From 1e346c01314ad7982ac1b7bacf074a6dc937f305 Mon Sep 17 00:00:00 2001 From: dhoomakethu Date: Wed, 20 Dec 2017 22:00:25 +0530 Subject: [PATCH 1/5] Trying to fix #210 1. Using if __name__ == "__main__" clause in example to avoid running them while generating docs 2. Trying to enforce PEP-8 compliant code + PYTHON2-3 compatibale code with examples as much as possible 3. Renaming examples with "-" to "_" for the ease of documentation generation 4. Minor changes with setup and setup commands 5. Support documentation creation from make file 6. Remove unnecessary html and pdf files from the doc folder --- .gitignore | 5 + Makefile | 1 + doc/Makefile | 20 ++ doc/changelog.rst | 1 + doc/conf.py | 179 +++++++++++++ doc/index.rst | 24 ++ doc/readme.rst | 1 + doc/source/example/asynchronous_client.rst | 4 + doc/source/example/asynchronous_processor.rst | 4 + doc/source/example/asynchronous_server.rst | 4 + doc/source/example/bcd_payload.rst | 4 + doc/source/example/callback_server.rst | 4 + doc/source/example/changing_framers.rst | 4 + doc/source/example/concurrent_client.rst | 4 + doc/source/example/custom_datablock.rst | 4 + doc/source/example/custom_message.rst | 4 + doc/source/example/dbstore_update_server.rst | 4 + doc/source/example/gui_common.rst | 4 + doc/source/example/libmodbus_client.rst | 4 + doc/source/example/message_generator.rst | 4 + doc/source/example/message_parser.rst | 4 + doc/source/example/modbus_logging.rst | 4 + doc/source/example/modbus_mapper.rst | 4 + doc/source/example/modbus_payload.rst | 4 + doc/source/example/modbus_payload_server.rst | 4 + doc/source/example/modbus_saver.rst | 4 + doc/source/example/modbus_scraper.rst | 4 + doc/source/example/modbus_simulator.rst | 4 + doc/source/example/modicon_payload.rst | 4 + doc/source/example/modules.rst | 39 +++ doc/source/example/performance.rst | 4 + doc/source/example/remote_server_context.rst | 4 + doc/source/example/serial_forwarder.rst | 4 + doc/source/example/sunspec_client.rst | 4 + doc/source/example/synchronous_client.rst | 4 + doc/source/example/synchronous_client_ext.rst | 4 + doc/source/example/synchronous_server.rst | 4 + doc/source/example/thread_safe_datastore.rst | 4 + doc/source/example/updating_server.rst | 4 + doc/source/library/modules.rst | 7 + doc/source/library/pymodbus.client.rst | 38 +++ .../library/pymodbus.datastore.database.rst | 30 +++ doc/source/library/pymodbus.datastore.rst | 45 ++++ doc/source/library/pymodbus.internal.rst | 22 ++ doc/source/library/pymodbus.rst | 184 +++++++++++++ doc/source/library/pymodbus.server.rst | 30 +++ examples/common/asynchronous-client.py | 127 --------- examples/common/asynchronous-server.py | 109 -------- examples/common/asynchronous_client.py | 138 ++++++++++ ...processor.py => asynchronous_processor.py} | 101 +++---- examples/common/asynchronous_server.py | 120 +++++++++ examples/common/callback-server.py | 134 ---------- examples/common/callback_server.py | 147 +++++++++++ examples/common/changing-framers.py | 56 ---- examples/common/changing_framers.py | 57 ++++ examples/common/custom-datablock.py | 78 ------ examples/common/custom_datablock.py | 85 ++++++ .../{custom-message.py => custom_message.py} | 61 +++-- examples/common/dbstore-update-server.py | 94 ------- examples/common/dbstore_update_server.py | 102 ++++++++ .../common/{device-mapping => device_mapping} | 0 examples/common/modbus-logging.py | 41 --- examples/common/modbus-payload-server.py | 70 ----- examples/common/modbus-payload.py | 89 ------- examples/common/modbus_logging.py | 46 ++++ examples/common/modbus_payload.py | 96 +++++++ examples/common/modbus_payload_server.py | 76 ++++++ examples/common/performance.py | 71 ++--- examples/common/synchronous-client-ext.py | 177 ------------- examples/common/synchronous-client.py | 148 ----------- examples/common/synchronous-server.py | 117 --------- examples/common/synchronous_client.py | 156 +++++++++++ examples/common/synchronous_client_ext.py | 232 +++++++++++++++++ examples/common/synchronous_server.py | 127 +++++++++ examples/common/updating-server.py | 84 ------ examples/common/updating_server.py | 93 +++++++ .../{bcd-payload.py => bcd_payload.py} | 90 ++++--- ...current-client.py => concurrent_client.py} | 143 +++++----- ...ibmodbus-client.py => libmodbus_client.py} | 246 ++++++++++-------- ...sage-generator.py => message_generator.py} | 101 +++---- .../{message-parser.py => message_parser.py} | 84 +++--- examples/contrib/modbus_mapper.py | 114 ++++---- examples/contrib/modbus_saver.py | 94 ++++--- .../{modbus-scraper.py => modbus_scraper.py} | 120 +++++---- ...odbus-simulator.py => modbus_simulator.py} | 88 ++++--- ...{modicon-payload.py => modicon_payload.py} | 133 +++++----- examples/contrib/remote_server_context.py | 102 ++++---- examples/contrib/{rx-messages => rx_messages} | 0 examples/contrib/serial-forwarder.py | 37 --- examples/contrib/serial_forwarder.py | 43 +++ examples/contrib/sunspec_client.py | 83 +++--- examples/contrib/thread_safe_datastore.py | 70 ++--- examples/contrib/{tx-messages => tx_messages} | 0 examples/functional/__init__.py | 0 ...client.py => asynchronous_ascii_client.py} | 8 +- ...u-client.py => asynchronous_rtu_client.py} | 8 +- ...p-client.py => asynchronous_tcp_client.py} | 8 +- ...p-client.py => asynchronous_udp_client.py} | 8 +- examples/functional/base_context.py | 16 +- examples/functional/base_runner.py | 16 +- ...e-context.py => database_slave_context.py} | 8 +- ...ave-context.py => memory_slave_context.py} | 8 +- ...lave-context.py => redis_slave_context.py} | 8 +- ...ave-context.py => remote_slave_context.py} | 8 +- ...-client.py => synchronous_ascii_client.py} | 8 +- ...tu-client.py => synchronous_rtu_client.py} | 8 +- ...cp-client.py => synchronous_tcp_client.py} | 8 +- ...dp-client.py => synchronous_udp_client.py} | 8 +- examples/gui/bottle/frontend.py | 52 ++-- ...esponsive.css => bootstrap_responsive.css} | 0 ...e.min.css => bootstrap_responsive.min.css} | 0 ...halflings.png => glyphicons_halflings.png} | Bin ...ite.png => glyphicons_halflings_white.png} | Bin examples/gui/gtk/simulator.py | 48 ++-- examples/gui/{gui-common.py => gui_common.py} | 67 ++--- examples/gui/tk/simulator.py | 66 ++--- examples/gui/wx/simulator.py | 64 ++--- ...{build-datastore.py => build_datastore.py} | 28 +- examples/tools/convert.py | 46 ++-- .../lib/{jamod-1.2.jar => jamod_1.2.jar} | Bin .../{virtual-serial.c => virtual_serial.c} | 0 .../reference/{LICENSE-FREE => LICENSE_FREE} | 0 .../{test-install.sh => test_install.sh} | 0 .../{modbus-tcp.tac => modbus_tcp.tac} | 10 +- .../{modbus-udp.tac => modbus_udp.tac} | 10 +- examples/twisted/plugins/pymodbus_plugin.py | 20 +- setup.py | 85 +++--- setup_commands.py | 141 +++++----- 128 files changed, 3597 insertions(+), 2498 deletions(-) create mode 100644 doc/Makefile create mode 100644 doc/changelog.rst create mode 100644 doc/conf.py create mode 100644 doc/index.rst create mode 100644 doc/readme.rst create mode 100644 doc/source/example/asynchronous_client.rst create mode 100644 doc/source/example/asynchronous_processor.rst create mode 100644 doc/source/example/asynchronous_server.rst create mode 100644 doc/source/example/bcd_payload.rst create mode 100644 doc/source/example/callback_server.rst create mode 100644 doc/source/example/changing_framers.rst create mode 100644 doc/source/example/concurrent_client.rst create mode 100644 doc/source/example/custom_datablock.rst create mode 100644 doc/source/example/custom_message.rst create mode 100644 doc/source/example/dbstore_update_server.rst create mode 100644 doc/source/example/gui_common.rst create mode 100644 doc/source/example/libmodbus_client.rst create mode 100644 doc/source/example/message_generator.rst create mode 100644 doc/source/example/message_parser.rst create mode 100644 doc/source/example/modbus_logging.rst create mode 100644 doc/source/example/modbus_mapper.rst create mode 100644 doc/source/example/modbus_payload.rst create mode 100644 doc/source/example/modbus_payload_server.rst create mode 100644 doc/source/example/modbus_saver.rst create mode 100644 doc/source/example/modbus_scraper.rst create mode 100644 doc/source/example/modbus_simulator.rst create mode 100644 doc/source/example/modicon_payload.rst create mode 100644 doc/source/example/modules.rst create mode 100644 doc/source/example/performance.rst create mode 100644 doc/source/example/remote_server_context.rst create mode 100644 doc/source/example/serial_forwarder.rst create mode 100644 doc/source/example/sunspec_client.rst create mode 100644 doc/source/example/synchronous_client.rst create mode 100644 doc/source/example/synchronous_client_ext.rst create mode 100644 doc/source/example/synchronous_server.rst create mode 100644 doc/source/example/thread_safe_datastore.rst create mode 100644 doc/source/example/updating_server.rst create mode 100644 doc/source/library/modules.rst create mode 100644 doc/source/library/pymodbus.client.rst create mode 100644 doc/source/library/pymodbus.datastore.database.rst create mode 100644 doc/source/library/pymodbus.datastore.rst create mode 100644 doc/source/library/pymodbus.internal.rst create mode 100644 doc/source/library/pymodbus.rst create mode 100644 doc/source/library/pymodbus.server.rst delete mode 100755 examples/common/asynchronous-client.py delete mode 100755 examples/common/asynchronous-server.py create mode 100755 examples/common/asynchronous_client.py rename examples/common/{asynchronous-processor.py => asynchronous_processor.py} (62%) create mode 100755 examples/common/asynchronous_server.py delete mode 100755 examples/common/callback-server.py create mode 100755 examples/common/callback_server.py delete mode 100755 examples/common/changing-framers.py create mode 100755 examples/common/changing_framers.py delete mode 100755 examples/common/custom-datablock.py create mode 100755 examples/common/custom_datablock.py rename examples/common/{custom-message.py => custom_message.py} (58%) delete mode 100644 examples/common/dbstore-update-server.py create mode 100644 examples/common/dbstore_update_server.py rename examples/common/{device-mapping => device_mapping} (100%) delete mode 100755 examples/common/modbus-logging.py delete mode 100755 examples/common/modbus-payload-server.py delete mode 100755 examples/common/modbus-payload.py create mode 100755 examples/common/modbus_logging.py create mode 100755 examples/common/modbus_payload.py create mode 100755 examples/common/modbus_payload_server.py delete mode 100755 examples/common/synchronous-client-ext.py delete mode 100755 examples/common/synchronous-client.py delete mode 100755 examples/common/synchronous-server.py create mode 100755 examples/common/synchronous_client.py create mode 100755 examples/common/synchronous_client_ext.py create mode 100755 examples/common/synchronous_server.py delete mode 100755 examples/common/updating-server.py create mode 100755 examples/common/updating_server.py rename examples/contrib/{bcd-payload.py => bcd_payload.py} (80%) rename examples/contrib/{concurrent-client.py => concurrent_client.py} (64%) rename examples/contrib/{libmodbus-client.py => libmodbus_client.py} (65%) rename examples/contrib/{message-generator.py => message_generator.py} (67%) rename examples/contrib/{message-parser.py => message_parser.py} (70%) rename examples/contrib/{modbus-scraper.py => modbus_scraper.py} (72%) rename examples/contrib/{modbus-simulator.py => modbus_simulator.py} (57%) rename examples/contrib/{modicon-payload.py => modicon_payload.py} (76%) rename examples/contrib/{rx-messages => rx_messages} (100%) delete mode 100755 examples/contrib/serial-forwarder.py create mode 100755 examples/contrib/serial_forwarder.py rename examples/contrib/{tx-messages => tx_messages} (100%) delete mode 100644 examples/functional/__init__.py rename examples/functional/{asynchronous-ascii-client.py => asynchronous_ascii_client.py} (85%) rename examples/functional/{asynchronous-rtu-client.py => asynchronous_rtu_client.py} (85%) rename examples/functional/{asynchronous-tcp-client.py => asynchronous_tcp_client.py} (90%) rename examples/functional/{asynchronous-udp-client.py => asynchronous_udp_client.py} (85%) rename examples/functional/{database-slave-context.py => database_slave_context.py} (88%) rename examples/functional/{memory-slave-context.py => memory_slave_context.py} (89%) rename examples/functional/{redis-slave-context.py => redis_slave_context.py} (87%) rename examples/functional/{remote-slave-context.py => remote_slave_context.py} (89%) rename examples/functional/{synchronous-ascii-client.py => synchronous_ascii_client.py} (88%) rename examples/functional/{synchronous-rtu-client.py => synchronous_rtu_client.py} (88%) rename examples/functional/{synchronous-tcp-client.py => synchronous_tcp_client.py} (86%) rename examples/functional/{synchronous-udp-client.py => synchronous_udp_client.py} (85%) rename examples/gui/bottle/media/css/{bootstrap-responsive.css => bootstrap_responsive.css} (100%) rename examples/gui/bottle/media/css/{bootstrap-responsive.min.css => bootstrap_responsive.min.css} (100%) rename examples/gui/bottle/media/img/{glyphicons-halflings.png => glyphicons_halflings.png} (100%) rename examples/gui/bottle/media/img/{glyphicons-halflings-white.png => glyphicons_halflings_white.png} (100%) rename examples/gui/{gui-common.py => gui_common.py} (60%) rename examples/tools/{build-datastore.py => build_datastore.py} (93%) rename examples/tools/jamod/lib/{jamod-1.2.jar => jamod_1.2.jar} (100%) rename examples/tools/nullmodem/generic/{virtual-serial.c => virtual_serial.c} (100%) rename examples/tools/reference/{LICENSE-FREE => LICENSE_FREE} (100%) rename examples/tools/{test-install.sh => test_install.sh} (100%) rename examples/twisted/{modbus-tcp.tac => modbus_tcp.tac} (94%) rename examples/twisted/{modbus-udp.tac => modbus_udp.tac} (94%) diff --git a/.gitignore b/.gitignore index bd252e573..684ffd18a 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,8 @@ test/__pycache__/ **/pymodbus.db /.eggs/ /.cache/ +/doc/sphinx/doctrees/ +/doc_new/ +/doc/quality/ +/doc/pymodbus.pdf +/doc/sphinx/ diff --git a/Makefile b/Makefile index e9f7d9ef5..6a8024501 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ default: @echo ' make check check coding style (PEP-8, PEP-257)' @echo ' make test run the test suite, report coverage' @echo ' make tox run the tests on all Python versions' + @echo ' make docs Creates sphinx documentation in html' @echo ' make clean cleanup all temporary files' @echo diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 000000000..e805f2538 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +SPHINXPROJ = PyModbus +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/doc/changelog.rst b/doc/changelog.rst new file mode 100644 index 000000000..4d7817ae3 --- /dev/null +++ b/doc/changelog.rst @@ -0,0 +1 @@ +.. include:: ../CHANGELOG.rst \ No newline at end of file diff --git a/doc/conf.py b/doc/conf.py new file mode 100644 index 000000000..fc92ce5fb --- /dev/null +++ b/doc/conf.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +# +# PyModbus documentation build configuration file, created by +# sphinx-quickstart on Wed Dec 20 12:31:10 2017. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +parent_dir = os.path.abspath(os.pardir) +# examples = os.path.join(parent_dir, "examples") +example_contrib = os.path.join(parent_dir, "examples/contrib") +example_common = os.path.join(parent_dir, "examples/common") +example_gui = os.path.join(parent_dir, "examples/gui") + +sys.path.insert(0, os.path.abspath(os.pardir)) +sys.path.append(example_common) +sys.path.append(example_contrib) +sys.path.append(example_gui) +# sys.path.extend([examples, example_common, example_contrib, example_gui]) +# sys.path.insert(0, os.path.abspath('../')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'PyModbus' +copyright = u'2017, Sanjay' +author = u'Sanjay' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'1.4.0' +# The full version, including alpha/beta/rc tags. +release = u'1.4.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'PyModbusdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'PyModbus.tex', u'PyModbus Documentation', + u'Sanjay', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'pymodbus', u'PyModbus Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'PyModbus', u'PyModbus Documentation', + author, 'PyModbus', 'One line description of project.', + 'Miscellaneous'), +] + + + diff --git a/doc/index.rst b/doc/index.rst new file mode 100644 index 000000000..9b5491d09 --- /dev/null +++ b/doc/index.rst @@ -0,0 +1,24 @@ +.. PyModbus documentation master file, created by + sphinx-quickstart on Wed Dec 20 12:31:10 2017. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PyModbus's documentation! +==================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + readme.rst + changelog.rst + source/example/modules.rst + source/library/modules.rst + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/doc/readme.rst b/doc/readme.rst new file mode 100644 index 000000000..6b2b3ec68 --- /dev/null +++ b/doc/readme.rst @@ -0,0 +1 @@ +.. include:: ../README.rst \ No newline at end of file diff --git a/doc/source/example/asynchronous_client.rst b/doc/source/example/asynchronous_client.rst new file mode 100644 index 000000000..c9a0b03e1 --- /dev/null +++ b/doc/source/example/asynchronous_client.rst @@ -0,0 +1,4 @@ +================================================== +Asynchronous Client Example +================================================== +.. literalinclude:: ../../../examples/common/asynchronous_client.py \ No newline at end of file diff --git a/doc/source/example/asynchronous_processor.rst b/doc/source/example/asynchronous_processor.rst new file mode 100644 index 000000000..b5b5ffd76 --- /dev/null +++ b/doc/source/example/asynchronous_processor.rst @@ -0,0 +1,4 @@ +================================================== +Asynchronous Processor Example +================================================== +.. literalinclude:: ../../../examples/common/asynchronous_processor.py \ No newline at end of file diff --git a/doc/source/example/asynchronous_server.rst b/doc/source/example/asynchronous_server.rst new file mode 100644 index 000000000..7b66a52bf --- /dev/null +++ b/doc/source/example/asynchronous_server.rst @@ -0,0 +1,4 @@ +================================================== +Asynchronous Server Example +================================================== +.. literalinclude:: ../../../examples/common/asynchronous_server.py \ No newline at end of file diff --git a/doc/source/example/bcd_payload.rst b/doc/source/example/bcd_payload.rst new file mode 100644 index 000000000..a1c9a2c23 --- /dev/null +++ b/doc/source/example/bcd_payload.rst @@ -0,0 +1,4 @@ +================================================== +Bcd Payload Example +================================================== +.. literalinclude:: ../../../examples/contrib/bcd_payload.py \ No newline at end of file diff --git a/doc/source/example/callback_server.rst b/doc/source/example/callback_server.rst new file mode 100644 index 000000000..2dff5d612 --- /dev/null +++ b/doc/source/example/callback_server.rst @@ -0,0 +1,4 @@ +================================================== +Callback Server Example +================================================== +.. literalinclude:: ../../../examples/common/callback_server.py \ No newline at end of file diff --git a/doc/source/example/changing_framers.rst b/doc/source/example/changing_framers.rst new file mode 100644 index 000000000..1b2b372a1 --- /dev/null +++ b/doc/source/example/changing_framers.rst @@ -0,0 +1,4 @@ +================================================== +Changing Framers Example +================================================== +.. literalinclude:: ../../../examples/common/changing_framers.py \ No newline at end of file diff --git a/doc/source/example/concurrent_client.rst b/doc/source/example/concurrent_client.rst new file mode 100644 index 000000000..235c91c47 --- /dev/null +++ b/doc/source/example/concurrent_client.rst @@ -0,0 +1,4 @@ +================================================== +Concurrent Client Example +================================================== +.. literalinclude:: ../../../examples/contrib/concurrent_client.py \ No newline at end of file diff --git a/doc/source/example/custom_datablock.rst b/doc/source/example/custom_datablock.rst new file mode 100644 index 000000000..21b9dc27a --- /dev/null +++ b/doc/source/example/custom_datablock.rst @@ -0,0 +1,4 @@ +================================================== +Custom Datablock Example +================================================== +.. literalinclude:: ../../../examples/common/custom_datablock.py \ No newline at end of file diff --git a/doc/source/example/custom_message.rst b/doc/source/example/custom_message.rst new file mode 100644 index 000000000..069d33101 --- /dev/null +++ b/doc/source/example/custom_message.rst @@ -0,0 +1,4 @@ +================================================== +Custom Message Example +================================================== +.. literalinclude:: ../../../examples/common/custom_message.py \ No newline at end of file diff --git a/doc/source/example/dbstore_update_server.rst b/doc/source/example/dbstore_update_server.rst new file mode 100644 index 000000000..1e27abd56 --- /dev/null +++ b/doc/source/example/dbstore_update_server.rst @@ -0,0 +1,4 @@ +================================================== +Dbstore Update Server Example +================================================== +.. literalinclude:: ../../../examples/common/dbstore_update_server.py \ No newline at end of file diff --git a/doc/source/example/gui_common.rst b/doc/source/example/gui_common.rst new file mode 100644 index 000000000..ec177a635 --- /dev/null +++ b/doc/source/example/gui_common.rst @@ -0,0 +1,4 @@ +================================================== +Gui Common Example +================================================== +.. literalinclude:: ../../../examples/gui/gui_common.py \ No newline at end of file diff --git a/doc/source/example/libmodbus_client.rst b/doc/source/example/libmodbus_client.rst new file mode 100644 index 000000000..b68ed1045 --- /dev/null +++ b/doc/source/example/libmodbus_client.rst @@ -0,0 +1,4 @@ +================================================== +Libmodbus Client Example +================================================== +.. literalinclude:: ../../../examples/contrib/libmodbus_client.py \ No newline at end of file diff --git a/doc/source/example/message_generator.rst b/doc/source/example/message_generator.rst new file mode 100644 index 000000000..0a06b5953 --- /dev/null +++ b/doc/source/example/message_generator.rst @@ -0,0 +1,4 @@ +================================================== +Message Generator Example +================================================== +.. literalinclude:: ../../../examples/contrib/message_generator.py \ No newline at end of file diff --git a/doc/source/example/message_parser.rst b/doc/source/example/message_parser.rst new file mode 100644 index 000000000..f5aa06c9b --- /dev/null +++ b/doc/source/example/message_parser.rst @@ -0,0 +1,4 @@ +================================================== +Message Parser Example +================================================== +.. literalinclude:: ../../../examples/contrib/message_parser.py \ No newline at end of file diff --git a/doc/source/example/modbus_logging.rst b/doc/source/example/modbus_logging.rst new file mode 100644 index 000000000..2c548c985 --- /dev/null +++ b/doc/source/example/modbus_logging.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Logging Example +================================================== +.. literalinclude:: ../../../examples/common/modbus_logging.py \ No newline at end of file diff --git a/doc/source/example/modbus_mapper.rst b/doc/source/example/modbus_mapper.rst new file mode 100644 index 000000000..18b92c504 --- /dev/null +++ b/doc/source/example/modbus_mapper.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Mapper Example +================================================== +.. literalinclude:: ../../../examples/contrib/modbus_mapper.py \ No newline at end of file diff --git a/doc/source/example/modbus_payload.rst b/doc/source/example/modbus_payload.rst new file mode 100644 index 000000000..4b0861ecb --- /dev/null +++ b/doc/source/example/modbus_payload.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Payload Example +================================================== +.. literalinclude:: ../../../examples/common/modbus_payload.py \ No newline at end of file diff --git a/doc/source/example/modbus_payload_server.rst b/doc/source/example/modbus_payload_server.rst new file mode 100644 index 000000000..e9ba210cb --- /dev/null +++ b/doc/source/example/modbus_payload_server.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Payload Server Example +================================================== +.. literalinclude:: ../../../examples/common/modbus_payload_server.py \ No newline at end of file diff --git a/doc/source/example/modbus_saver.rst b/doc/source/example/modbus_saver.rst new file mode 100644 index 000000000..bdba22817 --- /dev/null +++ b/doc/source/example/modbus_saver.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Saver Example +================================================== +.. literalinclude:: ../../../examples/contrib/modbus_saver.py \ No newline at end of file diff --git a/doc/source/example/modbus_scraper.rst b/doc/source/example/modbus_scraper.rst new file mode 100644 index 000000000..5bf9ccea9 --- /dev/null +++ b/doc/source/example/modbus_scraper.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Scraper Example +================================================== +.. literalinclude:: ../../../examples/contrib/modbus_scraper.py \ No newline at end of file diff --git a/doc/source/example/modbus_simulator.rst b/doc/source/example/modbus_simulator.rst new file mode 100644 index 000000000..d6883f030 --- /dev/null +++ b/doc/source/example/modbus_simulator.rst @@ -0,0 +1,4 @@ +================================================== +Modbus Simulator Example +================================================== +.. literalinclude:: ../../../examples/contrib/modbus_simulator.py \ No newline at end of file diff --git a/doc/source/example/modicon_payload.rst b/doc/source/example/modicon_payload.rst new file mode 100644 index 000000000..ac0cb4d2c --- /dev/null +++ b/doc/source/example/modicon_payload.rst @@ -0,0 +1,4 @@ +================================================== +Modicon Payload Example +================================================== +.. literalinclude:: ../../../examples/contrib/modicon_payload.py \ No newline at end of file diff --git a/doc/source/example/modules.rst b/doc/source/example/modules.rst new file mode 100644 index 000000000..6d6460349 --- /dev/null +++ b/doc/source/example/modules.rst @@ -0,0 +1,39 @@ +=================== +Examples +=================== +=== + +.. toctree:: + :maxdepth: 4 + + asynchronous_client + asynchronous_processor + asynchronous_server + callback_server + changing_framers + custom_datablock + custom_message + dbstore_update_server + modbus_logging + modbus_payload + modbus_payload_server + performance + synchronous_client + synchronous_client_ext + synchronous_server + updating_server + bcd_payload + concurrent_client + libmodbus_client + message_generator + message_parser + modbus_mapper + modbus_saver + modbus_scraper + modbus_simulator + modicon_payload + remote_server_context + serial_forwarder + sunspec_client + thread_safe_datastore + gui_common diff --git a/doc/source/example/performance.rst b/doc/source/example/performance.rst new file mode 100644 index 000000000..86cef1169 --- /dev/null +++ b/doc/source/example/performance.rst @@ -0,0 +1,4 @@ +================== +performance module +================== +.. literalinclude:: ../../../examples/common/performance.py diff --git a/doc/source/example/remote_server_context.rst b/doc/source/example/remote_server_context.rst new file mode 100644 index 000000000..0450e6ef6 --- /dev/null +++ b/doc/source/example/remote_server_context.rst @@ -0,0 +1,4 @@ +================================================== +Remote Server Context Example +================================================== +.. literalinclude:: ../../../examples/contrib/remote_server_context.py \ No newline at end of file diff --git a/doc/source/example/serial_forwarder.rst b/doc/source/example/serial_forwarder.rst new file mode 100644 index 000000000..1a8fba691 --- /dev/null +++ b/doc/source/example/serial_forwarder.rst @@ -0,0 +1,4 @@ +================================================== +Serial Forwarder Example +================================================== +.. literalinclude:: ../../../examples/contrib/serial_forwarder.py \ No newline at end of file diff --git a/doc/source/example/sunspec_client.rst b/doc/source/example/sunspec_client.rst new file mode 100644 index 000000000..48b284b97 --- /dev/null +++ b/doc/source/example/sunspec_client.rst @@ -0,0 +1,4 @@ +================================================== +Sunspec Client Example +================================================== +.. literalinclude:: ../../../examples/contrib/sunspec_client.py \ No newline at end of file diff --git a/doc/source/example/synchronous_client.rst b/doc/source/example/synchronous_client.rst new file mode 100644 index 000000000..6df8cc562 --- /dev/null +++ b/doc/source/example/synchronous_client.rst @@ -0,0 +1,4 @@ +================================================== +Synchronous Client Example +================================================== +.. literalinclude:: ../../../examples/common/synchronous_client.py \ No newline at end of file diff --git a/doc/source/example/synchronous_client_ext.rst b/doc/source/example/synchronous_client_ext.rst new file mode 100644 index 000000000..c26074cf5 --- /dev/null +++ b/doc/source/example/synchronous_client_ext.rst @@ -0,0 +1,4 @@ +================================================== +Synchronous Client Ext Example +================================================== +.. literalinclude:: ../../../examples/common/synchronous_client_ext.py \ No newline at end of file diff --git a/doc/source/example/synchronous_server.rst b/doc/source/example/synchronous_server.rst new file mode 100644 index 000000000..15f0db3d9 --- /dev/null +++ b/doc/source/example/synchronous_server.rst @@ -0,0 +1,4 @@ +================================================== +Synchronous Server Example +================================================== +.. literalinclude:: ../../../examples/common/synchronous_server.py \ No newline at end of file diff --git a/doc/source/example/thread_safe_datastore.rst b/doc/source/example/thread_safe_datastore.rst new file mode 100644 index 000000000..f4414be0a --- /dev/null +++ b/doc/source/example/thread_safe_datastore.rst @@ -0,0 +1,4 @@ +================================================== +Thread Safe Datastore Example +================================================== +.. literalinclude:: ../../../examples/contrib/thread_safe_datastore.py \ No newline at end of file diff --git a/doc/source/example/updating_server.rst b/doc/source/example/updating_server.rst new file mode 100644 index 000000000..d7fbcafcc --- /dev/null +++ b/doc/source/example/updating_server.rst @@ -0,0 +1,4 @@ +================================================== +Updating Server Example +================================================== +.. literalinclude:: ../../../examples/common/updating_server.py \ No newline at end of file diff --git a/doc/source/library/modules.rst b/doc/source/library/modules.rst new file mode 100644 index 000000000..43e9c4b12 --- /dev/null +++ b/doc/source/library/modules.rst @@ -0,0 +1,7 @@ +pymodbus +======== + +.. toctree:: + :maxdepth: 4 + + pymodbus diff --git a/doc/source/library/pymodbus.client.rst b/doc/source/library/pymodbus.client.rst new file mode 100644 index 000000000..391658189 --- /dev/null +++ b/doc/source/library/pymodbus.client.rst @@ -0,0 +1,38 @@ +pymodbus\.client package +======================== + +Submodules +---------- + +pymodbus\.client\.async module +------------------------------ + +.. automodule:: pymodbus.client.async + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.client\.common module +------------------------------- + +.. automodule:: pymodbus.client.common + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.client\.sync module +----------------------------- + +.. automodule:: pymodbus.client.sync + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pymodbus.client + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/library/pymodbus.datastore.database.rst b/doc/source/library/pymodbus.datastore.database.rst new file mode 100644 index 000000000..d0321e6d5 --- /dev/null +++ b/doc/source/library/pymodbus.datastore.database.rst @@ -0,0 +1,30 @@ +pymodbus\.datastore\.database package +===================================== + +Submodules +---------- + +pymodbus\.datastore\.database\.redis\_datastore module +------------------------------------------------------ + +.. automodule:: pymodbus.datastore.database.redis_datastore + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.datastore\.database\.sql\_datastore module +---------------------------------------------------- + +.. automodule:: pymodbus.datastore.database.sql_datastore + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pymodbus.datastore.database + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/library/pymodbus.datastore.rst b/doc/source/library/pymodbus.datastore.rst new file mode 100644 index 000000000..2aa8a3b93 --- /dev/null +++ b/doc/source/library/pymodbus.datastore.rst @@ -0,0 +1,45 @@ +pymodbus\.datastore package +=========================== + +Subpackages +----------- + +.. toctree:: + + pymodbus.datastore.database + +Submodules +---------- + +pymodbus\.datastore\.context module +----------------------------------- + +.. automodule:: pymodbus.datastore.context + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.datastore\.remote module +---------------------------------- + +.. automodule:: pymodbus.datastore.remote + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.datastore\.store module +--------------------------------- + +.. automodule:: pymodbus.datastore.store + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pymodbus.datastore + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/library/pymodbus.internal.rst b/doc/source/library/pymodbus.internal.rst new file mode 100644 index 000000000..35467c8a5 --- /dev/null +++ b/doc/source/library/pymodbus.internal.rst @@ -0,0 +1,22 @@ +pymodbus\.internal package +========================== + +Submodules +---------- + +pymodbus\.internal\.ptwisted module +----------------------------------- + +.. automodule:: pymodbus.internal.ptwisted + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pymodbus.internal + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/library/pymodbus.rst b/doc/source/library/pymodbus.rst new file mode 100644 index 000000000..00933087f --- /dev/null +++ b/doc/source/library/pymodbus.rst @@ -0,0 +1,184 @@ +pymodbus package +================ + +Subpackages +----------- + +.. toctree:: + + pymodbus.client + pymodbus.datastore + pymodbus.internal + pymodbus.server + +Submodules +---------- + +pymodbus\.bit\_read\_message module +----------------------------------- + +.. automodule:: pymodbus.bit_read_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.bit\_write\_message module +------------------------------------ + +.. automodule:: pymodbus.bit_write_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.compat module +----------------------- + +.. automodule:: pymodbus.compat + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.constants module +-------------------------- + +.. automodule:: pymodbus.constants + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.device module +----------------------- + +.. automodule:: pymodbus.device + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.diag\_message module +------------------------------ + +.. automodule:: pymodbus.diag_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.events module +----------------------- + +.. automodule:: pymodbus.events + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.exceptions module +--------------------------- + +.. automodule:: pymodbus.exceptions + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.factory module +------------------------ + +.. automodule:: pymodbus.factory + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.file\_message module +------------------------------ + +.. automodule:: pymodbus.file_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.interfaces module +--------------------------- + +.. automodule:: pymodbus.interfaces + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.mei\_message module +----------------------------- + +.. automodule:: pymodbus.mei_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.other\_message module +------------------------------- + +.. automodule:: pymodbus.other_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.payload module +------------------------ + +.. automodule:: pymodbus.payload + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.pdu module +-------------------- + +.. automodule:: pymodbus.pdu + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.register\_read\_message module +---------------------------------------- + +.. automodule:: pymodbus.register_read_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.register\_write\_message module +----------------------------------------- + +.. automodule:: pymodbus.register_write_message + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.transaction module +---------------------------- + +.. automodule:: pymodbus.transaction + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.utilities module +-------------------------- + +.. automodule:: pymodbus.utilities + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.version module +------------------------ + +.. automodule:: pymodbus.version + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pymodbus + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/library/pymodbus.server.rst b/doc/source/library/pymodbus.server.rst new file mode 100644 index 000000000..973bb5b55 --- /dev/null +++ b/doc/source/library/pymodbus.server.rst @@ -0,0 +1,30 @@ +pymodbus\.server package +======================== + +Submodules +---------- + +pymodbus\.server\.async module +------------------------------ + +.. automodule:: pymodbus.server.async + :members: + :undoc-members: + :show-inheritance: + +pymodbus\.server\.sync module +----------------------------- + +.. automodule:: pymodbus.server.sync + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: pymodbus.server + :members: + :undoc-members: + :show-inheritance: diff --git a/examples/common/asynchronous-client.py b/examples/common/asynchronous-client.py deleted file mode 100755 index 2ce863fd5..000000000 --- a/examples/common/asynchronous-client.py +++ /dev/null @@ -1,127 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Asynchronous Client Examples --------------------------------------------------------------------------- - -The following is an example of how to use the asynchronous modbus -client implementation from pymodbus. -''' -#---------------------------------------------------------------------------# -# import needed libraries -#---------------------------------------------------------------------------# -from twisted.internet import reactor, protocol -from pymodbus.constants import Defaults - -#---------------------------------------------------------------------------# -# choose the requested modbus protocol -#---------------------------------------------------------------------------# -from pymodbus.client.async import ModbusClientProtocol -#from pymodbus.client.async import ModbusUdpClientProtocol - -#---------------------------------------------------------------------------# -# configure the client logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# helper method to test deferred callbacks -#---------------------------------------------------------------------------# -def dassert(deferred, callback): - def _assertor(value): - assert(value) - deferred.addCallback(lambda r: _assertor(callback(r))) - deferred.addErrback(lambda _: _assertor(False)) - -#---------------------------------------------------------------------------# -# specify slave to query -#---------------------------------------------------------------------------# -# The slave to query is specified in an optional parameter for each -# individual request. This can be done by specifying the `unit` parameter -# which defaults to `0x00` -#---------------------------------------------------------------------------# -def exampleRequests(client): - rr = client.read_coils(1, 1, unit=0x02) - -#---------------------------------------------------------------------------# -# example requests -#---------------------------------------------------------------------------# -# simply call the methods that you would like to use. An example session -# is displayed below along with some assert checks. Note that unlike the -# synchronous version of the client, the asynchronous version returns -# deferreds which can be thought of as a handle to the callback to send -# the result of the operation. We are handling the result using the -# deferred assert helper(dassert). -#---------------------------------------------------------------------------# -def beginAsynchronousTest(client): - rq = client.write_coil(1, True) - rr = client.read_coils(1,1) - dassert(rq, lambda r: r.function_code < 0x80) # test that we are not an error - dassert(rr, lambda r: r.bits[0] == True) # test the expected value - - rq = client.write_coils(1, [True]*8) - rr = client.read_coils(1,8) - dassert(rq, lambda r: r.function_code < 0x80) # test that we are not an error - dassert(rr, lambda r: r.bits == [True]*8) # test the expected value - - rq = client.write_coils(1, [False]*8) - rr = client.read_discrete_inputs(1,8) - dassert(rq, lambda r: r.function_code < 0x80) # test that we are not an error - dassert(rr, lambda r: r.bits == [True]*8) # test the expected value - - rq = client.write_register(1, 10) - rr = client.read_holding_registers(1,1) - dassert(rq, lambda r: r.function_code < 0x80) # test that we are not an error - dassert(rr, lambda r: r.registers[0] == 10) # test the expected value - - rq = client.write_registers(1, [10]*8) - rr = client.read_input_registers(1,8) - dassert(rq, lambda r: r.function_code < 0x80) # test that we are not an error - dassert(rr, lambda r: r.registers == [17]*8) # test the expected value - - arguments = { - 'read_address': 1, - 'read_count': 8, - 'write_address': 1, - 'write_registers': [20]*8, - } - rq = client.readwrite_registers(**arguments) - rr = client.read_input_registers(1,8) - dassert(rq, lambda r: r.registers == [20]*8) # test the expected value - dassert(rr, lambda r: r.registers == [17]*8) # test the expected value - - #-----------------------------------------------------------------------# - # close the client at some time later - #-----------------------------------------------------------------------# - reactor.callLater(1, client.transport.loseConnection) - reactor.callLater(2, reactor.stop) - -#---------------------------------------------------------------------------# -# extra requests -#---------------------------------------------------------------------------# -# If you are performing a request that is not available in the client -# mixin, you have to perform the request like this instead:: -# -# from pymodbus.diag_message import ClearCountersRequest -# from pymodbus.diag_message import ClearCountersResponse -# -# request = ClearCountersRequest() -# response = client.execute(request) -# if isinstance(response, ClearCountersResponse): -# ... do something with the response -# -#---------------------------------------------------------------------------# - -#---------------------------------------------------------------------------# -# choose the client you want -#---------------------------------------------------------------------------# -# make sure to start an implementation to hit against. For this -# you can use an existing device, the reference implementation in the tools -# directory, or start a pymodbus server. -#---------------------------------------------------------------------------# -defer = protocol.ClientCreator(reactor, ModbusClientProtocol - ).connectTCP("localhost", 5020) -defer.addCallback(beginAsynchronousTest) -reactor.run() diff --git a/examples/common/asynchronous-server.py b/examples/common/asynchronous-server.py deleted file mode 100755 index dd4137210..000000000 --- a/examples/common/asynchronous-server.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Asynchronous Server Example --------------------------------------------------------------------------- - -The asynchronous server is a high performance implementation using the -twisted library as its backend. This allows it to scale to many thousands -of nodes which can be helpful for testing monitoring software. -''' -#---------------------------------------------------------------------------# -# import the various server implementations -#---------------------------------------------------------------------------# -from pymodbus.server.async import StartTcpServer -from pymodbus.server.async import StartUdpServer -from pymodbus.server.async import StartSerialServer - -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSequentialDataBlock -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext -from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# initialize your data store -#---------------------------------------------------------------------------# -# The datastores only respond to the addresses that they are initialized to. -# Therefore, if you initialize a DataBlock to addresses from 0x00 to 0xFF, a -# request to 0x100 will respond with an invalid address exception. This is -# because many devices exhibit this kind of behavior (but not all):: -# -# block = ModbusSequentialDataBlock(0x00, [0]*0xff) -# -# Continuing, you can choose to use a sequential or a sparse DataBlock in -# your data context. The difference is that the sequential has no gaps in -# the data while the sparse can. Once again, there are devices that exhibit -# both forms of behavior:: -# -# block = ModbusSparseDataBlock({0x00: 0, 0x05: 1}) -# block = ModbusSequentialDataBlock(0x00, [0]*5) -# -# Alternately, you can use the factory methods to initialize the DataBlocks -# or simply do not pass them to have them initialized to 0x00 on the full -# address range:: -# -# store = ModbusSlaveContext(di = ModbusSequentialDataBlock.create()) -# store = ModbusSlaveContext() -# -# Finally, you are allowed to use the same DataBlock reference for every -# table or you you may use a seperate DataBlock for each table. This depends -# if you would like functions to be able to access and modify the same data -# or not:: -# -# block = ModbusSequentialDataBlock(0x00, [0]*0xff) -# store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) -# -# The server then makes use of a server context that allows the server to -# respond with different slave contexts for different unit ids. By default -# it will return the same context for every unit id supplied (broadcast -# mode). However, this can be overloaded by setting the single flag to False -# and then supplying a dictionary of unit id to context mapping:: -# -# slaves = { -# 0x01: ModbusSlaveContext(...), -# 0x02: ModbusSlaveContext(...), -# 0x03: ModbusSlaveContext(...), -# } -# context = ModbusServerContext(slaves=slaves, single=False) -# -# The slave context can also be initialized in zero_mode which means that a -# request to address(0-7) will map to the address (0-7). The default is -# False which is based on section 4.4 of the specification, so address(0-7) -# will map to (1-8):: -# -# store = ModbusSlaveContext(..., zero_mode=True) -#---------------------------------------------------------------------------# -store = ModbusSlaveContext( - di = ModbusSequentialDataBlock(0, [17]*100), - co = ModbusSequentialDataBlock(0, [17]*100), - hr = ModbusSequentialDataBlock(0, [17]*100), - ir = ModbusSequentialDataBlock(0, [17]*100)) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# -# If you don't set this or any fields, they are defaulted to empty strings. -#---------------------------------------------------------------------------# -identity = ModbusDeviceIdentification() -identity.VendorName = 'Pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' -identity.ProductName = 'Pymodbus Server' -identity.ModelName = 'Pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -StartTcpServer(context, identity=identity, address=("localhost", 5020)) -#StartUdpServer(context, identity=identity, address=("localhost", 502)) -#StartSerialServer(context, identity=identity, port='/dev/pts/3', framer=ModbusRtuFramer) -#StartSerialServer(context, identity=identity, port='/dev/pts/3', framer=ModbusAsciiFramer) diff --git a/examples/common/asynchronous_client.py b/examples/common/asynchronous_client.py new file mode 100755 index 000000000..ed77be262 --- /dev/null +++ b/examples/common/asynchronous_client.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python +""" +Pymodbus Asynchronous Client Examples +-------------------------------------------------------------------------- + +The following is an example of how to use the asynchronous modbus +client implementation from pymodbus. +""" +# --------------------------------------------------------------------------- # +# import needed libraries +# --------------------------------------------------------------------------- # +from twisted.internet import reactor, protocol +from pymodbus.constants import Defaults + +# --------------------------------------------------------------------------- # +# choose the requested modbus protocol +# --------------------------------------------------------------------------- # +from pymodbus.client.async import ModbusClientProtocol +#from pymodbus.client.async import ModbusUdpClientProtocol + +# --------------------------------------------------------------------------- # +# configure the client logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +# --------------------------------------------------------------------------- # +# helper method to test deferred callbacks +# --------------------------------------------------------------------------- # + + +def dassert(deferred, callback): + def _assertor(value): + assert value + + deferred.addCallback(lambda r: _assertor(callback(r))) + deferred.addErrback(lambda _: _assertor(False)) + +# --------------------------------------------------------------------------- # +# specify slave to query +# --------------------------------------------------------------------------- # +# The slave to query is specified in an optional parameter for each +# individual request. This can be done by specifying the `unit` parameter +# which defaults to `0x00` +# --------------------------------------------------------------------------- # + + +def exampleRequests(client): + rr = client.read_coils(1, 1, unit=0x02) + +# --------------------------------------------------------------------------- # +# example requests +# --------------------------------------------------------------------------- # +# simply call the methods that you would like to use. An example session +# is displayed below along with some assert checks. Note that unlike the +# synchronous version of the client, the asynchronous version returns +# deferreds which can be thought of as a handle to the callback to send +# the result of the operation. We are handling the result using the +# deferred assert helper(dassert). +# --------------------------------------------------------------------------- # + +UNIT = 0x01 + +def beginAsynchronousTest(client): + rq = client.write_coil(1, True, unit=UNIT) + rr = client.read_coils(1, 1, unit=UNIT) + dassert(rq, lambda r: r.function_code < 0x80) # test for no error + dassert(rr, lambda r: r.bits[0] == True) # test the expected value + + rq = client.write_coils(1, [True]*8, unit=UNIT) + rr = client.read_coils(1, 8, unit=UNIT) + dassert(rq, lambda r: r.function_code < 0x80) # test for no error + dassert(rr, lambda r: r.bits == [True]*8) # test the expected value + + rq = client.write_coils(1, [False]*8, unit=UNIT) + rr = client.read_discrete_inputs(1, 8, unit=UNIT) + dassert(rq, lambda r: r.function_code < 0x80) # test for no error + dassert(rr, lambda r: r.bits == [True]*8) # test the expected value + + rq = client.write_register(1, 10, unit=UNIT) + rr = client.read_holding_registers(1, 1, unit=UNIT) + dassert(rq, lambda r: r.function_code < 0x80) # test for no error + dassert(rr, lambda r: r.registers[0] == 10) # test the expected value + + rq = client.write_registers(1, [10]*8, unit=UNIT) + rr = client.read_input_registers(1, 8, unit=UNIT) + dassert(rq, lambda r: r.function_code < 0x80) # test for no error + dassert(rr, lambda r: r.registers == [17]*8) # test the expected value + + arguments = { + 'read_address': 1, + 'read_count': 8, + 'write_address': 1, + 'write_registers': [20]*8, + } + rq = client.readwrite_registers(**arguments, unit=UNIT) + rr = client.read_input_registers(1, 8, unit=UNIT) + dassert(rq, lambda r: r.registers == [20]*8) # test the expected value + dassert(rr, lambda r: r.registers == [17]*8) # test the expected value + + # ----------------------------------------------------------------------- # + # close the client at some time later + # ----------------------------------------------------------------------- # + reactor.callLater(1, client.transport.loseConnection) + reactor.callLater(2, reactor.stop) + +# --------------------------------------------------------------------------- # +# extra requests +# --------------------------------------------------------------------------- # +# If you are performing a request that is not available in the client +# mixin, you have to perform the request like this instead:: +# +# from pymodbus.diag_message import ClearCountersRequest +# from pymodbus.diag_message import ClearCountersResponse +# +# request = ClearCountersRequest() +# response = client.execute(request) +# if isinstance(response, ClearCountersResponse): +# ... do something with the response +# +# --------------------------------------------------------------------------- # + +# --------------------------------------------------------------------------- # +# choose the client you want +# --------------------------------------------------------------------------- # +# make sure to start an implementation to hit against. For this +# you can use an existing device, the reference implementation in the tools +# directory, or start a pymodbus server. +# --------------------------------------------------------------------------- # + + +if __name__ == "__main__": + defer = protocol.ClientCreator( + reactor, ModbusClientProtocol).connectTCP("localhost", 5020) + defer.addCallback(beginAsynchronousTest) + reactor.run() diff --git a/examples/common/asynchronous-processor.py b/examples/common/asynchronous_processor.py similarity index 62% rename from examples/common/asynchronous-processor.py rename to examples/common/asynchronous_processor.py index e903610de..07dec9216 100755 --- a/examples/common/asynchronous-processor.py +++ b/examples/common/asynchronous_processor.py @@ -1,101 +1,101 @@ #!/usr/bin/env python -''' +""" Pymodbus Asynchronous Processor Example -------------------------------------------------------------------------- The following is a full example of a continuous client processor. Feel free to use it as a skeleton guide in implementing your own. -''' -#---------------------------------------------------------------------------# +""" +# --------------------------------------------------------------------------- # # import the neccessary modules -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # from twisted.internet import serialport, reactor from twisted.internet.protocol import ClientFactory from pymodbus.factory import ClientDecoder from pymodbus.client.async import ModbusClientProtocol -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Choose the framer you want to use -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # #from pymodbus.transaction import ModbusBinaryFramer as ModbusFramer #from pymodbus.transaction import ModbusAsciiFramer as ModbusFramer from pymodbus.transaction import ModbusRtuFramer as ModbusFramer # from pymodbus.transaction import ModbusSocketFramer as ModbusFramer -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # configure the client logging -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # import logging logging.basicConfig() log = logging.getLogger("pymodbus") log.setLevel(logging.DEBUG) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # state a few constants -#---------------------------------------------------------------------------# -SERIAL_PORT = "/dev/ttyp0" -STATUS_REGS = (1, 2) +# --------------------------------------------------------------------------- # +SERIAL_PORT = "/dev/ttyp0" +STATUS_REGS = (1, 2) STATUS_COILS = (1, 3) CLIENT_DELAY = 1 +UNIT = 0x01 - -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # an example custom protocol -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Here you can perform your main procesing loop utilizing defereds and timed # callbacks. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class ExampleProtocol(ModbusClientProtocol): def __init__(self, framer, endpoint): - ''' Initializes our custom protocol + """ Initializes our custom protocol :param framer: The decoder to use to process messages :param endpoint: The endpoint to send results to - ''' + """ ModbusClientProtocol.__init__(self, framer) self.endpoint = endpoint log.debug("Beginning the processing loop") reactor.callLater(CLIENT_DELAY, self.fetch_holding_registers) def fetch_holding_registers(self): - ''' Defer fetching holding registers - ''' + """ Defer fetching holding registers + """ log.debug("Starting the next cycle") - d = self.read_holding_registers(*STATUS_REGS, unit=1) + d = self.read_holding_registers(*STATUS_REGS, unit=UNIT) d.addCallbacks(self.send_holding_registers, self.error_handler) def send_holding_registers(self, response): - ''' Write values of holding registers, defer fetching coils + """ Write values of holding registers, defer fetching coils :param response: The response to process - ''' + """ self.endpoint.write(response.getRegister(0)) self.endpoint.write(response.getRegister(1)) - d = self.read_coils(*STATUS_COILS, unit=1) + d = self.read_coils(*STATUS_COILS, unit=UNIT) d.addCallbacks(self.start_next_cycle, self.error_handler) def start_next_cycle(self, response): - ''' Write values of coils, trigger next cycle + """ Write values of coils, trigger next cycle :param response: The response to process - ''' + """ self.endpoint.write(response.getBit(0)) self.endpoint.write(response.getBit(1)) self.endpoint.write(response.getBit(2)) reactor.callLater(CLIENT_DELAY, self.fetch_holding_registers) def error_handler(self, failure): - ''' Handle any twisted errors + """ Handle any twisted errors :param failure: The error to handle - ''' + """ log.error(failure) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # a factory for the example protocol -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # This is used to build client protocol's if you tie into twisted's method # of processing. It basically produces client instances of the underlying # protocol:: @@ -103,82 +103,85 @@ def error_handler(self, failure): # Factory(Protocol) -> ProtocolInstance # # It also persists data between client instances (think protocol singelton). -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class ExampleFactory(ClientFactory): protocol = ExampleProtocol def __init__(self, framer, endpoint): - ''' Remember things necessary for building a protocols ''' + """ Remember things necessary for building a protocols """ self.framer = framer self.endpoint = endpoint def buildProtocol(self, _): - ''' Create a protocol and start the reading cycle ''' + """ Create a protocol and start the reading cycle """ proto = self.protocol(self.framer, self.endpoint) proto.factory = self return proto -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # a custom client for our device -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Twisted provides a number of helper methods for creating and starting # clients: # - protocol.ClientCreator # - reactor.connectTCP # # How you start your client is really up to you. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class SerialModbusClient(serialport.SerialPort): def __init__(self, factory, *args, **kwargs): - ''' Setup the client and start listening on the serial port + """ Setup the client and start listening on the serial port :param factory: The factory to build clients with - ''' + """ protocol = factory.buildProtocol(None) self.decoder = ClientDecoder() serialport.SerialPort.__init__(self, protocol, *args, **kwargs) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # a custom endpoint for our results -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # An example line reader, this can replace with: # - the TCP protocol # - a context recorder # - a database or file recorder -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class LoggingLineReader(object): def write(self, response): - ''' Handle the next modbus response + """ Handle the next modbus response :param response: The response to process - ''' + """ log.info("Read Data: %d" % response) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # start running the processor -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # This initializes the client, the framer, the factory, and starts the # twisted event loop (the reactor). It should be noted that a number of # things could be chanegd as one sees fit: # - The ModbusRtuFramer could be replaced with a ModbusAsciiFramer # - The SerialModbusClient could be replaced with reactor.connectTCP # - The LineReader endpoint could be replaced with a database store -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + + def main(): log.debug("Initializing the client") - framer = ModbusFramer(ClientDecoder()) - reader = LoggingLineReader() + framer = ModbusFramer(ClientDecoder()) + reader = LoggingLineReader() factory = ExampleFactory(framer, reader) SerialModbusClient(factory, SERIAL_PORT, reactor) - #factory = reactor.connectTCP("localhost", 502, factory) + # factory = reactor.connectTCP("localhost", 502, factory) log.debug("Starting the client") reactor.run() + if __name__ == "__main__": main() diff --git a/examples/common/asynchronous_server.py b/examples/common/asynchronous_server.py new file mode 100755 index 000000000..ea545a568 --- /dev/null +++ b/examples/common/asynchronous_server.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python +""" +Pymodbus Asynchronous Server Example +-------------------------------------------------------------------------- + +The asynchronous server is a high performance implementation using the +twisted library as its backend. This allows it to scale to many thousands +of nodes which can be helpful for testing monitoring software. +""" +# --------------------------------------------------------------------------- # +# import the various server implementations +# --------------------------------------------------------------------------- # +from pymodbus.server.async import StartTcpServer +from pymodbus.server.async import StartUdpServer +from pymodbus.server.async import StartSerialServer + +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSequentialDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext +from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + + +def run_async_server(): + # ----------------------------------------------------------------------- # + # initialize your data store + # ----------------------------------------------------------------------- # + # The datastores only respond to the addresses that they are initialized to + # Therefore, if you initialize a DataBlock to addresses from 0x00 to 0xFF, + # a request to 0x100 will respond with an invalid address exception. + # This is because many devices exhibit this kind of behavior (but not all) + # + # block = ModbusSequentialDataBlock(0x00, [0]*0xff) + # + # Continuing, you can choose to use a sequential or a sparse DataBlock in + # your data context. The difference is that the sequential has no gaps in + # the data while the sparse can. Once again, there are devices that exhibit + # both forms of behavior:: + # + # block = ModbusSparseDataBlock({0x00: 0, 0x05: 1}) + # block = ModbusSequentialDataBlock(0x00, [0]*5) + # + # Alternately, you can use the factory methods to initialize the DataBlocks + # or simply do not pass them to have them initialized to 0x00 on the full + # address range:: + # + # store = ModbusSlaveContext(di = ModbusSequentialDataBlock.create()) + # store = ModbusSlaveContext() + # + # Finally, you are allowed to use the same DataBlock reference for every + # table or you you may use a seperate DataBlock for each table. + # This depends if you would like functions to be able to access and modify + # the same data or not:: + # + # block = ModbusSequentialDataBlock(0x00, [0]*0xff) + # store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) + # + # The server then makes use of a server context that allows the server to + # respond with different slave contexts for different unit ids. By default + # it will return the same context for every unit id supplied (broadcast + # mode). + # However, this can be overloaded by setting the single flag to False + # and then supplying a dictionary of unit id to context mapping:: + # + # slaves = { + # 0x01: ModbusSlaveContext(...), + # 0x02: ModbusSlaveContext(...), + # 0x03: ModbusSlaveContext(...), + # } + # context = ModbusServerContext(slaves=slaves, single=False) + # + # The slave context can also be initialized in zero_mode which means that a + # request to address(0-7) will map to the address (0-7). The default is + # False which is based on section 4.4 of the specification, so address(0-7) + # will map to (1-8):: + # + # store = ModbusSlaveContext(..., zero_mode=True) + # ----------------------------------------------------------------------- # + store = ModbusSlaveContext( + di=ModbusSequentialDataBlock(0, [17]*100), + co=ModbusSequentialDataBlock(0, [17]*100), + hr=ModbusSequentialDataBlock(0, [17]*100), + ir=ModbusSequentialDataBlock(0, [17]*100)) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + # If you don't set this or any fields, they are defaulted to empty strings. + # ----------------------------------------------------------------------- # + identity = ModbusDeviceIdentification() + identity.VendorName = 'Pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' + identity.ProductName = 'Pymodbus Server' + identity.ModelName = 'Pymodbus Server' + identity.MajorMinorRevision = '1.0' + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + + StartTcpServer(context, identity=identity, address=("localhost", 5020)) + # StartUdpServer(context, identity=identity, address=("localhost", 502)) + # StartSerialServer(context, identity=identity, + # port='/dev/pts/3', framer=ModbusRtuFramer) + # StartSerialServer(context, identity=identity, + # port='/dev/pts/3', framer=ModbusAsciiFramer) + + +if __name__ == "__main__": + run_async_server() + diff --git a/examples/common/callback-server.py b/examples/common/callback-server.py deleted file mode 100755 index 572b13841..000000000 --- a/examples/common/callback-server.py +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Server With Callbacks --------------------------------------------------------------------------- - -This is an example of adding callbacks to a running modbus server -when a value is written to it. In order for this to work, it needs -a device-mapping file. -''' -#---------------------------------------------------------------------------# -# import the modbus libraries we need -#---------------------------------------------------------------------------# -from pymodbus.server.async import StartTcpServer -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSparseDataBlock -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext -from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer - - -#---------------------------------------------------------------------------# -# import the python libraries we need -#---------------------------------------------------------------------------# -from multiprocessing import Queue, Process - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# create your custom data block with callbacks -#---------------------------------------------------------------------------# - -class CallbackDataBlock(ModbusSparseDataBlock): - ''' A datablock that stores the new value in memory - and passes the operation to a message queue for further - processing. - ''' - - def __init__(self, devices, queue): - ''' - ''' - self.devices = devices - self.queue = queue - - values = {k:0 for k in devices.keys()} - values[0xbeef] = len(values) # the number of devices - super(CallbackDataBlock, self).__init__(values) - - def setValues(self, address, value): - ''' Sets the requested values of the datastore - - :param address: The starting address - :param values: The new values to be set - ''' - super(CallbackDataBlock, self).setValues(address, value) - self.queue.put((self.devices.get(address, None), value)) - -#---------------------------------------------------------------------------# -# define your callback process -#---------------------------------------------------------------------------# -def rescale_value(value): - ''' Rescale the input value from the range - of 0..100 to -3200..3200. - - :param value: The input value to scale - :returns: The rescaled value - ''' - s = 1 if value >= 50 else -1 - c = value if value < 50 else (value - 50) - return s * (c * 64) - -def device_writer(queue): - ''' A worker process that processes new messages - from a queue to write to device outputs - - :param queue: The queue to get new messages from - ''' - while True: - device, value = queue.get() - scaled = rescale_value(value[0]) - log.debug("Write(%s) = %s" % (device, value)) - if not device: continue - # do any logic here to update your devices - -#---------------------------------------------------------------------------# -# initialize your device map -#---------------------------------------------------------------------------# -def read_device_map(path): - ''' A helper method to read the device - path to address mapping from file:: - - 0x0001,/dev/device1 - 0x0002,/dev/device2 - - :param path: The path to the input file - :returns: The input mapping file - ''' - devices = {} - with open(path, 'r') as stream: - for line in stream: - piece = line.strip().split(',') - devices[int(piece[0], 16)] = piece[1] - return devices - -#---------------------------------------------------------------------------# -# initialize your data store -#---------------------------------------------------------------------------# -queue = Queue() -devices = read_device_map("device-mapping") -block = CallbackDataBlock(devices, queue) -store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# -identity = ModbusDeviceIdentification() -identity.VendorName = 'pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' -identity.ProductName = 'pymodbus Server' -identity.ModelName = 'pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -p = Process(target=device_writer, args=(queue,)) -p.start() -StartTcpServer(context, identity=identity, address=("localhost", 5020)) diff --git a/examples/common/callback_server.py b/examples/common/callback_server.py new file mode 100755 index 000000000..045ead0ef --- /dev/null +++ b/examples/common/callback_server.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python +""" +Pymodbus Server With Callbacks +-------------------------------------------------------------------------- + +This is an example of adding callbacks to a running modbus server +when a value is written to it. In order for this to work, it needs +a device-mapping file. +""" +# --------------------------------------------------------------------------- # +# import the modbus libraries we need +# --------------------------------------------------------------------------- # +from pymodbus.server.async import StartTcpServer +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSparseDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext +from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer + + +# --------------------------------------------------------------------------- # +# import the python libraries we need +# --------------------------------------------------------------------------- # +from multiprocessing import Queue, Process + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +# --------------------------------------------------------------------------- # +# create your custom data block with callbacks +# --------------------------------------------------------------------------- # + + +class CallbackDataBlock(ModbusSparseDataBlock): + """ A datablock that stores the new value in memory + and passes the operation to a message queue for further + processing. + """ + + def __init__(self, devices, queue): + """ + """ + self.devices = devices + self.queue = queue + + values = {k: 0 for k in devices.keys()} + values[0xbeef] = len(values) # the number of devices + super(CallbackDataBlock, self).__init__(values) + + def setValues(self, address, value): + """ Sets the requested values of the datastore + + :param address: The starting address + :param values: The new values to be set + """ + super(CallbackDataBlock, self).setValues(address, value) + self.queue.put((self.devices.get(address, None), value)) + +# --------------------------------------------------------------------------- # +# define your callback process +# --------------------------------------------------------------------------- # + + +def rescale_value(value): + """ Rescale the input value from the range + of 0..100 to -3200..3200. + + :param value: The input value to scale + :returns: The rescaled value + """ + s = 1 if value >= 50 else -1 + c = value if value < 50 else (value - 50) + return s * (c * 64) + + +def device_writer(queue): + """ A worker process that processes new messages + from a queue to write to device outputs + + :param queue: The queue to get new messages from + """ + while True: + device, value = queue.get() + scaled = rescale_value(value[0]) + log.debug("Write(%s) = %s" % (device, value)) + if not device: continue + # do any logic here to update your devices + +# --------------------------------------------------------------------------- # +# initialize your device map +# --------------------------------------------------------------------------- # + + +def read_device_map(path): + """ A helper method to read the device + path to address mapping from file:: + + 0x0001,/dev/device1 + 0x0002,/dev/device2 + + :param path: The path to the input file + :returns: The input mapping file + """ + devices = {} + with open(path, 'r') as stream: + for line in stream: + piece = line.strip().split(',') + devices[int(piece[0], 16)] = piece[1] + return devices + + +def run_callback_server(): + # ----------------------------------------------------------------------- # + # initialize your data store + # ----------------------------------------------------------------------- # + queue = Queue() + devices = read_device_map("device-mapping") + block = CallbackDataBlock(devices, queue) + store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + identity = ModbusDeviceIdentification() + identity.VendorName = 'pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' + identity.ProductName = 'pymodbus Server' + identity.ModelName = 'pymodbus Server' + identity.MajorMinorRevision = '1.0' + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + p = Process(target=device_writer, args=(queue,)) + p.start() + StartTcpServer(context, identity=identity, address=("localhost", 5020)) + + +if __name__ == "__main__": + run_callback_server() + diff --git a/examples/common/changing-framers.py b/examples/common/changing-framers.py deleted file mode 100755 index 4aa5832e5..000000000 --- a/examples/common/changing-framers.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Client Framer Overload --------------------------------------------------------------------------- - -All of the modbus clients are designed to have pluggable framers -so that the transport and protocol are decoupled. This allows a user -to define or plug in their custom protocols into existing transports -(like a binary framer over a serial connection). - -It should be noted that although you are not limited to trying whatever -you would like, the library makes no gurantees that all framers with -all transports will produce predictable or correct results (for example -tcp transport with an RTU framer). However, please let us know of any -success cases that are not documented! -''' -#---------------------------------------------------------------------------# -# import the modbus client and the framers -#---------------------------------------------------------------------------# -from pymodbus.client.sync import ModbusTcpClient as ModbusClient - -#---------------------------------------------------------------------------# -# Import the modbus framer that you want -#---------------------------------------------------------------------------# -#---------------------------------------------------------------------------# -#from pymodbus.transaction import ModbusSocketFramer as ModbusFramer -from pymodbus.transaction import ModbusRtuFramer as ModbusFramer -#from pymodbus.transaction import ModbusBinaryFramer as ModbusFramer -#from pymodbus.transaction import ModbusAsciiFramer as ModbusFramer - -#---------------------------------------------------------------------------# -# configure the client logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# Initialize the client -#---------------------------------------------------------------------------# -client = ModbusClient('localhost', port=5020, framer=ModbusFramer) -client.connect() - -#---------------------------------------------------------------------------# -# perform your requests -#---------------------------------------------------------------------------# -rq = client.write_coil(1, True) -rr = client.read_coils(1,1) -assert(rq.function_code < 0x80) # test that we are not an error -assert(rr.bits[0] == True) # test the expected value - -#---------------------------------------------------------------------------# -# close the client -#---------------------------------------------------------------------------# -client.close() diff --git a/examples/common/changing_framers.py b/examples/common/changing_framers.py new file mode 100755 index 000000000..4391d7a00 --- /dev/null +++ b/examples/common/changing_framers.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +""" +Pymodbus Client Framer Overload +-------------------------------------------------------------------------- + +All of the modbus clients are designed to have pluggable framers +so that the transport and protocol are decoupled. This allows a user +to define or plug in their custom protocols into existing transports +(like a binary framer over a serial connection). + +It should be noted that although you are not limited to trying whatever +you would like, the library makes no gurantees that all framers with +all transports will produce predictable or correct results (for example +tcp transport with an RTU framer). However, please let us know of any +success cases that are not documented! +""" +# --------------------------------------------------------------------------- # +# import the modbus client and the framers +# --------------------------------------------------------------------------- # +from pymodbus.client.sync import ModbusTcpClient as ModbusClient + +# --------------------------------------------------------------------------- # +# Import the modbus framer that you want +# --------------------------------------------------------------------------- # +# --------------------------------------------------------------------------- # +#from pymodbus.transaction import ModbusSocketFramer as ModbusFramer +from pymodbus.transaction import ModbusRtuFramer as ModbusFramer +#from pymodbus.transaction import ModbusBinaryFramer as ModbusFramer +#from pymodbus.transaction import ModbusAsciiFramer as ModbusFramer + +# --------------------------------------------------------------------------- # +# configure the client logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +if __name__ == "__main__": + # ----------------------------------------------------------------------- # + # Initialize the client + # ----------------------------------------------------------------------- # + client = ModbusClient('localhost', port=5020, framer=ModbusFramer) + client.connect() + + # ----------------------------------------------------------------------- # + # perform your requests + # ----------------------------------------------------------------------- # + rq = client.write_coil(1, True) + rr = client.read_coils(1,1) + assert(rq.function_code < 0x80) # test that we are not an error + assert(rr.bits[0] == True) # test the expected value + + # ----------------------------------------------------------------------- # + # close the client + # ---------------------------------------------------------------------- # + client.close() diff --git a/examples/common/custom-datablock.py b/examples/common/custom-datablock.py deleted file mode 100755 index 481240f1b..000000000 --- a/examples/common/custom-datablock.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Server With Custom Datablock Side Effect --------------------------------------------------------------------------- - -This is an example of performing custom logic after a value has been -written to the datastore. -''' -#---------------------------------------------------------------------------# -# import the modbus libraries we need -#---------------------------------------------------------------------------# -from __future__ import print_function -from pymodbus.server.async import StartTcpServer -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSparseDataBlock -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext -from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# - -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# create your custom data block here -#---------------------------------------------------------------------------# - -class CustomDataBlock(ModbusSparseDataBlock): - ''' A datablock that stores the new value in memory - and performs a custom action after it has been stored. - ''' - - def setValues(self, address, value): - ''' Sets the requested values of the datastore - - :param address: The starting address - :param values: The new values to be set - ''' - super(ModbusSparseDataBlock, self).setValues(address, value) - - # whatever you want to do with the written value is done here, - # however make sure not to do too much work here or it will - # block the server, espectially if the server is being written - # to very quickly - print("wrote {} to {}".format(value, address)) - - -#---------------------------------------------------------------------------# -# initialize your data store -#---------------------------------------------------------------------------# - -block = CustomDataBlock([0]*100) -store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# - -identity = ModbusDeviceIdentification() -identity.VendorName = 'pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' -identity.ProductName = 'pymodbus Server' -identity.ModelName = 'pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# - -# p = Process(target=device_writer, args=(queue,)) -# p.start() -StartTcpServer(context, identity=identity, address=("localhost", 5020)) diff --git a/examples/common/custom_datablock.py b/examples/common/custom_datablock.py new file mode 100755 index 000000000..a9873bcb6 --- /dev/null +++ b/examples/common/custom_datablock.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Pymodbus Server With Custom Datablock Side Effect +-------------------------------------------------------------------------- + +This is an example of performing custom logic after a value has been +written to the datastore. +""" +# --------------------------------------------------------------------------- # +# import the modbus libraries we need +# --------------------------------------------------------------------------- # +from __future__ import print_function +from pymodbus.server.async import StartTcpServer +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSparseDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext +from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # + +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +# --------------------------------------------------------------------------- # +# create your custom data block here +# --------------------------------------------------------------------------- # + + +class CustomDataBlock(ModbusSparseDataBlock): + """ A datablock that stores the new value in memory + and performs a custom action after it has been stored. + """ + + def setValues(self, address, value): + """ Sets the requested values of the datastore + + :param address: The starting address + :param values: The new values to be set + """ + super(ModbusSparseDataBlock, self).setValues(address, value) + + # whatever you want to do with the written value is done here, + # however make sure not to do too much work here or it will + # block the server, espectially if the server is being written + # to very quickly + print("wrote {} to {}".format(value, address)) + + +def run_custom_db_server(): + # ----------------------------------------------------------------------- # + # initialize your data store + # ----------------------------------------------------------------------- # + block = CustomDataBlock([0]*100) + store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + + identity = ModbusDeviceIdentification() + identity.VendorName = 'pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' + identity.ProductName = 'pymodbus Server' + identity.ModelName = 'pymodbus Server' + identity.MajorMinorRevision = '1.0' + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + + # p = Process(target=device_writer, args=(queue,)) + # p.start() + StartTcpServer(context, identity=identity, address=("localhost", 5020)) + + +if __name__ == "__main__": + run_custom_db_server() + + diff --git a/examples/common/custom-message.py b/examples/common/custom_message.py similarity index 58% rename from examples/common/custom-message.py rename to examples/common/custom_message.py index 940680bef..22f55736d 100755 --- a/examples/common/custom-message.py +++ b/examples/common/custom_message.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -''' +""" Pymodbus Synchrnonous Client Examples -------------------------------------------------------------------------- @@ -12,31 +12,37 @@ with ModbusClient('127.0.0.1') as client: result = client.read_coils(1,10) print result -''' +""" import struct -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # import the various server implementations -#---------------------------------------------------------------------------# -from pymodbus.pdu import ModbusRequest, ModbusResponse +# --------------------------------------------------------------------------- # +from pymodbus.pdu import ModbusRequest, ModbusResponse, ModbusExceptions from pymodbus.client.sync import ModbusTcpClient as ModbusClient - -#---------------------------------------------------------------------------# +from pymodbus.bit_read_message import ReadCoilsRequest +# --------------------------------------------------------------------------- # # configure the client logging -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # import logging logging.basicConfig() log = logging.getLogger() log.setLevel(logging.DEBUG) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # create your custom message -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # The following is simply a read coil request that always reads 16 coils. # Since the function code is already registered with the decoder factory, # this will be decoded as a read coil response. If you implement a new # method that is not currently implemented, you must register the request # and response with a ClientDecoder factory. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + + +class CustomModbusResponse(ModbusResponse): + pass + + class CustomModbusRequest(ModbusRequest): function_code = 1 @@ -54,34 +60,37 @@ def decode(self, data): def execute(self, context): if not (1 <= self.count <= 0x7d0): - return self.doException(merror.IllegalValue) + return self.doException(ModbusExceptions.IllegalValue) if not context.validate(self.function_code, self.address, self.count): - return self.doException(merror.IllegalAddress) - values = context.getValues(self.function_code, self.address, self.count) + return self.doException(ModbusExceptions.IllegalAddress) + values = context.getValues(self.function_code, self.address, + self.count) return CustomModbusResponse(values) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # This could also have been defined as -#---------------------------------------------------------------------------# -from pymodbus.bit_read_message import ReadCoilsRequest +# --------------------------------------------------------------------------- # + class Read16CoilsRequest(ReadCoilsRequest): def __init__(self, address): - ''' Initializes a new instance + """ Initializes a new instance :param address: The address to start reading from - ''' + """ ReadCoilsRequest.__init__(self, address, 16) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # execute the request with your client -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # using the with context, the client will automatically be connected # and closed when it leaves the current scope. -#---------------------------------------------------------------------------# -with ModbusClient('127.0.0.1') as client: - request = CustomModbusRequest(0) - result = client.execute(request) - print result +# --------------------------------------------------------------------------- # + +if __name__ == "__main__": + with ModbusClient('127.0.0.1') as client: + request = CustomModbusRequest(0) + result = client.execute(request) + print(result) diff --git a/examples/common/dbstore-update-server.py b/examples/common/dbstore-update-server.py deleted file mode 100644 index b0ce87bf0..000000000 --- a/examples/common/dbstore-update-server.py +++ /dev/null @@ -1,94 +0,0 @@ -''' -Pymodbus Server With Updating Thread --------------------------------------------------------------------------- -This is an example of having a background thread updating the -context in an SQLite4 database while the server is operating. - -This scrit generates a random address range (within 0 - 65000) and a random -value and stores it in a database. It then reads the same address to verify -that the process works as expected - -This can also be done with a python thread:: - from threading import Thread - thread = Thread(target=updating_writer, args=(context,)) - thread.start() -''' -#---------------------------------------------------------------------------# -# import the modbus libraries we need -#---------------------------------------------------------------------------# -from pymodbus.server.async import StartTcpServer -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSequentialDataBlock -from pymodbus.datastore import ModbusServerContext -from pymodbus.datastore.database import SqlSlaveContext -from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer -import random - -#---------------------------------------------------------------------------# -# import the twisted libraries we need -#---------------------------------------------------------------------------# -from twisted.internet.task import LoopingCall - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# define your callback process -#---------------------------------------------------------------------------# -def updating_writer(a): - ''' A worker process that runs every so often and - updates live values of the context which resides in an SQLite3 database. - It should be noted that there is a race condition for the update. - :param arguments: The input arguments to the call - ''' - log.debug("Updating the database context") - context = a[0] - readfunction = 0x03 # read holding registers - writefunction = 0x10 - slave_id = 0x01 # slave address - count = 50 - - # import pdb; pdb.set_trace() - - rand_value = random.randint(0, 9999) - rand_addr = random.randint(0, 65000) - log.debug("Writing to datastore: {}, {}".format(rand_addr, rand_value)) - # import pdb; pdb.set_trace() - context[slave_id].setValues(writefunction, rand_addr, [rand_value]) - values = context[slave_id].getValues(readfunction, rand_addr, count) - log.debug("Values from datastore: " + str(values)) - - - -#---------------------------------------------------------------------------# -# initialize your data store -#---------------------------------------------------------------------------# -block = ModbusSequentialDataBlock(0x00, [0]*0xff) -store = SqlSlaveContext(block) - -context = ModbusServerContext(slaves={1: store}, single=False) - - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# -identity = ModbusDeviceIdentification() -identity.VendorName = 'pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' -identity.ProductName = 'pymodbus Server' -identity.ModelName = 'pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -time = 5 # 5 seconds delay -loop = LoopingCall(f=updating_writer, a=(context,)) -loop.start(time, now=False) # initially delay by time -StartTcpServer(context, identity=identity, address=("", 5020)) diff --git a/examples/common/dbstore_update_server.py b/examples/common/dbstore_update_server.py new file mode 100644 index 000000000..7119a31b2 --- /dev/null +++ b/examples/common/dbstore_update_server.py @@ -0,0 +1,102 @@ +""" +Pymodbus Server With Updating Thread +-------------------------------------------------------------------------- +This is an example of having a background thread updating the +context in an SQLite4 database while the server is operating. + +This scrit generates a random address range (within 0 - 65000) and a random +value and stores it in a database. It then reads the same address to verify +that the process works as expected + +This can also be done with a python thread:: + from threading import Thread + thread = Thread(target=updating_writer, args=(context,)) + thread.start() +""" +# --------------------------------------------------------------------------- # +# import the modbus libraries we need +# --------------------------------------------------------------------------- # +from pymodbus.server.async import StartTcpServer +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSequentialDataBlock +from pymodbus.datastore import ModbusServerContext +from pymodbus.datastore.database import SqlSlaveContext +from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer +import random + +# --------------------------------------------------------------------------- # +# import the twisted libraries we need +# --------------------------------------------------------------------------- # +from twisted.internet.task import LoopingCall + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +# --------------------------------------------------------------------------- # +# define your callback process +# --------------------------------------------------------------------------- # + + +def updating_writer(a): + """ A worker process that runs every so often and + updates live values of the context which resides in an SQLite3 database. + It should be noted that there is a race condition for the update. + :param arguments: The input arguments to the call + """ + log.debug("Updating the database context") + context = a[0] + readfunction = 0x03 # read holding registers + writefunction = 0x10 + slave_id = 0x01 # slave address + count = 50 + + # import pdb; pdb.set_trace() + + rand_value = random.randint(0, 9999) + rand_addr = random.randint(0, 65000) + log.debug("Writing to datastore: {}, {}".format(rand_addr, rand_value)) + # import pdb; pdb.set_trace() + context[slave_id].setValues(writefunction, rand_addr, [rand_value]) + values = context[slave_id].getValues(readfunction, rand_addr, count) + log.debug("Values from datastore: " + str(values)) + + +def run_dbstore_update_server(): + # ----------------------------------------------------------------------- # + # initialize your data store + # ----------------------------------------------------------------------- # + + block = ModbusSequentialDataBlock(0x00, [0] * 0xff) + store = SqlSlaveContext(block) + + context = ModbusServerContext(slaves={1: store}, single=False) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + identity = ModbusDeviceIdentification() + identity.VendorName = 'pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' + identity.ProductName = 'pymodbus Server' + identity.ModelName = 'pymodbus Server' + identity.MajorMinorRevision = '1.0' + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + time = 5 # 5 seconds delay + loop = LoopingCall(f=updating_writer, a=(context,)) + loop.start(time, now=False) # initially delay by time + StartTcpServer(context, identity=identity, address=("", 5020)) + + +if __name__ == "__main__": + run_dbstore_update_server() + + diff --git a/examples/common/device-mapping b/examples/common/device_mapping similarity index 100% rename from examples/common/device-mapping rename to examples/common/device_mapping diff --git a/examples/common/modbus-logging.py b/examples/common/modbus-logging.py deleted file mode 100755 index 0d133efc9..000000000 --- a/examples/common/modbus-logging.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Logging Examples --------------------------------------------------------------------------- -''' -import logging -import logging.handlers as Handlers - -#---------------------------------------------------------------------------# -# This will simply send everything logged to console -#---------------------------------------------------------------------------# -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# This will send the error messages in the specified namespace to a file. -# The available namespaces in pymodbus are as follows: -#---------------------------------------------------------------------------# -# * pymodbus.* - The root namespace -# * pymodbus.server.* - all logging messages involving the modbus server -# * pymodbus.client.* - all logging messages involving the client -# * pymodbus.protocol.* - all logging messages inside the protocol layer -#---------------------------------------------------------------------------# -logging.basicConfig() -log = logging.getLogger('pymodbus.server') -log.setLevel(logging.ERROR) - -#---------------------------------------------------------------------------# -# This will send the error messages to the specified handlers: -# * docs.python.org/library/logging.html -#---------------------------------------------------------------------------# -log = logging.getLogger('pymodbus') -log.setLevel(logging.ERROR) -handlers = [ - Handlers.RotatingFileHandler("logfile", maxBytes=1024*1024), - Handlers.SMTPHandler("mx.host.com", "pymodbus@host.com", ["support@host.com"], "Pymodbus"), - Handlers.SysLogHandler(facility="daemon"), - Handlers.DatagramHandler('localhost', 12345), -] -[log.addHandler(h) for h in handlers] diff --git a/examples/common/modbus-payload-server.py b/examples/common/modbus-payload-server.py deleted file mode 100755 index b2b55ebeb..000000000 --- a/examples/common/modbus-payload-server.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Server Payload Example --------------------------------------------------------------------------- - -If you want to initialize a server context with a complicated memory -layout, you can actually use the payload builder. -''' -#---------------------------------------------------------------------------# -# import the various server implementations -#---------------------------------------------------------------------------# -from pymodbus.server.sync import StartTcpServer - -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSequentialDataBlock -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext - -#---------------------------------------------------------------------------# -# import the payload builder -#---------------------------------------------------------------------------# - -from pymodbus.constants import Endian -from pymodbus.payload import BinaryPayloadDecoder -from pymodbus.payload import BinaryPayloadBuilder - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# build your payload -#---------------------------------------------------------------------------# -builder = BinaryPayloadBuilder(endian=Endian.Little) -# builder.add_string('abcdefgh') -# builder.add_32bit_float(22.34) -# builder.add_16bit_uint(4660) -# builder.add_8bit_int(18) -builder.add_bits([0,1,0,1,1,0,1,0]) - -#---------------------------------------------------------------------------# -# use that payload in the data store -#---------------------------------------------------------------------------# -# Here we use the same reference block for each underlying store. -#---------------------------------------------------------------------------# - -block = ModbusSequentialDataBlock(1, builder.to_registers()) -store = ModbusSlaveContext(di = block, co = block, hr = block, ir = block) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# -# If you don't set this or any fields, they are defaulted to empty strings. -#---------------------------------------------------------------------------# -identity = ModbusDeviceIdentification() -identity.VendorName = 'Pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' -identity.ProductName = 'Pymodbus Server' -identity.ModelName = 'Pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -StartTcpServer(context, identity=identity, address=("localhost", 5020)) diff --git a/examples/common/modbus-payload.py b/examples/common/modbus-payload.py deleted file mode 100755 index cd349387a..000000000 --- a/examples/common/modbus-payload.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Payload Building/Decoding Example --------------------------------------------------------------------------- - -# Run modbus-payload-server.py or synchronous-server.py to check the behavior -''' -from pymodbus.constants import Endian -from pymodbus.payload import BinaryPayloadDecoder -from pymodbus.payload import BinaryPayloadBuilder -from pymodbus.client.sync import ModbusTcpClient as ModbusClient -from pymodbus.compat import iteritems - -#---------------------------------------------------------------------------# -# configure the client logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.INFO) - -#---------------------------------------------------------------------------# -# We are going to use a simple client to send our requests -#---------------------------------------------------------------------------# -client = ModbusClient('127.0.0.1', port=5020) -client.connect() - -#---------------------------------------------------------------------------# -# If you need to build a complex message to send, you can use the payload -# builder to simplify the packing logic. -# -# Here we demonstrate packing a random payload layout, unpacked it looks -# like the following: -# -# - a 8 byte string 'abcdefgh' -# - a 32 bit float 22.34 -# - a 16 bit unsigned int 0x1234 -# - another 16 bit unsigned int 0x5678 -# - an 8 bit int 0x12 -# - an 8 bit bitstring [0,1,0,1,1,0,1,0] -#---------------------------------------------------------------------------# -builder = BinaryPayloadBuilder(endian=Endian.Big) -builder.add_string('abcdefgh') -builder.add_32bit_float(22.34) -builder.add_16bit_uint(0x1234) -builder.add_16bit_uint(0x5678) -builder.add_8bit_int(0x12) -builder.add_bits([0,1,0,1,1,0,1,0]) -payload = builder.build() -address = 0 -result = client.write_registers(address, payload, skip_encode=True, unit=1) - -#---------------------------------------------------------------------------# -# If you need to decode a collection of registers in a weird layout, the -# payload decoder can help you as well. -# -# Here we demonstrate decoding a random register layout, unpacked it looks -# like the following: -# -# - a 8 byte string 'abcdefgh' -# - a 32 bit float 22.34 -# - a 16 bit unsigned int 0x1234 -# - another 16 bit unsigned int which we will ignore -# - an 8 bit int 0x12 -# - an 8 bit bitstring [0,1,0,1,1,0,1,0] -#---------------------------------------------------------------------------# -address = 0x00 -count = 8 -result = client.read_holding_registers(address, count, unit=1) -decoder = BinaryPayloadDecoder.fromRegisters(result.registers, endian=Endian.Big) -decoded = { - 'string': decoder.decode_string(8), - 'float': decoder.decode_32bit_float(), - '16uint': decoder.decode_16bit_uint(), - 'ignored': decoder.skip_bytes(2), - '8int': decoder.decode_8bit_int(), - 'bits': decoder.decode_bits(), -} - -print("-" * 60) -print("Decoded Data") -print("-" * 60) -for name, value in iteritems(decoded): - print ("%s\t" % name, value) - -#---------------------------------------------------------------------------# -# close the client -#---------------------------------------------------------------------------# -client.close() diff --git a/examples/common/modbus_logging.py b/examples/common/modbus_logging.py new file mode 100755 index 000000000..fdac5bea1 --- /dev/null +++ b/examples/common/modbus_logging.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +""" +Pymodbus Logging Examples +-------------------------------------------------------------------------- +""" +import logging +import logging.handlers as Handlers + +if __name__ == "__main__": + # ----------------------------------------------------------------------- # + # This will simply send everything logged to console + # ----------------------------------------------------------------------- # + logging.basicConfig() + log = logging.getLogger() + log.setLevel(logging.DEBUG) + + # ----------------------------------------------------------------------- # + # This will send the error messages in the specified namespace to a file. + # The available namespaces in pymodbus are as follows: + # ----------------------------------------------------------------------- # + # * pymodbus.* - The root namespace + # * pymodbus.server.* - all logging messages involving the modbus server + # * pymodbus.client.* - all logging messages involving the client + # * pymodbus.protocol.* - all logging messages inside the protocol layer + # ----------------------------------------------------------------------- # + logging.basicConfig() + log = logging.getLogger('pymodbus.server') + log.setLevel(logging.ERROR) + + # ----------------------------------------------------------------------- # + # This will send the error messages to the specified handlers: + # * docs.python.org/library/logging.html + # ----------------------------------------------------------------------- # + log = logging.getLogger('pymodbus') + log.setLevel(logging.ERROR) + handlers = [ + Handlers.RotatingFileHandler("logfile", maxBytes=1024*1024), + Handlers.SMTPHandler("mx.host.com", + "pymodbus@host.com", + ["support@host.com"], + "Pymodbus"), + Handlers.SysLogHandler(facility="daemon"), + Handlers.DatagramHandler('localhost', 12345), + ] + [log.addHandler(h) for h in handlers] + diff --git a/examples/common/modbus_payload.py b/examples/common/modbus_payload.py new file mode 100755 index 000000000..a00944a1b --- /dev/null +++ b/examples/common/modbus_payload.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +""" +Pymodbus Payload Building/Decoding Example +-------------------------------------------------------------------------- + +# Run modbus-payload-server.py or synchronous-server.py to check the behavior +""" +from pymodbus.constants import Endian +from pymodbus.payload import BinaryPayloadDecoder +from pymodbus.payload import BinaryPayloadBuilder +from pymodbus.client.sync import ModbusTcpClient as ModbusClient +from pymodbus.compat import iteritems + +# --------------------------------------------------------------------------- # +# configure the client logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.INFO) + + +def run_binary_payload_ex(): + # ----------------------------------------------------------------------- # + # We are going to use a simple client to send our requests + # ----------------------------------------------------------------------- # + client = ModbusClient('127.0.0.1', port=5020) + client.connect() + + # ----------------------------------------------------------------------- # + # If you need to build a complex message to send, you can use the payload + # builder to simplify the packing logic. + # + # Here we demonstrate packing a random payload layout, unpacked it looks + # like the following: + # + # - a 8 byte string 'abcdefgh' + # - a 32 bit float 22.34 + # - a 16 bit unsigned int 0x1234 + # - another 16 bit unsigned int 0x5678 + # - an 8 bit int 0x12 + # - an 8 bit bitstring [0,1,0,1,1,0,1,0] + # ----------------------------------------------------------------------- # + builder = BinaryPayloadBuilder(endian=Endian.Big) + builder.add_string('abcdefgh') + builder.add_32bit_float(22.34) + builder.add_16bit_uint(0x1234) + builder.add_16bit_uint(0x5678) + builder.add_8bit_int(0x12) + builder.add_bits([0,1,0,1,1,0,1,0]) + payload = builder.build() + address = 0 + result = client.write_registers(address, payload, skip_encode=True, unit=1) + + # ----------------------------------------------------------------------- # + # If you need to decode a collection of registers in a weird layout, the + # payload decoder can help you as well. + # + # Here we demonstrate decoding a random register layout, unpacked it looks + # like the following: + # + # - a 8 byte string 'abcdefgh' + # - a 32 bit float 22.34 + # - a 16 bit unsigned int 0x1234 + # - another 16 bit unsigned int which we will ignore + # - an 8 bit int 0x12 + # - an 8 bit bitstring [0,1,0,1,1,0,1,0] + # ----------------------------------------------------------------------- # + address = 0x00 + count = 8 + result = client.read_holding_registers(address, count, unit=1) + decoder = BinaryPayloadDecoder.fromRegisters(result.registers, + endian=Endian.Big) + decoded = { + 'string': decoder.decode_string(8), + 'float': decoder.decode_32bit_float(), + '16uint': decoder.decode_16bit_uint(), + 'ignored': decoder.skip_bytes(2), + '8int': decoder.decode_8bit_int(), + 'bits': decoder.decode_bits(), + } + + print("-" * 60) + print("Decoded Data") + print("-" * 60) + for name, value in iteritems(decoded): + print("%s\t" % name, value) + + # ----------------------------------------------------------------------- # + # close the client + # ----------------------------------------------------------------------- # + client.close() + + +if __name__ == "__main__": + run_binary_payload_ex() diff --git a/examples/common/modbus_payload_server.py b/examples/common/modbus_payload_server.py new file mode 100755 index 000000000..d61739c5c --- /dev/null +++ b/examples/common/modbus_payload_server.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +""" +Pymodbus Server Payload Example +-------------------------------------------------------------------------- + +If you want to initialize a server context with a complicated memory +layout, you can actually use the payload builder. +""" +# --------------------------------------------------------------------------- # +# import the various server implementations +# --------------------------------------------------------------------------- # +from pymodbus.server.sync import StartTcpServer + +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSequentialDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext + +# --------------------------------------------------------------------------- # +# import the payload builder +# --------------------------------------------------------------------------- # + +from pymodbus.constants import Endian +from pymodbus.payload import BinaryPayloadDecoder +from pymodbus.payload import BinaryPayloadBuilder + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + + +def run_payload_server(): + # ----------------------------------------------------------------------- # + # build your payload + # ----------------------------------------------------------------------- # + builder = BinaryPayloadBuilder(endian=Endian.Little) + # builder.add_string('abcdefgh') + # builder.add_32bit_float(22.34) + # builder.add_16bit_uint(4660) + # builder.add_8bit_int(18) + builder.add_bits([0, 1, 0, 1, 1, 0, 1, 0]) + + # ----------------------------------------------------------------------- # + # use that payload in the data store + # ----------------------------------------------------------------------- # + # Here we use the same reference block for each underlying store. + # ----------------------------------------------------------------------- # + + block = ModbusSequentialDataBlock(1, builder.to_registers()) + store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + # If you don't set this or any fields, they are defaulted to empty strings. + # ----------------------------------------------------------------------- # + identity = ModbusDeviceIdentification() + identity.VendorName = 'Pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' + identity.ProductName = 'Pymodbus Server' + identity.ModelName = 'Pymodbus Server' + identity.MajorMinorRevision = '1.0' + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + StartTcpServer(context, identity=identity, address=("localhost", 5020)) + + +if __name__ == "__main__": + run_payload_server() + diff --git a/examples/common/performance.py b/examples/common/performance.py index 0a193d9d3..51b67d58f 100755 --- a/examples/common/performance.py +++ b/examples/common/performance.py @@ -1,64 +1,72 @@ #!/usr/bin/env python -''' +""" Pymodbus Performance Example -------------------------------------------------------------------------- The following is an quick performance check of the synchronous modbus client. -''' -#---------------------------------------------------------------------------# +""" +# --------------------------------------------------------------------------- # # import the necessary modules #---------------------------------------------------------------------------# from __future__ import print_function import logging, os from time import time -from multiprocessing import log_to_stderr # from pymodbus.client.sync import ModbusTcpClient from pymodbus.client.sync import ModbusSerialClient -#---------------------------------------------------------------------------# +try: + from multiprocessing import log_to_stderr +except ImportError: + import logging + logging.basicConfig() + log_to_stderr = logging.getLogger + +# --------------------------------------------------------------------------- # # choose between threads or processes -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + #from multiprocessing import Process as Worker from threading import Thread as Worker from threading import Lock _thread_lock = Lock() -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # initialize the test -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Modify the parameters below to control how we are testing the client: # # * workers - the number of workers to use at once # * cycles - the total number of requests to send # * host - the host to send the requests to -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # workers = 10 -cycles = 1000 -host = '127.0.0.1' +cycles = 1000 +host = '127.0.0.1' -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # perform the test -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # This test is written such that it can be used by many threads of processes # although it should be noted that there are performance penalties # associated with each strategy. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # def single_client_test(host, cycles): - ''' Performs a single threaded test of a synchronous + """ Performs a single threaded test of a synchronous client against the specified host :param host: The host to connect to :param cycles: The number of iterations to perform - ''' + """ logger = log_to_stderr() logger.setLevel(logging.DEBUG) logger.debug("starting worker: %d" % os.getpid()) try: - count = 0 + count = 0 # client = ModbusTcpClient(host, port=5020) - client = ModbusSerialClient(method="rtu", port="/dev/ttyp0", baudrate=9600) + client = ModbusSerialClient(method="rtu", + port="/dev/ttyp0", baudrate=9600) while count < cycles: with _thread_lock: client.read_holding_registers(10, 1, unit=1).registers[0] @@ -67,9 +75,9 @@ def single_client_test(host, cycles): logger.exception("failed to run test successfully") logger.debug("finished worker: %d" % os.getpid()) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # run our test and check results -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # We shard the total number of requests to perform between the number of # threads that was specified. We then start all the threads and block on # them to finish. This may need to switch to another mechanism to signal @@ -78,12 +86,17 @@ def single_client_test(host, cycles): # RTU 32 requests/second @9600 # TCP 31430 requests/second -#---------------------------------------------------------------------------# -args = (host, int(cycles * 1.0 / workers)) -procs = [Worker(target=single_client_test, args=args) for _ in range(workers)] -start = time() -any(p.start() for p in procs) # start the workers -any(p.join() for p in procs) # wait for the workers to finish -stop = time() -print("%d requests/second" % ((1.0 * cycles) / (stop - start))) -print("time taken to complete %s cycle by %s workers is %s seconds" % (cycles, workers, stop-start)) +# --------------------------------------------------------------------------- # + + +if __name__ == "__main__": + args = (host, int(cycles * 1.0 / workers)) + procs = [Worker(target=single_client_test, args=args) + for _ in range(workers)] + start = time() + any(p.start() for p in procs) # start the workers + any(p.join() for p in procs) # wait for the workers to finish + stop = time() + print("%d requests/second" % ((1.0 * cycles) / (stop - start))) + print("time taken to complete %s cycle by " + "%s workers is %s seconds" % (cycles, workers, stop-start)) diff --git a/examples/common/synchronous-client-ext.py b/examples/common/synchronous-client-ext.py deleted file mode 100755 index df4bda3e3..000000000 --- a/examples/common/synchronous-client-ext.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Synchronous Client Extended Examples --------------------------------------------------------------------------- - -The following is an example of how to use the synchronous modbus client -implementation from pymodbus to perform the extended portions of the -modbus protocol. -''' -#---------------------------------------------------------------------------# -# import the various server implementations -#---------------------------------------------------------------------------# -# from pymodbus.client.sync import ModbusTcpClient as ModbusClient -#from pymodbus.client.sync import ModbusUdpClient as ModbusClient -from pymodbus.client.sync import ModbusSerialClient as ModbusClient - -#---------------------------------------------------------------------------# -# configure the client logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# choose the client you want -#---------------------------------------------------------------------------# -# make sure to start an implementation to hit against. For this -# you can use an existing device, the reference implementation in the tools -# directory, or start a pymodbus server. -# -# It should be noted that you can supply an ipv4 or an ipv6 host address for -# both the UDP and TCP clients. -#---------------------------------------------------------------------------# -client = ModbusClient(method='rtu', port="/dev/ttyp0") -# client = ModbusClient('127.0.0.1', port=5020) -client.connect() - -#---------------------------------------------------------------------------# -# import the extended messages to perform -#---------------------------------------------------------------------------# -from pymodbus.diag_message import * -from pymodbus.file_message import * -from pymodbus.other_message import * -from pymodbus.mei_message import * - -#---------------------------------------------------------------------------# -# extra requests -#---------------------------------------------------------------------------# -# If you are performing a request that is not available in the client -# mixin, you have to perform the request like this instead:: -# -# from pymodbus.diag_message import ClearCountersRequest -# from pymodbus.diag_message import ClearCountersResponse -# -# request = ClearCountersRequest() -# response = client.execute(request) -# if isinstance(response, ClearCountersResponse): -# ... do something with the response -# -# -# What follows is a listing of all the supported methods. Feel free to -# comment, uncomment, or modify each result set to match with your reference. -#---------------------------------------------------------------------------# - -#---------------------------------------------------------------------------# -# information requests -#---------------------------------------------------------------------------# -rq = ReadDeviceInformationRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference -assert(rr.function_code < 0x80) # test that we are not an error -assert(rr.information[0] == b'Pymodbus') # test the vendor name -assert(rr.information[1] == b'PM') # test the product code -assert(rr.information[2] == b'1.0') # test the code revision - -rq = ReportSlaveIdRequest(unit=1) -rr = client.execute(rq) -# assert(rr == None) # not supported by reference -#assert(rr.function_code < 0x80) # test that we are not an error -#assert(rr.identifier == 0x00) # test the slave identifier -#assert(rr.status == 0x00) # test that the status is ok - -rq = ReadExceptionStatusRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference -#assert(rr.function_code < 0x80) # test that we are not an error -#assert(rr.status == 0x55) # test the status code - -rq = GetCommEventCounterRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference -#assert(rr.function_code < 0x80) # test that we are not an error -#assert(rr.status == True) # test the status code -#assert(rr.count == 0x00) # test the status code - -rq = GetCommEventLogRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference -#assert(rr.function_code < 0x80) # test that we are not an error -#assert(rr.status == True) # test the status code -#assert(rr.event_count == 0x00) # test the number of events -#assert(rr.message_count == 0x00) # test the number of messages -#assert(len(rr.events) == 0x00) # test the number of events - -#---------------------------------------------------------------------------# -# diagnostic requests -#---------------------------------------------------------------------------# -rq = ReturnQueryDataRequest(unit=1) -rr = client.execute(rq) -# assert(rr == None) # not supported by reference -#assert(rr.message[0] == 0x0000) # test the resulting message - -rq = RestartCommunicationsOptionRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference -#assert(rr.message == 0x0000) # test the resulting message - -rq = ReturnDiagnosticRegisterRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ChangeAsciiInputDelimiterRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ForceListenOnlyModeRequest(unit=1) -client.execute(rq) # does not send a response - -rq = ClearCountersRequest() -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnBusCommunicationErrorCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnBusExceptionErrorCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnSlaveMessageCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnSlaveNoResponseCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnSlaveNAKCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnSlaveBusyCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnSlaveBusCharacterOverrunCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ReturnIopOverrunCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = ClearOverrunCountRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -rq = GetClearModbusPlusRequest(unit=1) -rr = client.execute(rq) -#assert(rr == None) # not supported by reference - -#---------------------------------------------------------------------------# -# close the client -#---------------------------------------------------------------------------# -client.close() diff --git a/examples/common/synchronous-client.py b/examples/common/synchronous-client.py deleted file mode 100755 index 686c05c27..000000000 --- a/examples/common/synchronous-client.py +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Synchronous Client Examples --------------------------------------------------------------------------- - -The following is an example of how to use the synchronous modbus client -implementation from pymodbus. - -It should be noted that the client can also be used with -the guard construct that is available in python 2.5 and up:: - - with ModbusClient('127.0.0.1') as client: - result = client.read_coils(1,10) - print result -''' -#---------------------------------------------------------------------------# -# import the various server implementations -#---------------------------------------------------------------------------# -from pymodbus.client.sync import ModbusTcpClient as ModbusClient -#from pymodbus.client.sync import ModbusUdpClient as ModbusClient -# from pymodbus.client.sync import ModbusSerialClient as ModbusClient - -#---------------------------------------------------------------------------# -# configure the client logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# choose the client you want -#---------------------------------------------------------------------------# -# make sure to start an implementation to hit against. For this -# you can use an existing device, the reference implementation in the tools -# directory, or start a pymodbus server. -# -# If you use the UDP or TCP clients, you can override the framer being used -# to use a custom implementation (say RTU over TCP). By default they use the -# socket framer:: -# -# client = ModbusClient('localhost', port=5020, framer=ModbusRtuFramer) -# -# It should be noted that you can supply an ipv4 or an ipv6 host address for -# both the UDP and TCP clients. -# -# There are also other options that can be set on the client that controls -# how transactions are performed. The current ones are: -# -# * retries - Specify how many retries to allow per transaction (default = 3) -# * retry_on_empty - Is an empty response a retry (default = False) -# * source_address - Specifies the TCP source address to bind to -# -# Here is an example of using these options:: -# -# client = ModbusClient('localhost', retries=3, retry_on_empty=True) -#---------------------------------------------------------------------------# -client = ModbusClient('localhost', port=5020) -#client = ModbusClient(method='ascii', port='/dev/pts/2', timeout=1) -# client = ModbusClient(method='rtu', port='/dev/ttyp0', timeout=1) -client.connect() - -#---------------------------------------------------------------------------# -# specify slave to query -#---------------------------------------------------------------------------# -# The slave to query is specified in an optional parameter for each -# individual request. This can be done by specifying the `unit` parameter -# which defaults to `0x00` -#---------------------------------------------------------------------------# -log.debug("Reading Coils") -rr = client.read_coils(1, 1, unit=0x01) - -#---------------------------------------------------------------------------# -# example requests -#---------------------------------------------------------------------------# -# simply call the methods that you would like to use. An example session -# is displayed below along with some assert checks. Note that some modbus -# implementations differentiate holding/input discrete/coils and as such -# you will not be able to write to these, therefore the starting values -# are not known to these tests. Furthermore, some use the same memory -# blocks for the two sets, so a change to one is a change to the other. -# Keep both of these cases in mind when testing as the following will -# _only_ pass with the supplied async modbus server (script supplied). -#---------------------------------------------------------------------------# -log.debug("Write to a Coil and read back") -rq = client.write_coil(0, True, unit=1) -rr = client.read_coils(0, 1, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error -assert(rr.bits[0] == True) # test the expected value - -log.debug("Write to multiple coils and read back- test 1") -rq = client.write_coils(1, [True]*8, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error -rr = client.read_coils(1, 21, unit=1) -assert(rr.function_code < 0x80) # test that we are not an error -resp = [True]*21 - -# If the returned output quantity is not a multiple of eight, -# the remaining bits in the final data byte will be padded with zeros -# (toward the high order end of the byte). - -resp.extend([False]*3) -assert(rr.bits == resp) # test the expected value - -log.debug("Write to multiple coils and read back - test 2") -rq = client.write_coils(1, [False]*8, unit=1) -rr = client.read_coils(1, 8, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error -assert(rr.bits == [False]*8) # test the expected value - - -log.debug("Read discrete inputs") -rr = client.read_discrete_inputs(0, 8, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error - -log.debug("Write to a holding register and read back") -rq = client.write_register(1, 10, unit=1) -rr = client.read_holding_registers(1, 1, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error -assert(rr.registers[0] == 10) # test the expected value - -log.debug("Write to multiple holding registers and read back") -rq = client.write_registers(1, [10]*8, unit=1) -rr = client.read_holding_registers(1, 8, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error -assert(rr.registers == [10]*8) # test the expected value - -log.debug("Read input registers") -rr = client.read_input_registers(1, 8, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error - -arguments = { - 'read_address': 1, - 'read_count': 8, - 'write_address': 1, - 'write_registers': [20]*8, -} -log.debug("Read write registeres simulataneously") -rq = client.readwrite_registers(unit=1, **arguments) -rr = client.read_holding_registers(1, 8, unit=1) -assert(rq.function_code < 0x80) # test that we are not an error -assert(rq.registers == [20]*8) # test the expected value -assert(rr.registers == [20]*8) # test the expected value - -#---------------------------------------------------------------------------# -# close the client -#---------------------------------------------------------------------------# -client.close() diff --git a/examples/common/synchronous-server.py b/examples/common/synchronous-server.py deleted file mode 100755 index 72e830183..000000000 --- a/examples/common/synchronous-server.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Synchronous Server Example --------------------------------------------------------------------------- - -The synchronous server is implemented in pure python without any third -party libraries (unless you need to use the serial protocols which require -pyserial). This is helpful in constrained or old environments where using -twisted just is not feasable. What follows is an examle of its use: -''' -#---------------------------------------------------------------------------# -# import the various server implementations -#---------------------------------------------------------------------------# -from pymodbus.server.sync import StartTcpServer -from pymodbus.server.sync import StartUdpServer -from pymodbus.server.sync import StartSerialServer - -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSequentialDataBlock -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext - -from pymodbus.transaction import ModbusRtuFramer -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# initialize your data store -#---------------------------------------------------------------------------# -# The datastores only respond to the addresses that they are initialized to. -# Therefore, if you initialize a DataBlock to addresses of 0x00 to 0xFF, a -# request to 0x100 will respond with an invalid address exception. This is -# because many devices exhibit this kind of behavior (but not all):: -# -# block = ModbusSequentialDataBlock(0x00, [0]*0xff) -# -# Continuing, you can choose to use a sequential or a sparse DataBlock in -# your data context. The difference is that the sequential has no gaps in -# the data while the sparse can. Once again, there are devices that exhibit -# both forms of behavior:: -# -# block = ModbusSparseDataBlock({0x00: 0, 0x05: 1}) -# block = ModbusSequentialDataBlock(0x00, [0]*5) -# -# Alternately, you can use the factory methods to initialize the DataBlocks -# or simply do not pass them to have them initialized to 0x00 on the full -# address range:: -# -# store = ModbusSlaveContext(di = ModbusSequentialDataBlock.create()) -# store = ModbusSlaveContext() -# -# Finally, you are allowed to use the same DataBlock reference for every -# table or you you may use a seperate DataBlock for each table. This depends -# if you would like functions to be able to access and modify the same data -# or not:: -# -# block = ModbusSequentialDataBlock(0x00, [0]*0xff) -# store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) -# -# The server then makes use of a server context that allows the server to -# respond with different slave contexts for different unit ids. By default -# it will return the same context for every unit id supplied (broadcast -# mode). However, this can be overloaded by setting the single flag to False -# and then supplying a dictionary of unit id to context mapping:: -# -# slaves = { -# 0x01: ModbusSlaveContext(...), -# 0x02: ModbusSlaveContext(...), -# 0x03: ModbusSlaveContext(...), -# } -# context = ModbusServerContext(slaves=slaves, single=False) -# -# The slave context can also be initialized in zero_mode which means that a -# request to address(0-7) will map to the address (0-7). The default is -# False which is based on section 4.4 of the specification, so address(0-7) -# will map to (1-8):: -# -# store = ModbusSlaveContext(..., zero_mode=True) -#---------------------------------------------------------------------------# -store = ModbusSlaveContext( - di = ModbusSequentialDataBlock(0, [17]*100), - co = ModbusSequentialDataBlock(0, [17]*100), - hr = ModbusSequentialDataBlock(0, [17]*100), - ir = ModbusSequentialDataBlock(0, [17]*100)) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# -# If you don't set this or any fields, they are defaulted to empty strings. -#---------------------------------------------------------------------------# -identity = ModbusDeviceIdentification() -identity.VendorName = 'Pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/riptideio/pymodbus/' -identity.ProductName = 'Pymodbus Server' -identity.ModelName = 'Pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -# Tcp: -StartTcpServer(context, identity=identity, address=("localhost", 5020)) - -# Udp: -#StartUdpServer(context, identity=identity, address=("localhost", 502)) - -# Ascii: -#StartSerialServer(context, identity=identity, port='/dev/pts/3', timeout=1) - -# RTU: -# StartSerialServer(context, framer=ModbusRtuFramer, identity=identity, port='/dev/ptyp0', timeout=.005, baudrate=9600) diff --git a/examples/common/synchronous_client.py b/examples/common/synchronous_client.py new file mode 100755 index 000000000..d583586b1 --- /dev/null +++ b/examples/common/synchronous_client.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python +""" +Pymodbus Synchronous Client Examples +-------------------------------------------------------------------------- + +The following is an example of how to use the synchronous modbus client +implementation from pymodbus. + +It should be noted that the client can also be used with +the guard construct that is available in python 2.5 and up:: + + with ModbusClient('127.0.0.1') as client: + result = client.read_coils(1,10) + print result +""" +# --------------------------------------------------------------------------- # +# import the various server implementations +# --------------------------------------------------------------------------- # +from pymodbus.client.sync import ModbusTcpClient as ModbusClient +#from pymodbus.client.sync import ModbusUdpClient as ModbusClient +# from pymodbus.client.sync import ModbusSerialClient as ModbusClient + +# --------------------------------------------------------------------------- # +# configure the client logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +UNIT = 0x1 + + +def run_sync_client(): + # ------------------------------------------------------------------------# + # choose the client you want + # ------------------------------------------------------------------------# + # make sure to start an implementation to hit against. For this + # you can use an existing device, the reference implementation in the tools + # directory, or start a pymodbus server. + # + # If you use the UDP or TCP clients, you can override the framer being used + # to use a custom implementation (say RTU over TCP). By default they use + # the socket framer:: + # + # client = ModbusClient('localhost', port=5020, framer=ModbusRtuFramer) + # + # It should be noted that you can supply an ipv4 or an ipv6 host address + # for both the UDP and TCP clients. + # + # There are also other options that can be set on the client that controls + # how transactions are performed. The current ones are: + # + # * retries - Specify how many retries to allow per transaction (default=3) + # * retry_on_empty - Is an empty response a retry (default = False) + # * source_address - Specifies the TCP source address to bind to + # + # Here is an example of using these options:: + # + # client = ModbusClient('localhost', retries=3, retry_on_empty=True) + # ------------------------------------------------------------------------# + client = ModbusClient('localhost', port=5020) + # client = ModbusClient(method='ascii', port='/dev/pts/2', timeout=1) + # client = ModbusClient(method='rtu', port='/dev/ttyp0', timeout=1) + client.connect() + + # ------------------------------------------------------------------------# + # specify slave to query + # ------------------------------------------------------------------------# + # The slave to query is specified in an optional parameter for each + # individual request. This can be done by specifying the `unit` parameter + # which defaults to `0x00` + # ----------------------------------------------------------------------- # + log.debug("Reading Coils") + rr = client.read_coils(1, 1, unit=0x01) + print(rr) + + # ----------------------------------------------------------------------- # + # example requests + # ----------------------------------------------------------------------- # + # simply call the methods that you would like to use. An example session + # is displayed below along with some assert checks. Note that some modbus + # implementations differentiate holding/input discrete/coils and as such + # you will not be able to write to these, therefore the starting values + # are not known to these tests. Furthermore, some use the same memory + # blocks for the two sets, so a change to one is a change to the other. + # Keep both of these cases in mind when testing as the following will + # _only_ pass with the supplied async modbus server (script supplied). + # ----------------------------------------------------------------------- # + log.debug("Write to a Coil and read back") + rq = client.write_coil(0, True, unit=UNIT) + rr = client.read_coils(0, 1, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + assert(rr.bits[0] == True) # test the expected value + + log.debug("Write to multiple coils and read back- test 1") + rq = client.write_coils(1, [True]*8, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + rr = client.read_coils(1, 21, unit=UNIT) + assert(rr.function_code < 0x80) # test that we are not an error + resp = [True]*21 + + # If the returned output quantity is not a multiple of eight, + # the remaining bits in the final data byte will be padded with zeros + # (toward the high order end of the byte). + + resp.extend([False]*3) + assert(rr.bits == resp) # test the expected value + + log.debug("Write to multiple coils and read back - test 2") + rq = client.write_coils(1, [False]*8, unit=UNIT) + rr = client.read_coils(1, 8, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + assert(rr.bits == [False]*8) # test the expected value + + log.debug("Read discrete inputs") + rr = client.read_discrete_inputs(0, 8, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + + log.debug("Write to a holding register and read back") + rq = client.write_register(1, 10, unit=UNIT) + rr = client.read_holding_registers(1, 1, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + assert(rr.registers[0] == 10) # test the expected value + + log.debug("Write to multiple holding registers and read back") + rq = client.write_registers(1, [10]*8, unit=UNIT) + rr = client.read_holding_registers(1, 8, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + assert(rr.registers == [10]*8) # test the expected value + + log.debug("Read input registers") + rr = client.read_input_registers(1, 8, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + + arguments = { + 'read_address': 1, + 'read_count': 8, + 'write_address': 1, + 'write_registers': [20]*8, + } + log.debug("Read write registeres simulataneously") + rq = client.readwrite_registers(unit=UNIT, **arguments) + rr = client.read_holding_registers(1, 8, unit=UNIT) + assert(rq.function_code < 0x80) # test that we are not an error + assert(rq.registers == [20]*8) # test the expected value + assert(rr.registers == [20]*8) # test the expected value + + # ----------------------------------------------------------------------- # + # close the client + # ----------------------------------------------------------------------- # + client.close() + + +if __name__ == "__main__": + run_sync_client() diff --git a/examples/common/synchronous_client_ext.py b/examples/common/synchronous_client_ext.py new file mode 100755 index 000000000..637873a6f --- /dev/null +++ b/examples/common/synchronous_client_ext.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python +""" +Pymodbus Synchronous Client Extended Examples +-------------------------------------------------------------------------- + +The following is an example of how to use the synchronous modbus client +implementation from pymodbus to perform the extended portions of the +modbus protocol. +""" +# --------------------------------------------------------------------------- # +# import the various server implementations +# --------------------------------------------------------------------------- # +# from pymodbus.client.sync import ModbusTcpClient as ModbusClient +# from pymodbus.client.sync import ModbusUdpClient as ModbusClient +from pymodbus.client.sync import ModbusSerialClient as ModbusClient + +# --------------------------------------------------------------------------- # +# import the extended messages to perform +# --------------------------------------------------------------------------- # +from pymodbus.diag_message import * +from pymodbus.file_message import * +from pymodbus.other_message import * +from pymodbus.mei_message import * + +# --------------------------------------------------------------------------- # +# configure the client logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +UNIT = 0x01 + + +def execute_extended_requests(): + # ------------------------------------------------------------------------# + # choose the client you want + # ------------------------------------------------------------------------# + # make sure to start an implementation to hit against. For this + # you can use an existing device, the reference implementation in the tools + # directory, or start a pymodbus server. + # + # It should be noted that you can supply an ipv4 or an ipv6 host address + # for both the UDP and TCP clients. + # ------------------------------------------------------------------------# + client = ModbusClient(method='rtu', port="/dev/ttyp0") + # client = ModbusClient('127.0.0.1', port=5020) + client.connect() + + # ----------------------------------------------------------------------- # + # extra requests + # ----------------------------------------------------------------------- # + # If you are performing a request that is not available in the client + # mixin, you have to perform the request like this instead:: + # + # from pymodbus.diag_message import ClearCountersRequest + # from pymodbus.diag_message import ClearCountersResponse + # + # request = ClearCountersRequest() + # response = client.execute(request) + # if isinstance(response, ClearCountersResponse): + # ... do something with the response + # + # + # What follows is a listing of all the supported methods. Feel free to + # comment, uncomment, or modify each result set to match with your ref. + # ----------------------------------------------------------------------- # + + # ----------------------------------------------------------------------- # + # information requests + # ----------------------------------------------------------------------- # + log.debug("Running ReadDeviceInformationRequest") + rq = ReadDeviceInformationRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert (rr.function_code < 0x80) # test that we are not an error + # assert (rr.information[0] == b'Pymodbus') # test the vendor name + # assert (rr.information[1] == b'PM') # test the product code + # assert (rr.information[2] == b'1.0') # test the code revision + + log.debug("Running ReportSlaveIdRequest") + rq = ReportSlaveIdRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert(rr.function_code < 0x80) # test that we are not an error + # assert(rr.identifier == 0x00) # test the slave identifier + # assert(rr.status == 0x00) # test that the status is ok + + log.debug("Running ReadExceptionStatusRequest") + rq = ReadExceptionStatusRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert(rr.function_code < 0x80) # test that we are not an error + # assert(rr.status == 0x55) # test the status code + + log.debug("Running GetCommEventCounterRequest") + rq = GetCommEventCounterRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert(rr.function_code < 0x80) # test that we are not an error + # assert(rr.status == True) # test the status code + # assert(rr.count == 0x00) # test the status code + + log.debug("Running GetCommEventLogRequest") + rq = GetCommEventLogRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert(rr.function_code < 0x80) # test that we are not an error + # assert(rr.status == True) # test the status code + # assert(rr.event_count == 0x00) # test the number of events + # assert(rr.message_count == 0x00) # test the number of messages + # assert(len(rr.events) == 0x00) # test the number of events + + # ------------------------------------------------------------------------# + # diagnostic requests + # ------------------------------------------------------------------------# + log.debug("Running ReturnQueryDataRequest") + rq = ReturnQueryDataRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert(rr.message[0] == 0x0000) # test the resulting message + + log.debug("Running RestartCommunicationsOptionRequest") + rq = RestartCommunicationsOptionRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + # assert(rr.message == 0x0000) # test the resulting message + + log.debug("Running ReturnDiagnosticRegisterRequest") + rq = ReturnDiagnosticRegisterRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ChangeAsciiInputDelimiterRequest") + rq = ChangeAsciiInputDelimiterRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ForceListenOnlyModeRequest") + rq = ForceListenOnlyModeRequest(unit=UNIT) + rr = client.execute(rq) # does not send a response + print(rr) + + log.debug("Running ClearCountersRequest") + rq = ClearCountersRequest() + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnBusCommunicationErrorCountRequest") + rq = ReturnBusCommunicationErrorCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnBusExceptionErrorCountRequest") + rq = ReturnBusExceptionErrorCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnSlaveMessageCountRequest") + rq = ReturnSlaveMessageCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnSlaveNoResponseCountRequest") + rq = ReturnSlaveNoResponseCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnSlaveNAKCountRequest") + rq = ReturnSlaveNAKCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnSlaveBusyCountRequest") + rq = ReturnSlaveBusyCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnSlaveBusCharacterOverrunCountRequest") + rq = ReturnSlaveBusCharacterOverrunCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ReturnIopOverrunCountRequest") + rq = ReturnIopOverrunCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running ClearOverrunCountRequest") + rq = ClearOverrunCountRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + log.debug("Running GetClearModbusPlusRequest") + rq = GetClearModbusPlusRequest(unit=UNIT) + rr = client.execute(rq) + print(rr) + # assert(rr == None) # not supported by reference + + # ------------------------------------------------------------------------# + # close the client + # ------------------------------------------------------------------------# + client.close() + + +if __name__ == "__main__": + execute_extended_requests() + + + + + diff --git a/examples/common/synchronous_server.py b/examples/common/synchronous_server.py new file mode 100755 index 000000000..e5ad9486e --- /dev/null +++ b/examples/common/synchronous_server.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python +""" +Pymodbus Synchronous Server Example +-------------------------------------------------------------------------- + +The synchronous server is implemented in pure python without any third +party libraries (unless you need to use the serial protocols which require +pyserial). This is helpful in constrained or old environments where using +twisted just is not feasable. What follows is an examle of its use: +""" +# --------------------------------------------------------------------------- # +# import the various server implementations +# --------------------------------------------------------------------------- # +from pymodbus.server.sync import StartTcpServer +from pymodbus.server.sync import StartUdpServer +from pymodbus.server.sync import StartSerialServer + +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSequentialDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext + +from pymodbus.transaction import ModbusRtuFramer +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + + +def run_server(): + # ----------------------------------------------------------------------- # + # initialize your data store + # ----------------------------------------------------------------------- # + # The datastores only respond to the addresses that they are initialized to + # Therefore, if you initialize a DataBlock to addresses of 0x00 to 0xFF, a + # request to 0x100 will respond with an invalid address exception. This is + # because many devices exhibit this kind of behavior (but not all):: + # + # block = ModbusSequentialDataBlock(0x00, [0]*0xff) + # + # Continuing, you can choose to use a sequential or a sparse DataBlock in + # your data context. The difference is that the sequential has no gaps in + # the data while the sparse can. Once again, there are devices that exhibit + # both forms of behavior:: + # + # block = ModbusSparseDataBlock({0x00: 0, 0x05: 1}) + # block = ModbusSequentialDataBlock(0x00, [0]*5) + # + # Alternately, you can use the factory methods to initialize the DataBlocks + # or simply do not pass them to have them initialized to 0x00 on the full + # address range:: + # + # store = ModbusSlaveContext(di = ModbusSequentialDataBlock.create()) + # store = ModbusSlaveContext() + # + # Finally, you are allowed to use the same DataBlock reference for every + # table or you you may use a seperate DataBlock for each table. + # This depends if you would like functions to be able to access and modify + # the same data or not:: + # + # block = ModbusSequentialDataBlock(0x00, [0]*0xff) + # store = ModbusSlaveContext(di=block, co=block, hr=block, ir=block) + # + # The server then makes use of a server context that allows the server to + # respond with different slave contexts for different unit ids. By default + # it will return the same context for every unit id supplied (broadcast + # mode). + # However, this can be overloaded by setting the single flag to False and + # then supplying a dictionary of unit id to context mapping:: + # + # slaves = { + # 0x01: ModbusSlaveContext(...), + # 0x02: ModbusSlaveContext(...), + # 0x03: ModbusSlaveContext(...), + # } + # context = ModbusServerContext(slaves=slaves, single=False) + # + # The slave context can also be initialized in zero_mode which means that a + # request to address(0-7) will map to the address (0-7). The default is + # False which is based on section 4.4 of the specification, so address(0-7) + # will map to (1-8):: + # + # store = ModbusSlaveContext(..., zero_mode=True) + # ----------------------------------------------------------------------- # + store = ModbusSlaveContext( + di = ModbusSequentialDataBlock(0, [17]*100), + co = ModbusSequentialDataBlock(0, [17]*100), + hr = ModbusSequentialDataBlock(0, [17]*100), + ir = ModbusSequentialDataBlock(0, [17]*100)) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + # If you don't set this or any fields, they are defaulted to empty strings. + # ----------------------------------------------------------------------- # + identity = ModbusDeviceIdentification() + identity.VendorName = 'Pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/riptideio/pymodbus/' + identity.ProductName = 'Pymodbus Server' + identity.ModelName = 'Pymodbus Server' + identity.MajorMinorRevision = '1.0' + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + # Tcp: + StartTcpServer(context, identity=identity, address=("localhost", 5020)) + + # Udp: + # StartUdpServer(context, identity=identity, address=("localhost", 502)) + + # Ascii: + # StartSerialServer(context, identity=identity, + # port='/dev/pts/3', timeout=1) + + # RTU: + # StartSerialServer(context, framer=ModbusRtuFramer, identity=identity, + # port='/dev/ptyp0', timeout=.005, baudrate=9600) + + +if __name__ == "__main__": + run_server() + diff --git a/examples/common/updating-server.py b/examples/common/updating-server.py deleted file mode 100755 index fc24cba5d..000000000 --- a/examples/common/updating-server.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Server With Updating Thread --------------------------------------------------------------------------- - -This is an example of having a background thread updating the -context while the server is operating. This can also be done with -a python thread:: - - from threading import Thread - - thread = Thread(target=updating_writer, args=(context,)) - thread.start() -''' -#---------------------------------------------------------------------------# -# import the modbus libraries we need -#---------------------------------------------------------------------------# -from pymodbus.server.async import StartTcpServer -from pymodbus.device import ModbusDeviceIdentification -from pymodbus.datastore import ModbusSequentialDataBlock -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext -from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer - -#---------------------------------------------------------------------------# -# import the twisted libraries we need -#---------------------------------------------------------------------------# -from twisted.internet.task import LoopingCall - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# define your callback process -#---------------------------------------------------------------------------# -def updating_writer(a): - ''' A worker process that runs every so often and - updates live values of the context. It should be noted - that there is a race condition for the update. - - :param arguments: The input arguments to the call - ''' - log.debug("updating the context") - context = a[0] - register = 3 - slave_id = 0x00 - address = 0x10 - values = context[slave_id].getValues(register, address, count=5) - values = [v + 1 for v in values] - log.debug("new values: " + str(values)) - context[slave_id].setValues(register, address, values) - -#---------------------------------------------------------------------------# -# initialize your data store -#---------------------------------------------------------------------------# -store = ModbusSlaveContext( - di = ModbusSequentialDataBlock(0, [17]*100), - co = ModbusSequentialDataBlock(0, [17]*100), - hr = ModbusSequentialDataBlock(0, [17]*100), - ir = ModbusSequentialDataBlock(0, [17]*100)) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# initialize the server information -#---------------------------------------------------------------------------# -identity = ModbusDeviceIdentification() -identity.VendorName = 'pymodbus' -identity.ProductCode = 'PM' -identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' -identity.ProductName = 'pymodbus Server' -identity.ModelName = 'pymodbus Server' -identity.MajorMinorRevision = '1.0' - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -time = 5 # 5 seconds delay -loop = LoopingCall(f=updating_writer, a=(context,)) -loop.start(time, now=False) # initially delay by time -StartTcpServer(context, identity=identity, address=("localhost", 5020)) diff --git a/examples/common/updating_server.py b/examples/common/updating_server.py new file mode 100755 index 000000000..7b7b6be98 --- /dev/null +++ b/examples/common/updating_server.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +""" +Pymodbus Server With Updating Thread +-------------------------------------------------------------------------- + +This is an example of having a background thread updating the +context while the server is operating. This can also be done with +a python thread:: + + from threading import Thread + + thread = Thread(target=updating_writer, args=(context,)) + thread.start() +""" +# --------------------------------------------------------------------------- # +# import the modbus libraries we need +# --------------------------------------------------------------------------- # +from pymodbus.server.async import StartTcpServer +from pymodbus.device import ModbusDeviceIdentification +from pymodbus.datastore import ModbusSequentialDataBlock +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext +from pymodbus.transaction import ModbusRtuFramer, ModbusAsciiFramer + +# --------------------------------------------------------------------------- # +# import the twisted libraries we need +# --------------------------------------------------------------------------- # +from twisted.internet.task import LoopingCall + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + +# --------------------------------------------------------------------------- # +# define your callback process +# --------------------------------------------------------------------------- # + + +def updating_writer(a): + """ A worker process that runs every so often and + updates live values of the context. It should be noted + that there is a race condition for the update. + + :param arguments: The input arguments to the call + """ + log.debug("updating the context") + context = a[0] + register = 3 + slave_id = 0x00 + address = 0x10 + values = context[slave_id].getValues(register, address, count=5) + values = [v + 1 for v in values] + log.debug("new values: " + str(values)) + context[slave_id].setValues(register, address, values) + + +def run_updating_server(): + # ----------------------------------------------------------------------- # + # initialize your data store + # ----------------------------------------------------------------------- # + + store = ModbusSlaveContext( + di=ModbusSequentialDataBlock(0, [17]*100), + co=ModbusSequentialDataBlock(0, [17]*100), + hr=ModbusSequentialDataBlock(0, [17]*100), + ir=ModbusSequentialDataBlock(0, [17]*100)) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # initialize the server information + # ----------------------------------------------------------------------- # + identity = ModbusDeviceIdentification() + identity.VendorName = 'pymodbus' + identity.ProductCode = 'PM' + identity.VendorUrl = 'http://github.com/bashwork/pymodbus/' + identity.ProductName = 'pymodbus Server' + identity.ModelName = 'pymodbus Server' + identity.MajorMinorRevision = '1.0' + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + time = 5 # 5 seconds delay + loop = LoopingCall(f=updating_writer, a=(context,)) + loop.start(time, now=False) # initially delay by time + StartTcpServer(context, identity=identity, address=("localhost", 5020)) + + +if __name__ == "__main__": + run_updating_server() diff --git a/examples/contrib/bcd-payload.py b/examples/contrib/bcd_payload.py similarity index 80% rename from examples/contrib/bcd-payload.py rename to examples/contrib/bcd_payload.py index 81ca32e75..82c631460 100644 --- a/examples/contrib/bcd-payload.py +++ b/examples/contrib/bcd_payload.py @@ -1,24 +1,26 @@ -''' +""" Modbus BCD Payload Builder ----------------------------------------------------------- This is an example of building a custom payload builder that can be used in the pymodbus library. Below is a simple binary coded decimal builder and decoder. -''' +""" from struct import pack, unpack from pymodbus.constants import Endian from pymodbus.interfaces import IPayloadBuilder from pymodbus.utilities import pack_bitstring from pymodbus.utilities import unpack_bitstring from pymodbus.exceptions import ParameterException +from pymodbus.payload import BinaryPayloadDecoder + def convert_to_bcd(decimal): - ''' Converts a decimal value to a bcd value + """ Converts a decimal value to a bcd value :param value: The decimal value to to pack into bcd :returns: The number in bcd form - ''' + """ place, bcd = 0, 0 while decimal > 0: nibble = decimal % 10 @@ -29,11 +31,11 @@ def convert_to_bcd(decimal): def convert_from_bcd(bcd): - ''' Converts a bcd value to a decimal value + """ Converts a bcd value to a decimal value :param value: The value to unpack from bcd :returns: The number in decimal form - ''' + """ place, decimal = 1, 0 while bcd > 0: nibble = bcd & 0xf @@ -42,12 +44,13 @@ def convert_from_bcd(bcd): place *= 10 return decimal + def count_bcd_digits(bcd): - ''' Count the number of digits in a bcd value + """ Count the number of digits in a bcd value :param bcd: The bcd number to count the digits of :returns: The number of digits in the bcd string - ''' + """ count = 0 while bcd > 0: count += 1 @@ -56,7 +59,7 @@ def count_bcd_digits(bcd): class BcdPayloadBuilder(IPayloadBuilder): - ''' + """ A utility that helps build binary coded decimal payload messages to be written with the various modbus messages. example:: @@ -65,59 +68,59 @@ class BcdPayloadBuilder(IPayloadBuilder): builder.add_number(1) builder.add_number(int(2.234 * 1000)) payload = builder.build() - ''' + """ def __init__(self, payload=None, endian=Endian.Little): - ''' Initialize a new instance of the payload builder + """ Initialize a new instance of the payload builder :param payload: Raw payload data to initialize with :param endian: The endianess of the payload - ''' + """ self._payload = payload or [] self._endian = endian def __str__(self): - ''' Return the payload buffer as a string + """ Return the payload buffer as a string :returns: The payload buffer as a string - ''' + """ return ''.join(self._payload) def reset(self): - ''' Reset the payload buffer - ''' + """ Reset the payload buffer + """ self._payload = [] def build(self): - ''' Return the payload buffer as a list + """ Return the payload buffer as a list This list is two bytes per element and can thus be treated as a list of registers. :returns: The payload buffer as a list - ''' + """ string = str(self) length = len(string) string = string + ('\x00' * (length % 2)) - return [string[i:i+2] for i in xrange(0, length, 2)] + return [string[i:i+2] for i in range(0, length, 2)] def add_bits(self, values): - ''' Adds a collection of bits to be encoded + """ Adds a collection of bits to be encoded If these are less than a multiple of eight, they will be left padded with 0 bits to make it so. :param value: The value to add to the buffer - ''' + """ value = pack_bitstring(values) self._payload.append(value) def add_number(self, value, size=None): - ''' Adds any 8bit numeric type to the buffer + """ Adds any 8bit numeric type to the buffer :param value: The value to add to the buffer - ''' + """ encoded = [] value = convert_to_bcd(value) size = size or count_bcd_digits(value) @@ -129,15 +132,15 @@ def add_number(self, value, size=None): self._payload.extend(encoded) def add_string(self, value): - ''' Adds a string to the buffer + """ Adds a string to the buffer :param value: The value to add to the buffer - ''' + """ self._payload.append(value) class BcdPayloadDecoder(object): - ''' + """ A utility that helps decode binary coded decimal payload messages from a modbus reponse message. What follows is a simple example:: @@ -145,19 +148,19 @@ class BcdPayloadDecoder(object): decoder = BcdPayloadDecoder(payload) first = decoder.decode_int(2) second = decoder.decode_int(5) / 100 - ''' + """ def __init__(self, payload): - ''' Initialize a new payload decoder + """ Initialize a new payload decoder :param payload: The payload to decode with - ''' + """ self._payload = payload self._pointer = 0x00 @staticmethod def fromRegisters(registers, endian=Endian.Little): - ''' Initialize a payload decoder with the result of + """ Initialize a payload decoder with the result of reading a collection of registers from a modbus device. The registers are treated as a list of 2 byte values. @@ -167,7 +170,7 @@ def fromRegisters(registers, endian=Endian.Little): :param registers: The register results to initialize with :param endian: The endianess of the payload :returns: An initialized PayloadDecoder - ''' + """ if isinstance(registers, list): # repack into flat binary payload = ''.join(pack('>H', x) for x in registers) return BinaryPayloadDecoder(payload, endian) @@ -175,7 +178,7 @@ def fromRegisters(registers, endian=Endian.Little): @staticmethod def fromCoils(coils, endian=Endian.Little): - ''' Initialize a payload decoder with the result of + """ Initialize a payload decoder with the result of reading a collection of coils from a modbus device. The coils are treated as a list of bit(boolean) values. @@ -183,41 +186,42 @@ def fromCoils(coils, endian=Endian.Little): :param coils: The coil results to initialize with :param endian: The endianess of the payload :returns: An initialized PayloadDecoder - ''' + """ if isinstance(coils, list): payload = pack_bitstring(coils) return BinaryPayloadDecoder(payload, endian) raise ParameterException('Invalid collection of coils supplied') def reset(self): - ''' Reset the decoder pointer back to the start - ''' + """ Reset the decoder pointer back to the start + """ self._pointer = 0x00 def decode_int(self, size=1): - ''' Decodes a int or long from the buffer - ''' + """ Decodes a int or long from the buffer + """ self._pointer += size handle = self._payload[self._pointer - size:self._pointer] return convert_from_bcd(handle) def decode_bits(self): - ''' Decodes a byte worth of bits from the buffer - ''' + """ Decodes a byte worth of bits from the buffer + """ self._pointer += 1 handle = self._payload[self._pointer - 1:self._pointer] return unpack_bitstring(handle) def decode_string(self, size=1): - ''' Decodes a string from the buffer + """ Decodes a string from the buffer :param size: The size of the string to decode - ''' + """ self._pointer += size return self._payload[self._pointer - size:self._pointer] -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Exported Identifiers -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + __all__ = ["BcdPayloadBuilder", "BcdPayloadDecoder"] diff --git a/examples/contrib/concurrent-client.py b/examples/contrib/concurrent_client.py similarity index 64% rename from examples/contrib/concurrent-client.py rename to examples/contrib/concurrent_client.py index cd1b05ff6..b3873f845 100755 --- a/examples/contrib/concurrent-client.py +++ b/examples/contrib/concurrent_client.py @@ -1,22 +1,22 @@ #!/usr/bin/env python -''' +""" Concurrent Modbus Client --------------------------------------------------------------------------- This is an example of writing a high performance modbus client that allows a high level of concurrency by using worker threads/processes to handle writing/reading from one or more client handles at once. -''' -#--------------------------------------------------------------------------# +""" +# -------------------------------------------------------------------------- # # import system libraries -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import multiprocessing import threading -import logging -import time import itertools from collections import namedtuple +from pymodbus.compat import IS_PYTHON3 + # we are using the future from the concurrent.futures released with # python3. Alternatively we will try the backported library:: # pip install futures @@ -25,28 +25,28 @@ except ImportError: from futures import Future -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # import neccessary modbus libraries -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from pymodbus.client.common import ModbusClientMixin -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # configure the client logging -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import logging log = logging.getLogger("pymodbus") log.setLevel(logging.DEBUG) logging.basicConfig() -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Initialize out concurrency primitives -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # class _Primitives(object): - ''' This is a helper class used to group the + """ This is a helper class used to group the threading primitives depending on the type of worker situation we want to run (threads or processes). - ''' + """ def __init__(self, **kwargs): self.queue = kwargs.get('queue') @@ -54,40 +54,43 @@ def __init__(self, **kwargs): self.worker = kwargs.get('worker') @classmethod - def create(klass, in_process=False): - ''' Initialize a new instance of the concurrency + def create(cls, in_process=False): + """ Initialize a new instance of the concurrency primitives. :param in_process: True for threaded, False for processes :returns: An initialized instance of concurrency primitives - ''' + """ if in_process: - from Queue import Queue + if IS_PYTHON3: + from queue import Queue + else: + from Queue import Queue from threading import Thread from threading import Event - return klass(queue=Queue, event=Event, worker=Thread) + return cls(queue=Queue, event=Event, worker=Thread) else: from multiprocessing import Queue from multiprocessing import Event from multiprocessing import Process - return klass(queue=Queue, event=Event, worker=Process) + return cls(queue=Queue, event=Event, worker=Process) -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Define our data transfer objects -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # These will be used to serialize state between the various workers. # We use named tuples here as they are very lightweight while giving us # all the benefits of classes. -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # WorkRequest = namedtuple('WorkRequest', 'request, work_id') WorkResponse = namedtuple('WorkResponse', 'is_exception, work_id, response') -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Define our worker processes -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # def _client_worker_process(factory, input_queue, output_queue, is_shutdown): - ''' This worker process takes input requests, issues them on its + """ This worker process takes input requests, issues them on its client handle, and then sends the client response (success or failure) to the manager to deliver back to the application. @@ -98,7 +101,7 @@ def _client_worker_process(factory, input_queue, output_queue, is_shutdown): :param input_queue: The queue to pull new requests to issue :param output_queue: The queue to place client responses :param is_shutdown: Condition variable marking process shutdown - ''' + """ log.info("starting up worker : %s", threading.current_thread()) client = factory() while not is_shutdown.is_set(): @@ -110,15 +113,18 @@ def _client_worker_process(factory, input_queue, output_queue, is_shutdown): log.debug("executing request on thread: %s", workitem) result = client.execute(workitem.request) output_queue.put(WorkResponse(False, workitem.work_id, result)) - except Exception, exception: - log.exception("error in worker thread: %s", threading.current_thread()) - output_queue.put(WorkResponse(True, workitem.work_id, exception)) - except Exception, ex: pass + except Exception as exception: + log.exception("error in worker " + "thread: %s", threading.current_thread()) + output_queue.put(WorkResponse(True, + workitem.work_id, exception)) + except Exception as ex: + pass log.info("request worker shutting down: %s", threading.current_thread()) def _manager_worker_process(output_queue, futures, is_shutdown): - ''' This worker process manages taking output responses and + """ This worker process manages taking output responses and tying them back to the future keyed on the initial transaction id. Basically this can be thought of as the delivery worker. @@ -129,7 +135,7 @@ def _manager_worker_process(output_queue, futures, is_shutdown): :param output_queue: The queue holding output results to return :param futures: The mapping of tid -> future :param is_shutdown: Condition variable marking process shutdown - ''' + """ log.info("starting up manager worker: %s", threading.current_thread()) while not is_shutdown.is_set(): try: @@ -142,79 +148,87 @@ def _manager_worker_process(output_queue, futures, is_shutdown): else: future.set_result(workitem.response) log.debug("updated future result: %s", future) del futures[workitem.work_id] - except Exception, ex: log.exception("error in manager") + except Exception as ex: + log.exception("error in manager") log.info("manager worker shutting down: %s", threading.current_thread()) -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Define our concurrent client -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # class ConcurrentClient(ModbusClientMixin): - ''' This is a high performance client that can be used + """ This is a high performance client that can be used to read/write a large number of reqeusts at once asyncronously. This operates with a backing worker pool of processes or threads to achieve its performance. - ''' + """ def __init__(self, **kwargs): - ''' Initialize a new instance of the client - ''' - worker_count = kwargs.get('count', multiprocessing.cpu_count()) - self.factory = kwargs.get('factory') - primitives = _Primitives.create(kwargs.get('in_process', False)) - self.is_shutdown = primitives.event() # condition marking process shutdown - self.input_queue = primitives.queue() # input requests to process - self.output_queue = primitives.queue() # output results to return - self.futures = {} # mapping of tid -> future - self.workers = [] # handle to our worker threads - self.counter = itertools.count() + """ Initialize a new instance of the client + """ + worker_count = kwargs.get('count', multiprocessing.cpu_count()) + self.factory = kwargs.get('factory') + primitives = _Primitives.create(kwargs.get('in_process', False)) + self.is_shutdown = primitives.event() # process shutdown condition + self.input_queue = primitives.queue() # input requests to process + self.output_queue = primitives.queue() # output results to return + self.futures = {} # mapping of tid -> future + self.workers = [] # handle to our worker threads + self.counter = itertools.count() # creating the response manager - self.manager = threading.Thread(target=_manager_worker_process, - args=(self.output_queue, self.futures, self.is_shutdown)) + self.manager = threading.Thread( + target=_manager_worker_process, + args=(self.output_queue, self.futures, self.is_shutdown) + ) self.manager.start() self.workers.append(self.manager) # creating the request workers for i in range(worker_count): - worker = primitives.worker(target=_client_worker_process, - args=(self.factory, self.input_queue, self.output_queue, self.is_shutdown)) + worker = primitives.worker( + target=_client_worker_process, + args=(self.factory, self.input_queue, self.output_queue, + self.is_shutdown) + ) worker.start() self.workers.append(worker) def shutdown(self): - ''' Shutdown all the workers being used to + """ Shutdown all the workers being used to concurrently process the requests. - ''' + """ log.info("stating to shut down workers") self.is_shutdown.set() - self.output_queue.put(WorkResponse(None, None, None)) # to wake up the manager + # to wake up the manager + self.output_queue.put(WorkResponse(None, None, None)) for worker in self.workers: worker.join() log.info("finished shutting down workers") def execute(self, request): - ''' Given a request, enqueue it to be processed + """ Given a request, enqueue it to be processed and then return a future linked to the response of the call. :param request: The request to execute :returns: A future linked to the call's response - ''' - future, work_id = Future(), self.counter.next() + """ + fut, work_id = Future(), self.counter.next() self.input_queue.put(WorkRequest(request, work_id)) - self.futures[work_id] = future - return future + self.futures[work_id] = fut + return fut def execute_silently(self, request): - ''' Given a write request, enqueue it to + """ Given a write request, enqueue it to be processed without worrying about calling the application back (fire and forget) :param request: The request to execute - ''' + """ self.input_queue.put(WorkRequest(request, None)) + if __name__ == "__main__": from pymodbus.client.sync import ModbusTcpClient @@ -231,4 +245,5 @@ def client_factory(): log.info("waiting on futures to complete") for future in futures: log.info("future result: %s", future.result(timeout=1)) - finally: client.shutdown() + finally: + client.shutdown() diff --git a/examples/contrib/libmodbus-client.py b/examples/contrib/libmodbus_client.py similarity index 65% rename from examples/contrib/libmodbus-client.py rename to examples/contrib/libmodbus_client.py index 3922433f3..ee56fe14a 100755 --- a/examples/contrib/libmodbus-client.py +++ b/examples/contrib/libmodbus_client.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -''' +""" Libmodbus Protocol Wrapper ------------------------------------------------------------ @@ -23,16 +23,16 @@ sudo apt-get install libmodbus-dev pip install cffi -''' -#--------------------------------------------------------------------------# +""" +# -------------------------------------------------------------------------- # # import system libraries -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from cffi import FFI -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # import pymodbus libraries -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from pymodbus.constants import Defaults from pymodbus.exceptions import ModbusException @@ -43,11 +43,11 @@ from pymodbus.bit_write_message import WriteSingleCoilResponse, WriteMultipleCoilsResponse from pymodbus.register_write_message import WriteSingleRegisterResponse, WriteMultipleRegistersResponse -#-------------------------------------------------------------------------------- +# --------------------------------------------------------------------------- # # create the C interface -#-------------------------------------------------------------------------------- +# --------------------------------------------------------------------------- # # * TODO add the protocol needed for the servers -#-------------------------------------------------------------------------------- +# --------------------------------------------------------------------------- # compiler = FFI() compiler.cdef(""" @@ -90,54 +90,63 @@ """) LIB = compiler.dlopen('modbus') # create our bindings -#-------------------------------------------------------------------------------- +# -------------------------------------------------------------------------- # # helper utilites -#-------------------------------------------------------------------------------- +# -------------------------------------------------------------------------- # + def get_float(data): return LIB.modbus_get_float(data) + def set_float(value, data): LIB.modbus_set_float(value, data) + def cast_to_int16(data): return int(compiler.cast('int16_t', data)) + def cast_to_int32(data): return int(compiler.cast('int32_t', data)) -#-------------------------------------------------------------------------------- + +class NotImplementedException(Exception): + pass + +# -------------------------------------------------------------------------- # # level1 client -#-------------------------------------------------------------------------------- +# -------------------------------------------------------------------------- # + class LibmodbusLevel1Client(object): - ''' A raw wrapper around the libmodbus c library. Feel free + """ A raw wrapper around the libmodbus c library. Feel free to use it if you want increased performance and don't mind the entire protocol not being implemented. - ''' + """ @classmethod def create_tcp_client(klass, host='127.0.0.1', port=Defaults.Port): - ''' Create a TCP modbus client for the supplied parameters. + """ Create a TCP modbus client for the supplied parameters. - :param host: The host to connect to - :param port: The port to connect to on that host - :returns: A new level1 client - ''' + :param host: The host to connect to + :param port: The port to connect to on that host + :returns: A new level1 client + """ client = LIB.modbus_new_tcp(host.encode(), port) return klass(client) @classmethod def create_rtu_client(klass, **kwargs): - ''' Create a TCP modbus client for the supplied parameters. - - :param port: The serial port to attach to - :param stopbits: The number of stop bits to use - :param bytesize: The bytesize of the serial messages - :param parity: Which kind of parity to use - :param baudrate: The baud rate to use for the serial device - :returns: A new level1 client - ''' + """ Create a TCP modbus client for the supplied parameters. + + :param port: The serial port to attach to + :param stopbits: The number of stop bits to use + :param bytesize: The bytesize of the serial messages + :param parity: Which kind of parity to use + :param baudrate: The baud rate to use for the serial device + :returns: A new level1 client + """ port = kwargs.get('port', '/dev/ttyS0') baudrate = kwargs.get('baud', Defaults.Baudrate) parity = kwargs.get('parity', Defaults.Parity) @@ -147,7 +156,7 @@ def create_rtu_client(klass, **kwargs): return klass(client) def __init__(self, client): - ''' Initalize a new instance of the LibmodbusLevel1Client. This + """ Initalize a new instance of the LibmodbusLevel1Client. This method should not be used, instead new instances should be created using the two supplied factory methods: @@ -155,52 +164,52 @@ def __init__(self, client): * LibmodbusLevel1Client.create_tcp_client(...) :param client: The underlying client instance to operate with. - ''' + """ self.client = client self.slave = Defaults.UnitId def set_slave(self, slave): - ''' Set the current slave to operate against. + """ Set the current slave to operate against. :param slave: The new slave to operate against :returns: The resulting slave to operate against - ''' + """ self.slave = self._execute(LIB.modbus_set_slave, slave) return self.slave def connect(self): - ''' Attempt to connect to the client target. + """ Attempt to connect to the client target. :returns: True if successful, throws otherwise - ''' + """ return (self.__execute(LIB.modbus_connect) == 0) def flush(self): - ''' Discards the existing bytes on the wire. + """ Discards the existing bytes on the wire. :returns: The number of flushed bytes, or throws - ''' + """ return self.__execute(LIB.modbus_flush) def close(self): - ''' Closes and frees the underlying connection + """ Closes and frees the underlying connection and context structure. :returns: Always True - ''' + """ LIB.modbus_close(self.client) LIB.modbus_free(self.client) return True def __execute(self, command, *args): - ''' Run the supplied command against the currently + """ Run the supplied command against the currently instantiated client with the supplied arguments. This will make sure to correctly handle resulting errors. :param command: The command to execute against the context :param *args: The arguments for the given command :returns: The result of the operation unless -1 which throws - ''' + """ result = command(self.client, *args) if result == -1: message = LIB.modbus_strerror(compiler.errno) @@ -208,96 +217,96 @@ def __execute(self, command, *args): return result def read_bits(self, address, count=1): - ''' + """ :param address: The starting address to read from :param count: The number of coils to read :returns: The resulting bits - ''' + """ result = compiler.new("uint8_t[]", count) self.__execute(LIB.modbus_read_bits, address, count, result) return result def read_input_bits(self, address, count=1): - ''' + """ :param address: The starting address to read from :param count: The number of discretes to read :returns: The resulting bits - ''' + """ result = compiler.new("uint8_t[]", count) self.__execute(LIB.modbus_read_input_bits, address, count, result) return result def write_bit(self, address, value): - ''' + """ :param address: The starting address to write to :param value: The value to write to the specified address :returns: The number of written bits - ''' + """ return self.__execute(LIB.modbus_write_bit, address, value) def write_bits(self, address, values): - ''' + """ :param address: The starting address to write to :param values: The values to write to the specified address :returns: The number of written bits - ''' + """ count = len(values) return self.__execute(LIB.modbus_write_bits, address, count, values) def write_register(self, address, value): - ''' + """ :param address: The starting address to write to :param value: The value to write to the specified address :returns: The number of written registers - ''' + """ return self.__execute(LIB.modbus_write_register, address, value) def write_registers(self, address, values): - ''' + """ :param address: The starting address to write to :param values: The values to write to the specified address :returns: The number of written registers - ''' + """ count = len(values) return self.__execute(LIB.modbus_write_registers, address, count, values) def read_registers(self, address, count=1): - ''' + """ :param address: The starting address to read from :param count: The number of registers to read :returns: The resulting read registers - ''' + """ result = compiler.new("uint16_t[]", count) self.__execute(LIB.modbus_read_registers, address, count, result) return result def read_input_registers(self, address, count=1): - ''' + """ :param address: The starting address to read from :param count: The number of registers to read :returns: The resulting read registers - ''' + """ result = compiler.new("uint16_t[]", count) self.__execute(LIB.modbus_read_input_registers, address, count, result) return result def read_and_write_registers(self, read_address, read_count, write_address, write_registers): - ''' + """ :param read_address: The address to start reading from :param read_count: The number of registers to read from address :param write_address: The address to start writing to :param write_registers: The registers to write to the specified address :returns: The resulting read registers - ''' + """ write_count = len(write_registers) read_result = compiler.new("uint16_t[]", read_count) self.__execute(LIB.modbus_write_and_read_registers, @@ -305,73 +314,93 @@ def read_and_write_registers(self, read_address, read_count, write_address, writ read_address, read_count, read_result) return read_result -#-------------------------------------------------------------------------------- +# -------------------------------------------------------------------------- # # level2 client -#-------------------------------------------------------------------------------- +# -------------------------------------------------------------------------- # + class LibmodbusClient(ModbusClientMixin): - ''' A facade around the raw level 1 libmodbus client + """ A facade around the raw level 1 libmodbus client that implements the pymodbus protocol on top of the lower level client. - ''' + """ - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # # these are used to convert from the pymodbus request types to the # libmodbus operations (overloaded operator). - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # __methods = { - 'ReadCoilsRequest' : lambda c, r: c.read_bits(r.address, r.count), - 'ReadDiscreteInputsRequest' : lambda c, r: c.read_input_bits(r.address, r.count), - 'WriteSingleCoilRequest' : lambda c, r: c.write_bit(r.address, r.value), - 'WriteMultipleCoilsRequest' : lambda c, r: c.write_bits(r.address, r.values), - 'WriteSingleRegisterRequest' : lambda c, r: c.write_register(r.address, r.value), - 'WriteMultipleRegistersRequest' : lambda c, r: c.write_registers(r.address, r.values), - 'ReadHoldingRegistersRequest' : lambda c, r: c.read_registers(r.address, r.count), - 'ReadInputRegistersRequest' : lambda c, r: c.read_input_registers(r.address, r.count), - 'ReadWriteMultipleRegistersRequest' : lambda c, r: c.read_and_write_registers(r.read_address, r.read_count, r.write_address, r.write_registers), + 'ReadCoilsRequest': lambda c, r: c.read_bits(r.address, r.count), + 'ReadDiscreteInputsRequest': lambda c, r: c.read_input_bits(r.address, + r.count), + 'WriteSingleCoilRequest': lambda c, r: c.write_bit(r.address, + r.value), + 'WriteMultipleCoilsRequest': lambda c, r: c.write_bits(r.address, + r.values), + 'WriteSingleRegisterRequest': lambda c, r: c.write_register(r.address, + r.value), + 'WriteMultipleRegistersRequest': + lambda c, r: c.write_registers(r.address, r.values), + 'ReadHoldingRegistersRequest': + lambda c, r: c.read_registers(r.address, r.count), + 'ReadInputRegistersRequest': + lambda c, r: c.read_input_registers(r.address, r.count), + 'ReadWriteMultipleRegistersRequest': + lambda c, r: c.read_and_write_registers(r.read_address, + r.read_count, + r.write_address, + r.write_registers), } - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # # these are used to convert from the libmodbus result to the # pymodbus response type - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # __adapters = { - 'ReadCoilsRequest' : lambda tx, rx: ReadCoilsResponse(list(rx)), - 'ReadDiscreteInputsRequest' : lambda tx, rx: ReadDiscreteInputsResponse(list(rx)), - 'WriteSingleCoilRequest' : lambda tx, rx: WriteSingleCoilResponse(tx.address, rx), - 'WriteMultipleCoilsRequest' : lambda tx, rx: WriteMultipleCoilsResponse(tx.address, rx), - 'WriteSingleRegisterRequest' : lambda tx, rx: WriteSingleRegisterResponse(tx.address, rx), - 'WriteMultipleRegistersRequest' : lambda tx, rx: WriteMultipleRegistersResponse(tx.address, rx), - 'ReadHoldingRegistersRequest' : lambda tx, rx: ReadHoldingRegistersResponse(list(rx)), - 'ReadInputRegistersRequest' : lambda tx, rx: ReadInputRegistersResponse(list(rx)), - 'ReadWriteMultipleRegistersRequest' : lambda tx, rx: ReadWriteMultipleRegistersResponse(list(rx)), + 'ReadCoilsRequest': + lambda tx, rx: ReadCoilsResponse(list(rx)), + 'ReadDiscreteInputsRequest': + lambda tx, rx: ReadDiscreteInputsResponse(list(rx)), + 'WriteSingleCoilRequest': + lambda tx, rx: WriteSingleCoilResponse(tx.address, rx), + 'WriteMultipleCoilsRequest': + lambda tx, rx: WriteMultipleCoilsResponse(tx.address, rx), + 'WriteSingleRegisterRequest': + lambda tx, rx: WriteSingleRegisterResponse(tx.address, rx), + 'WriteMultipleRegistersRequest': + lambda tx, rx: WriteMultipleRegistersResponse(tx.address, rx), + 'ReadHoldingRegistersRequest': + lambda tx, rx: ReadHoldingRegistersResponse(list(rx)), + 'ReadInputRegistersRequest': + lambda tx, rx: ReadInputRegistersResponse(list(rx)), + 'ReadWriteMultipleRegistersRequest': + lambda tx, rx: ReadWriteMultipleRegistersResponse(list(rx)), } def __init__(self, client): - ''' Initalize a new instance of the LibmodbusClient. This should + """ Initalize a new instance of the LibmodbusClient. This should be initialized with one of the LibmodbusLevel1Client instances: * LibmodbusLevel1Client.create_rtu_client(...) * LibmodbusLevel1Client.create_tcp_client(...) - :param client: The underlying client instance to operate with. - ''' + """ self.client = client - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # # We use the client mixin to implement the api methods which are all # forwarded to this method. It is implemented using the previously # defined lookup tables. Any method not defined simply throws. - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # def execute(self, request): - ''' Execute the supplied request against the server. + """ Execute the supplied request against the server. :param request: The request to process :returns: The result of the request execution - ''' + """ if self.client.slave != request.unit_id: self.client.set_slave(request.unit_id) @@ -380,37 +409,42 @@ def execute(self, request): adapter = self.__adapters.get(method, None) if not operation or not adapter: - raise NotImplementedException("Method not implemented: " + name) + raise NotImplementedException("Method not " + "implemented: " + operation) response = operation(self.client, request) return adapter(request, response) - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # # Other methods can simply be forwarded using the decorator pattern - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # + + def connect(self): + return self.client.connect() - def connect(self): return self.client.connect() - def close(self): return self.client.close() + def close(self): + return self.client.close() - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # # magic methods - #-----------------------------------------------------------------------# + # ----------------------------------------------------------------------- # def __enter__(self): - ''' Implement the client with enter block + """ Implement the client with enter block :returns: The current instance of the client - ''' + """ self.client.connect() return self def __exit__(self, klass, value, traceback): - ''' Implement the client with exit block ''' + """ Implement the client with exit block """ self.client.close() -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # main example runner -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + if __name__ == '__main__': @@ -422,6 +456,6 @@ def __exit__(self, klass, value, traceback): # operate with our high level client with LibmodbusClient(protocol) as client: registers = client.write_registers(0, [13, 12, 11]) - print registers + print(registers) registers = client.read_holding_registers(0, 10) - print registers.registers + print(registers.registers) diff --git a/examples/contrib/message-generator.py b/examples/contrib/message_generator.py similarity index 67% rename from examples/contrib/message-generator.py rename to examples/contrib/message_generator.py index 51146434b..47781c2f9 100755 --- a/examples/contrib/message-generator.py +++ b/examples/contrib/message_generator.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -''' +""" Modbus Message Generator -------------------------------------------------------------------------- @@ -10,19 +10,19 @@ * ascii - `./generate-messages.py -f ascii -m tx -a` * rtu - `./generate-messages.py -f rtu -m rx -b` * binary - `./generate-messages.py -f binary -m tx -b` -''' +""" from optparse import OptionParser import codecs as c -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # import all the available framers -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from pymodbus.transaction import ModbusSocketFramer from pymodbus.transaction import ModbusBinaryFramer from pymodbus.transaction import ModbusAsciiFramer from pymodbus.transaction import ModbusRtuFramer -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # import all available messages -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from pymodbus.bit_read_message import * from pymodbus.bit_write_message import * from pymodbus.diag_message import * @@ -33,16 +33,16 @@ from pymodbus.register_write_message import * from pymodbus.compat import IS_PYTHON3 -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # initialize logging -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import logging modbus_log = logging.getLogger("pymodbus") -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # enumerate all request messages -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # _request_messages = [ ReadHoldingRegistersRequest, ReadDiscreteInputsRequest, @@ -86,9 +86,9 @@ ] -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # enumerate all response messages -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # _response_messages = [ ReadHoldingRegistersResponse, ReadDiscreteInputsResponse, @@ -132,42 +132,45 @@ ] -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # build an arguments singleton -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Feel free to override any values here to generate a specific message # in question. It should be noted that many argument names are reused # between different messages, and a number of messages are simply using # their default values. -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # _arguments = { - 'address' : 0x12, - 'count' : 0x08, - 'value' : 0x01, - 'values' : [0x01] * 8, - 'read_address' : 0x12, - 'read_count' : 0x08, - 'write_address ' : 0x12, - 'write_registers' : [0x01] * 8, - 'transaction' : 0x01, - 'protocol' : 0x00, - 'unit' : 0xff, + 'address': 0x12, + 'count': 0x08, + 'value': 0x01, + 'values': [0x01] * 8, + 'read_address': 0x12, + 'read_count': 0x08, + 'write_address': 0x12, + 'write_registers': [0x01] * 8, + 'transaction': 0x01, + 'protocol': 0x00, + 'unit': 0xff, } -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # generate all the requested messages -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # def generate_messages(framer, options): - ''' A helper method to parse the command line options + """ A helper method to parse the command line options :param framer: The framer to encode the messages with :param options: The message options to use - ''' - messages = _request_messages if options.messages == 'tx' else _response_messages + """ + if options.messages == "tx": + messages = _request_messages + else: + messages = _response_messages for message in messages: message = message(**_arguments) - print ("%-44s = " % message.__class__.__name__) + print("%-44s = " % message.__class__.__name__) packet = framer.buildPacket(message) if not options.ascii: if not IS_PYTHON3: @@ -177,43 +180,44 @@ def generate_messages(framer, options): print ("{}\n".format(packet)) # because ascii ends with a \r\n -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # initialize our program settings -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # def get_options(): - ''' A helper method to parse the command line options + """ A helper method to parse the command line options :returns: The options manager - ''' + """ parser = OptionParser() parser.add_option("-f", "--framer", - help="The type of framer to use (tcp, rtu, binary, ascii)", - dest="framer", default="tcp") + help="The type of framer to use " + "(tcp, rtu, binary, ascii)", + dest="framer", default="tcp") parser.add_option("-D", "--debug", - help="Enable debug tracing", - action="store_true", dest="debug", default=False) + help="Enable debug tracing", + action="store_true", dest="debug", default=False) parser.add_option("-a", "--ascii", - help="The indicates that the message is ascii", - action="store_true", dest="ascii", default=True) + help="The indicates that the message is ascii", + action="store_true", dest="ascii", default=True) parser.add_option("-b", "--binary", - help="The indicates that the message is binary", - action="store_false", dest="ascii") + help="The indicates that the message is binary", + action="store_false", dest="ascii") parser.add_option("-m", "--messages", - help="The messages to encode (rx, tx)", - dest="messages", default='rx') + help="The messages to encode (rx, tx)", + dest="messages", default='rx') (opt, arg) = parser.parse_args() return opt def main(): - ''' The main runner function - ''' + """ The main runner function + """ option = get_options() if option.debug: @@ -232,5 +236,6 @@ def main(): generate_messages(framer, option) + if __name__ == "__main__": main() diff --git a/examples/contrib/message-parser.py b/examples/contrib/message_parser.py similarity index 70% rename from examples/contrib/message-parser.py rename to examples/contrib/message_parser.py index be8fc8b42..5d3110661 100755 --- a/examples/contrib/message-parser.py +++ b/examples/contrib/message_parser.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -''' +""" Modbus Message Parser -------------------------------------------------------------------------- @@ -10,52 +10,50 @@ * ascii * rtu * binary -''' -#---------------------------------------------------------------------------# +""" +# -------------------------------------------------------------------------- # # import needed libraries -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from __future__ import print_function -import sys import collections import textwrap from optparse import OptionParser import codecs as c -from pymodbus.utilities import computeCRC, computeLRC from pymodbus.factory import ClientDecoder, ServerDecoder from pymodbus.transaction import ModbusSocketFramer from pymodbus.transaction import ModbusBinaryFramer from pymodbus.transaction import ModbusAsciiFramer from pymodbus.transaction import ModbusRtuFramer -from pymodbus.compat import byte2int, int2byte, IS_PYTHON3 +from pymodbus.compat import IS_PYTHON3 -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Logging -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import logging modbus_log = logging.getLogger("pymodbus") -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # build a quick wrapper around the framers -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # class Decoder(object): def __init__(self, framer, encode=False): - ''' Initialize a new instance of the decoder + """ Initialize a new instance of the decoder :param framer: The framer to use :param encode: If the message needs to be encoded - ''' + """ self.framer = framer self.encode = encode def decode(self, message): - ''' Attempt to decode the supplied message + """ Attempt to decode the supplied message :param message: The messge to decode - ''' + """ if IS_PYTHON3: value = message if self.encode else c.encode(message, 'hex_codec') else: @@ -81,17 +79,17 @@ def decode(self, message): self.check_errors(decoder, message) def check_errors(self, decoder, message): - ''' Attempt to find message errors + """ Attempt to find message errors :param message: The message to find errors in - ''' + """ pass def report(self, message): - ''' The callback to print the message information + """ The callback to print the message information :param message: The message to print - ''' + """ print("%-15s = %s" % ('name', message.__class__.__name__)) for (k, v) in message.__dict__.items(): if isinstance(v, dict): @@ -109,43 +107,44 @@ def report(self, message): print("%-15s = %s" % ('documentation', message.__doc__)) -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # and decode our message -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # def get_options(): - ''' A helper method to parse the command line options + """ A helper method to parse the command line options :returns: The options manager - ''' + """ parser = OptionParser() parser.add_option("-p", "--parser", - help="The type of parser to use (tcp, rtu, binary, ascii)", - dest="parser", default="tcp") + help="The type of parser to use " + "(tcp, rtu, binary, ascii)", + dest="parser", default="tcp") parser.add_option("-D", "--debug", - help="Enable debug tracing", - action="store_true", dest="debug", default=False) + help="Enable debug tracing", + action="store_true", dest="debug", default=False) parser.add_option("-m", "--message", - help="The message to parse", - dest="message", default=None) + help="The message to parse", + dest="message", default=None) parser.add_option("-a", "--ascii", - help="The indicates that the message is ascii", - action="store_true", dest="ascii", default=True) + help="The indicates that the message is ascii", + action="store_true", dest="ascii", default=True) parser.add_option("-b", "--binary", - help="The indicates that the message is binary", - action="store_false", dest="ascii") + help="The indicates that the message is binary", + action="store_false", dest="ascii") parser.add_option("-f", "--file", - help="The file containing messages to parse", - dest="file", default=None) + help="The file containing messages to parse", + dest="file", default=None) parser.add_option("-t", "--transaction", - help="If the incoming message is in hexadecimal format", - action="store_true", dest="transaction", default=False) + help="If the incoming message is in hexadecimal format", + action="store_true", dest="transaction", default=False) (opt, arg) = parser.parse_args() @@ -154,12 +153,13 @@ def get_options(): return opt + def get_messages(option): - ''' A helper method to generate the messages to parse + """ A helper method to generate the messages to parse :param options: The option manager :returns: The message iterator to parse - ''' + """ if option.message: if option.transaction: msg = "" @@ -184,9 +184,10 @@ def get_messages(option): line = line.decode('hex') yield line + def main(): - ''' The main runner function - ''' + """ The main runner function + """ option = get_options() if option.debug: @@ -207,5 +208,6 @@ def main(): for message in get_messages(option): decoder.decode(message) + if __name__ == "__main__": main() diff --git a/examples/contrib/modbus_mapper.py b/examples/contrib/modbus_mapper.py index cc122e8c0..e98db8055 100644 --- a/examples/contrib/modbus_mapper.py +++ b/examples/contrib/modbus_mapper.py @@ -1,4 +1,4 @@ -''' +""" Given a modbus mapping file, this is used to generate decoder blocks so that non-programmers can define the register values and then decode a modbus device all @@ -45,26 +45,32 @@ slave_context = modbus_context_decoder(raw_mapping) context = ModbusServerContext(slaves=slave_context, single=True) StartTcpServer(context) -''' +""" import csv import json from collections import defaultdict -from StringIO import StringIO + from tokenize import generate_tokens from pymodbus.payload import BinaryPayloadDecoder from pymodbus.datastore.store import ModbusSparseDataBlock +from pymodbus.compat import IS_PYTHON3 from pymodbus.datastore.context import ModbusSlaveContext +if IS_PYTHON3: + from io import StringIO +else: + from StringIO import StringIO - -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # raw mapping input parsers -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # These generate the raw mapping_blocks from some form of input # which can then be passed to the decoder in question to supply # the requested output result. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + + def csv_mapping_parser(path, template): - ''' Given a csv file of the the mapping data for + """ Given a csv file of the the mapping data for a modbus device, return a mapping layout that can be used to decode an new block. @@ -79,7 +85,7 @@ def csv_mapping_parser(path, template): :param path: The path to the csv input file :param template: The row value template :returns: The decoded csv dictionary - ''' + """ mapping_blocks = defaultdict(dict) with open(path, 'r') as handle: reader = csv.reader(handle) @@ -93,7 +99,7 @@ def csv_mapping_parser(path, template): def json_mapping_parser(path, template): - ''' Given a json file of the the mapping data for + """ Given a json file of the the mapping data for a modbus device, return a mapping layout that can be used to decode an new block. @@ -113,7 +119,7 @@ def json_mapping_parser(path, template): :param path: The path to the csv input file :param template: The row value template :returns: The decoded csv dictionary - ''' + """ mapping_blocks = {} with open(path, 'r') as handle: for tid, rows in json.load(handle).iteritems(): @@ -126,7 +132,7 @@ def json_mapping_parser(path, template): def xml_mapping_parser(path): - ''' Given an xml file of the the mapping data for + """ Given an xml file of the the mapping data for a modbus device, return a mapping layout that can be used to decode an new block. @@ -135,18 +141,18 @@ def xml_mapping_parser(path): :param path: The path to the xml input file :returns: The decoded csv dictionary - ''' + """ pass -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # modbus context decoders -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # These are used to decode a raw mapping_block into a slave context with # populated function data blocks. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # def modbus_context_decoder(mapping_blocks): - ''' Given a mapping block input, generate a backing + """ Given a mapping block input, generate a backing slave context with initialized data blocks. .. note:: This expects the following for each block: @@ -156,7 +162,7 @@ def modbus_context_decoder(mapping_blocks): :param mapping_blocks: The mapping blocks :returns: The initialized modbus slave context - ''' + """ blocks = defaultdict(dict) for block in mapping_blocks.itervalues(): for mapping in block.itervalues(): @@ -167,15 +173,15 @@ def modbus_context_decoder(mapping_blocks): return ModbusSlaveContext(**blocks) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # modbus mapping decoder -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # These are used to decode a raw mapping_block into a request decoder. # So this allows one to simply grab a number of registers, and then # pass them to this decoder which will do the rest. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class ModbusTypeDecoder(object): - ''' This is a utility to determine the correct + """ This is a utility to determine the correct decoder to use given a type name. By default this supports all the types available in the default modbus decoder, however this can easily be extended this class @@ -189,10 +195,10 @@ def __init__(self): def parse_my_bitfield(self, tokens): return lambda d: d.decode_my_type() - ''' + """ def __init__(self): - ''' Initializes a new instance of the decoder - ''' + """ Initializes a new instance of the decoder + """ self.default = lambda m: self.parse_16bit_uint self.parsers = { 'uint': self.parse_16bit_uint, @@ -212,68 +218,80 @@ def __init__(self): 'bits': self.parse_bits, } - #------------------------------------------------------------ + # ------------------------------------------------------------ # # Type parsers - #------------------------------------------------------------ - def parse_string(self, tokens): + # ------------------------------------------------------------ # + @staticmethod + def parse_string(tokens): _ = tokens.next() size = int(tokens.next()) return lambda d: d.decode_string(size=size) - def parse_bits(self, tokens): + @staticmethod + def parse_bits(tokens): return lambda d: d.decode_bits() - def parse_8bit_uint(self, tokens): + @staticmethod + def parse_8bit_uint(tokens): return lambda d: d.decode_8bit_uint() - def parse_16bit_uint(self, tokens): + @staticmethod + def parse_16bit_uint(tokens): return lambda d: d.decode_16bit_uint() - def parse_32bit_uint(self, tokens): + @staticmethod + def parse_32bit_uint(tokens): return lambda d: d.decode_32bit_uint() - def parse_64bit_uint(self, tokens): + @staticmethod + def parse_64bit_uint(tokens): return lambda d: d.decode_64bit_uint() - def parse_8bit_int(self, tokens): + @staticmethod + def parse_8bit_int(tokens): return lambda d: d.decode_8bit_int() - def parse_16bit_int(self, tokens): + @staticmethod + def parse_16bit_int(tokens): return lambda d: d.decode_16bit_int() - def parse_32bit_int(self, tokens): + @staticmethod + def parse_32bit_int(tokens): return lambda d: d.decode_32bit_int() - def parse_64bit_int(self, tokens): + @staticmethod + def parse_64bit_int(tokens): return lambda d: d.decode_64bit_int() - def parse_32bit_float(self, tokens): + @staticmethod + def parse_32bit_float(tokens): return lambda d: d.decode_32bit_float() - def parse_64bit_float(self, tokens): + @staticmethod + def parse_64bit_float(tokens): return lambda d: d.decode_64bit_float() #------------------------------------------------------------ # Public Interface #------------------------------------------------------------ def tokenize(self, value): - ''' Given a value, return the tokens + """ Given a value, return the tokens :param value: The value to tokenize :returns: A token generator - ''' + """ tokens = generate_tokens(StringIO(value).readline) for toknum, tokval, _, _, _ in tokens: yield tokval def parse(self, value): - ''' Given a type value, return a function + """ Given a type value, return a function that supplied with a decoder, will decode the correct value. :param value: The type of value to parse :returns: The decoder method to use - ''' + """ tokens = self.tokenize(value) token = tokens.next().lower() parser = self.parsers.get(token, self.default) @@ -281,17 +299,15 @@ def parse(self, value): def mapping_decoder(mapping_blocks, decoder=None): - ''' Given the raw mapping blocks, convert + """ Given the raw mapping blocks, convert them into modbus value decoder map. :param mapping_blocks: The mapping blocks :param decoder: The type decoder to use - ''' + """ decoder = decoder or ModbusTypeDecoder() for block in mapping_blocks.itervalues(): for mapping in block.itervalues(): mapping['address'] = int(mapping['address']) - mapping['size'] = int(mapping['size']) - mapping['type'] = decoder.parse(mapping['type']) - - + mapping['size'] = int(mapping['size']) + mapping['type'] = decoder.parse(mapping['type']) diff --git a/examples/contrib/modbus_saver.py b/examples/contrib/modbus_saver.py index 34a817d0a..b4f344898 100644 --- a/examples/contrib/modbus_saver.py +++ b/examples/contrib/modbus_saver.py @@ -1,4 +1,4 @@ -''' +""" These are a collection of helper methods that can be used to save a modbus server context to file for backup, checkpointing, or any other purpose. There use is very @@ -25,34 +25,33 @@ * handle_slave_end(self, slave) * handle_save_start(self) * handle_save_end(self) -''' -import csv +""" import json import xml.etree.ElementTree as xml class ModbusDatastoreSaver(object): - ''' An abstract base class that can be used to implement + """ An abstract base class that can be used to implement a persistance format for the modbus server context. In order to use it, just complete the neccessary callbacks (SAX style) that your persistance format needs. - ''' + """ def __init__(self, context, path=None): - ''' Initialize a new instance of the saver. + """ Initialize a new instance of the saver. :param context: The modbus server context :param path: The output path to save to - ''' + """ self.context = context self.path = path or 'modbus-context-dump' def save(self): - ''' The main runner method to save the + """ The main runner method to save the context to file which calls the various callbacks which the sub classes will implement. - ''' + """ with open(self.path, 'w') as self.file_handle: self.handle_save_start() for slave_name, slave in self.context: @@ -67,73 +66,102 @@ def save(self): #------------------------------------------------------------ # predefined state machine callbacks #------------------------------------------------------------ - def handle_save_start(self): pass - def handle_store_start(self, store): pass - def handle_store_end(self, store): pass - def handle_slave_start(self, slave): pass - def handle_slave_end(self, slave): pass - def handle_save_end(self): pass + def handle_save_start(self): + pass + + def handle_store_start(self, store): + pass + + def handle_store_end(self, store): + pass + + def handle_slave_start(self, slave): + pass + def handle_slave_end(self, slave): + pass -#---------------------------------------------------------------- + def handle_save_end(self): + pass + + +# ---------------------------------------------------------------- # # Implementations of the data store savers -#---------------------------------------------------------------- +# ---------------------------------------------------------------- # class JsonDatastoreSaver(ModbusDatastoreSaver): - ''' An implementation of the modbus datastore saver + """ An implementation of the modbus datastore saver that persists the context as a json document. - ''' + """ + _context = None + _store = None + _slave = None STORE_NAMES = { - 'i' : 'input-registers', - 'd' : 'discretes', - 'h' : 'holding-registers', - 'c' : 'coils', + 'i': 'input-registers', + 'd': 'discretes', + 'h': 'holding-registers', + 'c': 'coils', } def handle_save_start(self): self._context = dict() + def handle_slave_start(self, slave): self._context[hex(slave)] = self._slave = dict() + def handle_store_start(self, store): self._store = self.STORE_NAMES[store] + def handle_store_values(self, values): self._slave[self._store] = dict(values) + def handle_save_end(self): json.dump(self._context, self.file_handle) class CsvDatastoreSaver(ModbusDatastoreSaver): - ''' An implementation of the modbus datastore saver + """ An implementation of the modbus datastore saver that persists the context as a csv document. - ''' + """ + _context = None + _store = None + _line = None NEWLINE = '\r\n' HEADER = "slave,store,address,value" + NEWLINE STORE_NAMES = { - 'i' : 'i', - 'd' : 'd', - 'h' : 'h', - 'c' : 'c', + 'i': 'i', + 'd': 'd', + 'h': 'h', + 'c': 'c', } def handle_save_start(self): self.file_handle.write(self.HEADER) + def handle_slave_start(self, slave): self._line = [str(slave)] + def handle_store_start(self, store): self._line.append(self.STORE_NAMES[store]) + def handle_store_values(self, values): self.file_handle.writelines(self.handle_store_value(values)) + def handle_store_end(self, store): self._line.pop() + def handle_store_value(self, values): for a, v in values: yield ','.join(self._line + [str(a), str(v)]) + self.NEWLINE class XmlDatastoreSaver(ModbusDatastoreSaver): - ''' An implementation of the modbus datastore saver + """ An implementation of the modbus datastore saver that persists the context as a XML document. - ''' + """ + _context = None + _store = None + STORE_NAMES = { 'i' : 'input-registers', 'd' : 'discretes', @@ -144,16 +172,20 @@ class XmlDatastoreSaver(ModbusDatastoreSaver): def handle_save_start(self): self._context = xml.Element("context") self._root = xml.ElementTree(self._context) + def handle_slave_start(self, slave): self._slave = xml.SubElement(self._context, "slave") self._slave.set("id", str(slave)) + def handle_store_start(self, store): self._store = xml.SubElement(self._slave, "store") self._store.set("function", self.STORE_NAMES[store]) + def handle_store_values(self, values): for address, value in values: entry = xml.SubElement(self._store, "entry") entry.text = str(value) entry.set("address", str(address)) + def handle_save_end(self): self._root.write(self.file_handle) diff --git a/examples/contrib/modbus-scraper.py b/examples/contrib/modbus_scraper.py similarity index 72% rename from examples/contrib/modbus-scraper.py rename to examples/contrib/modbus_scraper.py index 6d256c12e..ee76388d1 100755 --- a/examples/contrib/modbus-scraper.py +++ b/examples/contrib/modbus_scraper.py @@ -1,9 +1,9 @@ #!/usr/bin/env python -''' +""" This is a simple scraper that can be pointed at a modbus device to pull down all its values and store them as a collection of sequential data blocks. -''' +""" import pickle from optparse import OptionParser from twisted.internet import serialport, reactor @@ -19,93 +19,95 @@ import logging log = logging.getLogger("pymodbus") -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Choose the framer you want to use -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # from pymodbus.transaction import ModbusBinaryFramer from pymodbus.transaction import ModbusAsciiFramer from pymodbus.transaction import ModbusRtuFramer from pymodbus.transaction import ModbusSocketFramer -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Define some constants -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # COUNT = 8 # The number of bits/registers to read at once DELAY = 0 # The delay between subsequent reads SLAVE = 0x01 # The slave unit id to read from -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # A simple scraper protocol -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # I tried to spread the load across the device, but feel free to modify the # logic to suit your own purpose. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class ScraperProtocol(ModbusClientProtocol): + address = None + def __init__(self, framer, endpoint): - ''' Initializes our custom protocol + """ Initializes our custom protocol :param framer: The decoder to use to process messages :param endpoint: The endpoint to send results to - ''' + """ ModbusClientProtocol.__init__(self, framer) self.endpoint = endpoint def connectionMade(self): - ''' Callback for when the client has connected + """ Callback for when the client has connected to the remote server. - ''' + """ super(ScraperProtocol, self).connectionMade() log.debug("Beginning the processing loop") self.address = self.factory.starting reactor.callLater(DELAY, self.scrape_holding_registers) def connectionLost(self, reason): - ''' Callback for when the client disconnects from the + """ Callback for when the client disconnects from the server. :param reason: The reason for the disconnection - ''' + """ reactor.callLater(DELAY, reactor.stop) def scrape_holding_registers(self): - ''' Defer fetching holding registers - ''' + """ Defer fetching holding registers + """ log.debug("reading holding registers: %d" % self.address) d = self.read_holding_registers(self.address, count=COUNT, unit=SLAVE) d.addCallbacks(self.scrape_discrete_inputs, self.error_handler) def scrape_discrete_inputs(self, response): - ''' Defer fetching holding registers - ''' + """ Defer fetching holding registers + """ log.debug("reading discrete inputs: %d" % self.address) self.endpoint.write((3, self.address, response.registers)) d = self.read_discrete_inputs(self.address, count=COUNT, unit=SLAVE) d.addCallbacks(self.scrape_input_registers, self.error_handler) def scrape_input_registers(self, response): - ''' Defer fetching holding registers - ''' + """ Defer fetching holding registers + """ log.debug("reading discrete inputs: %d" % self.address) self.endpoint.write((2, self.address, response.bits)) d = self.read_input_registers(self.address, count=COUNT, unit=SLAVE) d.addCallbacks(self.scrape_coils, self.error_handler) def scrape_coils(self, response): - ''' Write values of holding registers, defer fetching coils + """ Write values of holding registers, defer fetching coils :param response: The response to process - ''' + """ log.debug("reading coils: %d" % self.address) self.endpoint.write((4, self.address, response.registers)) d = self.read_coils(self.address, count=COUNT, unit=SLAVE) d.addCallbacks(self.start_next_cycle, self.error_handler) def start_next_cycle(self, response): - ''' Write values of coils, trigger next cycle + """ Write values of coils, trigger next cycle :param response: The response to process - ''' + """ log.debug("starting next round: %d" % self.address) self.endpoint.write((1, self.address, response.bits)) self.address += COUNT @@ -115,16 +117,16 @@ def start_next_cycle(self, response): else: reactor.callLater(DELAY, self.scrape_holding_registers) def error_handler(self, failure): - ''' Handle any twisted errors + """ Handle any twisted errors :param failure: The error to handle - ''' + """ log.error(failure) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # a factory for the example protocol -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # This is used to build client protocol's if you tie into twisted's method # of processing. It basically produces client instances of the underlying # protocol:: @@ -132,61 +134,61 @@ def error_handler(self, failure): # Factory(Protocol) -> ProtocolInstance # # It also persists data between client instances (think protocol singelton). -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class ScraperFactory(ClientFactory): protocol = ScraperProtocol def __init__(self, framer, endpoint, query): - ''' Remember things necessary for building a protocols ''' + """ Remember things necessary for building a protocols """ self.framer = framer self.endpoint = endpoint self.starting, self.ending = query def buildProtocol(self, _): - ''' Create a protocol and start the reading cycle ''' + """ Create a protocol and start the reading cycle """ protocol = self.protocol(self.framer, self.endpoint) protocol.factory = self return protocol -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # a custom client for our device -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Twisted provides a number of helper methods for creating and starting # clients: # - protocol.ClientCreator # - reactor.connectTCP # # How you start your client is really up to you. -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class SerialModbusClient(serialport.SerialPort): def __init__(self, factory, *args, **kwargs): - ''' Setup the client and start listening on the serial port + """ Setup the client and start listening on the serial port :param factory: The factory to build clients with - ''' + """ protocol = factory.buildProtocol(None) self.decoder = ClientDecoder() serialport.SerialPort.__init__(self, protocol, *args, **kwargs) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # a custom endpoint for our results -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # An example line reader, this can replace with: # - the TCP protocol # - a context recorder # - a database or file recorder -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class LoggingContextReader(object): def __init__(self, output): - ''' Initialize a new instance of the logger + """ Initialize a new instance of the logger :param output: The output file to save to - ''' + """ self.output = output self.context = ModbusSlaveContext( di = ModbusSequentialDataBlock.create(), @@ -195,10 +197,10 @@ def __init__(self, output): ir = ModbusSequentialDataBlock.create()) def write(self, response): - ''' Handle the next modbus response + """ Handle the next modbus response :param response: The response to process - ''' + """ log.info("Read Data: %s" % str(response)) fx, address, values = response self.context.setValues(fx, address, values) @@ -208,14 +210,14 @@ def finalize(self): pickle.dump(self.context, handle) -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Main start point -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # def get_options(): - ''' A helper method to parse the command line options + """ A helper method to parse the command line options :returns: The options manager - ''' + """ parser = OptionParser() parser.add_option("-o", "--output", @@ -241,16 +243,17 @@ def get_options(): (opt, arg) = parser.parse_args() return opt + def main(): - ''' The main runner function ''' + """ The main runner function """ options = get_options() if options.debug: try: log.setLevel(logging.DEBUG) - logging.basicConfig() - except Exception, ex: - print "Logging is not supported on this system" + logging.basicConfig() + except Exception as ex: + print("Logging is not supported on this system") # split the query into a starting and ending range query = [int(p) for p in options.query.split(':')] @@ -264,16 +267,19 @@ def main(): # how to connect based on TCP vs Serial clients if isinstance(framer, ModbusSocketFramer): reactor.connectTCP(options.host, options.port, factory) - else: SerialModbusClient(factory, options.port, reactor) + else: + SerialModbusClient(factory, options.port, reactor) log.debug("Starting the client") reactor.run() log.debug("Finished scraping the client") - except Exception, ex: - print ex + except Exception as ex: + print(ex) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Main jumper -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + + if __name__ == "__main__": main() diff --git a/examples/contrib/modbus-simulator.py b/examples/contrib/modbus_simulator.py similarity index 57% rename from examples/contrib/modbus-simulator.py rename to examples/contrib/modbus_simulator.py index 029199546..09ae0c41f 100644 --- a/examples/contrib/modbus-simulator.py +++ b/examples/contrib/modbus_simulator.py @@ -1,8 +1,8 @@ #!/usr/bin/env python -''' +""" An example of creating a fully implemented modbus server with read/write data as well as user configurable base data -''' +""" import pickle from optparse import OptionParser @@ -11,74 +11,80 @@ from pymodbus.server.async import StartTcpServer from pymodbus.datastore import ModbusServerContext,ModbusSlaveContext -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Logging -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import logging logging.basicConfig() -server_log = logging.getLogger("pymodbus.server") +server_log = logging.getLogger("pymodbus.server") protocol_log = logging.getLogger("pymodbus.protocol") -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Extra Global Functions -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # These are extra helper functions that don't belong in a class -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import getpass + + def root_test(): - ''' Simple test to see if we are running as root ''' - return True # removed for the time being as it isn't portable + """ Simple test to see if we are running as root """ + return True # removed for the time being as it isn't portable #return getpass.getuser() == "root" -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Helper Classes -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + class ConfigurationException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ def __init__(self, string): - ''' Initializes the ConfigurationException instance + """ Initializes the ConfigurationException instance :param string: The message to append to the exception - ''' + """ Exception.__init__(self, string) self.string = string def __str__(self): - ''' Builds a representation of the object + """ Builds a representation of the object :returns: A string representation of the object - ''' + """ return 'Configuration Error: %s' % self.string + + class Configuration: - ''' + """ Class used to parse configuration file and create and modbus datastore. The format of the configuration file is actually just a python pickle, which is a compressed memory dump from the scraper. - ''' + """ def __init__(self, config): - ''' + """ Trys to load a configuration file, lets the file not found exception fall through :param config: The pickled datastore - ''' + """ try: self.file = open(config, "r") except Exception: raise ConfigurationException("File not found %s" % config) def parse(self): - ''' Parses the config file and creates a server context - ''' + """ Parses the config file and creates a server context + """ handle = pickle.load(self.file) - try: # test for existance, or bomb + try: # test for existance, or bomb dsd = handle['di'] csd = handle['ci'] hsd = handle['hr'] @@ -88,18 +94,20 @@ def parse(self): slave = ModbusSlaveContext(d=dsd, c=csd, h=hsd, i=isd) return ModbusServerContext(slaves=slave) -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Main start point -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + def main(): - ''' Server launcher ''' + """ Server launcher """ parser = OptionParser() parser.add_option("-c", "--conf", - help="The configuration file to load", - dest="file") + help="The configuration file to load", + dest="file") parser.add_option("-D", "--debug", - help="Turn on to enable tracing", - action="store_true", dest="debug", default=False) + help="Turn on to enable tracing", + action="store_true", dest="debug", default=False) (opt, arg) = parser.parse_args() # enable debugging information @@ -107,22 +115,24 @@ def main(): try: server_log.setLevel(logging.DEBUG) protocol_log.setLevel(logging.DEBUG) - except Exception, e: - print "Logging is not supported on this system" + except Exception as e: + print("Logging is not supported on this system") # parse configuration file and run try: conf = Configuration(opt.file) StartTcpServer(context=conf.parse()) - except ConfigurationException, err: - print err + except ConfigurationException as err: + print(err) parser.print_help() -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Main jumper -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + if __name__ == "__main__": if root_test(): main() - else: print "This script must be run as root!" - + else: + print("This script must be run as root!") diff --git a/examples/contrib/modicon-payload.py b/examples/contrib/modicon_payload.py similarity index 76% rename from examples/contrib/modicon-payload.py rename to examples/contrib/modicon_payload.py index 2803ebf1f..b1534ae7b 100644 --- a/examples/contrib/modicon-payload.py +++ b/examples/contrib/modicon_payload.py @@ -1,11 +1,11 @@ -''' +""" Modbus Modicon Payload Builder ----------------------------------------------------------- This is an example of building a custom payload builder that can be used in the pymodbus library. Below is a simple modicon encoded builder and decoder. -''' +""" from struct import pack, unpack from pymodbus.constants import Endian from pymodbus.interfaces import IPayloadBuilder @@ -15,7 +15,7 @@ class ModiconPayloadBuilder(IPayloadBuilder): - ''' + """ A utility that helps build modicon encoded payload messages to be written with the various modbus messages. example:: @@ -24,128 +24,128 @@ class ModiconPayloadBuilder(IPayloadBuilder): builder.add_8bit_uint(1) builder.add_16bit_uint(2) payload = builder.build() - ''' + """ def __init__(self, payload=None, endian=Endian.Little): - ''' Initialize a new instance of the payload builder + """ Initialize a new instance of the payload builder :param payload: Raw payload data to initialize with :param endian: The endianess of the payload - ''' + """ self._payload = payload or [] - self._endian = endian + self._endian = endian def __str__(self): - ''' Return the payload buffer as a string + """ Return the payload buffer as a string :returns: The payload buffer as a string - ''' + """ return ''.join(self._payload) def reset(self): - ''' Reset the payload buffer - ''' + """ Reset the payload buffer + """ self._payload = [] def build(self): - ''' Return the payload buffer as a list + """ Return the payload buffer as a list This list is two bytes per element and can thus be treated as a list of registers. :returns: The payload buffer as a list - ''' + """ string = str(self) length = len(string) string = string + ('\x00' * (length % 2)) - return [string[i:i+2] for i in xrange(0, length, 2)] + return [string[i:i+2] for i in range(0, length, 2)] def add_bits(self, values): - ''' Adds a collection of bits to be encoded + """ Adds a collection of bits to be encoded If these are less than a multiple of eight, they will be left padded with 0 bits to make it so. - :param value: The value to add to the buffer - ''' + :param values: The value to add to the buffer + """ value = pack_bitstring(values) self._payload.append(value) def add_8bit_uint(self, value): - ''' Adds a 8 bit unsigned int to the buffer + """ Adds a 8 bit unsigned int to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'B' self._payload.append(pack(fstring, value)) def add_16bit_uint(self, value): - ''' Adds a 16 bit unsigned int to the buffer + """ Adds a 16 bit unsigned int to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'H' self._payload.append(pack(fstring, value)) def add_32bit_uint(self, value): - ''' Adds a 32 bit unsigned int to the buffer + """ Adds a 32 bit unsigned int to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'I' handle = pack(fstring, value) handle = handle[2:] + handle[:2] self._payload.append(handle) def add_8bit_int(self, value): - ''' Adds a 8 bit signed int to the buffer + """ Adds a 8 bit signed int to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'b' self._payload.append(pack(fstring, value)) def add_16bit_int(self, value): - ''' Adds a 16 bit signed int to the buffer + """ Adds a 16 bit signed int to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'h' self._payload.append(pack(fstring, value)) def add_32bit_int(self, value): - ''' Adds a 32 bit signed int to the buffer + """ Adds a 32 bit signed int to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'i' handle = pack(fstring, value) handle = handle[2:] + handle[:2] self._payload.append(handle) def add_32bit_float(self, value): - ''' Adds a 32 bit float to the buffer + """ Adds a 32 bit float to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 'f' handle = pack(fstring, value) handle = handle[2:] + handle[:2] self._payload.append(handle) def add_string(self, value): - ''' Adds a string to the buffer + """ Adds a string to the buffer :param value: The value to add to the buffer - ''' + """ fstring = self._endian + 's' for c in value: self._payload.append(pack(fstring, c)) class ModiconPayloadDecoder(object): - ''' + """ A utility that helps decode modicon encoded payload messages from a modbus reponse message. What follows is a simple example:: @@ -153,22 +153,21 @@ class ModiconPayloadDecoder(object): decoder = ModiconPayloadDecoder(payload) first = decoder.decode_8bit_uint() second = decoder.decode_16bit_uint() - ''' + """ def __init__(self, payload, endian): - ''' Initialize a new payload decoder + """ Initialize a new payload decoder :param payload: The payload to decode with - ''' + """ self._payload = payload self._pointer = 0x00 self._endian = endian - @staticmethod - def fromRegisters(registers, endian=Endian.Little): - ''' Initialize a payload decoder with the result of + def from_registers(registers, endian=Endian.Little): + """ Initialize a payload decoder with the result of reading a collection of registers from a modbus device. The registers are treated as a list of 2 byte values. @@ -178,15 +177,15 @@ def fromRegisters(registers, endian=Endian.Little): :param registers: The register results to initialize with :param endian: The endianess of the payload :returns: An initialized PayloadDecoder - ''' + """ if isinstance(registers, list): # repack into flat binary payload = ''.join(pack('>H', x) for x in registers) return ModiconPayloadDecoder(payload, endian) raise ParameterException('Invalid collection of registers supplied') @staticmethod - def fromCoils(coils, endian=Endian.Little): - ''' Initialize a payload decoder with the result of + def from_coils(coils, endian=Endian.Little): + """ Initialize a payload decoder with the result of reading a collection of coils from a modbus device. The coils are treated as a list of bit(boolean) values. @@ -194,36 +193,36 @@ def fromCoils(coils, endian=Endian.Little): :param coils: The coil results to initialize with :param endian: The endianess of the payload :returns: An initialized PayloadDecoder - ''' + """ if isinstance(coils, list): payload = pack_bitstring(coils) return ModiconPayloadDecoder(payload, endian) raise ParameterException('Invalid collection of coils supplied') def reset(self): - ''' Reset the decoder pointer back to the start - ''' + """ Reset the decoder pointer back to the start + """ self._pointer = 0x00 def decode_8bit_uint(self): - ''' Decodes a 8 bit unsigned int from the buffer - ''' + """ Decodes a 8 bit unsigned int from the buffer + """ self._pointer += 1 fstring = self._endian + 'B' handle = self._payload[self._pointer - 1:self._pointer] return unpack(fstring, handle)[0] def decode_16bit_uint(self): - ''' Decodes a 16 bit unsigned int from the buffer - ''' + """ Decodes a 16 bit unsigned int from the buffer + """ self._pointer += 2 fstring = self._endian + 'H' handle = self._payload[self._pointer - 2:self._pointer] return unpack(fstring, handle)[0] def decode_32bit_uint(self): - ''' Decodes a 32 bit unsigned int from the buffer - ''' + """ Decodes a 32 bit unsigned int from the buffer + """ self._pointer += 4 fstring = self._endian + 'I' handle = self._payload[self._pointer - 4:self._pointer] @@ -231,24 +230,24 @@ def decode_32bit_uint(self): return unpack(fstring, handle)[0] def decode_8bit_int(self): - ''' Decodes a 8 bit signed int from the buffer - ''' + """ Decodes a 8 bit signed int from the buffer + """ self._pointer += 1 fstring = self._endian + 'b' handle = self._payload[self._pointer - 1:self._pointer] return unpack(fstring, handle)[0] def decode_16bit_int(self): - ''' Decodes a 16 bit signed int from the buffer - ''' + """ Decodes a 16 bit signed int from the buffer + """ self._pointer += 2 fstring = self._endian + 'h' handle = self._payload[self._pointer - 2:self._pointer] return unpack(fstring, handle)[0] def decode_32bit_int(self): - ''' Decodes a 32 bit signed int from the buffer - ''' + """ Decodes a 32 bit signed int from the buffer + """ self._pointer += 4 fstring = self._endian + 'i' handle = self._payload[self._pointer - 4:self._pointer] @@ -256,8 +255,8 @@ def decode_32bit_int(self): return unpack(fstring, handle)[0] def decode_32bit_float(self, size=1): - ''' Decodes a float from the buffer - ''' + """ Decodes a float from the buffer + """ self._pointer += 4 fstring = self._endian + 'f' handle = self._payload[self._pointer - 4:self._pointer] @@ -265,22 +264,22 @@ def decode_32bit_float(self, size=1): return unpack(fstring, handle)[0] def decode_bits(self): - ''' Decodes a byte worth of bits from the buffer - ''' + """ Decodes a byte worth of bits from the buffer + """ self._pointer += 1 handle = self._payload[self._pointer - 1:self._pointer] return unpack_bitstring(handle) def decode_string(self, size=1): - ''' Decodes a string from the buffer + """ Decodes a string from the buffer :param size: The size of the string to decode - ''' + """ self._pointer += size return self._payload[self._pointer - size:self._pointer] -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Exported Identifiers -#---------------------------------------------------------------------------# -__all__ = ["BcdPayloadBuilder", "BcdPayloadDecoder"] +# -------------------------------------------------------------------------- # +__all__ = ["ModiconPayloadBuilder", "ModiconPayloadDecoder"] diff --git a/examples/contrib/remote_server_context.py b/examples/contrib/remote_server_context.py index 5ade25b32..c21a4632f 100644 --- a/examples/contrib/remote_server_context.py +++ b/examples/contrib/remote_server_context.py @@ -1,4 +1,4 @@ -''' +""" Although there is a remote server context already in the main library, it works under the assumption that users would have a server context of the following form:: @@ -18,117 +18,127 @@ 0x01: client('host1.something.com', 0x01), 0x02: client('host1.something.com', 0x02) } -''' +""" from pymodbus.exceptions import NotImplementedException from pymodbus.interfaces import IModbusSlaveContext -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Logging -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import logging _logger = logging.getLogger(__name__) -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Slave Context -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Basically we create a new slave context for the given slave identifier so # that this slave context will only make requests to that slave with the # client that the server is maintaining. -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + class RemoteSingleSlaveContext(IModbusSlaveContext): - ''' This is a remote server context that allows one + """ This is a remote server context that allows one to create a server context backed by a single client that may be attached to many slave units. This can be used to effectively create a modbus forwarding server. - ''' + """ def __init__(self, context, unit_id): - ''' Initializes the datastores + """ Initializes the datastores :param context: The underlying context to operate with :param unit_id: The slave that this context will contact - ''' + """ self.context = context self.unit_id = unit_id def reset(self): - ''' Resets all the datastores to their default values ''' + """ Resets all the datastores to their default values """ raise NotImplementedException() def validate(self, fx, address, count=1): - ''' Validates the request to make sure it is in range + """ Validates the request to make sure it is in range :param fx: The function we are working with :param address: The starting address :param count: The number of values to test :returns: True if the request in within range, False otherwise - ''' + """ _logger.debug("validate[%d] %d:%d" % (fx, address, count)) - result = self.context.get_callbacks[self.decode(fx)](address, count, self.unit_id) + result = self.context.get_callbacks[self.decode(fx)](address, + count, + self.unit_id) return result.function_code < 0x80 def getValues(self, fx, address, count=1): - ''' Validates the request to make sure it is in range + """ Validates the request to make sure it is in range :param fx: The function we are working with :param address: The starting address :param count: The number of values to retrieve :returns: The requested values from a:a+c - ''' + """ _logger.debug("get values[%d] %d:%d" % (fx, address, count)) - result = self.context.get_callbacks[self.decode(fx)](address, count, self.unit_id) + result = self.context.get_callbacks[self.decode(fx)](address, + count, + self.unit_id) return self.__extract_result(self.decode(fx), result) def setValues(self, fx, address, values): - ''' Sets the datastore with the supplied values + """ Sets the datastore with the supplied values :param fx: The function we are working with :param address: The starting address :param values: The new values to be set - ''' + """ _logger.debug("set values[%d] %d:%d" % (fx, address, len(values))) - self.context.set_callbacks[self.decode(fx)](address, values, self.unit_id) + self.context.set_callbacks[self.decode(fx)](address, + values, + self.unit_id) def __str__(self): - ''' Returns a string representation of the context + """ Returns a string representation of the context :returns: A string representation of the context - ''' + """ return "Remote Single Slave Context(%s)" % self.unit_id def __extract_result(self, fx, result): - ''' A helper method to extract the values out of + """ A helper method to extract the values out of a response. The future api should make the result consistent so we can just call `result.getValues()`. :param fx: The function to call :param result: The resulting data - ''' + """ if result.function_code < 0x80: - if fx in ['d', 'c']: return result.bits - if fx in ['h', 'i']: return result.registers + if fx in ['d', 'c']: + return result.bits + if fx in ['h', 'i']: + return result.registers else: return result -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Server Context -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Think of this as simply a dictionary of { unit_id: client(req, unit_id) } -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + class RemoteServerContext(object): - ''' This is a remote server context that allows one + """ This is a remote server context that allows one to create a server context backed by a single client that may be attached to many slave units. This can be used to effectively create a modbus forwarding server. - ''' + """ def __init__(self, client): - ''' Initializes the datastores + """ Initializes the datastores :param client: The client to retrieve values with - ''' + """ self.get_callbacks = { 'd': lambda a, c, s: client.read_discrete_inputs(a, c, s), 'c': lambda a, c, s: client.read_coils(a, c, s), @@ -145,53 +155,53 @@ def __init__(self, client): self.slaves = {} # simply a cache def __str__(self): - ''' Returns a string representation of the context + """ Returns a string representation of the context :returns: A string representation of the context - ''' + """ return "Remote Server Context(%s)" % self._client def __iter__(self): - ''' Iterater over the current collection of slave + """ Iterater over the current collection of slave contexts. :returns: An iterator over the slave contexts - ''' + """ # note, this may not include all slaves return iter(self.slaves.items()) def __contains__(self, slave): - ''' Check if the given slave is in this list + """ Check if the given slave is in this list :param slave: slave The slave to check for existance :returns: True if the slave exists, False otherwise - ''' + """ # we don't want to check the cache here as the # slave may not exist yet or may not exist any # more. The best thing to do is try and fail. return True def __setitem__(self, slave, context): - ''' Used to set a new slave context + """ Used to set a new slave context :param slave: The slave context to set :param context: The new context to set for this slave - ''' + """ raise NotImplementedException() # doesn't make sense here def __delitem__(self, slave): - ''' Wrapper used to access the slave context + """ Wrapper used to access the slave context :param slave: The slave context to remove - ''' + """ raise NotImplementedException() # doesn't make sense here def __getitem__(self, slave): - ''' Used to get access to a slave context + """ Used to get access to a slave context :param slave: The slave context to get :returns: The requested slave context - ''' + """ if slave not in self.slaves: self.slaves[slave] = RemoteSingleSlaveContext(self, slave) return self.slaves[slave] diff --git a/examples/contrib/rx-messages b/examples/contrib/rx_messages similarity index 100% rename from examples/contrib/rx-messages rename to examples/contrib/rx_messages diff --git a/examples/contrib/serial-forwarder.py b/examples/contrib/serial-forwarder.py deleted file mode 100755 index 23ef69f45..000000000 --- a/examples/contrib/serial-forwarder.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python -''' -Pymodbus Synchronous Serial Forwarder --------------------------------------------------------------------------- - -We basically set the context for the tcp serial server to be that of a -serial client! This is just an example of how clever you can be with -the data context (basically anything can become a modbus device). -''' -#---------------------------------------------------------------------------# -# import the various server implementations -#---------------------------------------------------------------------------# -from pymodbus.server.sync import StartTcpServer as StartServer -from pymodbus.client.sync import ModbusSerialClient as ModbusClient - -from pymodbus.datastore.remote import RemoteSlaveContext -from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext - -#---------------------------------------------------------------------------# -# configure the service logging -#---------------------------------------------------------------------------# -import logging -logging.basicConfig() -log = logging.getLogger() -log.setLevel(logging.DEBUG) - -#---------------------------------------------------------------------------# -# initialize the datastore(serial client) -#---------------------------------------------------------------------------# -client = ModbusClient(method='ascii', port='/dev/pts/14') -store = RemoteSlaveContext(client) -context = ModbusServerContext(slaves=store, single=True) - -#---------------------------------------------------------------------------# -# run the server you want -#---------------------------------------------------------------------------# -StartServer(context) diff --git a/examples/contrib/serial_forwarder.py b/examples/contrib/serial_forwarder.py new file mode 100755 index 000000000..de478050c --- /dev/null +++ b/examples/contrib/serial_forwarder.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +""" +Pymodbus Synchronous Serial Forwarder +-------------------------------------------------------------------------- + +We basically set the context for the tcp serial server to be that of a +serial client! This is just an example of how clever you can be with +the data context (basically anything can become a modbus device). +""" +# --------------------------------------------------------------------------- # +# import the various server implementations +# --------------------------------------------------------------------------- # +from pymodbus.server.sync import StartTcpServer as StartServer +from pymodbus.client.sync import ModbusSerialClient as ModbusClient + +from pymodbus.datastore.remote import RemoteSlaveContext +from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext + +# --------------------------------------------------------------------------- # +# configure the service logging +# --------------------------------------------------------------------------- # +import logging +logging.basicConfig() +log = logging.getLogger() +log.setLevel(logging.DEBUG) + + +def run_serial_forwarder(): + # ----------------------------------------------------------------------- # + # initialize the datastore(serial client) + # ----------------------------------------------------------------------- # + client = ModbusClient(method='ascii', port='/dev/pts/14') + store = RemoteSlaveContext(client) + context = ModbusServerContext(slaves=store, single=True) + + # ----------------------------------------------------------------------- # + # run the server you want + # ----------------------------------------------------------------------- # + StartServer(context) + + +if __name__ == "__main__": + run_serial_forwarder() diff --git a/examples/contrib/sunspec_client.py b/examples/contrib/sunspec_client.py index 360461014..a472f1901 100644 --- a/examples/contrib/sunspec_client.py +++ b/examples/contrib/sunspec_client.py @@ -13,13 +13,13 @@ logging.basicConfig() -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Sunspec Common Constants -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class SunspecDefaultValue(object): - ''' A collection of constants to indicate if + """ A collection of constants to indicate if a value is not implemented. - ''' + """ Signed16 = 0x8000 Unsigned16 = 0xffff Accumulator16 = 0x0000 @@ -35,25 +35,25 @@ class SunspecDefaultValue(object): class SunspecStatus(object): - ''' Indicators of the current status of a + """ Indicators of the current status of a sunspec device - ''' + """ Normal = 0x00000000 Error = 0xfffffffe Unknown = 0xffffffff class SunspecIdentifier(object): - ''' Assigned identifiers that are pre-assigned + """ Assigned identifiers that are pre-assigned by the sunspec protocol. - ''' + """ Sunspec = 0x53756e53 class SunspecModel(object): - ''' Assigned device indentifiers that are pre-assigned + """ Assigned device indentifiers that are pre-assigned by the sunspec protocol. - ''' + """ #--------------------------------------------- # 0xx Common Models #--------------------------------------------- @@ -124,38 +124,38 @@ class SunspecModel(object): @classmethod def lookup(klass, code): - ''' Given a device identifier, return the + """ Given a device identifier, return the device model name for that identifier :param code: The device code to lookup :returns: The device model name, or None if none available - ''' + """ values = dict((v, k) for k, v in klass.__dict__.iteritems() if not callable(v)) return values.get(code, None) class SunspecOffsets(object): - ''' Well known offsets that are used throughout + """ Well known offsets that are used throughout the sunspec protocol - ''' + """ CommonBlock = 40000 CommonBlockLength = 69 AlternateCommonBlock = 50000 -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Common Functions -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # def defer_or_apply(func): - ''' Decorator to apply an adapter method + """ Decorator to apply an adapter method to a result regardless if it is a deferred or a concrete response. :param func: The function to decorate - ''' + """ def closure(future, adapt): - if isinstance(defer, Deferred): + if isinstance(future, Deferred): d = Deferred() future.addCallback(lambda r: d.callback(adapt(r))) return d @@ -164,12 +164,12 @@ def closure(future, adapt): def create_sunspec_sync_client(host): - ''' A quick helper method to create a sunspec + """ A quick helper method to create a sunspec client. :param host: The host to connect to :returns: an initialized SunspecClient - ''' + """ modbus = ModbusTcpClient(host) modbus.connect() client = SunspecClient(modbus) @@ -177,28 +177,28 @@ def create_sunspec_sync_client(host): return client -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Sunspec Client -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class SunspecDecoder(BinaryPayloadDecoder): - ''' A decoder that deals correctly with the sunspec + """ A decoder that deals correctly with the sunspec binary format. - ''' + """ def __init__(self, payload, endian): - ''' Initialize a new instance of the SunspecDecoder + """ Initialize a new instance of the SunspecDecoder .. note:: This is always set to big endian byte order as specified in the protocol. - ''' + """ endian = Endian.Big BinaryPayloadDecoder.__init__(self, payload, endian) def decode_string(self, size=1): - ''' Decodes a string from the buffer + """ Decodes a string from the buffer :param size: The size of the string to decode - ''' + """ self._pointer += size string = self._payload[self._pointer - size:self._pointer] return string.split(SunspecDefaultValue.String)[0] @@ -207,18 +207,18 @@ def decode_string(self, size=1): class SunspecClient(object): def __init__(self, client): - ''' Initialize a new instance of the client + """ Initialize a new instance of the client :param client: The modbus client to use - ''' + """ self.client = client self.offset = SunspecOffsets.CommonBlock def initialize(self): - ''' Initialize the underlying client values + """ Initialize the underlying client values :returns: True if successful, false otherwise - ''' + """ decoder = self.get_device_block(self.offset, 2) if decoder.decode_32bit_uint() == SunspecIdentifier.Sunspec: return True @@ -227,11 +227,11 @@ def initialize(self): return decoder.decode_32bit_uint() == SunspecIdentifier.Sunspec def get_common_block(self): - ''' Read and return the sunspec common information + """ Read and return the sunspec common information block. :returns: A dictionary of the common block information - ''' + """ length = SunspecOffsets.CommonBlockLength decoder = self.get_device_block(self.offset, length) return { @@ -249,7 +249,7 @@ def get_common_block(self): } def get_device_block(self, offset, size): - ''' A helper method to retrieve the next device block + """ A helper method to retrieve the next device block .. note:: We will read 2 more registers so that we have the information for the next block. @@ -257,13 +257,13 @@ def get_device_block(self, offset, size): :param offset: The offset to start reading at :param size: The size of the offset to read :returns: An initialized decoder for that result - ''' + """ _logger.debug("reading device block[{}..{}]".format(offset, offset + size)) response = self.client.read_holding_registers(offset, size + 2) return SunspecDecoder.fromRegisters(response.registers) def get_all_device_blocks(self): - ''' Retrieve all the available blocks in the supplied + """ Retrieve all the available blocks in the supplied sunspec device. .. note:: Since we do not know how to decode the available @@ -273,7 +273,7 @@ def get_all_device_blocks(self): model: the-model-identifier (name) :returns: A list of the available blocks - ''' + """ blocks = [] offset = self.offset + 2 model = SunspecModel.CommonBlock @@ -302,12 +302,11 @@ def get_all_device_blocks(self): for key, value in common.iteritems(): if key == "SunSpec_DID": value = SunspecModel.lookup(value) - print "{:<20}: {}".format(key, value) + print("{:<20}: {}".format(key, value)) # print out all the available device blocks blocks = client.get_all_device_blocks() for block in blocks: - print block + print(block) client.client.close() - diff --git a/examples/contrib/thread_safe_datastore.py b/examples/contrib/thread_safe_datastore.py index 6a13e947e..edaf8afee 100644 --- a/examples/contrib/thread_safe_datastore.py +++ b/examples/contrib/thread_safe_datastore.py @@ -4,13 +4,13 @@ class ContextWrapper(object): - ''' This is a simple wrapper around enter + """ This is a simple wrapper around enter and exit functions that conforms to the pyhton context manager protocol: with ContextWrapper(enter, leave): do_something() - ''' + """ def __init__(self, enter=None, leave=None, factory=None): self._enter = enter @@ -26,7 +26,7 @@ def __exit__(self, args): class ReadWriteLock(object): - ''' This reader writer lock gurantees write order, but not + """ This reader writer lock gurantees write order, but not read order and is generally biased towards allowing writes if they are available to prevent starvation. @@ -36,26 +36,26 @@ class ReadWriteLock(object): - currently write biased - read biased allow N readers in queue - random is 50/50 choice of next - ''' + """ def __init__(self): - ''' Initializes a new instance of the ReadWriteLock - ''' - self.queue = [] # the current writer queue - self.lock = threading.Lock() # the underlying condition lock + """ Initializes a new instance of the ReadWriteLock + """ + self.queue = [] # the current writer queue + self.lock = threading.Lock() # the underlying condition lock self.read_condition = threading.Condition(self.lock) # the single reader condition - self.readers = 0 # the number of current readers - self.writer = False # is there a current writer + self.readers = 0 # the number of current readers + self.writer = False # is there a current writer def __is_pending_writer(self): - return (self.writer # if there is a current writer - or (self.queue # or if there is a waiting writer + return (self.writer # if there is a current writer + or (self.queue # or if there is a waiting writer and (self.queue[0] != self.read_condition))) # or if the queue head is not a reader def acquire_reader(self): - ''' Notifies the lock that a new reader is requesting + """ Notifies the lock that a new reader is requesting the underlying resource. - ''' + """ with self.lock: if self.__is_pending_writer(): # if there are existing writers waiting if self.read_condition not in self.queue: # do not pollute the queue with readers @@ -67,9 +67,9 @@ def acquire_reader(self): self.readers += 1 # update the current number of readers def acquire_writer(self): - ''' Notifies the lock that a new writer is requesting + """ Notifies the lock that a new writer is requesting the underlying resource. - ''' + """ with self.lock: if self.writer or self.readers: # if we need to wait on a writer or readers condition = threading.Condition(self.lock) # create a condition just for this writer @@ -80,18 +80,18 @@ def acquire_writer(self): self.writer = True # stop other writers from operating def release_reader(self): - ''' Notifies the lock that an existing reader is + """ Notifies the lock that an existing reader is finished with the underlying resource. - ''' + """ with self.lock: self.readers = max(0, self.readers - 1) # readers should never go below 0 if not self.readers and self.queue: # if there are no active readers self.queue[0].notify_all() # then notify any waiting writers def release_writer(self): - ''' Notifies the lock that an existing writer is + """ Notifies the lock that an existing writer is finished with the underlying resource. - ''' + """ with self.lock: self.writer = False # give up current writing handle if self.queue: # if someone is waiting in the queue @@ -100,12 +100,12 @@ def release_writer(self): @contextmanager def get_reader_lock(self): - ''' Wrap some code with a reader lock using the + """ Wrap some code with a reader lock using the python context manager protocol:: with rwlock.get_reader_lock(): do_read_operation() - ''' + """ try: self.acquire_reader() yield self @@ -113,12 +113,12 @@ def get_reader_lock(self): @contextmanager def get_writer_lock(self): - ''' Wrap some code with a writer lock using the + """ Wrap some code with a writer lock using the python context manager protocol:: with rwlock.get_writer_lock(): do_read_operation() - ''' + """ try: self.acquire_writer() yield self @@ -126,7 +126,7 @@ def get_writer_lock(self): class ThreadSafeDataBlock(BaseModbusDataBlock): - ''' This is a simple decorator for a data block. This allows + """ This is a simple decorator for a data block. This allows a user to inject an existing data block which can then be safely operated on from multiple cocurrent threads. @@ -134,42 +134,42 @@ class ThreadSafeDataBlock(BaseModbusDataBlock): datablock instead of the manager as there is less source of contention (writes can occur to slave 0x01 while reads can occur to slave 0x02). - ''' + """ def __init__(self, block): - ''' Initialize a new thread safe decorator + """ Initialize a new thread safe decorator :param block: The block to decorate - ''' + """ self.rwlock = ReadWriteLock() self.block = block def validate(self, address, count=1): - ''' Checks to see if the request is in range + """ Checks to see if the request is in range :param address: The starting address :param count: The number of values to test for :returns: True if the request in within range, False otherwise - ''' + """ with self.rwlock.get_reader_lock(): return self.block.validate(address, count) def getValues(self, address, count=1): - ''' Returns the requested values of the datastore + """ Returns the requested values of the datastore :param address: The starting address :param count: The number of values to retrieve :returns: The requested values from a:a+c - ''' + """ with self.rwlock.get_reader_lock(): return self.block.getValues(address, count) def setValues(self, address, values): - ''' Sets the requested values of the datastore + """ Sets the requested values of the datastore :param address: The starting address :param values: The new values to be set - ''' + """ with self.rwlock.get_writer_lock(): return self.block.setValues(address, values) @@ -206,4 +206,4 @@ def write(): wthreads = [threading.Thread(target=write) for i in range(2)] for t in rthreads + wthreads: t.start() for t in rthreads + wthreads: t.join() - print "readers[%d] writers[%d]" % (readers.counter, writers.counter) + print("readers[%d] writers[%d]" % (readers.counter, writers.counter)) diff --git a/examples/contrib/tx-messages b/examples/contrib/tx_messages similarity index 100% rename from examples/contrib/tx-messages rename to examples/contrib/tx_messages diff --git a/examples/functional/__init__.py b/examples/functional/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/examples/functional/asynchronous-ascii-client.py b/examples/functional/asynchronous_ascii_client.py similarity index 85% rename from examples/functional/asynchronous-ascii-client.py rename to examples/functional/asynchronous_ascii_client.py index afb19cc37..aaaffc8a0 100644 --- a/examples/functional/asynchronous-ascii-client.py +++ b/examples/functional/asynchronous_ascii_client.py @@ -4,18 +4,18 @@ from base_runner import Runner class AsynchronousAsciiClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the asynchronous serial ascii client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ super(Runner, self).setUp() self.client = ModbusClient(method='ascii') def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() self.shutdown() diff --git a/examples/functional/asynchronous-rtu-client.py b/examples/functional/asynchronous_rtu_client.py similarity index 85% rename from examples/functional/asynchronous-rtu-client.py rename to examples/functional/asynchronous_rtu_client.py index f4c84c78d..96676e8b1 100644 --- a/examples/functional/asynchronous-rtu-client.py +++ b/examples/functional/asynchronous_rtu_client.py @@ -4,18 +4,18 @@ from base_runner import Runner class AsynchronousRtuClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the asynchronous serial rtu client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ super(Runner, self).setUp() self.client = ModbusClient(method='rtu') def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() super(Runner, self).tearDown() diff --git a/examples/functional/asynchronous-tcp-client.py b/examples/functional/asynchronous_tcp_client.py similarity index 90% rename from examples/functional/asynchronous-tcp-client.py rename to examples/functional/asynchronous_tcp_client.py index 1dd9d6d2a..fde20181b 100644 --- a/examples/functional/asynchronous-tcp-client.py +++ b/examples/functional/asynchronous_tcp_client.py @@ -6,13 +6,13 @@ from base_runner import Runner class AsynchronousTcpClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the asynchronous tcp client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ def _callback(client): self.client = client self.initialize(["../tools/reference/diagslave", "-m", "tcp", "-p", "12345"]) defer = protocol.ClientCreator(reactor, ModbusClientProtocol @@ -21,7 +21,7 @@ def _callback(client): self.client = client reactor.run() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ reactor.callLater(1, client.transport.loseConnection) reactor.callLater(2, reactor.stop) reactor.shutdown() diff --git a/examples/functional/asynchronous-udp-client.py b/examples/functional/asynchronous_udp_client.py similarity index 85% rename from examples/functional/asynchronous-udp-client.py rename to examples/functional/asynchronous_udp_client.py index e5f993560..696fa5dbb 100644 --- a/examples/functional/asynchronous-udp-client.py +++ b/examples/functional/asynchronous_udp_client.py @@ -4,18 +4,18 @@ from base_runner import Runner class AsynchronousUdpClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the asynchronous udp client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ super(Runner, self).setUp() self.client = ModbusClient() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() super(Runner, self).tearDown() diff --git a/examples/functional/base_context.py b/examples/functional/base_context.py index 278248558..1745a0b91 100644 --- a/examples/functional/base_context.py +++ b/examples/functional/base_context.py @@ -3,21 +3,21 @@ from subprocess import Popen as execute from twisted.internet.defer import Deferred -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # configure the client logging -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # import logging log = logging.getLogger(__name__) class ContextRunner(object): - ''' + """ This is the base runner class for all the integration tests - ''' + """ __bit_functions = [2,1] # redundant are removed for now __reg_functions = [4,3] # redundant are removed for now def initialize(self, service=None): - ''' Initializes the test environment ''' + """ Initializes the test environment """ if service: self.fnull = open(os.devnull, 'w') self.service = execute(service, stdout=self.fnull, stderr=self.fnull) @@ -27,7 +27,7 @@ def initialize(self, service=None): log.debug("%s context started", self.context) def shutdown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ try: if self.service: self.service.kill() @@ -37,7 +37,7 @@ def shutdown(self): log.debug("%s context stopped" % self.context) def testDataContextRegisters(self): - ''' Test that the context gets and sets registers ''' + """ Test that the context gets and sets registers """ address = 10 values = [0x1234] * 32 for fx in self.__reg_functions: @@ -47,7 +47,7 @@ def testDataContextRegisters(self): self.assertEquals(result, values) def testDataContextDiscretes(self): - ''' Test that the context gets and sets discretes ''' + """ Test that the context gets and sets discretes """ address = 10 values = [True] * 32 for fx in self.__bit_functions: diff --git a/examples/functional/base_runner.py b/examples/functional/base_runner.py index c432f798d..34e81d262 100644 --- a/examples/functional/base_runner.py +++ b/examples/functional/base_runner.py @@ -3,26 +3,26 @@ from subprocess import Popen as execute from twisted.internet.defer import Deferred -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # configure the client logging -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # import logging log = logging.getLogger(__name__) class Runner(object): - ''' + """ This is the base runner class for all the integration tests - ''' + """ def initialize(self, service): - ''' Initializes the test environment ''' + """ Initializes the test environment """ self.fnull = open(os.devnull, 'w') self.server = execute(service, stdout=self.fnull, stderr=self.fnull) log.debug("%s service started: %s", service, self.server.pid) time.sleep(0.2) def shutdown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.server.kill() self.fnull.close() log.debug("service stopped") @@ -70,11 +70,11 @@ def testReadWriteRegistersTogether(self): self.__validate(rr, lambda r: r.registers == [20]*8) def __validate(self, result, test): - ''' Validate the result whether it is a result or a deferred. + """ Validate the result whether it is a result or a deferred. :param result: The result to __validate :param callback: The test to __validate - ''' + """ if isinstance(result, Deferred): deferred.callback(lambda : self.assertTrue(test(result))) deferred.errback(lambda _: self.assertTrue(False)) diff --git a/examples/functional/database-slave-context.py b/examples/functional/database_slave_context.py similarity index 88% rename from examples/functional/database-slave-context.py rename to examples/functional/database_slave_context.py index c4269fcbd..372b1fdbe 100644 --- a/examples/functional/database-slave-context.py +++ b/examples/functional/database_slave_context.py @@ -4,21 +4,21 @@ from base_context import ContextRunner class DatabaseSlaveContextTest(ContextRunner, unittest.TestCase): - ''' + """ These are the integration tests for using the redis slave context. - ''' + """ __database = 'sqlite:///pymodbus-test.db' def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ path = './' + self.__database.split('///')[1] if os.path.exists(path): os.remove(path) self.context = DatabaseSlaveContext(database=self.__database) self.initialize() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.context._connection.close() self.shutdown() diff --git a/examples/functional/memory-slave-context.py b/examples/functional/memory_slave_context.py similarity index 89% rename from examples/functional/memory-slave-context.py rename to examples/functional/memory_slave_context.py index e239d3018..1145281f4 100755 --- a/examples/functional/memory-slave-context.py +++ b/examples/functional/memory_slave_context.py @@ -5,13 +5,13 @@ from base_context import ContextRunner class MemorySlaveContextTest(ContextRunner, unittest.TestCase): - ''' + """ These are the integration tests for using the in memory slave context. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ self.context = ModbusSlaveContext(**{ 'di' : ModbusSequentialDataBlock(0, [0]*100), 'co' : ModbusSequentialDataBlock(0, [0]*100), @@ -20,7 +20,7 @@ def setUp(self): self.initialize() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.shutdown() #---------------------------------------------------------------------------# diff --git a/examples/functional/redis-slave-context.py b/examples/functional/redis_slave_context.py similarity index 87% rename from examples/functional/redis-slave-context.py rename to examples/functional/redis_slave_context.py index 364aa50dd..e0f28b31f 100644 --- a/examples/functional/redis-slave-context.py +++ b/examples/functional/redis_slave_context.py @@ -6,18 +6,18 @@ from base_context import ContextRunner class RedisSlaveContextTest(ContextRunner, unittest.TestCase): - ''' + """ These are the integration tests for using the redis slave context. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ self.context = RedisSlaveContext() # the redis client will block, so no wait needed self.initialize("redis-server") def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.server.kill() self.fnull.close() self.shutdown() diff --git a/examples/functional/remote-slave-context.py b/examples/functional/remote_slave_context.py similarity index 89% rename from examples/functional/remote-slave-context.py rename to examples/functional/remote_slave_context.py index d0e946502..0e6355184 100644 --- a/examples/functional/remote-slave-context.py +++ b/examples/functional/remote_slave_context.py @@ -5,20 +5,20 @@ from base_context import ContextRunner class RemoteSlaveContextTest(ContextRunner, unittest.TestCase): - ''' + """ These are the integration tests for using the redis slave context. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ self.context = RemoteSlaveContext(client=None) # for the log statment self.initialize(["../tools/reference/diagslave", "-m", "tcp", "-p", "12345"]) self.client = ModbusTcpClient(port=12345) self.context = RemoteSlaveContext(client=self.client) def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() self.shutdown() diff --git a/examples/functional/synchronous-ascii-client.py b/examples/functional/synchronous_ascii_client.py similarity index 88% rename from examples/functional/synchronous-ascii-client.py rename to examples/functional/synchronous_ascii_client.py index 2099881cf..abf63c193 100644 --- a/examples/functional/synchronous-ascii-client.py +++ b/examples/functional/synchronous_ascii_client.py @@ -4,13 +4,13 @@ from base_runner import Runner class SynchronousAsciiClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the synchronous serial ascii client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ super(Runner, self).setUp() # "../tools/nullmodem/linux/run", self.initialize(["../tools/reference/diagslave", "-m", "ascii", "/dev/pts/14"]) @@ -18,7 +18,7 @@ def setUp(self): self.client.connect() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() super(Runner, self).tearDown() diff --git a/examples/functional/synchronous-rtu-client.py b/examples/functional/synchronous_rtu_client.py similarity index 88% rename from examples/functional/synchronous-rtu-client.py rename to examples/functional/synchronous_rtu_client.py index 3885f9ff0..c92d67f0b 100644 --- a/examples/functional/synchronous-rtu-client.py +++ b/examples/functional/synchronous_rtu_client.py @@ -4,20 +4,20 @@ from base_runner import Runner class SynchronousRtuClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the synchronous serial rtu client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ super(Runner, self).setUp() self.initialize(["../tools/reference/diagslave", "-m", "rtu", "/dev/pts/14"]) self.client = ModbusClient(method='rtu', timeout=0.2, port='/dev/pts/13') self.client.connect() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() super(Runner, self).tearDown() diff --git a/examples/functional/synchronous-tcp-client.py b/examples/functional/synchronous_tcp_client.py similarity index 86% rename from examples/functional/synchronous-tcp-client.py rename to examples/functional/synchronous_tcp_client.py index 4e6e904d5..36acde451 100644 --- a/examples/functional/synchronous-tcp-client.py +++ b/examples/functional/synchronous_tcp_client.py @@ -4,18 +4,18 @@ from base_runner import Runner class SynchronousTcpClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the synchronous tcp client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ self.initialize(["../tools/reference/diagslave", "-m", "tcp", "-p", "12345"]) self.client = ModbusClient(port=12345) def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() self.shutdown() diff --git a/examples/functional/synchronous-udp-client.py b/examples/functional/synchronous_udp_client.py similarity index 85% rename from examples/functional/synchronous-udp-client.py rename to examples/functional/synchronous_udp_client.py index 9507ab78b..7af2ee176 100644 --- a/examples/functional/synchronous-udp-client.py +++ b/examples/functional/synchronous_udp_client.py @@ -4,18 +4,18 @@ from base_runner import Runner class SynchronousUdpClient(Runner, unittest.TestCase): - ''' + """ These are the integration tests for the synchronous udp client. - ''' + """ def setUp(self): - ''' Initializes the test environment ''' + """ Initializes the test environment """ super(Runner, self).setUp() self.client = ModbusClient() def tearDown(self): - ''' Cleans up the test environment ''' + """ Cleans up the test environment """ self.client.close() super(Runner, self).tearDown() diff --git a/examples/gui/bottle/frontend.py b/examples/gui/bottle/frontend.py index fdbcb2849..56ef04ee7 100644 --- a/examples/gui/bottle/frontend.py +++ b/examples/gui/bottle/frontend.py @@ -1,47 +1,47 @@ -''' +""" Pymodbus Web Frontend ======================================= This is a simple web frontend using bottle as the web framework. This can be hosted using any wsgi adapter. -''' +""" from __future__ import print_function import json, inspect from bottle import route, request, Bottle from bottle import static_file from bottle import jinja2_template as template -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # configure the client logging -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # import logging logging.basicConfig() log = logging.getLogger() log.setLevel(logging.DEBUG) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # REST API -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # class Response(object): - ''' + """ A collection of common responses for the frontend api - ''' + """ success = { 'status' : 200 } failure = { 'status' : 500 } class ModbusApiWebApp(object): - ''' + """ This is the web REST api interace into the pymodbus service. It can be consumed by any utility that can make web requests (javascript). - ''' + """ _namespace = '/api/v1' def __init__(self, server): - ''' Initialize a new instance of the ModbusApi + """ Initialize a new instance of the ModbusApi :param server: The current server instance - ''' + """ self._server = server #---------------------------------------------------------------------# @@ -177,12 +177,12 @@ def post_inputs(self, address='0'): # webpage routes #---------------------------------------------------------------------# def register_web_routes(application, register): - ''' A helper method to register the default web routes of + """ A helper method to register the default web routes of a single page application. :param application: The application instance to register :param register: The bottle instance to register the application with - ''' + """ def get_index_file(): return template('index.html') @@ -192,17 +192,17 @@ def get_static_file(filename): register.route('/', method='GET', name='get_index_file')(get_index_file) register.route('/media/', method='GET', name='get_static_file')(get_static_file) -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Configurations -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # def register_api_routes(application, register): - ''' A helper method to register the routes of an application + """ A helper method to register the routes of an application based on convention. This is easier to manage than having to decorate each method with a static route name. :param application: The application instance to register :param register: The bottle instance to register the application with - ''' + """ log.info("installing application routes:") methods = inspect.getmembers(application) methods = filter(lambda n: not n[0].startswith('_'), methods) @@ -219,11 +219,11 @@ def register_api_routes(application, register): register.route(path, method=verb, name=method)(func) def build_application(server): - ''' Helper method to create and initiailze a bottle application + """ Helper method to create and initiailze a bottle application :param server: The modbus server to pull instance data from :returns: An initialied bottle application - ''' + """ log.info("building web application") api = ModbusApiWebApp(server) register = Bottle() @@ -231,26 +231,26 @@ def build_application(server): register_web_routes(api, register) return register -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Start Methods -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # def RunModbusFrontend(server, port=8080): - ''' Helper method to host bottle in twisted + """ Helper method to host bottle in twisted :param server: The modbus server to pull instance data from :param port: The port to host the service on - ''' + """ from bottle import TwistedServer, run application = build_application(server) run(app=application, server=TwistedServer, port=port) def RunDebugModbusFrontend(server, port=8080): - ''' Helper method to start the bottle server + """ Helper method to start the bottle server :param server: The modbus server to pull instance data from :param port: The port to host the service on - ''' + """ from bottle import run application = build_application(server) diff --git a/examples/gui/bottle/media/css/bootstrap-responsive.css b/examples/gui/bottle/media/css/bootstrap_responsive.css similarity index 100% rename from examples/gui/bottle/media/css/bootstrap-responsive.css rename to examples/gui/bottle/media/css/bootstrap_responsive.css diff --git a/examples/gui/bottle/media/css/bootstrap-responsive.min.css b/examples/gui/bottle/media/css/bootstrap_responsive.min.css similarity index 100% rename from examples/gui/bottle/media/css/bootstrap-responsive.min.css rename to examples/gui/bottle/media/css/bootstrap_responsive.min.css diff --git a/examples/gui/bottle/media/img/glyphicons-halflings.png b/examples/gui/bottle/media/img/glyphicons_halflings.png similarity index 100% rename from examples/gui/bottle/media/img/glyphicons-halflings.png rename to examples/gui/bottle/media/img/glyphicons_halflings.png diff --git a/examples/gui/bottle/media/img/glyphicons-halflings-white.png b/examples/gui/bottle/media/img/glyphicons_halflings_white.png similarity index 100% rename from examples/gui/bottle/media/img/glyphicons-halflings-white.png rename to examples/gui/bottle/media/img/glyphicons_halflings_white.png diff --git a/examples/gui/gtk/simulator.py b/examples/gui/gtk/simulator.py index ea0fb51e2..1accbda73 100755 --- a/examples/gui/gtk/simulator.py +++ b/examples/gui/gtk/simulator.py @@ -33,7 +33,7 @@ # Application Error #---------------------------------------------------------------------------# class ConfigurationException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ def __init__(self, string): Exception.__init__(self, string) @@ -48,36 +48,36 @@ def __str__(self): # These are extra helper functions that don't belong in a class #---------------------------------------------------------------------------# def root_test(): - ''' Simple test to see if we are running as root ''' + """ Simple test to see if we are running as root """ return getpass.getuser() == "root" #---------------------------------------------------------------------------# # Simulator Class #---------------------------------------------------------------------------# class Simulator(object): - ''' + """ Class used to parse configuration file and create and modbus datastore. The format of the configuration file is actually just a python pickle, which is a compressed memory dump from the scraper. - ''' + """ def __init__(self, config): - ''' + """ Trys to load a configuration file, lets the file not found exception fall through @param config The pickled datastore - ''' + """ try: self.file = open(config, "r") except Exception: raise ConfigurationException("File not found %s" % config) def _parse(self): - ''' Parses the config file and creates a server context ''' + """ Parses the config file and creates a server context """ try: handle = pickle.load(self.file) dsd = handle['di'] @@ -90,7 +90,7 @@ def _parse(self): return ModbusServerContext(slaves=slave) def _simulator(self): - ''' Starts the snmp simulator ''' + """ Starts the snmp simulator """ ports = [502]+range(20000,25000) for port in ports: try: @@ -101,7 +101,7 @@ def _simulator(self): pass def run(self): - ''' Used to run the simulator ''' + """ Used to run the simulator """ reactor.callWhenRunning(self._simulator) #---------------------------------------------------------------------------# @@ -111,17 +111,17 @@ def run(self): # in for linux(debian/redhat)/windows/nix #---------------------------------------------------------------------------# class NetworkReset(Thread): - ''' + """ This class is simply a daemon that is spun off at the end of the program to call the network restart function (an easy way to remove all the virtual interfaces) - ''' + """ def __init__(self): Thread.__init__(self) self.setDaemon(True) def run(self): - ''' Run the network reset ''' + """ Run the network reset """ os.system("/etc/init.d/networking restart") #---------------------------------------------------------------------------# @@ -153,16 +153,16 @@ def run(self): # handle = Simulator(config=self.file) #---------------------------------------------------------------------------# class SimulatorApp(object): - ''' + """ This class implements the GUI for the flasher application - ''' + """ file = "none" subnet = 205 number = 1 restart = 0 def __init__(self, xml): - ''' Sets up the gui, callback, and widget handles ''' + """ Sets up the gui, callback, and widget handles """ #---------------------------------------------------------------------------# # Action Handles @@ -196,7 +196,7 @@ def __init__(self, xml): # Not callbacks, but used by them #---------------------------------------------------------------------------# def show_buttons(self, state=False, all=0): - ''' Greys out the buttons ''' + """ Greys out the buttons """ if all: self.window.set_sensitive(state) self.bstart.set_sensitive(state) @@ -205,13 +205,13 @@ def show_buttons(self, state=False, all=0): self.tnumber.set_sensitive(state) def destroy_interfaces(self): - ''' This is used to reset the virtual interfaces ''' + """ This is used to reset the virtual interfaces """ if self.restart: n = NetworkReset() n.start() def error_dialog(self, message, quit=False): - ''' Quick pop-up for error messages ''' + """ Quick pop-up for error messages """ dialog = gtk.MessageDialog( parent = self.window, flags = gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, @@ -231,7 +231,7 @@ def error_dialog(self, message, quit=False): # These are all callbacks for the various buttons #---------------------------------------------------------------------------# def start_clicked(self, widget): - ''' Starts the simulator ''' + """ Starts the simulator """ start = 1 base = "172.16" @@ -273,7 +273,7 @@ def start_clicked(self, widget): return False def help_clicked(self, widget): - ''' Quick pop-up for about page ''' + """ Quick pop-up for about page """ data = gtk.AboutDialog() data.set_version("0.1") data.set_name(('Modbus Simulator')) @@ -286,12 +286,12 @@ def help_clicked(self, widget): data.run() def close_clicked(self, widget): - ''' Callback for close button ''' + """ Callback for close button """ self.destroy_interfaces() reactor.stop() # quit twisted def file_changed(self, widget): - ''' Callback for the filename change ''' + """ Callback for the filename change """ self.file = widget.get_filename() #---------------------------------------------------------------------------# @@ -301,10 +301,10 @@ def file_changed(self, widget): # We simply start the gui and start the twisted event loop #---------------------------------------------------------------------------# def main(): - ''' + """ Main control function This either launches the gui or runs the command line application - ''' + """ debug = True if debug: try: diff --git a/examples/gui/gui-common.py b/examples/gui/gui_common.py similarity index 60% rename from examples/gui/gui-common.py rename to examples/gui/gui_common.py index c78e595d1..8ac4088fa 100755 --- a/examples/gui/gui-common.py +++ b/examples/gui/gui_common.py @@ -1,69 +1,75 @@ #!/usr/bin/env python -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # System -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import os import getpass import pickle from threading import Thread -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # SNMP Simulator -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # from twisted.internet import reactor from twisted.internet import error as twisted_error from pymodbus.server.async import ModbusServerFactory from pymodbus.datastore import ModbusServerContext,ModbusSlaveContext -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Logging -#--------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # import logging log = logging.getLogger("pymodbus") -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Application Error -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + class ConfigurationException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ pass -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Extra Global Functions -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # These are extra helper functions that don't belong in a class -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + def root_test(): - ''' Simple test to see if we are running as root ''' + """ Simple test to see if we are running as root """ return getpass.getuser() == "root" -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Simulator Class -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + class Simulator(object): - ''' + """ Class used to parse configuration file and create and modbus datastore. The format of the configuration file is actually just a python pickle, which is a compressed memory dump from the scraper. - ''' + """ def __init__(self, config): - ''' + """ Trys to load a configuration file, lets the file not found exception fall through :param config: The pickled datastore - ''' + """ try: self.file = open(config, "r") except Exception: raise ConfigurationException("File not found %s" % config) def _parse(self): - ''' Parses the config file and creates a server context ''' + """ Parses the config file and creates a server context """ try: handle = pickle.load(self.file) dsd = handle['di'] @@ -76,7 +82,7 @@ def _parse(self): return ModbusServerContext(slaves=slave) def _simulator(self): - ''' Starts the snmp simulator ''' + """ Starts the snmp simulator """ ports = [502]+range(20000,25000) for port in ports: try: @@ -87,29 +93,30 @@ def _simulator(self): pass def run(self): - ''' Used to run the simulator ''' + """ Used to run the simulator """ log.debug('simulator started') reactor.callWhenRunning(self._simulator) -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # Network reset thread -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # # This is linux only, maybe I should make a base class that can be filled # in for linux(debian/redhat)/windows/nix -#---------------------------------------------------------------------------# +# -------------------------------------------------------------------------- # + + class NetworkReset(Thread): - ''' + """ This class is simply a daemon that is spun off at the end of the program to call the network restart function (an easy way to remove all the virtual interfaces) - ''' + """ def __init__(self): - ''' Initialize a new network reset thread ''' + """ Initialize a new network reset thread """ Thread.__init__(self) self.setDaemon(True) def run(self): - ''' Run the network reset ''' + """ Run the network reset """ os.system("/etc/init.d/networking restart") - diff --git a/examples/gui/tk/simulator.py b/examples/gui/tk/simulator.py index 13cc767c9..d8c59bc22 100755 --- a/examples/gui/tk/simulator.py +++ b/examples/gui/tk/simulator.py @@ -1,7 +1,7 @@ #!/usr/bin/env python -''' +""" Note that this is not finished -''' +""" #---------------------------------------------------------------------------# # System #---------------------------------------------------------------------------# @@ -37,7 +37,7 @@ # Application Error #---------------------------------------------------------------------------# class ConfigurationException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ pass #---------------------------------------------------------------------------# @@ -46,36 +46,36 @@ class ConfigurationException(Exception): # These are extra helper functions that don't belong in a class #---------------------------------------------------------------------------# def root_test(): - ''' Simple test to see if we are running as root ''' + """ Simple test to see if we are running as root """ return getpass.getuser() == "root" #---------------------------------------------------------------------------# # Simulator Class #---------------------------------------------------------------------------# class Simulator(object): - ''' + """ Class used to parse configuration file and create and modbus datastore. The format of the configuration file is actually just a python pickle, which is a compressed memory dump from the scraper. - ''' + """ def __init__(self, config): - ''' + """ Trys to load a configuration file, lets the file not found exception fall through @param config The pickled datastore - ''' + """ try: self.file = open(config, "r") except Exception: raise ConfigurationException("File not found %s" % config) def _parse(self): - ''' Parses the config file and creates a server context ''' + """ Parses the config file and creates a server context """ try: handle = pickle.load(self.file) dsd = handle['di'] @@ -88,7 +88,7 @@ def _parse(self): return ModbusServerContext(slaves=slave) def _simulator(self): - ''' Starts the snmp simulator ''' + """ Starts the snmp simulator """ ports = [502]+range(20000,25000) for port in ports: try: @@ -99,7 +99,7 @@ def _simulator(self): pass def run(self): - ''' Used to run the simulator ''' + """ Used to run the simulator """ reactor.callWhenRunning(self._simulator) #---------------------------------------------------------------------------# @@ -109,32 +109,32 @@ def run(self): # in for linux(debian/redhat)/windows/nix #---------------------------------------------------------------------------# class NetworkReset(Thread): - ''' + """ This class is simply a daemon that is spun off at the end of the program to call the network restart function (an easy way to remove all the virtual interfaces) - ''' + """ def __init__(self): Thread.__init__(self) self.setDaemon(True) def run(self): - ''' Run the network reset ''' + """ Run the network reset """ os.system("/etc/init.d/networking restart") #---------------------------------------------------------------------------# # Main Gui Class #---------------------------------------------------------------------------# class SimulatorFrame(Frame): - ''' + """ This class implements the GUI for the flasher application - ''' + """ subnet = 205 number = 1 restart = 0 def __init__(self, master, font): - ''' Sets up the gui, callback, and widget handles ''' + """ Sets up the gui, callback, and widget handles """ Frame.__init__(self, master) self._widgets = [] @@ -198,19 +198,19 @@ def __init__(self, master, font): # Not callbacks, but used by them #---------------------------------------------------------------------------# def show_buttons(self, state=False): - ''' Greys out the buttons ''' + """ Greys out the buttons """ state = 'active' if state else 'disabled' for widget in self._widgets: widget.configure(state=state) def destroy_interfaces(self): - ''' This is used to reset the virtual interfaces ''' + """ This is used to reset the virtual interfaces """ if self.restart: n = NetworkReset() n.start() def error_dialog(self, message, quit=False): - ''' Quick pop-up for error messages ''' + """ Quick pop-up for error messages """ dialog = gtk.MessageDialog( parent = self.window, flags = gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_MODAL, @@ -229,7 +229,7 @@ def error_dialog(self, message, quit=False): # These are all callbacks for the various buttons #---------------------------------------------------------------------------# def start_clicked(self): - ''' Starts the simulator ''' + """ Starts the simulator """ start = 1 base = "172.16" @@ -264,7 +264,7 @@ def start_clicked(self): try: handle = Simulator(config=filename) handle.run() - except ConfigurationException, ex: + except ConfigurationException as ex: self.error_dialog("Error %s" % ex) self.show_buttons(state=True) else: @@ -272,7 +272,7 @@ def start_clicked(self): return False def help_clicked(self): - ''' Quick pop-up for about page ''' + """ Quick pop-up for about page """ data = gtk.AboutDialog() data.set_version("0.1") data.set_name(('Modbus Simulator')) @@ -285,25 +285,25 @@ def help_clicked(self): data.run() def close_clicked(self): - ''' Callback for close button ''' + """ Callback for close button """ #self.destroy_interfaces() reactor.stop() def file_clicked(self): - ''' Callback for the filename change ''' + """ Callback for the filename change """ file = OpenFilename() self.tdevice_value.set(file) class SimulatorApp(object): - ''' The main wx application handle for our simulator - ''' + """ The main wx application handle for our simulator + """ def __init__(self, master): - ''' + """ Called by wxWindows to initialize our application :param master: The master window to connect to - ''' + """ font = ('Helvetica', 12, 'normal') frame = SimulatorFrame(master, font) frame.pack() @@ -315,17 +315,17 @@ def __init__(self, master): # We simply start the gui and start the twisted event loop #---------------------------------------------------------------------------# def main(): - ''' + """ Main control function This either launches the gui or runs the command line application - ''' + """ debug = True if debug: try: log.setLevel(logging.DEBUG) logging.basicConfig() - except Exception, e: - print "Logging is not supported on this system" + except Exception as e: + print("Logging is not supported on this system") simulator = SimulatorApp(root) root.title("Modbus Simulator") reactor.run() diff --git a/examples/gui/wx/simulator.py b/examples/gui/wx/simulator.py index 789ec5623..a07d6e529 100755 --- a/examples/gui/wx/simulator.py +++ b/examples/gui/wx/simulator.py @@ -1,7 +1,7 @@ #!/usr/bin/env python -''' +""" Note that this is not finished -''' +""" #---------------------------------------------------------------------------# # System #---------------------------------------------------------------------------# @@ -35,7 +35,7 @@ # Application Error #---------------------------------------------------------------------------# class ConfigurationException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ pass #---------------------------------------------------------------------------# @@ -44,36 +44,36 @@ class ConfigurationException(Exception): # These are extra helper functions that don't belong in a class #---------------------------------------------------------------------------# def root_test(): - ''' Simple test to see if we are running as root ''' + """ Simple test to see if we are running as root """ return getpass.getuser() == "root" #---------------------------------------------------------------------------# # Simulator Class #---------------------------------------------------------------------------# class Simulator(object): - ''' + """ Class used to parse configuration file and create and modbus datastore. The format of the configuration file is actually just a python pickle, which is a compressed memory dump from the scraper. - ''' + """ def __init__(self, config): - ''' + """ Trys to load a configuration file, lets the file not found exception fall through @param config The pickled datastore - ''' + """ try: self.file = open(config, "r") except Exception: raise ConfigurationException("File not found %s" % config) def _parse(self): - ''' Parses the config file and creates a server context ''' + """ Parses the config file and creates a server context """ try: handle = pickle.load(self.file) dsd = handle['di'] @@ -86,7 +86,7 @@ def _parse(self): return ModbusServerContext(slaves=slave) def _simulator(self): - ''' Starts the snmp simulator ''' + """ Starts the snmp simulator """ ports = [502]+range(20000,25000) for port in ports: try: @@ -97,7 +97,7 @@ def _simulator(self): pass def run(self): - ''' Used to run the simulator ''' + """ Used to run the simulator """ reactor.callWhenRunning(self._simulator) #---------------------------------------------------------------------------# @@ -107,35 +107,35 @@ def run(self): # in for linux(debian/redhat)/windows/nix #---------------------------------------------------------------------------# class NetworkReset(Thread): - ''' + """ This class is simply a daemon that is spun off at the end of the program to call the network restart function (an easy way to remove all the virtual interfaces) - ''' + """ def __init__(self): - ''' Initializes a new instance of the network reset thread ''' + """ Initializes a new instance of the network reset thread """ Thread.__init__(self) self.setDaemon(True) def run(self): - ''' Run the network reset ''' + """ Run the network reset """ os.system("/etc/init.d/networking restart") #---------------------------------------------------------------------------# # Main Gui Class #---------------------------------------------------------------------------# class SimulatorFrame(wx.Frame): - ''' + """ This class implements the GUI for the flasher application - ''' + """ subnet = 205 number = 1 restart = 0 def __init__(self, parent, id, title): - ''' + """ Sets up the gui, callback, and widget handles - ''' + """ wx.Frame.__init__(self, parent, id, title) wx.EVT_CLOSE(self, self.close_clicked) @@ -172,7 +172,7 @@ def __init__(self, parent, id, title): # Not callbacks, but used by them #---------------------------------------------------------------------------# def show_buttons(self, state=False, all=0): - ''' Greys out the buttons ''' + """ Greys out the buttons """ if all: self.window.set_sensitive(state) self.bstart.set_sensitive(state) @@ -181,13 +181,13 @@ def show_buttons(self, state=False, all=0): self.tnumber.set_sensitive(state) def destroy_interfaces(self): - ''' This is used to reset the virtual interfaces ''' + """ This is used to reset the virtual interfaces """ if self.restart: n = NetworkReset() n.start() def error_dialog(self, message, quit=False): - ''' Quick pop-up for error messages ''' + """ Quick pop-up for error messages """ log.debug("error event called") dialog = wx.MessageDialog(self, message, 'Error', wx.OK | wx.ICON_ERROR) @@ -201,7 +201,7 @@ def error_dialog(self, message, quit=False): # These are all callbacks for the various buttons #---------------------------------------------------------------------------# def start_clicked(self, widget): - ''' Starts the simulator ''' + """ Starts the simulator """ start = 1 base = "172.16" @@ -243,7 +243,7 @@ def start_clicked(self, widget): return False def help_clicked(self, widget): - ''' Quick pop-up for about page ''' + """ Quick pop-up for about page """ data = gtk.AboutDialog() data.set_version("0.1") data.set_name(('Modbus Simulator')) @@ -256,23 +256,23 @@ def help_clicked(self, widget): data.run() def close_clicked(self, event): - ''' Callback for close button ''' + """ Callback for close button """ log.debug("close event called") reactor.stop() def file_changed(self, event): - ''' Callback for the filename change ''' + """ Callback for the filename change """ self.file = widget.get_filename() class SimulatorApp(wx.App): - ''' The main wx application handle for our simulator - ''' + """ The main wx application handle for our simulator + """ def OnInit(self): - ''' Called by wxWindows to initialize our application + """ Called by wxWindows to initialize our application :returns: Always True - ''' + """ log.debug("application initialize event called") reactor.registerWxApp(self) frame = SimulatorFrame(None, -1, "Pymodbus Simulator") @@ -288,10 +288,10 @@ def OnInit(self): # We simply start the gui and start the twisted event loop #---------------------------------------------------------------------------# def main(): - ''' + """ Main control function This either launches the gui or runs the command line application - ''' + """ debug = True if debug: try: diff --git a/examples/tools/build-datastore.py b/examples/tools/build_datastore.py similarity index 93% rename from examples/tools/build-datastore.py rename to examples/tools/build_datastore.py index 861cdd108..507240eb0 100755 --- a/examples/tools/build-datastore.py +++ b/examples/tools/build_datastore.py @@ -1,11 +1,11 @@ #!/usr/bin/env python -''' +""" This creates a dummy datastore for use with the modbus simulator. It is also used to convert datastores to and from a register list dump. This allows users to build their own data from scratch or modifiy an exisiting dump. -''' +""" import pickle from sys import exit from optparse import OptionParser @@ -17,12 +17,12 @@ # Helper Classes #--------------------------------------------------------------------------# class ConfigurationException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ def __init__(self, string): - ''' A base string to make pylint happy + """ A base string to make pylint happy :param string: Additional information to append to exception - ''' + """ Exception.__init__(self, string) self.string = string @@ -33,13 +33,13 @@ def __str__(self): # Datablock Builders #--------------------------------------------------------------------------# def build_translation(option, opt, value, parser): - ''' Converts a register dump list to a pickeld datastore + """ Converts a register dump list to a pickeld datastore :param option: The option instance :param opt: The option string specified :param value: The file to translate :param parser: The parser object - ''' + """ raise ConfigurationException("This function is not implemented yet") try: with open(value, "r") as input: @@ -52,13 +52,13 @@ def build_translation(option, opt, value, parser): exit() # So we don't start a dummy build def build_conversion(option, opt, value, parser): - ''' This converts a pickled datastore to a register dump list + """ This converts a pickled datastore to a register dump list :param option: The option instance :param opt: The option string specified :param value: The file to convert :param parser: The parser object - ''' + """ try: with open(value, "r") as input: data = pickle.load(input) @@ -86,10 +86,10 @@ def build_conversion(option, opt, value, parser): # Datablock Builders #--------------------------------------------------------------------------# def build_sequential(): - ''' + """ This builds a quick mock sequential datastore with 100 values for each discrete, coils, holding, and input bits/registers. - ''' + """ data = { 'di' : seqblock(0, [bool(x) for x in range(1, 100)]), 'ci' : seqblock(0, [bool(not x) for x in range(1, 100)]), @@ -99,10 +99,10 @@ def build_sequential(): return data def build_sparse(): - ''' + """ This builds a quick mock sparse datastore with 100 values for each discrete, coils, holding, and input bits/registers. - ''' + """ data = { 'di' : sparblock([bool(x) for x in range(1, 100)]), 'ci' : sparblock([bool(not x) for x in range(1, 100)]), @@ -112,7 +112,7 @@ def build_sparse(): return data def main(): - ''' The main function for this script ''' + """ The main function for this script """ parser = OptionParser() parser.add_option("-o", "--output", help="The output file to write to", diff --git a/examples/tools/convert.py b/examples/tools/convert.py index 3858f3e43..34b232e56 100755 --- a/examples/tools/convert.py +++ b/examples/tools/convert.py @@ -1,11 +1,11 @@ #!/usr/bin/env python -''' +""" This script is used to convert an XML dump to a serialized ModbusDataStore for use with the simulator. This is used to convert from the nmodbus datastore xml dump to our modbus pickled version. -''' +""" from pymodbus.datastore import ModbusSparseDataBlock as sblock from optparse import OptionParser from lxml import etree @@ -15,21 +15,21 @@ # Helper Classes #--------------------------------------------------------------------------# class ConversionException(Exception): - ''' Exception for configuration error ''' + """ Exception for configuration error """ def __init__(self, string): - ''' Initialize a ConversionException instance + """ Initialize a ConversionException instance :param string: Additional information to append to exception - ''' + """ Exception.__init__(self, string) self.string = string def __str__(self): - ''' Builds a string representation of the object + """ Builds a string representation of the object :returns: The string representation of the object - ''' + """ return 'Conversion Error: %s' % self.string #--------------------------------------------------------------------------# @@ -48,18 +48,18 @@ class ModbusXML: } def __init__(self): - ''' + """ Initializer for the parser object - ''' + """ self.next = 0 self.result = {'di':{}, 'ci':{}, 'ir':{}, 'hr':{}} def start(self, tag, attrib): - ''' + """ Callback for start node @param tag The starting tag found @param attrib Attributes dict found in the tag - ''' + """ if tag == "value": try: self.next = attrib['index'] @@ -68,44 +68,44 @@ def start(self, tag, attrib): self.h = self.result[self.lookup[tag]] def end(self, tag): - ''' + """ Callback for end node @param tag The end tag found - ''' + """ pass def data(self, data): - ''' + """ Callback for node data @param data The data for the current node - ''' + """ if data in self.convert: result = self.convert[data] else: result = data self.h[self.next] = data def comment(self, text): - ''' + """ Callback for node data @param data The data for the current node - ''' + """ pass def close(self): - ''' + """ Callback for node data @param data The data for the current node - ''' + """ return self.result #--------------------------------------------------------------------------# # Helper Functions #--------------------------------------------------------------------------# def store_dump(result, file): - ''' + """ Quick function to dump a result to a pickle @param result The resulting parsed data - ''' + """ result['di'] = sblock(result['di']) result['ci'] = sblock(result['ci']) result['hr'] = sblock(result['hr']) @@ -115,9 +115,9 @@ def store_dump(result, file): pickle.dump(result, input) def main(): - ''' + """ The main function for this script - ''' + """ parser = OptionParser() parser.add_option("-o", "--output", help="The output file to write to", diff --git a/examples/tools/jamod/lib/jamod-1.2.jar b/examples/tools/jamod/lib/jamod_1.2.jar similarity index 100% rename from examples/tools/jamod/lib/jamod-1.2.jar rename to examples/tools/jamod/lib/jamod_1.2.jar diff --git a/examples/tools/nullmodem/generic/virtual-serial.c b/examples/tools/nullmodem/generic/virtual_serial.c similarity index 100% rename from examples/tools/nullmodem/generic/virtual-serial.c rename to examples/tools/nullmodem/generic/virtual_serial.c diff --git a/examples/tools/reference/LICENSE-FREE b/examples/tools/reference/LICENSE_FREE similarity index 100% rename from examples/tools/reference/LICENSE-FREE rename to examples/tools/reference/LICENSE_FREE diff --git a/examples/tools/test-install.sh b/examples/tools/test_install.sh similarity index 100% rename from examples/tools/test-install.sh rename to examples/tools/test_install.sh diff --git a/examples/twisted/modbus-tcp.tac b/examples/twisted/modbus_tcp.tac similarity index 94% rename from examples/twisted/modbus-tcp.tac rename to examples/twisted/modbus_tcp.tac index e1dcfc465..83a9c3607 100644 --- a/examples/twisted/modbus-tcp.tac +++ b/examples/twisted/modbus_tcp.tac @@ -1,8 +1,8 @@ -''' +""" This service can be run with the following:: - twistd -ny modbus-tcp.tac -''' + twistd -ny modbus_tcp.tac +""" from twisted.application import service, internet from twisted.python.log import ILogObserver, FileLogObserver from twisted.python.logfile import DailyLogFile @@ -13,9 +13,9 @@ from pymodbus.transaction import ModbusSocketFramer from pymodbus.internal.ptwisted import InstallManagementConsole def BuildService(): - ''' + """ A helper method to build the service - ''' + """ context = None framer = ModbusSocketFramer factory = ModbusServerFactory(context, framer) diff --git a/examples/twisted/modbus-udp.tac b/examples/twisted/modbus_udp.tac similarity index 94% rename from examples/twisted/modbus-udp.tac rename to examples/twisted/modbus_udp.tac index d73fcae26..59e914afb 100644 --- a/examples/twisted/modbus-udp.tac +++ b/examples/twisted/modbus_udp.tac @@ -1,8 +1,8 @@ -''' +""" This service can be run with the following:: - twistd -ny modbus-udp.tac -''' + twistd -ny modbus_udp.tac +""" from twisted.application import service, internet from twisted.python.log import ILogObserver, FileLogObserver from twisted.python.logfile import DailyLogFile @@ -13,9 +13,9 @@ from pymodbus.transaction import ModbusSocketFramer from pymodbus.internal.ptwisted import InstallManagementConsole def BuildService(): - ''' + """ A helper method to build the service - ''' + """ context = None framer = ModbusSocketFramer server = ModbusUdpProtocol(context, framer) diff --git a/examples/twisted/plugins/pymodbus_plugin.py b/examples/twisted/plugins/pymodbus_plugin.py index c0b232686..9625b6b1b 100644 --- a/examples/twisted/plugins/pymodbus_plugin.py +++ b/examples/twisted/plugins/pymodbus_plugin.py @@ -1,5 +1,5 @@ -''' -''' +""" +""" from zope.interface import implements from twisted.python import usage @@ -13,10 +13,10 @@ from pymodbus.internal.ptwisted import InstallManagementConsole class Options(usage.Options): - ''' + """ The following are the options available to the pymodbus server. - ''' + """ optParameters = [ ["port", "p", Defaults.Port, "The port number to listen on."], ["type", "t", "tcp", "The type of server to host (tcp, udp, ascii, rtu)"], @@ -25,18 +25,18 @@ class Options(usage.Options): ] class ModbusServiceMaker(object): - ''' + """ A helper class used to build a twisted plugin - ''' + """ implements(IServiceMaker, IPlugin) tapname = "pymodbus" description = "A modbus server" options = Options def makeService(self, options): - ''' + """ Construct a service from the given options - ''' + """ if options["type"] == "tcp": server = internet.TCPServer else: server = internet.UDPServer @@ -50,10 +50,10 @@ def makeService(self, options): return server(int(options["port"]), factory) def _build_context(self, path): - ''' + """ A helper method to unpickle a datastore, note, this should be a ModbusServerContext. - ''' + """ import pickle try: context = pickle.load(path) diff --git a/setup.py b/setup.py index b8619fd79..fdc7f0567 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -''' +""" Installs pymodbus using distutils Run: @@ -8,11 +8,12 @@ For information about setuptools http://peak.telecommunity.com/DevCenter/setuptools#new-and-changed-setup-keywords -''' -#---------------------------------------------------------------------------# +""" + +# --------------------------------------------------------------------------- # # initialization -#---------------------------------------------------------------------------# -try: # if not installed, install and proceed +# --------------------------------------------------------------------------- # +try: # if not installed, install and proceed from setuptools import setup, find_packages except ImportError: from ez_setup import use_setuptools @@ -22,21 +23,23 @@ try: from setup_commands import command_classes except ImportError: - command_classes = {} + command_classes={} from pymodbus import __version__, __author__, __maintainer__ -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # configuration -#---------------------------------------------------------------------------# -setup(name = 'pymodbus', - version = __version__, - description = 'A fully featured modbus protocol stack in python', - long_description=''' - Pymodbus aims to be a fully implemented modbus protocol stack implemented - using twisted. Its orignal goal was to allow simulation of thousands of - modbus devices on a single machine for monitoring software testing. - ''', - classifiers = [ +# --------------------------------------------------------------------------- # +setup( + name='pymodbus', + version=__version__, + description='A fully featured modbus protocol stack in python', + long_description=""" + Pymodbus aims to be a fully implemented modbus protocol stack + implemented using twisted. Its orignal goal was to allow simulation + of thousands of modbus devices on a single machine for monitoring + software testing. + """, + classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Console', 'Environment :: X11 Applications :: GTK', @@ -49,27 +52,37 @@ 'Topic :: System :: Networking', 'Topic :: Utilities' ], - keywords = 'modbus, twisted, scada', - author = __author__, - author_email = 'bashwork@gmail.com', - maintainer = __maintainer__, - maintainer_email = 'otlasanju@gmail.com', + keywords='modbus, twisted, scada', + author=__author__, + author_email='bashwork@gmail.com', + maintainer=__maintainer__, + maintainer_email='otlasanju@gmail.com', url='https://github.com/riptideio/pymodbus/', - license = 'BSD', - packages = find_packages(exclude=['examples', 'test']), - exclude_package_data = {'' : ['examples', 'test', 'tools', 'doc']}, - py_modules = ['ez_setup'], - platforms = ['Linux', 'Mac OS X', 'Win'], - include_package_data = True, - zip_safe = True, - install_requires = [ + license='BSD', + packages=find_packages(exclude=['examples', 'test']), + exclude_package_data={'': ['examples', 'test', 'tools', 'doc']}, + py_modules=['ez_setup'], + platforms=['Linux', 'Mac OS X', 'Win'], + include_package_data=True, + zip_safe=True, + install_requires=[ 'pyserial >= 2.6' ], - extras_require = { - 'quality' : [ 'coverage >= 3.5.3', 'nose >= 1.2.1', 'mock >= 1.0.0', 'pep8 >= 1.3.3' ], - 'documents' : [ 'sphinx >= 1.1.3' ], - 'twisted' : [ 'twisted >= 12.2.0', 'pyasn1 >= 0.1.4', 'pycrypto >= 2.6' ], + extras_require={ + 'quality': [ + 'coverage >= 3.5.3', + 'nose >= 1.2.1', + 'mock >= 1.0.0', + 'pep8 >= 1.3.3' + ], + 'documents': ['sphinx >= 1.1.3', 'sphinx_rtd_theme'], + 'twisted': [ + 'twisted >= 12.2.0', + 'pyasn1 >= 0.1.4', + 'pycrypto >= 2.6' + ], }, - test_suite = 'nose.collector', - cmdclass = command_classes, + test_suite='nose.collector', + cmdclass=command_classes, ) + diff --git a/setup_commands.py b/setup_commands.py index ff68bc899..42196e9a7 100755 --- a/setup_commands.py +++ b/setup_commands.py @@ -1,29 +1,31 @@ from distutils.core import Command import sys, os, shutil -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Extra Commands -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + + class BuildApiDocsCommand(Command): - ''' Helper command to build the available api documents + """ Helper command to build the available api documents This scans all the subdirectories under api and runs the build.py script underneath trying to build the api documentation for the given format. - ''' + """ description = "build all the projects api documents" user_options = [] def initialize_options(self): - ''' options setup ''' + """ options setup """ if not os.path.exists('./build'): os.mkdir('./build') def finalize_options(self): - ''' options teardown ''' + """ options teardown """ pass def run(self): - ''' command runner ''' + """ command runner """ old_cwd = os.getcwd() directories = (d for d in os.listdir('./doc/api') if not d.startswith('.')) for entry in directories: @@ -31,50 +33,56 @@ def run(self): os.system('python build.py') os.chdir(old_cwd) + class DeepCleanCommand(Command): - ''' Helper command to return the directory to a completely - clean state. - ''' + """ + Helper command to return the directory to a completely + clean state. + """ description = "clean everything that we don't want" user_options = [] + trash = ['build', 'dist', 'pymodbus.egg-info', + os.path.join(os.path.join('doc', 'sphinx'), 'build'), + ] def initialize_options(self): - ''' options setup ''' - self.trash = ['build', 'dist', 'pymodbus.egg-info', - os.path.join(os.path.join('doc','sphinx'),'build'), - ] + """ options setup """ + pass def finalize_options(self): pass def run(self): - ''' command runner ''' - self.__delete_pyc_files() - self.__delete_trash_dirs() + """ command runner """ + self._delete_pyc_files() + self._delete_trash_dirs() - def __delete_trash_dirs(self): - ''' remove all directories created in building ''' - self.__delete_pyc_files() + def _delete_trash_dirs(self): + """ remove all directories created in building """ + self._delete_pyc_files() for directory in self.trash: if os.path.exists(directory): shutil.rmtree(directory) - def __delete_pyc_files(self): - ''' remove all python cache files ''' - for root,dirs,files in os.walk('.'): + @staticmethod + def _delete_pyc_files(): + """ remove all python cache files """ + for root, dirs, files in os.walk('.'): for file in files: if file.endswith('.pyc'): os.remove(os.path.join(root,file)) + class LintCommand(Command): - ''' Helper command to perform a lint scan of the + """ + Helper command to perform a lint scan of the sourcecode and return the results. - ''' - description = "perform a lint scan of the code" + """ + description = "perform a lint scan of the code" user_options = [] def initialize_options(self): - ''' options setup ''' + """ options setup """ if not os.path.exists('./build'): os.mkdir('./build') @@ -82,59 +90,61 @@ def finalize_options(self): pass def run(self): - ''' command runner ''' + """ command runner """ scanners = [s for s in dir(self) if s.find('__try') >= 0] for scanner in scanners: if getattr(self, scanner)(): break - def __try_pyflakes(self): + def _try_pyflakes(self): try: from pyflakes.scripts.pyflakes import main - sys.argv = '''pyflakes pymodbus'''.split() + sys.argv = """pyflakes pymodbus""".split() main() return True - except: return False + except Exception: + return False - def __try_pychecker(self): + def _try_pychecker(self): try: import pychecker - sys.argv = '''pychecker pymodbus/*.py'''.split() + sys.argv = """pychecker pymodbus/*.py""".split() main() return True except: return False - def __try_pylint(self): + def _try_pylint(self): try: import pylint - sys.argv = '''pylint pymodbus/*.py'''.split() + sys.argv = """pylint pymodbus/*.py""".split() main() return True except: return False + class Python3Command(Command): - ''' Helper command to scan for potential python 3 + """ Helper command to scan for potential python 3 errors. ./setup.py scan_2to3 > build/diffs_2to3 build/report_2to3 - ''' - description = "perform 2to3 scan of the code" + """ + description = "perform 2to3 scan of the code" user_options = [] + directories = ['pymodbus', 'test', 'examples'] def initialize_options(self): - ''' options setup ''' + """ options setup """ if not os.path.exists('./build'): os.mkdir('./build') - self.directories = ['pymodbus', 'test', 'examples'] def finalize_options(self): pass def run(self): - ''' command runner ''' - self.__run_python3() + """ command runner """ + self._run_python3() - def __run_python3(self): + def _run_python3(self): try: from lib2to3.main import main sys.argv = ['2to3'] + self.directories @@ -142,46 +152,51 @@ def __run_python3(self): return True except: return False + class Pep8Command(Command): - ''' Helper command to scan for potential pep8 violations - ''' - description = "perform pep8 scan of the code" + """ + Helper command to scan for potential pep8 violations + """ + description = "perform pep8 scan of the code" user_options = [] + directories = ['pymodbus'] def initialize_options(self): - ''' options setup ''' + """ options setup """ if not os.path.exists('./build'): os.mkdir('./build') - self.directories = ['pymodbus'] def finalize_options(self): pass def run(self): - ''' command runner ''' - self.__run_pep8() + """ command runner """ + self._run_pep8() - def __run_pep8(self): + def _run_pep8(self): try: from pep8 import _main as main - sys.argv = '''pep8 --repeat --count --statistics - '''.split() + self.directories + sys.argv = """pep8 --repeat --count --statistics + """.split() + self.directories main() return True - except: return False + except Exception: + return False -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Command Configuration -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # + + command_classes = { - 'deep_clean' : DeepCleanCommand, - 'build_apidocs' : BuildApiDocsCommand, - 'lint' : LintCommand, - 'scan_2to3' : Python3Command, - 'pep8' : Pep8Command, + 'deep_clean': DeepCleanCommand, + 'build_apidocs': BuildApiDocsCommand, + 'lint': LintCommand, + 'scan_2to3': Python3Command, + 'pep8': Pep8Command, } -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # # Export command list -#---------------------------------------------------------------------------# +# --------------------------------------------------------------------------- # __all__ = ['command_classes'] From 3580af8b6d37e04144330f437122c81b0fb4ca54 Mon Sep 17 00:00:00 2001 From: dhoomakethu Date: Wed, 20 Dec 2017 22:23:50 +0530 Subject: [PATCH 2/5] Fix makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 6a8024501..efe4e3efe 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ default: @echo ' make check check coding style (PEP-8, PEP-257)' @echo ' make test run the test suite, report coverage' @echo ' make tox run the tests on all Python versions' - @echo ' make docs Creates sphinx documentation in html' - @echo ' make clean cleanup all temporary files' + @echo ' make docs creates sphinx documentation in html' + @echo ' make clean cleanup all temporary files' @echo install: From 586021a5950be41175f88b4a456bfe4db4519ba4 Mon Sep 17 00:00:00 2001 From: dhoomakethu Date: Wed, 20 Dec 2017 22:40:47 +0530 Subject: [PATCH 3/5] Remove unwanted files and folders from doc folder --- .gitignore | 2 + Makefile | 4 +- doc/pymodbus.pdf | Bin 509208 -> 0 bytes doc/quality/current.coverage | 41 - doc/quality/current.lint | 19 - doc/quality/current.pep8 | 568 - doc/source/library/modules.rst | 2 +- doc/source/library/pymodbus.rst | 2 +- doc/sphinx/Makefile | 88 - doc/sphinx/conf.py | 109 - doc/sphinx/doctrees/environment.pickle | Bin 1774735 -> 0 bytes .../examples/asynchronous-client.doctree | Bin 15603 -> 0 bytes .../examples/asynchronous-processor.doctree | Bin 18069 -> 0 bytes .../examples/asynchronous-server.doctree | Bin 12967 -> 0 bytes .../doctrees/examples/bcd-payload.doctree | Bin 16238 -> 0 bytes .../doctrees/examples/bottle-frontend.doctree | Bin 25797 -> 0 bytes .../doctrees/examples/callback-server.doctree | Bin 12719 -> 0 bytes .../examples/changing-framers.doctree | Bin 7861 -> 0 bytes .../examples/concurrent-client.doctree | Bin 22382 -> 0 bytes .../examples/custom-datablock.doctree | Bin 8763 -> 0 bytes .../doctrees/examples/custom-message.doctree | Bin 9525 -> 0 bytes .../examples/database-datastore.doctree | Bin 15916 -> 0 bytes .../doctrees/examples/gtk-frontend.doctree | Bin 47222 -> 0 bytes doc/sphinx/doctrees/examples/index.doctree | Bin 5145 -> 0 bytes .../examples/libmodbus-client.doctree | Bin 37552 -> 0 bytes .../examples/message-generator.doctree | Bin 44289 -> 0 bytes .../doctrees/examples/message-parser.doctree | Bin 18888 -> 0 bytes .../doctrees/examples/modbus-logging.doctree | Bin 6223 -> 0 bytes .../examples/modbus-payload-server.doctree | Bin 8899 -> 0 bytes .../doctrees/examples/modbus-payload.doctree | Bin 8627 -> 0 bytes .../doctrees/examples/modbus-scraper.doctree | Bin 23370 -> 0 bytes .../examples/modbus-simulator.doctree | Bin 11210 -> 0 bytes .../doctrees/examples/modicon-payload.doctree | Bin 20990 -> 0 bytes .../doctrees/examples/performance.doctree | Bin 10613 -> 0 bytes .../doctrees/examples/redis-datastore.doctree | Bin 21030 -> 0 bytes .../examples/remote-server-context.doctree | Bin 17518 -> 0 bytes .../examples/serial-forwarder.doctree | Bin 5894 -> 0 bytes .../examples/synchronous-client-ext.doctree | Bin 18229 -> 0 bytes .../examples/synchronous-client.doctree | Bin 15969 -> 0 bytes .../examples/synchronous-server.doctree | Bin 13165 -> 0 bytes .../examples/thread-safe-datastore.doctree | Bin 19126 -> 0 bytes .../doctrees/examples/tk-frontend.doctree | Bin 29046 -> 0 bytes .../doctrees/examples/updating-server.doctree | Bin 9631 -> 0 bytes .../doctrees/examples/wx-frontend.doctree | Bin 26776 -> 0 bytes doc/sphinx/doctrees/index.doctree | Bin 4903 -> 0 bytes .../doctrees/library/async-client.doctree | Bin 27467 -> 0 bytes .../doctrees/library/async-server.doctree | Bin 55492 -> 0 bytes .../doctrees/library/bit-read-message.doctree | Bin 67175 -> 0 bytes .../library/bit-write-message.doctree | Bin 62877 -> 0 bytes .../doctrees/library/client-common.doctree | Bin 44901 -> 0 bytes doc/sphinx/doctrees/library/constants.doctree | Bin 44657 -> 0 bytes .../library/datastore/context.doctree | Bin 42980 -> 0 bytes .../doctrees/library/datastore/index.doctree | Bin 3067 -> 0 bytes .../doctrees/library/datastore/remote.doctree | Bin 26371 -> 0 bytes .../doctrees/library/datastore/store.doctree | Bin 65527 -> 0 bytes doc/sphinx/doctrees/library/device.doctree | Bin 87838 -> 0 bytes .../doctrees/library/diag-message.doctree | Bin 168993 -> 0 bytes doc/sphinx/doctrees/library/events.doctree | Bin 42596 -> 0 bytes .../doctrees/library/exceptions.doctree | Bin 19414 -> 0 bytes doc/sphinx/doctrees/library/factory.doctree | Bin 29504 -> 0 bytes .../doctrees/library/file-message.doctree | Bin 84656 -> 0 bytes doc/sphinx/doctrees/library/index.doctree | Bin 3651 -> 0 bytes .../doctrees/library/interfaces.doctree | Bin 60843 -> 0 bytes .../doctrees/library/mei-message.doctree | Bin 34347 -> 0 bytes .../doctrees/library/other-message.doctree | Bin 76848 -> 0 bytes doc/sphinx/doctrees/library/payload.doctree | Bin 84770 -> 0 bytes doc/sphinx/doctrees/library/pdu.doctree | Bin 56390 -> 0 bytes doc/sphinx/doctrees/library/pymodbus.doctree | Bin 4553 -> 0 bytes .../library/register-read-message.doctree | Bin 92068 -> 0 bytes .../library/register-write-message.doctree | Bin 62981 -> 0 bytes .../doctrees/library/sync-client.doctree | Bin 86418 -> 0 bytes .../doctrees/library/sync-server.doctree | Bin 99274 -> 0 bytes .../doctrees/library/transaction.doctree | Bin 153386 -> 0 bytes doc/sphinx/doctrees/library/utilities.doctree | Bin 36183 -> 0 bytes doc/sphinx/examples/asynchronous-client.rst | 16 - .../examples/asynchronous-processor.rst | 15 - doc/sphinx/examples/asynchronous-server.rst | 6 - doc/sphinx/examples/bcd-payload.rst | 6 - doc/sphinx/examples/bottle-frontend.rst | 22 - doc/sphinx/examples/callback-server.rst | 6 - doc/sphinx/examples/changing-framers.rst | 6 - doc/sphinx/examples/concurrent-client.rst | 6 - doc/sphinx/examples/custom-datablock.rst | 6 - doc/sphinx/examples/custom-message.rst | 6 - doc/sphinx/examples/database-datastore.rst | 6 - doc/sphinx/examples/gtk-frontend.rst | 26 - doc/sphinx/examples/index.rst | 60 - doc/sphinx/examples/libmodbus-client.rst | 6 - doc/sphinx/examples/message-generator.rst | 26 - doc/sphinx/examples/message-parser.rst | 55 - doc/sphinx/examples/modbus-logging.rst | 6 - doc/sphinx/examples/modbus-payload-server.rst | 6 - doc/sphinx/examples/modbus-payload.rst | 6 - doc/sphinx/examples/modbus-scraper.rst | 6 - doc/sphinx/examples/modbus-simulator.rst | 5 - doc/sphinx/examples/modicon-payload.rst | 6 - doc/sphinx/examples/performance.rst | 11 - doc/sphinx/examples/redis-datastore.rst | 6 - doc/sphinx/examples/remote-server-context.rst | 6 - doc/sphinx/examples/serial-forwarder.rst | 6 - .../examples/synchronous-client-ext.rst | 6 - doc/sphinx/examples/synchronous-client.rst | 19 - doc/sphinx/examples/synchronous-server.rst | 6 - doc/sphinx/examples/thread-safe-datastore.rst | 6 - doc/sphinx/examples/tk-frontend.rst | 17 - doc/sphinx/examples/updating-server.rst | 6 - doc/sphinx/examples/wx-frontend.rst | 17 - doc/sphinx/html/.buildinfo | 4 - doc/sphinx/html/_modules/index.html | 114 - .../_modules/pymodbus/bit_read_message.html | 331 - .../_modules/pymodbus/bit_write_message.html | 353 - .../html/_modules/pymodbus/client/async.html | 305 - .../html/_modules/pymodbus/client/common.html | 240 - .../html/_modules/pymodbus/client/sync.html | 506 - .../html/_modules/pymodbus/constants.html | 331 - .../_modules/pymodbus/datastore/context.html | 246 - .../_modules/pymodbus/datastore/remote.html | 190 - .../_modules/pymodbus/datastore/store.html | 343 - doc/sphinx/html/_modules/pymodbus/device.html | 712 -- .../html/_modules/pymodbus/diag_message.html | 845 -- doc/sphinx/html/_modules/pymodbus/events.html | 287 - .../html/_modules/pymodbus/exceptions.html | 177 - .../html/_modules/pymodbus/factory.html | 347 - .../html/_modules/pymodbus/file_message.html | 576 - .../html/_modules/pymodbus/interfaces.html | 327 - .../html/_modules/pymodbus/mei_message.html | 256 - .../html/_modules/pymodbus/other_message.html | 533 - .../html/_modules/pymodbus/payload.html | 432 - doc/sphinx/html/_modules/pymodbus/pdu.html | 330 - .../pymodbus/register_read_message.html | 449 - .../pymodbus/register_write_message.html | 337 - .../html/_modules/pymodbus/server/async.html | 370 - .../html/_modules/pymodbus/server/sync.html | 597 - .../html/_modules/pymodbus/transaction.html | 1064 -- .../html/_modules/pymodbus/utilities.html | 290 - .../examples/asynchronous-client.rst.txt | 16 - .../examples/asynchronous-processor.rst.txt | 15 - .../examples/asynchronous-server.rst.txt | 6 - .../_sources/examples/bcd-payload.rst.txt | 6 - .../_sources/examples/bottle-frontend.rst.txt | 22 - .../_sources/examples/callback-server.rst.txt | 6 - .../examples/changing-framers.rst.txt | 6 - .../examples/concurrent-client.rst.txt | 6 - .../examples/custom-datablock.rst.txt | 6 - .../_sources/examples/custom-message.rst.txt | 6 - .../examples/database-datastore.rst.txt | 6 - .../_sources/examples/gtk-frontend.rst.txt | 26 - .../html/_sources/examples/index.rst.txt | 60 - .../examples/libmodbus-client.rst.txt | 6 - .../examples/message-generator.rst.txt | 26 - .../_sources/examples/message-parser.rst.txt | 55 - .../_sources/examples/modbus-logging.rst.txt | 6 - .../examples/modbus-payload-server.rst.txt | 6 - .../_sources/examples/modbus-payload.rst.txt | 6 - .../_sources/examples/modbus-scraper.rst.txt | 6 - .../examples/modbus-simulator.rst.txt | 5 - .../_sources/examples/modicon-payload.rst.txt | 6 - .../_sources/examples/performance.rst.txt | 11 - .../_sources/examples/redis-datastore.rst.txt | 6 - .../examples/remote-server-context.rst.txt | 6 - .../examples/serial-forwarder.rst.txt | 6 - .../examples/synchronous-client-ext.rst.txt | 6 - .../examples/synchronous-client.rst.txt | 19 - .../examples/synchronous-server.rst.txt | 6 - .../examples/thread-safe-datastore.rst.txt | 6 - .../_sources/examples/tk-frontend.rst.txt | 17 - .../_sources/examples/updating-server.rst.txt | 6 - .../_sources/examples/wx-frontend.rst.txt | 17 - doc/sphinx/html/_sources/index.rst.txt | 23 - .../_sources/library/async-client.rst.txt | 19 - .../_sources/library/async-server.rst.txt | 29 - .../_sources/library/bit-read-message.rst.txt | 32 - .../library/bit-write-message.rst.txt | 26 - .../_sources/library/client-common.rst.txt | 16 - .../html/_sources/library/constants.rst.txt | 31 - .../library/datastore/context.rst.txt | 20 - .../_sources/library/datastore/index.rst.txt | 13 - .../_sources/library/datastore/remote.rst.txt | 16 - .../_sources/library/datastore/store.rst.txt | 23 - .../html/_sources/library/device.rst.txt | 28 - .../_sources/library/diag-message.rst.txt | 128 - .../html/_sources/library/events.rst.txt | 28 - .../html/_sources/library/exceptions.rst.txt | 26 - .../html/_sources/library/factory.rst.txt | 19 - .../_sources/library/file-message.rst.txt | 34 - .../html/_sources/library/index.rst.txt | 35 - .../html/_sources/library/interfaces.rst.txt | 28 - .../html/_sources/library/mei-message.rst.txt | 19 - .../_sources/library/other-message.rst.txt | 31 - .../html/_sources/library/payload.rst.txt | 19 - doc/sphinx/html/_sources/library/pdu.rst.txt | 32 - .../html/_sources/library/pymodbus.rst.txt | 7 - .../library/register-read-message.rst.txt | 38 - .../library/register-write-message.rst.txt | 26 - .../html/_sources/library/sync-client.rst.txt | 26 - .../html/_sources/library/sync-server.rst.txt | 40 - .../html/_sources/library/transaction.rst.txt | 31 - .../html/_sources/library/utilities.rst.txt | 33 - doc/sphinx/html/_static/README | 1 - doc/sphinx/html/_static/ajax-loader.gif | Bin 673 -> 0 bytes doc/sphinx/html/_static/basic.css | 632 - doc/sphinx/html/_static/classic.css | 261 - doc/sphinx/html/_static/comment-bright.png | Bin 756 -> 0 bytes doc/sphinx/html/_static/comment-close.png | Bin 829 -> 0 bytes doc/sphinx/html/_static/comment.png | Bin 641 -> 0 bytes doc/sphinx/html/_static/default.css | 1 - doc/sphinx/html/_static/doctools.js | 287 - doc/sphinx/html/_static/down-pressed.png | Bin 222 -> 0 bytes doc/sphinx/html/_static/down.png | Bin 202 -> 0 bytes doc/sphinx/html/_static/file.png | Bin 286 -> 0 bytes doc/sphinx/html/_static/jquery-3.1.0.js | 10074 ---------------- doc/sphinx/html/_static/jquery.js | 4 - doc/sphinx/html/_static/minus.png | Bin 90 -> 0 bytes doc/sphinx/html/_static/plus.png | Bin 90 -> 0 bytes doc/sphinx/html/_static/pygments.css | 69 - doc/sphinx/html/_static/searchtools.js | 758 -- doc/sphinx/html/_static/sidebar.js | 159 - doc/sphinx/html/_static/underscore-1.3.1.js | 999 -- doc/sphinx/html/_static/underscore.js | 31 - doc/sphinx/html/_static/up-pressed.png | Bin 214 -> 0 bytes doc/sphinx/html/_static/up.png | Bin 203 -> 0 bytes doc/sphinx/html/_static/websupport.js | 808 -- .../html/examples/asynchronous-client.html | 255 - .../html/examples/asynchronous-processor.html | 312 - .../html/examples/asynchronous-server.html | 230 - doc/sphinx/html/examples/bcd-payload.html | 344 - doc/sphinx/html/examples/bottle-frontend.html | 442 - doc/sphinx/html/examples/callback-server.html | 253 - .../html/examples/changing-framers.html | 177 - .../html/examples/concurrent-client.html | 355 - .../html/examples/custom-datablock.html | 198 - doc/sphinx/html/examples/custom-message.html | 208 - .../html/examples/database-datastore.html | 294 - doc/sphinx/html/examples/gtk-frontend.html | 637 - doc/sphinx/html/examples/index.html | 205 - .../html/examples/libmodbus-client.html | 548 - .../html/examples/message-generator.html | 808 -- doc/sphinx/html/examples/message-parser.html | 361 - doc/sphinx/html/examples/modbus-logging.html | 162 - .../html/examples/modbus-payload-server.html | 191 - doc/sphinx/html/examples/modbus-payload.html | 203 - doc/sphinx/html/examples/modbus-scraper.html | 400 - .../html/examples/modbus-simulator.html | 249 - doc/sphinx/html/examples/modicon-payload.html | 407 - doc/sphinx/html/examples/performance.html | 208 - doc/sphinx/html/examples/redis-datastore.html | 364 - .../html/examples/remote-server-context.html | 317 - .../html/examples/serial-forwarder.html | 158 - .../html/examples/synchronous-client-ext.html | 298 - .../html/examples/synchronous-client.html | 262 - .../html/examples/synchronous-server.html | 238 - .../html/examples/thread-safe-datastore.html | 330 - doc/sphinx/html/examples/tk-frontend.html | 480 - doc/sphinx/html/examples/updating-server.html | 205 - doc/sphinx/html/examples/wx-frontend.html | 452 - doc/sphinx/html/genindex.html | 1830 --- doc/sphinx/html/index.html | 160 - doc/sphinx/html/library/async-client.html | 271 - doc/sphinx/html/library/async-server.html | 383 - doc/sphinx/html/library/bit-read-message.html | 469 - .../html/library/bit-write-message.html | 459 - doc/sphinx/html/library/client-common.html | 370 - doc/sphinx/html/library/constants.html | 400 - .../html/library/datastore/context.html | 349 - doc/sphinx/html/library/datastore/index.html | 137 - doc/sphinx/html/library/datastore/remote.html | 251 - doc/sphinx/html/library/datastore/store.html | 502 - doc/sphinx/html/library/device.html | 632 - doc/sphinx/html/library/diag-message.html | 876 -- doc/sphinx/html/library/events.html | 366 - doc/sphinx/html/library/exceptions.html | 196 - doc/sphinx/html/library/factory.html | 268 - doc/sphinx/html/library/file-message.html | 578 - doc/sphinx/html/library/index.html | 225 - doc/sphinx/html/library/interfaces.html | 453 - doc/sphinx/html/library/mei-message.html | 304 - doc/sphinx/html/library/other-message.html | 527 - doc/sphinx/html/library/payload.html | 574 - doc/sphinx/html/library/pdu.html | 425 - doc/sphinx/html/library/pymodbus.html | 136 - .../html/library/register-read-message.html | 586 - .../html/library/register-write-message.html | 448 - doc/sphinx/html/library/sync-client.html | 580 - doc/sphinx/html/library/sync-server.html | 564 - doc/sphinx/html/library/transaction.html | 1010 -- doc/sphinx/html/library/utilities.html | 330 - doc/sphinx/html/objects.inv | Bin 5985 -> 0 bytes doc/sphinx/html/py-modindex.html | 428 - doc/sphinx/html/search.html | 107 - doc/sphinx/html/searchindex.js | 1 - doc/sphinx/index.rst | 23 - doc/sphinx/library/async-client.rst | 19 - doc/sphinx/library/async-server.rst | 29 - doc/sphinx/library/bit-read-message.rst | 32 - doc/sphinx/library/bit-write-message.rst | 26 - doc/sphinx/library/client-common.rst | 16 - doc/sphinx/library/constants.rst | 31 - doc/sphinx/library/datastore/context.rst | 20 - doc/sphinx/library/datastore/index.rst | 13 - doc/sphinx/library/datastore/remote.rst | 16 - doc/sphinx/library/datastore/store.rst | 23 - doc/sphinx/library/device.rst | 28 - doc/sphinx/library/diag-message.rst | 128 - doc/sphinx/library/events.rst | 28 - doc/sphinx/library/exceptions.rst | 26 - doc/sphinx/library/factory.rst | 19 - doc/sphinx/library/file-message.rst | 34 - doc/sphinx/library/index.rst | 35 - doc/sphinx/library/interfaces.rst | 28 - doc/sphinx/library/mei-message.rst | 19 - doc/sphinx/library/other-message.rst | 31 - doc/sphinx/library/payload.rst | 19 - doc/sphinx/library/pdu.rst | 32 - doc/sphinx/library/pymodbus.rst | 7 - doc/sphinx/library/register-read-message.rst | 38 - doc/sphinx/library/register-write-message.rst | 26 - doc/sphinx/library/sync-client.rst | 26 - doc/sphinx/library/sync-server.rst | 40 - doc/sphinx/library/transaction.rst | 31 - doc/sphinx/library/utilities.rst | 33 - doc/sphinx/static/README | 1 - 321 files changed, 6 insertions(+), 54134 deletions(-) delete mode 100644 doc/pymodbus.pdf delete mode 100644 doc/quality/current.coverage delete mode 100644 doc/quality/current.lint delete mode 100644 doc/quality/current.pep8 delete mode 100644 doc/sphinx/Makefile delete mode 100644 doc/sphinx/conf.py delete mode 100644 doc/sphinx/doctrees/environment.pickle delete mode 100644 doc/sphinx/doctrees/examples/asynchronous-client.doctree delete mode 100644 doc/sphinx/doctrees/examples/asynchronous-processor.doctree delete mode 100644 doc/sphinx/doctrees/examples/asynchronous-server.doctree delete mode 100644 doc/sphinx/doctrees/examples/bcd-payload.doctree delete mode 100644 doc/sphinx/doctrees/examples/bottle-frontend.doctree delete mode 100644 doc/sphinx/doctrees/examples/callback-server.doctree delete mode 100644 doc/sphinx/doctrees/examples/changing-framers.doctree delete mode 100644 doc/sphinx/doctrees/examples/concurrent-client.doctree delete mode 100644 doc/sphinx/doctrees/examples/custom-datablock.doctree delete mode 100644 doc/sphinx/doctrees/examples/custom-message.doctree delete mode 100644 doc/sphinx/doctrees/examples/database-datastore.doctree delete mode 100644 doc/sphinx/doctrees/examples/gtk-frontend.doctree delete mode 100644 doc/sphinx/doctrees/examples/index.doctree delete mode 100644 doc/sphinx/doctrees/examples/libmodbus-client.doctree delete mode 100644 doc/sphinx/doctrees/examples/message-generator.doctree delete mode 100644 doc/sphinx/doctrees/examples/message-parser.doctree delete mode 100644 doc/sphinx/doctrees/examples/modbus-logging.doctree delete mode 100644 doc/sphinx/doctrees/examples/modbus-payload-server.doctree delete mode 100644 doc/sphinx/doctrees/examples/modbus-payload.doctree delete mode 100644 doc/sphinx/doctrees/examples/modbus-scraper.doctree delete mode 100644 doc/sphinx/doctrees/examples/modbus-simulator.doctree delete mode 100644 doc/sphinx/doctrees/examples/modicon-payload.doctree delete mode 100644 doc/sphinx/doctrees/examples/performance.doctree delete mode 100644 doc/sphinx/doctrees/examples/redis-datastore.doctree delete mode 100644 doc/sphinx/doctrees/examples/remote-server-context.doctree delete mode 100644 doc/sphinx/doctrees/examples/serial-forwarder.doctree delete mode 100644 doc/sphinx/doctrees/examples/synchronous-client-ext.doctree delete mode 100644 doc/sphinx/doctrees/examples/synchronous-client.doctree delete mode 100644 doc/sphinx/doctrees/examples/synchronous-server.doctree delete mode 100644 doc/sphinx/doctrees/examples/thread-safe-datastore.doctree delete mode 100644 doc/sphinx/doctrees/examples/tk-frontend.doctree delete mode 100644 doc/sphinx/doctrees/examples/updating-server.doctree delete mode 100644 doc/sphinx/doctrees/examples/wx-frontend.doctree delete mode 100644 doc/sphinx/doctrees/index.doctree delete mode 100644 doc/sphinx/doctrees/library/async-client.doctree delete mode 100644 doc/sphinx/doctrees/library/async-server.doctree delete mode 100644 doc/sphinx/doctrees/library/bit-read-message.doctree delete mode 100644 doc/sphinx/doctrees/library/bit-write-message.doctree delete mode 100644 doc/sphinx/doctrees/library/client-common.doctree delete mode 100644 doc/sphinx/doctrees/library/constants.doctree delete mode 100644 doc/sphinx/doctrees/library/datastore/context.doctree delete mode 100644 doc/sphinx/doctrees/library/datastore/index.doctree delete mode 100644 doc/sphinx/doctrees/library/datastore/remote.doctree delete mode 100644 doc/sphinx/doctrees/library/datastore/store.doctree delete mode 100644 doc/sphinx/doctrees/library/device.doctree delete mode 100644 doc/sphinx/doctrees/library/diag-message.doctree delete mode 100644 doc/sphinx/doctrees/library/events.doctree delete mode 100644 doc/sphinx/doctrees/library/exceptions.doctree delete mode 100644 doc/sphinx/doctrees/library/factory.doctree delete mode 100644 doc/sphinx/doctrees/library/file-message.doctree delete mode 100644 doc/sphinx/doctrees/library/index.doctree delete mode 100644 doc/sphinx/doctrees/library/interfaces.doctree delete mode 100644 doc/sphinx/doctrees/library/mei-message.doctree delete mode 100644 doc/sphinx/doctrees/library/other-message.doctree delete mode 100644 doc/sphinx/doctrees/library/payload.doctree delete mode 100644 doc/sphinx/doctrees/library/pdu.doctree delete mode 100644 doc/sphinx/doctrees/library/pymodbus.doctree delete mode 100644 doc/sphinx/doctrees/library/register-read-message.doctree delete mode 100644 doc/sphinx/doctrees/library/register-write-message.doctree delete mode 100644 doc/sphinx/doctrees/library/sync-client.doctree delete mode 100644 doc/sphinx/doctrees/library/sync-server.doctree delete mode 100644 doc/sphinx/doctrees/library/transaction.doctree delete mode 100644 doc/sphinx/doctrees/library/utilities.doctree delete mode 100644 doc/sphinx/examples/asynchronous-client.rst delete mode 100644 doc/sphinx/examples/asynchronous-processor.rst delete mode 100644 doc/sphinx/examples/asynchronous-server.rst delete mode 100644 doc/sphinx/examples/bcd-payload.rst delete mode 100644 doc/sphinx/examples/bottle-frontend.rst delete mode 100644 doc/sphinx/examples/callback-server.rst delete mode 100644 doc/sphinx/examples/changing-framers.rst delete mode 100644 doc/sphinx/examples/concurrent-client.rst delete mode 100644 doc/sphinx/examples/custom-datablock.rst delete mode 100644 doc/sphinx/examples/custom-message.rst delete mode 100644 doc/sphinx/examples/database-datastore.rst delete mode 100644 doc/sphinx/examples/gtk-frontend.rst delete mode 100644 doc/sphinx/examples/index.rst delete mode 100644 doc/sphinx/examples/libmodbus-client.rst delete mode 100644 doc/sphinx/examples/message-generator.rst delete mode 100644 doc/sphinx/examples/message-parser.rst delete mode 100644 doc/sphinx/examples/modbus-logging.rst delete mode 100644 doc/sphinx/examples/modbus-payload-server.rst delete mode 100644 doc/sphinx/examples/modbus-payload.rst delete mode 100644 doc/sphinx/examples/modbus-scraper.rst delete mode 100644 doc/sphinx/examples/modbus-simulator.rst delete mode 100644 doc/sphinx/examples/modicon-payload.rst delete mode 100644 doc/sphinx/examples/performance.rst delete mode 100644 doc/sphinx/examples/redis-datastore.rst delete mode 100644 doc/sphinx/examples/remote-server-context.rst delete mode 100644 doc/sphinx/examples/serial-forwarder.rst delete mode 100644 doc/sphinx/examples/synchronous-client-ext.rst delete mode 100644 doc/sphinx/examples/synchronous-client.rst delete mode 100644 doc/sphinx/examples/synchronous-server.rst delete mode 100644 doc/sphinx/examples/thread-safe-datastore.rst delete mode 100644 doc/sphinx/examples/tk-frontend.rst delete mode 100644 doc/sphinx/examples/updating-server.rst delete mode 100644 doc/sphinx/examples/wx-frontend.rst delete mode 100644 doc/sphinx/html/.buildinfo delete mode 100644 doc/sphinx/html/_modules/index.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/bit_read_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/bit_write_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/client/async.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/client/common.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/client/sync.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/constants.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/datastore/context.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/datastore/remote.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/datastore/store.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/device.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/diag_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/events.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/exceptions.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/factory.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/file_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/interfaces.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/mei_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/other_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/payload.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/pdu.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/register_read_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/register_write_message.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/server/async.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/server/sync.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/transaction.html delete mode 100644 doc/sphinx/html/_modules/pymodbus/utilities.html delete mode 100644 doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/bcd-payload.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/callback-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/changing-framers.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/concurrent-client.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/custom-datablock.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/custom-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/database-datastore.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/index.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/message-generator.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/message-parser.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/modbus-logging.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/modbus-payload.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/modicon-payload.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/performance.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/redis-datastore.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/remote-server-context.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/synchronous-client.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/synchronous-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/tk-frontend.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/updating-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/examples/wx-frontend.rst.txt delete mode 100644 doc/sphinx/html/_sources/index.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/async-client.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/async-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/bit-read-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/bit-write-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/client-common.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/constants.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/datastore/context.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/datastore/index.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/datastore/remote.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/datastore/store.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/device.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/diag-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/events.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/exceptions.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/factory.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/file-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/index.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/interfaces.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/mei-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/other-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/payload.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/pdu.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/pymodbus.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/register-read-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/register-write-message.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/sync-client.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/sync-server.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/transaction.rst.txt delete mode 100644 doc/sphinx/html/_sources/library/utilities.rst.txt delete mode 100644 doc/sphinx/html/_static/README delete mode 100644 doc/sphinx/html/_static/ajax-loader.gif delete mode 100644 doc/sphinx/html/_static/basic.css delete mode 100644 doc/sphinx/html/_static/classic.css delete mode 100644 doc/sphinx/html/_static/comment-bright.png delete mode 100644 doc/sphinx/html/_static/comment-close.png delete mode 100644 doc/sphinx/html/_static/comment.png delete mode 100644 doc/sphinx/html/_static/default.css delete mode 100644 doc/sphinx/html/_static/doctools.js delete mode 100644 doc/sphinx/html/_static/down-pressed.png delete mode 100644 doc/sphinx/html/_static/down.png delete mode 100644 doc/sphinx/html/_static/file.png delete mode 100644 doc/sphinx/html/_static/jquery-3.1.0.js delete mode 100644 doc/sphinx/html/_static/jquery.js delete mode 100644 doc/sphinx/html/_static/minus.png delete mode 100644 doc/sphinx/html/_static/plus.png delete mode 100644 doc/sphinx/html/_static/pygments.css delete mode 100644 doc/sphinx/html/_static/searchtools.js delete mode 100644 doc/sphinx/html/_static/sidebar.js delete mode 100644 doc/sphinx/html/_static/underscore-1.3.1.js delete mode 100644 doc/sphinx/html/_static/underscore.js delete mode 100644 doc/sphinx/html/_static/up-pressed.png delete mode 100644 doc/sphinx/html/_static/up.png delete mode 100644 doc/sphinx/html/_static/websupport.js delete mode 100644 doc/sphinx/html/examples/asynchronous-client.html delete mode 100644 doc/sphinx/html/examples/asynchronous-processor.html delete mode 100644 doc/sphinx/html/examples/asynchronous-server.html delete mode 100644 doc/sphinx/html/examples/bcd-payload.html delete mode 100644 doc/sphinx/html/examples/bottle-frontend.html delete mode 100644 doc/sphinx/html/examples/callback-server.html delete mode 100644 doc/sphinx/html/examples/changing-framers.html delete mode 100644 doc/sphinx/html/examples/concurrent-client.html delete mode 100644 doc/sphinx/html/examples/custom-datablock.html delete mode 100644 doc/sphinx/html/examples/custom-message.html delete mode 100644 doc/sphinx/html/examples/database-datastore.html delete mode 100644 doc/sphinx/html/examples/gtk-frontend.html delete mode 100644 doc/sphinx/html/examples/index.html delete mode 100644 doc/sphinx/html/examples/libmodbus-client.html delete mode 100644 doc/sphinx/html/examples/message-generator.html delete mode 100644 doc/sphinx/html/examples/message-parser.html delete mode 100644 doc/sphinx/html/examples/modbus-logging.html delete mode 100644 doc/sphinx/html/examples/modbus-payload-server.html delete mode 100644 doc/sphinx/html/examples/modbus-payload.html delete mode 100644 doc/sphinx/html/examples/modbus-scraper.html delete mode 100644 doc/sphinx/html/examples/modbus-simulator.html delete mode 100644 doc/sphinx/html/examples/modicon-payload.html delete mode 100644 doc/sphinx/html/examples/performance.html delete mode 100644 doc/sphinx/html/examples/redis-datastore.html delete mode 100644 doc/sphinx/html/examples/remote-server-context.html delete mode 100644 doc/sphinx/html/examples/serial-forwarder.html delete mode 100644 doc/sphinx/html/examples/synchronous-client-ext.html delete mode 100644 doc/sphinx/html/examples/synchronous-client.html delete mode 100644 doc/sphinx/html/examples/synchronous-server.html delete mode 100644 doc/sphinx/html/examples/thread-safe-datastore.html delete mode 100644 doc/sphinx/html/examples/tk-frontend.html delete mode 100644 doc/sphinx/html/examples/updating-server.html delete mode 100644 doc/sphinx/html/examples/wx-frontend.html delete mode 100644 doc/sphinx/html/genindex.html delete mode 100644 doc/sphinx/html/index.html delete mode 100644 doc/sphinx/html/library/async-client.html delete mode 100644 doc/sphinx/html/library/async-server.html delete mode 100644 doc/sphinx/html/library/bit-read-message.html delete mode 100644 doc/sphinx/html/library/bit-write-message.html delete mode 100644 doc/sphinx/html/library/client-common.html delete mode 100644 doc/sphinx/html/library/constants.html delete mode 100644 doc/sphinx/html/library/datastore/context.html delete mode 100644 doc/sphinx/html/library/datastore/index.html delete mode 100644 doc/sphinx/html/library/datastore/remote.html delete mode 100644 doc/sphinx/html/library/datastore/store.html delete mode 100644 doc/sphinx/html/library/device.html delete mode 100644 doc/sphinx/html/library/diag-message.html delete mode 100644 doc/sphinx/html/library/events.html delete mode 100644 doc/sphinx/html/library/exceptions.html delete mode 100644 doc/sphinx/html/library/factory.html delete mode 100644 doc/sphinx/html/library/file-message.html delete mode 100644 doc/sphinx/html/library/index.html delete mode 100644 doc/sphinx/html/library/interfaces.html delete mode 100644 doc/sphinx/html/library/mei-message.html delete mode 100644 doc/sphinx/html/library/other-message.html delete mode 100644 doc/sphinx/html/library/payload.html delete mode 100644 doc/sphinx/html/library/pdu.html delete mode 100644 doc/sphinx/html/library/pymodbus.html delete mode 100644 doc/sphinx/html/library/register-read-message.html delete mode 100644 doc/sphinx/html/library/register-write-message.html delete mode 100644 doc/sphinx/html/library/sync-client.html delete mode 100644 doc/sphinx/html/library/sync-server.html delete mode 100644 doc/sphinx/html/library/transaction.html delete mode 100644 doc/sphinx/html/library/utilities.html delete mode 100644 doc/sphinx/html/objects.inv delete mode 100644 doc/sphinx/html/py-modindex.html delete mode 100644 doc/sphinx/html/search.html delete mode 100644 doc/sphinx/html/searchindex.js delete mode 100644 doc/sphinx/index.rst delete mode 100644 doc/sphinx/library/async-client.rst delete mode 100644 doc/sphinx/library/async-server.rst delete mode 100644 doc/sphinx/library/bit-read-message.rst delete mode 100644 doc/sphinx/library/bit-write-message.rst delete mode 100644 doc/sphinx/library/client-common.rst delete mode 100644 doc/sphinx/library/constants.rst delete mode 100644 doc/sphinx/library/datastore/context.rst delete mode 100644 doc/sphinx/library/datastore/index.rst delete mode 100644 doc/sphinx/library/datastore/remote.rst delete mode 100644 doc/sphinx/library/datastore/store.rst delete mode 100644 doc/sphinx/library/device.rst delete mode 100644 doc/sphinx/library/diag-message.rst delete mode 100644 doc/sphinx/library/events.rst delete mode 100644 doc/sphinx/library/exceptions.rst delete mode 100644 doc/sphinx/library/factory.rst delete mode 100644 doc/sphinx/library/file-message.rst delete mode 100644 doc/sphinx/library/index.rst delete mode 100644 doc/sphinx/library/interfaces.rst delete mode 100644 doc/sphinx/library/mei-message.rst delete mode 100644 doc/sphinx/library/other-message.rst delete mode 100644 doc/sphinx/library/payload.rst delete mode 100644 doc/sphinx/library/pdu.rst delete mode 100644 doc/sphinx/library/pymodbus.rst delete mode 100644 doc/sphinx/library/register-read-message.rst delete mode 100644 doc/sphinx/library/register-write-message.rst delete mode 100644 doc/sphinx/library/sync-client.rst delete mode 100644 doc/sphinx/library/sync-server.rst delete mode 100644 doc/sphinx/library/transaction.rst delete mode 100644 doc/sphinx/library/utilities.rst delete mode 100644 doc/sphinx/static/README diff --git a/.gitignore b/.gitignore index 684ffd18a..1a62fbcd8 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ test/__pycache__/ /doc/quality/ /doc/pymodbus.pdf /doc/sphinx/ +/doc/html/ +/doc/_build/ diff --git a/Makefile b/Makefile index efe4e3efe..bfb592c40 100644 --- a/Makefile +++ b/Makefile @@ -46,8 +46,8 @@ tox: install @pip install --quiet tox && tox docs: install - @pip install --quiet sphinx - @cd doc/sphinx && sphinx-build -nb html -d doctrees . html + @pip install --quiet sphinx sphinx_rtd_theme + @cd doc && sphinx-build -nb html -d _build/doctrees . html publish: install git push origin && git push --tags origin diff --git a/doc/pymodbus.pdf b/doc/pymodbus.pdf deleted file mode 100644 index d3dc1fff81c84175dbe7b84cd2c3d8acc61595b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509208 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%0D+X^EsOduo}1s2 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
`;aR6u%&Ky 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⪼;grX<>l5#YpsM^O=G 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 H^%MRND!GX0 diff --git a/doc/quality/current.coverage b/doc/quality/current.coverage deleted file mode 100644 index 376726edb..000000000 --- a/doc/quality/current.coverage +++ /dev/null @@ -1,41 +0,0 @@ -Name Stmts Miss Cover Missing ---------------------------------------------------------------- -pymodbus 15 6 60% 24-27, 36-37 -pymodbus.bit_read_message 68 0 100% -pymodbus.bit_write_message 95 0 100% -pymodbus.client 0 0 100% -pymodbus.client.async 70 0 100% -pymodbus.client.common 36 0 100% -pymodbus.client.sync 147 0 100% -pymodbus.constants 36 0 100% -pymodbus.datastore 5 0 100% -pymodbus.datastore.context 50 0 100% -pymodbus.datastore.remote 31 0 100% -pymodbus.datastore.store 67 0 100% -pymodbus.device 159 0 100% -pymodbus.diag_message 202 0 100% -pymodbus.events 60 0 100% -pymodbus.exceptions 22 0 100% -pymodbus.factory 77 0 100% -pymodbus.file_message 181 0 100% -pymodbus.interfaces 46 0 100% -pymodbus.internal 0 0 100% -pymodbus.internal.ptwisted 16 2 88% 29-30 -pymodbus.mei_message 70 0 100% -pymodbus.other_message 145 0 100% -pymodbus.payload 140 2 99% 205, 224 -pymodbus.pdu 72 0 100% -pymodbus.register_read_message 124 0 100% -pymodbus.register_write_message 91 2 98% 39, 148 -pymodbus.server 0 0 100% -pymodbus.server.async 113 39 65% 55-58, 65-74, 81-86, 151-156, 163-172, 180-184 -pymodbus.server.sync 186 0 100% -pymodbus.transaction 275 53 81% 63-81, 116-117, 259, 263, 403, 433-442, 577-586, 656, 733-742, 768-769 -pymodbus.utilities 67 0 100% -pymodbus.version 13 0 100% ---------------------------------------------------------------- -TOTAL 2679 104 96% ----------------------------------------------------------------------- -Ran 255 tests in 0.981s - -OK diff --git a/doc/quality/current.lint b/doc/quality/current.lint deleted file mode 100644 index 848d63e86..000000000 --- a/doc/quality/current.lint +++ /dev/null @@ -1,19 +0,0 @@ -running lint -pymodbus/__init__.py:25: redefinition of unused 'NullHandler' from line 23 -pymodbus/factory.py:12: 'from pymodbus.bit_read_message import *' used; unable to detect undefined names -pymodbus/factory.py:13: 'from pymodbus.bit_write_message import *' used; unable to detect undefined names -pymodbus/factory.py:14: 'from pymodbus.diag_message import *' used; unable to detect undefined names -pymodbus/factory.py:15: 'from pymodbus.file_message import *' used; unable to detect undefined names -pymodbus/factory.py:16: 'from pymodbus.other_message import *' used; unable to detect undefined names -pymodbus/factory.py:17: 'from pymodbus.register_read_message import *' used; unable to detect undefined names -pymodbus/factory.py:18: 'from pymodbus.register_write_message import *' used; unable to detect undefined names -pymodbus/server/async.py:230: local variable 'handle' is assigned to but never used -pymodbus/server/sync.py:16: 'from pymodbus.transaction import *' used; unable to detect undefined names -pymodbus/client/common.py:3: 'from pymodbus.bit_read_message import *' used; unable to detect undefined names -pymodbus/client/common.py:4: 'from pymodbus.bit_write_message import *' used; unable to detect undefined names -pymodbus/client/common.py:5: 'from pymodbus.register_read_message import *' used; unable to detect undefined names -pymodbus/client/common.py:6: 'from pymodbus.register_write_message import *' used; unable to detect undefined names -pymodbus/client/common.py:7: 'from pymodbus.diag_message import *' used; unable to detect undefined names -pymodbus/client/common.py:8: 'from pymodbus.file_message import *' used; unable to detect undefined names -pymodbus/client/common.py:9: 'from pymodbus.other_message import *' used; unable to detect undefined names -pymodbus/client/sync.py:8: 'from pymodbus.transaction import *' used; unable to detect undefined names diff --git a/doc/quality/current.pep8 b/doc/quality/current.pep8 deleted file mode 100644 index ba5cbbaf1..000000000 --- a/doc/quality/current.pep8 +++ /dev/null @@ -1,568 +0,0 @@ -running pep8 -pymodbus/__init__.py:16:11: E221 multiple spaces before operator -pymodbus/bit_read_message.py:26:19: E221 multiple spaces before operator -pymodbus/bit_read_message.py:143:80: E501 line too long (80 characters) -pymodbus/bit_read_message.py:202:80: E501 line too long (80 characters) -pymodbus/bit_write_message.py:19:14: E221 multiple spaces before operator -pymodbus/bit_write_message.py:58:15: E221 multiple spaces before operator -pymodbus/bit_write_message.py:59:22: E701 multiple statements on one line (colon) -pymodbus/bit_write_message.py:60:13: E701 multiple statements on one line (colon) -pymodbus/bit_write_message.py:117:15: E221 multiple spaces before operator -pymodbus/bit_write_message.py:118:22: E701 multiple statements on one line (colon) -pymodbus/bit_write_message.py:119:13: E701 multiple statements on one line (colon) -pymodbus/bit_write_message.py:160:22: E701 multiple statements on one line (colon) -pymodbus/bit_write_message.py:161:45: E701 multiple statements on one line (colon) -pymodbus/bit_write_message.py:162:20: E221 multiple spaces before operator -pymodbus/bit_write_message.py:170:14: E221 multiple spaces before operator -pymodbus/bit_write_message.py:172:15: E221 multiple spaces before operator -pymodbus/constants.py:74:9: E221 multiple spaces before operator -pymodbus/constants.py:75:12: E221 multiple spaces before operator -pymodbus/constants.py:76:12: E221 multiple spaces before operator -pymodbus/constants.py:77:15: E221 multiple spaces before operator -pymodbus/constants.py:79:15: E221 multiple spaces before operator -pymodbus/constants.py:80:11: E221 multiple spaces before operator -pymodbus/constants.py:81:13: E221 multiple spaces before operator -pymodbus/constants.py:82:11: E221 multiple spaces before operator -pymodbus/constants.py:83:13: E221 multiple spaces before operator -pymodbus/constants.py:84:13: E221 multiple spaces before operator -pymodbus/constants.py:118:12: E221 multiple spaces before operator -pymodbus/constants.py:119:10: E221 multiple spaces before operator -pymodbus/constants.py:120:7: E221 multiple spaces before operator -pymodbus/constants.py:121:8: E221 multiple spaces before operator -pymodbus/constants.py:122:12: E221 multiple spaces before operator -pymodbus/constants.py:145:9: E221 multiple spaces before operator -pymodbus/constants.py:146:8: E221 multiple spaces before operator -pymodbus/constants.py:163:18: E221 multiple spaces before operator -pymodbus/constants.py:193:10: E221 multiple spaces before operator -pymodbus/constants.py:194:12: E221 multiple spaces before operator -pymodbus/constants.py:210:12: E221 multiple spaces before operator -pymodbus/device.py:30:13: E126 continuation line over-indented for hanging indent -pymodbus/device.py:88:41: E203 whitespace before ':' -pymodbus/device.py:89:41: E203 whitespace before ':' -pymodbus/device.py:90:41: E203 whitespace before ':' -pymodbus/device.py:91:41: E203 whitespace before ':' -pymodbus/device.py:92:41: E203 whitespace before ':' -pymodbus/device.py:93:41: E203 whitespace before ':' -pymodbus/device.py:94:41: E203 whitespace before ':' -pymodbus/device.py:96:41: E203 whitespace before ':' -pymodbus/device.py:97:41: E203 whitespace before ':' -pymodbus/device.py:98:41: E203 whitespace before ':' -pymodbus/device.py:99:41: E203 whitespace before ':' -pymodbus/device.py:100:41: E203 whitespace before ':' -pymodbus/device.py:101:41: E203 whitespace before ':' -pymodbus/device.py:102:41: E203 whitespace before ':' -pymodbus/device.py:103:41: E203 whitespace before ':' -pymodbus/device.py:105:41: E203 whitespace before ':' -pymodbus/device.py:106:41: E203 whitespace before ':' -pymodbus/device.py:107:41: E203 whitespace before ':' -pymodbus/device.py:108:41: E203 whitespace before ':' -pymodbus/device.py:109:41: E203 whitespace before ':' -pymodbus/device.py:110:41: E203 whitespace before ':' -pymodbus/device.py:111:41: E203 whitespace before ':' -pymodbus/device.py:112:41: E203 whitespace before ':' -pymodbus/device.py:113:41: E203 whitespace before ':' -pymodbus/device.py:114:41: E203 whitespace before ':' -pymodbus/device.py:115:41: E203 whitespace before ':' -pymodbus/device.py:116:41: E203 whitespace before ':' -pymodbus/device.py:117:41: E203 whitespace before ':' -pymodbus/device.py:118:41: E203 whitespace before ':' -pymodbus/device.py:120:41: E203 whitespace before ':' -pymodbus/device.py:121:41: E203 whitespace before ':' -pymodbus/device.py:122:41: E203 whitespace before ':' -pymodbus/device.py:123:41: E203 whitespace before ':' -pymodbus/device.py:124:41: E203 whitespace before ':' -pymodbus/device.py:125:41: E203 whitespace before ':' -pymodbus/device.py:126:41: E203 whitespace before ':' -pymodbus/device.py:127:41: E203 whitespace before ':' -pymodbus/device.py:128:41: E203 whitespace before ':' -pymodbus/device.py:129:41: E203 whitespace before ':' -pymodbus/device.py:131:41: E203 whitespace before ':' -pymodbus/device.py:132:41: E203 whitespace before ':' -pymodbus/device.py:133:41: E203 whitespace before ':' -pymodbus/device.py:134:41: E203 whitespace before ':' -pymodbus/device.py:135:41: E203 whitespace before ':' -pymodbus/device.py:136:41: E203 whitespace before ':' -pymodbus/device.py:137:41: E203 whitespace before ':' -pymodbus/device.py:138:41: E203 whitespace before ':' -pymodbus/device.py:88:55: E261 at least two spaces before inline comment -pymodbus/device.py:89:55: E261 at least two spaces before inline comment -pymodbus/device.py:90:55: E261 at least two spaces before inline comment -pymodbus/device.py:91:55: E261 at least two spaces before inline comment -pymodbus/device.py:92:55: E261 at least two spaces before inline comment -pymodbus/device.py:93:55: E261 at least two spaces before inline comment -pymodbus/device.py:94:55: E261 at least two spaces before inline comment -pymodbus/device.py:131:55: E261 at least two spaces before inline comment -pymodbus/device.py:132:55: E261 at least two spaces before inline comment -pymodbus/device.py:133:55: E261 at least two spaces before inline comment -pymodbus/device.py:134:55: E261 at least two spaces before inline comment -pymodbus/device.py:135:55: E261 at least two spaces before inline comment -pymodbus/device.py:136:55: E261 at least two spaces before inline comment -pymodbus/device.py:137:55: E261 at least two spaces before inline comment -pymodbus/device.py:138:55: E261 at least two spaces before inline comment -pymodbus/device.py:175:53: E225 missing whitespace around operator -pymodbus/device.py:273:15: E221 multiple spaces before operator -pymodbus/device.py:274:16: E221 multiple spaces before operator -pymodbus/device.py:275:23: E221 multiple spaces before operator -pymodbus/device.py:276:14: E221 multiple spaces before operator -pymodbus/device.py:277:16: E221 multiple spaces before operator -pymodbus/device.py:278:14: E221 multiple spaces before operator -pymodbus/device.py:289:80: E501 line too long (81 characters) -pymodbus/device.py:290:80: E501 line too long (81 characters) -pymodbus/device.py:289:45: E231 missing whitespace after ',' -pymodbus/device.py:289:47: E231 missing whitespace after ',' -pymodbus/device.py:290:45: E231 missing whitespace after ',' -pymodbus/device.py:290:47: E231 missing whitespace after ',' -pymodbus/device.py:291:45: E231 missing whitespace after ',' -pymodbus/device.py:291:47: E231 missing whitespace after ',' -pymodbus/device.py:292:45: E231 missing whitespace after ',' -pymodbus/device.py:292:47: E231 missing whitespace after ',' -pymodbus/device.py:289:33: E272 multiple spaces before keyword -pymodbus/device.py:290:35: E272 multiple spaces before keyword -pymodbus/device.py:315:17: E201 whitespace after '{' -pymodbus/device.py:315:47: E202 whitespace before '}' -pymodbus/device.py:315:27: E231 missing whitespace after ':' -pymodbus/device.py:401:12: E221 multiple spaces before operator -pymodbus/device.py:442:25: E701 multiple statements on one line (colon) -pymodbus/device.py:449:15: E221 multiple spaces before operator -pymodbus/device.py:451:22: E221 multiple spaces before operator -pymodbus/device.py:452:17: E221 multiple spaces before operator -pymodbus/device.py:453:20: E221 multiple spaces before operator -pymodbus/device.py:454:13: E221 multiple spaces before operator -pymodbus/device.py:455:14: E221 multiple spaces before operator -pymodbus/device.py:456:24: E221 multiple spaces before operator -pymodbus/device.py:457:10: E221 multiple spaces before operator -pymodbus/device.py:478:11: E221 multiple spaces before operator -pymodbus/device.py:479:13: E221 multiple spaces before operator -pymodbus/device.py:527:12: E221 multiple spaces before operator -pymodbus/device.py:528:11: E221 multiple spaces before operator -pymodbus/device.py:529:9: E221 multiple spaces before operator -pymodbus/device.py:612:9: E126 continuation line over-indented for hanging indent -pymodbus/diag_message.py:135:80: E501 line too long (81 characters) -pymodbus/diag_message.py:174:13: E701 multiple statements on one line (colon) -pymodbus/diag_message.py:200:13: E701 multiple statements on one line (colon) -pymodbus/diag_message.py:224:25: E221 multiple spaces before operator -pymodbus/diag_message.py:225:13: E701 multiple statements on one line (colon) -pymodbus/diag_message.py:254:25: E221 multiple spaces before operator -pymodbus/diag_message.py:255:13: E701 multiple statements on one line (colon) -pymodbus/diag_message.py:349:19: E221 multiple spaces before operator -pymodbus/diag_message.py:593:80: E501 line too long (80 characters) -pymodbus/diag_message.py:596:80: E501 line too long (80 characters) -pymodbus/diag_message.py:612:80: E501 line too long (82 characters) -pymodbus/diag_message.py:615:80: E501 line too long (80 characters) -pymodbus/diag_message.py:702:23: E261 at least two spaces before inline comment -pymodbus/diag_message.py:705:13: E701 multiple statements on one line (colon) -pymodbus/diag_message.py:725:80: E501 line too long (80 characters) -pymodbus/diag_message.py:731:80: E501 line too long (90 characters) -pymodbus/diag_message.py:732:80: E501 line too long (82 characters) -pymodbus/diag_message.py:737:80: E501 line too long (96 characters) -pymodbus/events.py:54:21: E221 multiple spaces before operator -pymodbus/events.py:55:20: E221 multiple spaces before operator -pymodbus/events.py:63:13: E221 multiple spaces before operator -pymodbus/events.py:74:21: E221 multiple spaces before operator -pymodbus/events.py:75:20: E221 multiple spaces before operator -pymodbus/events.py:105:18: E221 multiple spaces before operator -pymodbus/events.py:106:25: E221 multiple spaces before operator -pymodbus/events.py:107:24: E221 multiple spaces before operator -pymodbus/events.py:108:23: E221 multiple spaces before operator -pymodbus/events.py:110:20: E221 multiple spaces before operator -pymodbus/events.py:118:13: E128 continuation line under-indented for visual indent -pymodbus/events.py:119:13: E221 multiple spaces before operator -pymodbus/events.py:130:18: E221 multiple spaces before operator -pymodbus/events.py:131:25: E221 multiple spaces before operator -pymodbus/events.py:132:24: E221 multiple spaces before operator -pymodbus/events.py:133:23: E221 multiple spaces before operator -pymodbus/events.py:135:20: E221 multiple spaces before operator -pymodbus/factory.py:44:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:45:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:46:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:47:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:48:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:49:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:50:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:51:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:52:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:54:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:56:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:57:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:58:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:59:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:61:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:62:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:63:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:64:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:66:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:69:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:70:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:71:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:72:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:73:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:74:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:75:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:76:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:77:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:78:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:79:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:80:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:81:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:82:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:83:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:84:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:85:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:87:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:94:80: E501 line too long (83 characters) -pymodbus/factory.py:138:23: E701 multiple statements on one line (colon) -pymodbus/factory.py:152:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:153:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:154:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:155:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:156:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:157:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:158:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:159:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:160:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:162:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:164:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:165:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:166:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:167:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:169:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:170:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:171:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:172:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:174:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:177:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:178:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:179:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:180:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:181:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:182:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:183:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:184:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:185:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:186:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:187:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:188:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:189:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:190:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:191:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:192:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:193:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:195:13: E126 continuation line over-indented for hanging indent -pymodbus/factory.py:202:80: E501 line too long (83 characters) -pymodbus/factory.py:249:23: E701 multiple statements on one line (colon) -pymodbus/file_message.py:30:28: E221 multiple spaces before operator -pymodbus/file_message.py:31:25: E221 multiple spaces before operator -pymodbus/file_message.py:32:27: E221 multiple spaces before operator -pymodbus/file_message.py:33:25: E221 multiple spaces before operator -pymodbus/file_message.py:34:80: E501 line too long (87 characters) -pymodbus/file_message.py:34:27: E221 multiple spaces before operator -pymodbus/file_message.py:35:80: E501 line too long (87 characters) -pymodbus/file_message.py:41:12: E127 continuation line over-indented for visual indent -pymodbus/file_message.py:42:12: E127 continuation line over-indented for visual indent -pymodbus/file_message.py:43:12: E127 continuation line over-indented for visual indent -pymodbus/file_message.py:44:12: E127 continuation line over-indented for visual indent -pymodbus/file_message.py:41:32: E221 multiple spaces before operator -pymodbus/file_message.py:42:34: E221 multiple spaces before operator -pymodbus/file_message.py:43:34: E221 multiple spaces before operator -pymodbus/file_message.py:44:32: E221 multiple spaces before operator -pymodbus/file_message.py:92:21: E221 multiple spaces before operator -pymodbus/file_message.py:102:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:113:62: E225 missing whitespace around operator -pymodbus/file_message.py:115:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:114:19: E221 multiple spaces before operator -pymodbus/file_message.py:116:34: E701 multiple statements on one line (colon) -pymodbus/file_message.py:154:14: E221 multiple spaces before operator -pymodbus/file_message.py:169:80: E501 line too long (87 characters) -pymodbus/file_message.py:169:84: E225 missing whitespace around operator -pymodbus/file_message.py:170:41: E261 at least two spaces before inline comment -pymodbus/file_message.py:172:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:173:38: E701 multiple statements on one line (colon) -pymodbus/file_message.py:192:21: E221 multiple spaces before operator -pymodbus/file_message.py:199:80: E501 line too long (85 characters) -pymodbus/file_message.py:203:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:215:62: E225 missing whitespace around operator -pymodbus/file_message.py:217:18: E221 multiple spaces before operator -pymodbus/file_message.py:219:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:220:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:218:19: E221 multiple spaces before operator -pymodbus/file_message.py:221:34: E701 multiple statements on one line (colon) -pymodbus/file_message.py:248:21: E221 multiple spaces before operator -pymodbus/file_message.py:255:80: E501 line too long (85 characters) -pymodbus/file_message.py:259:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:271:62: E225 missing whitespace around operator -pymodbus/file_message.py:273:18: E221 multiple spaces before operator -pymodbus/file_message.py:275:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:276:17: E128 continuation line under-indented for visual indent -pymodbus/file_message.py:274:19: E221 multiple spaces before operator -pymodbus/file_message.py:277:34: E701 multiple statements on one line (colon) -pymodbus/file_message.py:298:21: E221 multiple spaces before operator -pymodbus/file_message.py:300:21: E221 multiple spaces before operator -pymodbus/file_message.py:331:80: E501 line too long (83 characters) -pymodbus/file_message.py:350:21: E221 multiple spaces before operator -pymodbus/file_message.py:352:21: E221 multiple spaces before operator -pymodbus/mei_message.py:43:13: E128 continuation line under-indented for visual indent -pymodbus/mei_message.py:66:13: E128 continuation line under-indented for visual indent -pymodbus/mei_message.py:91:17: E261 at least two spaces before inline comment -pymodbus/mei_message.py:94:69: E225 missing whitespace around operator -pymodbus/mei_message.py:108:31: E261 at least two spaces before inline comment -pymodbus/mei_message.py:111:35: E261 at least two spaces before inline comment -pymodbus/mei_message.py:120:13: E128 continuation line under-indented for visual indent -pymodbus/mei_message.py:121:13: E128 continuation line under-indented for visual indent -pymodbus/mei_message.py:138:40: E261 at least two spaces before inline comment -pymodbus/mei_message.py:141:80: E501 line too long (80 characters) -pymodbus/mei_message.py:141:77: E225 missing whitespace around operator -pymodbus/mei_message.py:143:53: E225 missing whitespace around operator -pymodbus/other_message.py:187:23: E701 multiple statements on one line (colon) -pymodbus/other_message.py:188:13: E701 multiple statements on one line (colon) -pymodbus/other_message.py:257:28: E203 whitespace before ':' -pymodbus/other_message.py:258:28: E203 whitespace before ':' -pymodbus/other_message.py:259:28: E203 whitespace before ':' -pymodbus/other_message.py:260:28: E203 whitespace before ':' -pymodbus/other_message.py:301:23: E701 multiple statements on one line (colon) -pymodbus/other_message.py:302:13: E701 multiple statements on one line (colon) -pymodbus/other_message.py:303:15: E221 multiple spaces before operator -pymodbus/other_message.py:329:80: E501 line too long (91 characters) -pymodbus/other_message.py:400:23: E701 multiple statements on one line (colon) -pymodbus/other_message.py:401:13: E701 multiple statements on one line (colon) -pymodbus/payload.py:36:21: E221 multiple spaces before operator -pymodbus/payload.py:61:27: E225 missing whitespace around operator -pymodbus/payload.py:186:21: E221 multiple spaces before operator -pymodbus/pdu.py:79:13: E701 multiple statements on one line (colon) -pymodbus/pdu.py:97:17: E128 continuation line under-indented for visual indent -pymodbus/pdu.py:129:20: E221 multiple spaces before operator -pymodbus/pdu.py:130:19: E221 multiple spaces before operator -pymodbus/pdu.py:131:17: E221 multiple spaces before operator -pymodbus/pdu.py:132:17: E221 multiple spaces before operator -pymodbus/pdu.py:133:16: E221 multiple spaces before operator -pymodbus/pdu.py:134:14: E221 multiple spaces before operator -pymodbus/pdu.py:135:22: E221 multiple spaces before operator -pymodbus/pdu.py:136:27: E221 multiple spaces before operator -pymodbus/pdu.py:137:22: E221 multiple spaces before operator -pymodbus/register_read_message.py:128:80: E501 line too long (80 characters) -pymodbus/register_read_message.py:178:80: E501 line too long (80 characters) -pymodbus/register_read_message.py:226:26: E221 multiple spaces before operator -pymodbus/register_read_message.py:227:24: E221 multiple spaces before operator -pymodbus/register_read_message.py:228:27: E221 multiple spaces before operator -pymodbus/register_read_message.py:241:17: E128 continuation line under-indented for visual indent -pymodbus/register_read_message.py:242:17: E128 continuation line under-indented for visual indent -pymodbus/register_read_message.py:241:54: E502 the backslash is redundant between brackets -pymodbus/register_read_message.py:253:9: E122 continuation line missing indentation or outdented -pymodbus/register_read_message.py:254:9: E122 continuation line missing indentation or outdented -pymodbus/register_read_message.py:255:29: E221 multiple spaces before operator -pymodbus/register_write_message.py:133:22: E701 multiple statements on one line (colon) -pymodbus/register_write_message.py:134:45: E701 multiple statements on one line (colon) -pymodbus/register_write_message.py:155:9: E122 continuation line missing indentation or outdented -pymodbus/transaction.py:9:24: E272 multiple spaces before keyword -pymodbus/transaction.py:11:24: E272 multiple spaces before keyword -pymodbus/transaction.py:12:24: E272 multiple spaces before keyword -pymodbus/transaction.py:66:80: E501 line too long (85 characters) -pymodbus/transaction.py:67:22: E702 multiple statements on one line (semicolon) -pymodbus/transaction.py:146:31: E231 missing whitespace after ':' -pymodbus/transaction.py:146:40: E231 missing whitespace after ':' -pymodbus/transaction.py:146:49: E231 missing whitespace after ':' -pymodbus/transaction.py:146:58: E231 missing whitespace after ':' -pymodbus/transaction.py:147:21: E221 multiple spaces before operator -pymodbus/transaction.py:148:21: E221 multiple spaces before operator -pymodbus/transaction.py:159:13: E122 continuation line missing indentation or outdented -pymodbus/transaction.py:160:21: E126 continuation line over-indented for hanging indent -pymodbus/transaction.py:179:31: E231 missing whitespace after ':' -pymodbus/transaction.py:179:40: E231 missing whitespace after ':' -pymodbus/transaction.py:179:49: E231 missing whitespace after ':' -pymodbus/transaction.py:179:58: E231 missing whitespace after ':' -pymodbus/transaction.py:244:17: E701 multiple statements on one line (colon) -pymodbus/transaction.py:253:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:254:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:255:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:305:21: E221 multiple spaces before operator -pymodbus/transaction.py:306:19: E221 multiple spaces before operator -pymodbus/transaction.py:308:21: E221 multiple spaces before operator -pymodbus/transaction.py:380:14: E221 multiple spaces before operator -pymodbus/transaction.py:381:12: E221 multiple spaces before operator -pymodbus/transaction.py:383:19: E701 multiple statements on one line (colon) -pymodbus/transaction.py:423:17: E701 multiple statements on one line (colon) -pymodbus/transaction.py:432:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:433:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:463:31: E231 missing whitespace after ':' -pymodbus/transaction.py:463:45: E231 missing whitespace after ':' -pymodbus/transaction.py:463:54: E231 missing whitespace after ':' -pymodbus/transaction.py:464:21: E221 multiple spaces before operator -pymodbus/transaction.py:465:21: E221 multiple spaces before operator -pymodbus/transaction.py:466:19: E221 multiple spaces before operator -pymodbus/transaction.py:467:21: E221 multiple spaces before operator -pymodbus/transaction.py:478:23: E701 multiple statements on one line (colon) -pymodbus/transaction.py:479:21: E203 whitespace before ':' -pymodbus/transaction.py:499:31: E231 missing whitespace after ':' -pymodbus/transaction.py:499:45: E231 missing whitespace after ':' -pymodbus/transaction.py:499:54: E231 missing whitespace after ':' -pymodbus/transaction.py:524:14: E221 multiple spaces before operator -pymodbus/transaction.py:525:12: E221 multiple spaces before operator -pymodbus/transaction.py:527:19: E701 multiple statements on one line (colon) -pymodbus/transaction.py:567:17: E701 multiple statements on one line (colon) -pymodbus/transaction.py:576:16: E221 multiple spaces before operator -pymodbus/transaction.py:577:15: E221 multiple spaces before operator -pymodbus/transaction.py:620:31: E231 missing whitespace after ':' -pymodbus/transaction.py:620:45: E231 missing whitespace after ':' -pymodbus/transaction.py:620:54: E231 missing whitespace after ':' -pymodbus/transaction.py:621:21: E221 multiple spaces before operator -pymodbus/transaction.py:622:21: E221 multiple spaces before operator -pymodbus/transaction.py:623:19: E221 multiple spaces before operator -pymodbus/transaction.py:624:21: E221 multiple spaces before operator -pymodbus/transaction.py:635:23: E701 multiple statements on one line (colon) -pymodbus/transaction.py:636:21: E203 whitespace before ':' -pymodbus/transaction.py:643:80: E501 line too long (85 characters) -pymodbus/transaction.py:655:31: E231 missing whitespace after ':' -pymodbus/transaction.py:655:45: E231 missing whitespace after ':' -pymodbus/transaction.py:655:54: E231 missing whitespace after ':' -pymodbus/transaction.py:680:14: E221 multiple spaces before operator -pymodbus/transaction.py:681:12: E221 multiple spaces before operator -pymodbus/transaction.py:683:19: E701 multiple statements on one line (colon) -pymodbus/transaction.py:723:17: E701 multiple statements on one line (colon) -pymodbus/transaction.py:733:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:734:13: E128 continuation line under-indented for visual indent -pymodbus/transaction.py:749:31: E701 multiple statements on one line (colon) -pymodbus/transaction.py:750:17: E701 multiple statements on one line (colon) -pymodbus/utilities.py:64:15: E701 multiple statements on one line (colon) -pymodbus/utilities.py:69:13: E701 multiple statements on one line (colon) -pymodbus/utilities.py:110:17: E701 multiple statements on one line (colon) -pymodbus/utilities.py:131:51: E702 multiple statements on one line (semicolon) -pymodbus/client/async.py:115:17: E701 multiple statements on one line (colon) -pymodbus/client/async.py:130:32: E261 at least two spaces before inline comment -pymodbus/client/async.py:187:17: E701 multiple statements on one line (colon) -pymodbus/client/async.py:198:32: E261 at least two spaces before inline comment -pymodbus/client/sync.py:47:80: E501 line too long (80 characters) -pymodbus/client/sync.py:60:80: E501 line too long (80 characters) -pymodbus/client/sync.py:68:80: E501 line too long (80 characters) -pymodbus/client/sync.py:79:80: E501 line too long (81 characters) -pymodbus/client/sync.py:93:80: E501 line too long (81 characters) -pymodbus/client/sync.py:137:23: E701 multiple statements on one line (colon) -pymodbus/client/sync.py:139:80: E501 line too long (92 characters) -pymodbus/client/sync.py:143:17: E128 continuation line under-indented for visual indent -pymodbus/client/sync.py:142:65: E502 the backslash is redundant between brackets -pymodbus/client/sync.py:145:28: E711 comparison to None should be 'if cond is not None:' -pymodbus/client/sync.py:212:29: E261 at least two spaces before inline comment -pymodbus/client/sync.py:221:23: E701 multiple statements on one line (colon) -pymodbus/client/sync.py:228:28: E711 comparison to None should be 'if cond is not None:' -pymodbus/client/sync.py:289:20: E221 multiple spaces before operator -pymodbus/client/sync.py:290:20: E221 multiple spaces before operator -pymodbus/client/sync.py:293:18: E221 multiple spaces before operator -pymodbus/client/sync.py:296:20: E221 multiple spaces before operator -pymodbus/client/sync.py:298:21: E221 multiple spaces before operator -pymodbus/client/sync.py:308:31: E701 multiple statements on one line (colon) -pymodbus/client/sync.py:308:32: E272 multiple spaces before keyword -pymodbus/client/sync.py:309:29: E701 multiple statements on one line (colon) -pymodbus/client/sync.py:309:30: E272 multiple spaces before keyword -pymodbus/client/sync.py:310:32: E701 multiple statements on one line (colon) -pymodbus/client/sync.py:318:23: E701 multiple statements on one line (colon) -pymodbus/client/sync.py:321:17: E128 continuation line under-indented for visual indent -pymodbus/client/sync.py:322:17: E128 continuation line under-indented for visual indent -pymodbus/client/sync.py:326:28: E711 comparison to None should be 'if cond is not None:' -pymodbus/server/async.py:218:5: E128 continuation line under-indented for visual indent -pymodbus/server/async.py:218:5: E125 continuation line does not distinguish itself from next logical line -pymodbus/server/async.py:236:43: E261 at least two spaces before inline comment -pymodbus/server/sync.py:78:80: E501 line too long (81 characters) -pymodbus/server/sync.py:80:80: E501 line too long (81 characters) -pymodbus/server/sync.py:84:80: E501 line too long (80 characters) -pymodbus/server/sync.py:91:80: E501 line too long (80 characters) -pymodbus/server/sync.py:110:34: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:113:19: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:140:28: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:144:34: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:148:19: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:177:28: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:181:34: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:185:19: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:224:30: E272 multiple spaces before keyword -pymodbus/server/sync.py:224:20: E221 multiple spaces before operator -pymodbus/server/sync.py:232:13: E128 continuation line under-indented for visual indent -pymodbus/server/sync.py:248:35: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:273:30: E272 multiple spaces before keyword -pymodbus/server/sync.py:273:20: E221 multiple spaces before operator -pymodbus/server/sync.py:281:13: E128 continuation line under-indented for visual indent -pymodbus/server/sync.py:289:33: E261 at least two spaces before inline comment -pymodbus/server/sync.py:298:35: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:329:30: E272 multiple spaces before keyword -pymodbus/server/sync.py:329:20: E221 multiple spaces before operator -pymodbus/server/sync.py:336:20: E221 multiple spaces before operator -pymodbus/server/sync.py:339:20: E221 multiple spaces before operator -pymodbus/server/sync.py:341:21: E221 multiple spaces before operator -pymodbus/server/sync.py:342:20: E221 multiple spaces before operator -pymodbus/server/sync.py:350:23: E701 multiple statements on one line (colon) -pymodbus/server/sync.py:353:17: E128 continuation line under-indented for visual indent -pymodbus/server/sync.py:354:17: E128 continuation line under-indented for visual indent -pymodbus/server/sync.py:358:28: E711 comparison to None should be 'if cond is not None:' -pymodbus/server/sync.py:370:13: E128 continuation line under-indented for visual indent -pymodbus/server/sync.py:381:19: E701 multiple statements on one line (colon) -pymodbus/internal/ptwisted.py:53:15: E701 multiple statements on one line (colon) -pymodbus/datastore/context.py:9:15: E702 multiple statements on one line (semicolon) -pymodbus/datastore/context.py:101:20: E221 multiple spaces before operator -pymodbus/datastore/context.py:128:23: E701 multiple statements on one line (colon) -pymodbus/datastore/context.py:131:13: E701 multiple statements on one line (colon) -pymodbus/datastore/context.py:139:23: E701 multiple statements on one line (colon) -pymodbus/datastore/context.py:142:80: E501 line too long (82 characters) -pymodbus/datastore/context.py:142:13: E701 multiple statements on one line (colon) -pymodbus/datastore/database.py:13:15: E702 multiple statements on one line (semicolon) -pymodbus/datastore/database.py:83:80: E501 line too long (80 characters) -pymodbus/datastore/database.py:85:80: E501 line too long (80 characters) -pymodbus/datastore/database.py:95:13: E128 continuation line under-indented for visual indent -pymodbus/datastore/database.py:110:14: E221 multiple spaces before operator -pymodbus/datastore/database.py:128:28: E203 whitespace before ':' -pymodbus/datastore/database.py:129:28: E203 whitespace before ':' -pymodbus/datastore/database.py:130:28: E203 whitespace before ':' -pymodbus/datastore/database.py:142:14: E221 multiple spaces before operator -pymodbus/datastore/database.py:143:15: E221 multiple spaces before operator -pymodbus/datastore/database.py:154:14: E221 multiple spaces before operator -pymodbus/datastore/database.py:155:14: E221 multiple spaces before operator -pymodbus/datastore/database.py:156:31: E221 multiple spaces before operator -pymodbus/datastore/database.py:158:15: E221 multiple spaces before operator -pymodbus/datastore/database.py:168:14: E221 multiple spaces before operator -pymodbus/datastore/modredis.py:8:15: E702 multiple statements on one line (semicolon) -pymodbus/datastore/modredis.py:80:80: E501 line too long (80 characters) -pymodbus/datastore/modredis.py:82:80: E501 line too long (80 characters) -pymodbus/datastore/modredis.py:97:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:98:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:99:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:100:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:103:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:104:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:105:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:106:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:109:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:110:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:111:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:112:16: E203 whitespace before ':' -pymodbus/datastore/modredis.py:115:80: E501 line too long (80 characters) -pymodbus/datastore/modredis.py:117:80: E501 line too long (80 characters) -pymodbus/datastore/modredis.py:118:15: E221 multiple spaces before operator -pymodbus/datastore/modredis.py:132:16: E221 multiple spaces before operator -pymodbus/datastore/modredis.py:176:80: E501 line too long (92 characters) -pymodbus/datastore/modredis.py:176:14: E221 multiple spaces before operator -pymodbus/datastore/modredis.py:183:80: E501 line too long (80 characters) -pymodbus/datastore/modredis.py:185:80: E501 line too long (80 characters) -pymodbus/datastore/modredis.py:186:15: E221 multiple spaces before operator -pymodbus/datastore/modredis.py:201:16: E221 multiple spaces before operator -pymodbus/datastore/remote.py:98:32: E701 multiple statements on one line (colon) -pymodbus/datastore/remote.py:99:32: E701 multiple statements on one line (colon) -pymodbus/datastore/remote.py:100:13: E701 multiple statements on one line (colon) -pymodbus/datastore/store.py:144:13: E701 multiple statements on one line (colon) -pymodbus/datastore/store.py:163:15: E221 multiple spaces before operator -pymodbus/datastore/store.py:204:13: E701 multiple statements on one line (colon) -pymodbus/datastore/store.py:216:44: E225 missing whitespace around operator -pymodbus/datastore/store.py:225:22: E701 multiple statements on one line (colon) -4 E122 continuation line missing indentation or outdented -1 E125 continuation line does not distinguish itself from next logical line -77 E126 continuation line over-indented for hanging indent -4 E127 continuation line over-indented for visual indent -34 E128 continuation line under-indented for visual indent -1 E201 whitespace after '{' -1 E202 whitespace before '}' -68 E203 whitespace before ':' -154 E221 multiple spaces before operator -10 E225 missing whitespace around operator -29 E231 missing whitespace after ',' -26 E261 at least two spaces before inline comment -10 E272 multiple spaces before keyword -47 E501 line too long (80 characters) -2 E502 the backslash is redundant between brackets -72 E701 multiple statements on one line (colon) -5 E702 multiple statements on one line (semicolon) -4 E711 comparison to None should be 'if cond is not None:' diff --git a/doc/source/library/modules.rst b/doc/source/library/modules.rst index 43e9c4b12..f36970d42 100644 --- a/doc/source/library/modules.rst +++ b/doc/source/library/modules.rst @@ -1,4 +1,4 @@ -pymodbus +Pymodbus ======== .. toctree:: diff --git a/doc/source/library/pymodbus.rst b/doc/source/library/pymodbus.rst index 00933087f..9517ad686 100644 --- a/doc/source/library/pymodbus.rst +++ b/doc/source/library/pymodbus.rst @@ -1,4 +1,4 @@ -pymodbus package +Pymodbus package ================ Subpackages diff --git a/doc/sphinx/Makefile b/doc/sphinx/Makefile deleted file mode 100644 index 9ea4a8dfa..000000000 --- a/doc/sphinx/Makefile +++ /dev/null @@ -1,88 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf build/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html - @echo - @echo "Build finished. The HTML pages are in build/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) build/dirhtml - @echo - @echo "Build finished. The HTML pages are in build/dirhtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) build/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) build/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in build/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) build/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in build/qthelp, like this:" - @echo "# qcollectiongenerator build/qthelp/PyModbus.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile build/qthelp/PyModbus.qhc" - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex - @echo - @echo "Build finished; the LaTeX files are in build/latex." - @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ - "run these through (pdf)latex." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) build/changes - @echo - @echo "The overview file is in build/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) build/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in build/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) build/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in build/doctest/output.txt." diff --git a/doc/sphinx/conf.py b/doc/sphinx/conf.py deleted file mode 100644 index 3faaccc37..000000000 --- a/doc/sphinx/conf.py +++ /dev/null @@ -1,109 +0,0 @@ -# -*- coding: utf-8 -*- -# -# pymodbus documentation build configuration file, created by -# sphinx-quickstart on Fri May 26 10:10:53 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath(os.pardir)) - -from pymodbus import __version__, __author__, __maintainer__ - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -# Sphinx extension module names. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', - 'humanfriendly.sphinx', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# Sort members by the source order instead of alphabetically. -autodoc_member_order = 'bysource' - -# Paths that contain templates, relative to this directory. -templates_path = ['templates'] - -# The suffix of source filenames. -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'pymodbus' -copyright = u'2017, {}, {}'.format(__author__, __maintainer__) -author = u'{}, {}'.format(__author__, __maintainer__) - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = __version__ -# The full version, including alpha/beta/rc tags. -release = __version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = 'en' - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -exclude_patterns = ['build', '_build', 'Thumbs.db', '.DS_Store'] - -# If true, '()' will be appended to :func: etc. cross-reference text. -add_function_parentheses = True - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# Refer to the Python standard library. -# From: http://twistedmatrix.com/trac/ticket/4582. -intersphinx_mapping = dict( - python=('https://docs.python.org/2', None), - capturer=('https://capturer.readthedocs.io/en/latest', None), - humanfriendly=('https://humanfriendly.readthedocs.io/en/latest', None), -) - -# -- Options for HTML output -------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'default' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'pymodbusdoc' - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['static'] diff --git a/doc/sphinx/doctrees/environment.pickle b/doc/sphinx/doctrees/environment.pickle deleted file mode 100644 index 97c03334b95a8af404614d6bab8edfeb56d91977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1774735 zcmceC!DQZ>70dm#{%(9Np|uv9%ev)DxD1CU}O zGb>*vNtD@|?f$bie}vi2T64bL?swUryNAb%crP;eC?>kis>MuX{5%d155L0W|MCLC&h3& z?x5l2-T>&*dhfVB8ubQ;-0Q`o>2Z5-Fz)4pZvW)9SwEUgM#bG*w}S82$9cOuIm$t! zSnmyQ<%3)O_9QPRuOIzipwnrOCetyI{7jqcSLv2#MkkY_;o!Boq3xK0e7imzAKto6 z6sBe+f7R(vyZPRzJ;6W*#q0lyDSvODRs++rXa8}27v0`3*1P+dqV;<_dpi?aiQHUo zce{HB(?Ms_8x8<6#;hLY1*Y%6nWag7JmTRH`Vo-LdH2=pHr9?Oaj%#j9Q0n%pMSAF z#?ag5EEb^vAR2tRerNrQ^>ODm{@odlPR6~%Bk)Uh`-?BX`8@ls-OmTv=CI%I4T{gR z?$K~~+T>_+eQBRXx+S5^&@kx-yR%J+lN@X|Cj@RYtg2 zn;*2NePCS3Urq7>4NRul?Sxm8b<1h5%~jnV_|ju8u$uRW7rp#tXV?Y$TF6h1kK6q= zdWR)_olp18g@fUA(4|dKVEcS(F86!;CGjd(O?Y1Xqixs{#&X0!^ zka<6U)y87x#jWCG&^f}s9Zri@rw{hVz~X-`@-fyCyUn$=+t1P2?@d~?1IjL3(k}4O z5854YlDX~xI_-XczukG>Qf%GPSG3&_vpz2Imi7Bl`=mc?gQqXLZ@OTTD-QZ_^1O9` zabbn~D|`O(mAAs>*ZZArIY*8GAsF)!(FkUHoOgRg%k>UZ=;+(o?hg+S=@2NF zZ93`ody^hKs8_6LTMoA!f&MmSsux+T3)AR-m;G^FcnAQI{eFw0hvFa>dI(?GGmt47QX4<>J~o zcA~QUi_UOo+{Ti9zS#`N8eUKqCKl9OF=cpll7G0nidaFXCf-k2*o0 z-uI5FJvt7%d%Xck7?KCj;Et}58n-YyxeFa*+}oexK%sAb6&_ui!{hzlAn!hdy0_lV zJH6v}AHS+9Qa``5e*3lgFRIss7_-!=Tg>dx!H)Z%ge{^}&3|aUhT#1u{OL~bZ@F}? z_W~N?7$f`dNB@uc%e=Z$!$0~rI$LLSg7psR!LzydfWc$rcYD}|>toU;@~)kLxseaS znS2(GUVf4H+oJ+pHbG}>AO7>arXWIrJMzo0BLUlhZJ|rqp8PNK>Pd_Qcjd#dD~@f7 zljHp%whVLS5A*6q6`r~-_byb-yw6+tOp&+8og+*8?pxB9#=JYBpY1SI_JmYY z@c%hTaXG4FVE_1*;M&~6zqidMAOX`!z#jzopWYI9bkb4;i@or0*q!$COi4^x=s87# zXX^Li;z3V29!-k%-Qnow`_lCQxv22 zVBWk{h378Z2xrLt<{r#qOMYiw^Wj4$NYf5DCDIJdq$^_HcI`nvIE3XqXE7gw6Zt6_ zuy@stXGX1@lM|>e>jl_yLRNnJ5Zca>GU$Ju*Mh`}@cgtwu25E%|L#Fk-hb{}qDcul)1*5-EZripR)J`I<}t=(Zx^7atE zXYduA0jhKF&uf_yl(=KRt8|R!t5|2x#AL5HZjUE>Fh$`*mu=LZTfb%!iq2Q?>(Mx$ zOiqG+&2PSDQ{s+&U70VH!3WUF_H?rM3NSqcA$I*@_6IUA`H1nT@+W zvG(n%?#`=U0X7r=JR}}&6_)CBxZ_kOAE)ik!MwWj25Q{Fufh)M60Xl&&;qzkWXuL{pysM#m5_$ibC<6ux42y?VgD)`)q zir_1yCHcw3&OaJbL~_ph=4?XTt+@Fh`iTt+RmI-C&4(GpxO9QFo#BuZ4o&u!OK;kgT+%@AmH{m`;(XYNuh zLW;XqaY)I^QP9Nm<<89^RYB(tRD6h~a=}0DvKeG&Wo|yiI1%nnC79$+1@@15=g!=M zNf8R%k>7?q6Olc=!Du?MQ}e&gi(zKc;ZD`|lJy=Ar<1ZTbKFZIJa^&m!g(o|(wcxa z=I60*cV2Uoq!pVVD~l@IX>RjVh376*yhO1+2X_11ydDWk+_B%xS~$DWgQI9~{%aPJ z;V#WmxMj2VkacOd*ZdW3k3?*CoK&D}1=e}V6Rk?`+-7GMnb_>8WPsyre1gOCxTnHr zZnG03!Ck31hAra<95Xk^a0t%iD~F_;HCDGQi_Gnite|rTD!Lmh8EhmV?R3uOSb)vM zEABVfKj{4f9XhwA?atiXZ*QQ+9jv&Ccmy1Vw4Iroo5(|E!WCJ|-WKQh9uJWT z9D2UzCTkOvxMLM{oBNGq97@EUv%2j=$L1tZgY~L#2vd@KYxzfJq@}(ndgDS zxHA_*1k9-{goS3(6;r+RDFiXixtZ!UeD1_d*+KDcCp7i~{qYoJN0b_Ou%ho<4;@Dn zf++Od^!*5h*&RWCCXxtGvm*fo?nwNs4RpqNpS2d8$=A+Wcz{Oz=@>ar&hJ0Rvo=8I z4pdGPu~|J&#oSI4519#9EMb)4mJ4E~_}rvJgaXe&#ZnO=(mSRY-5xRwkx^)SGB;g3 zMuNLiab~H`j(|EC8kfX4TM?oi*HT2+n42>zMT)yt@tMRl0*`Ix<};Z|C$@A>p|u%T zrBye#rHhf^u2fQ;%HQD%<6b`SLK$;Qb&As9&Q$ah_d~ruACwhlC1usA5Yivth?M?wOk{9fC9YibZMHQm3xNve!!9xmlEPBHW#s(j|Z8 zZS7N#E*76VQPF`ngU#J8aPe2|mbuB>C=KpR#jLB$9c3xl<(Zpp5F?S`6(?QzYW6Ad zN`(k_rxNkdlL7?+Gzd1gY?T0;iC4C*`$0c<)aSNsL+}*&4!oFpp?L1(1)RxOc1VR| z_~xKxgt_gID2)c4=?`Bzfqq(@5gOc?xIA_2d(fX28Zn-?JgpE(bVtQ|5N4QncPd1< zJ83(ySHR1QY9AfTJEvtQmUI&Q<7TtS^XI3;%pr}$47nddv&7Zj>8Ts7j!pwELP9x} z!xG#6w7AF;;qJt>T;;dW4RcyLoKi_}kanp5BZ9oA#6cmA2AvuIJ9I{9H0X@4Y@e2F z_EhbP(Y67XCf)Px==oYPAm?VZ%_hWi6hAU_Wl_SUOdmh3-DQbzcPg`F&s`^hG}}ni zV&^tXvk7sxDt?)YI)ET(@v`TVvF7HNnMH=X6hF;sGj&R*S)C4dDlHsQF3a=kotAJ^ zDv4QA_U0;FRNe2CW~okxJ5|Y2Rl_)RHO?&yvkK2$s07J211mG;Y@Az=EJcdD7MDnl z;X3^x>LH%ad0!#I-HBTp?w5lyjyUf_B&3m;8)Y*To-CtvrzNc|5$;aaVdA1ufuCZ2 z4wEWAcj8Slr`?BQZyDzFWR6hb4y6x^;$?f(p^~1$!l!juI5OO&I1?-1{0;T-^!oO^ znK-1uovFrJ+^SL#vvfS3LJU(0G~}DnQTyM4Z-@$as3Q16L8&VLoCRN;NUS@ZFx=Vy z_mDM~NTcQI_6}Xb_vvkOp~4-CtE$TH9O(2@qUNotMhG?NR{jblu)0XkJuMAdyX6sT z&@EJi?oIp*y3?91k5GedjjPE6r`0Ww5O*ssubo0L$xlsQhcsey6fr1+_{iMmXf~n5 z94Y^GP~P#h{T@OiHb)g#wFGpC65_ha}0EcN2VN88)+I5^rtUHyZ4$|S~)}1(!2HnB?0jR5Y zN_LqttR)ib&Sq%A2AbsDW+zUByOWNTdI@o-6)9yB+?6*R9^^x_>ojj=-|Z}>!JV0r zEEAjFJGLkgg*BVy9e?b2c~em!L#THN{I2CwFZ@>`$wOqpe^- z4e#M(h^iu%gXU)2*YIPktO?c+H~zA>vAetV@X7AZyjeL)BgV?M$5uAkZp@99E9l&T z3M;#e;d@*6H=aG%-FvY8XiMi~Zmc|m3U{bt$-AF!Jlfgb+xhOPos_v*@^u2-jY?q? z_p8kZTN{t|9zWZC@@#kS2{FvmN486ID{PV`#@(wJimnCE((cw@cK3F6|Mh`exw+|v zvk7sxDkoO>>!({gTf26y=5}JmNW6K5HXlED{B&>g@x9ZYA)gR;tD-%-?(2R-gJ%yP z>5iM5_B@jgcPhE(Hg~p9ch3=l&dGk@7Ky1nEulO|%dLHM6 zUf7!VlFcT>-KvD>?5|b7wVjz;h^`9HU8vmcllyMZb~e7-+IzV1^k24gZ_Vv)UxWg6 z#NI)YOMLX^N#&xtimP{@6uBr^sn6)(c~Y)~m*lOoW=X$;@)aem=uA2ONSV0f-yz#E zN?1w`ilAK$M~u6CcC_zs&o@exka?t)*J@;lkA8anffzNRbU7RwGoT&aJ7mws=&cKO zY$av$S+et9Nej+&FNLG^ZlJ!y1>xvm89FvrsmpOnW3}K!cWRblOOng1*YR#IRy-4% zq0a{Qo7}B~xp^j{G@`GF7F6M2Vp^17fGG-b8;GH&HCvYC8#fgb-33X64#}KW~=q zI|$B@F#>F6i^{>ToMQ>ktwN2%WuldBT6JPs;&a=kHGJ+w<)Gq}Dogp{yw+JjneC@X zH{;LEedwOfg({l2kJnM`fu3_5bDb;bX5MqVKfk^H)obIl1lN*$v$5xT{g-3hkE3LG zNXH0~Yu*32@bjPj?8im?zw(Va*YK@+lAywKHuE_zuM1!6TD`do zP2cnK(7$Pp-sC|q5BY9$1d?_^8@UkDCnp-94lT1f6-%d{X$1fV?I)3z>QP1NYYs28JuNumE12*e6v2 z;(vNK;xYKju3{6IUID>&!fW1mKLtA-FKOc~SAR*I;B#Gnt0hTLvAYT zz2e9oCLvqRw^tQH+^etLcpu`~^WGDAiurpyn2xFtRw&{9xK4gB#nbCnXa+3i-Xd{G zZ#8poLza8|8%Jj|*qN2l`McAp@2=@vbumeY`*hs_TRoz@Mr`Xr^55 zyRetI;Riw59}aO#*XzPu<&;N*`;xhFRrXzUHk=2-wR)@Bm_>qnQl6`J(#AOBhvRT_ zz2muBL1wzYc4G-wgY%-IJKTi~UCXzcg%la?(G7`yKV3nKZaB zrAAu$-Rxuk9W~M<9q!XdZq_TmMQy4!J^t?PH5Zj}ZQf<2ECKGtYz;t*h6f}sWP@A&BtaKU#5?Lf zZ=l5e`pgY8`s?8+E`MFNpKJbBv-Cz<+_!S?1hX2Iy6?Dm;sm%Cv;598m7I6KVuGN(8PwBPYuszNj6Qh)mH>Bi>P{bvvMcD{eM zd++fNkM?%9zk9UtAn3w7>Q6Iia9=K2t{kuLpaV!@zJD(u{@uI9AWG0WwXLU5=TFUo zGPUw7(UeI}gf0^_Jr&>`&yqL+>P029%?qCT^61`Anr54qqf5xq`@+Q18N88x^;1Z_ zHjk9b-E6B}^!g_%RWf8x45yP@_)k6_XTyUGf#0k%9m9T`WC(6`@}kHPw#ka=zWoT( zx1Q-xs%v#sA>he(RM#Tt%q~}TgzKCBaU78Tm!C3uGqedwwkX}Dp&Sp$zN5Reg3P16 z;zsN1K>^i&ez(B}xJ+}|(G&-6K<%e(fhr==nNE*Bq|}DJ*xsy6rjyqGxR)PHhSTxn^`9%gm>%Jaeo~c(xn=hS=az}_Sj-$5*DDiK93UnPj4nR zIU>sgxgSC5ss>AB)_ggQAM_rsT1 zXC{KI#Ni+lN*M1|B48hjBL<93^VaN6=rq$W@NXIS3`lficlXJrJWNNO@TUD*DT7r~QJuf}q2+gFJ`4o6%iF=?W7A<@bl9 z32HJFIeeA<{(c*Ln!jovW7D_33_9ZugZft0^-?J5h<=Izn_q8QYMG^$eR(&-Er}P{ z@i=RxC$v}3jq*|J&X-?>opHx{y)!S5+LHqLpto+X|3Nz95X^6%Y(2>c>~6M^?VgPC z?E7Ah9o;!P$>5329!-z;^D!OQ<|56bs2m}`{6m99vF*wQQ6O_x)|^RPCK8;f+RZ7Z zEKh29>z~-CZvDA^Ze?-|&|KT3WZ3MUqmk{L3?}VYG|B~P(Hp!NK9}6GQVKSa%r4ah zalWI;asQJ5&0OEMz|8mCbOo2PZ&1D$l&|pp-4>rMtsK+dB@q{J-1oC*8YRL|A`lI3 zxu(*CII3xVo1YA!l>Ir!Y4CmT@F;sghg!C!guxJlZ1^G{zv$&JseimU1rC)?-r~Xl z)!sQiw5d7n8me8?EOS|(+6mxZFy3d;hlbbyo$j@Z2|GdaiXTjTe2{MUs5sF#Z z$tPL2huRJ8lX92;b&A;B zRD#qdLbK?j;h^XfX+0L{uhI>M1j?r4BG z3#&fLbQZ04(L($lnWh14XWZ16-0>LEa;k!Npj2_qm1hO*p$9}SYZuv{gdX~F&7Ju; z(b`D!YH@YzurCedmBI)|=%-c%)GXmlBPyAtf*zbd8sY`s+Ty!J;`;cN0}Ck9x#d9u zX)(wVEG)CcJaM49Trji$(`>eK$o0)sVwv+!M!Q!U#wtG>(KcvOwm8Zy7Ob zV;>zM@3hy+hDf<%jh#2{IWT=OIpI9h^89Z^lvoC;P2QJESVMzwjIG!N3xNURlLL$k<|d<|?*6 zp|>9N26@Ix)d9V^gDG7BbCXDH;Zdsrc4#=*24<~oFVt&b=G+g83u241zhjnNgDn9A zdOX7QNNd}LSZ47)?`qGIyMVJbM(WP&73{Q--hK=1WH=sxxkzWUhyLD61SUf!OxWe+ zo+C+*qG(;D+#IW0M4-%N;za&8%rC^Oh$Cr@E>iXH*hs#9(@3bH48@0F`E*6Zc1zxW zz`jFu{mSYm4j<(`0kN~iCSw)QEZyg4lCvF4f%Y-$7p=+gdCqzCziUW6|WAvQ}s^6Up88{(OB4-^{2 zR_zd3yQ&Yc$vktbV1OQ&xp0q^G&i`V0!~KqgBATA;se2KCX{jS47wwvDmZ3&i|t@I zc6J0AgS&8C^jdl=x!JL*%Z8RtBzq|4(i7Zy_6Pb{3PQ{Hn%X~m{?O{GS8g>hECEo`ne`hSW z`>Yg32i(BMXCVv34Q~Tn=z|%n}UvCLvwj1drRtIr(HQpNeHz!8BK_ z#aR5nv}`wMx|e9pA)sT@FQFdF!E4(p=>Uk87(%uVH-G3??cTKi(WMK$3hiZKw1cyZudMg81z-dFHxih<9!8Ra5u`|P3D|Y?25+` z&GIg2>r5mJqCSgFO}T_ArcDe?q<=8Z4CMY%2a9`ZypJ20mtXigNe@ zVJuni@)1W5f>}xMplrReovcM2&fEZDB9Uz=4Sx@=Sf2{!;t)oD#eI~J zJn(yAGxhq#EsNk?6RlyY&Lt!=2n@1oXacUN?ICdu_#|PPhd!(Z>=?CXLPT@rF-J}| zg@VtNi?ALr{sXQ^95O`0K$Qi6?lm6D+=nP;<*D->ZBjX9UT+Tm47=UNR8(Nyvi7u) z!nZ9(F^i7@#(ckpcXVh*7YZ_1@uC7wgpf=^*_kO>0x-C*1v`^dITIQnN`h758!a+e zb+5rEgt#v5Acq}sc@A}U)(Rc-TmlUmC&h`FgF&mA&&Xz`*v~kdG;;)kBD`iLia^3foG|m&*5;ycNLk` z=#a)BZCZw%=n@MF6y(U1Sh~Q|N)|_X{{@0j5|s^(f+j4=t!1PYBy)DlVuH+B@uY<; z`G?t@q7!MG2?510t57#Aw>;z^H!s=cH-)kirk>IZLRm39b15FcTFsB!Jt*+c4_ik# zriK+KYhv+~Gy_;xtzntvClZK2cu~+Xsps|)CaJ|W6YN_whd=U4=AX??_0U*$M`Kj${n5nQfgRUJiXFYj?&&%5cnVd+OdrQuB~fP)lG) zbgfh_;x0fR(p=p32!P;wICzKQ%zyD_QH4e_bZKp_?Mw%ccicp0I~4u5w!pPqtR;$0 zv?xD@PEvTSgPC`E^>vj+SDP}$IK;8;0ZK2tF9HhYB2v}ZKK#qW2Ryw9m`7PXkp&~$ z7Y&7$k6>2Iu)BAttrpO;yVHIiKg=7*M+UGnT*ES}JNli!rLK&J#5b5+a>HnzLomyU zG)0|d%cJWyO+rPu)4akmrO5x~3%lV)FrdjL4lp7uf&cTpv5`tIB9)#Y(D5P1t$CLusAggjH zMyd7%A2Pw@CKggoB-dD`)_tVB)yeR+`Q;O~{LGlh#FI#bQ=6IGrE+T%FmU`A0NCNOxyEtW8(9G6A%)dD=Te2*wF ze^E6~*;`~hBL>i-|6=U;x}Xd`pT!d*M#pYZWF2Ne!blYw4=oKaz{UN38-9LxUDcVF8)()Qt_IH+i5cu|mf(wXA5@?j|5 znuU_#fjCF*o%gF65CJ5Ubd7T)bPw@ zm#6CjJ%xAKs z!!s4R7-D?AU1m!u0BARYjWp-60%vY)9TP{vJ;-bi=-i>hM|*(2UPSE!_OT3$S3!>w z>J^LATgUB=%#V*?vhM^>)JC}hNDTk5-4SU=6Lb+d&Rv8Xu?Ir0S;9n;g~7f-HQ$NN zcJyJ)Wh6^0sLu-LXs`7K(@=>>=*i`NuIB_gEOV9il70;H0@wK3Cp&@>{!&M^zubva zL|LA^gW)~WDxg`}uwP}K3;YtDHIm?Mb2LLvOPn1}s}R-AzgEk6;tmftFW_;eW#y}j zHj5nUTw5bz585XPr}KGordJ@bB6Q~@wtPAJwQyLkXc3TE+a{MX%w00ea8UFL(pKmX zH1Puxz%bmR=hjb|_!^*Dc?23{jrx3c=>W0rNgo^h7_V#BHK+#1mLSNkilCWaKPa(z zgK;t}abd+s|G4z)4-R^V5WF3@BoGQ3BbOF}E!gR<&dF@qqfS&%0-SX4O(e`sVb2V% z871wX@+)-9y0?$SK^rs)I+a+cl0z!zZ4D4n{wV@($GyK1uev`&(WD>^am)fAx7Ift zbfAF+ud`yCTlG6YG#BZ(^}L*m_H00vak>QN3x&j{P@xbx11yj^vmuBW)X#AlrYUkc znY5Rx8S4aO*7O!ihL83xDo@_3)A3bu1XLSnED9hTrJq_3&Yat|SN&F!0S=SgUI|eEld%`zi$C6_OL1MkUW>%9sw4b42ezVuq)E^cQJjvwVo*UcOaH>q zzWi9ks9Oi4R<9_kSF{qFL8s~#ylJdja?*#)X9#F+-?u->I2#0hHNEw7H_Nt}Dhm}) z$k41W%i|2K7X^&+30LhaZPdhptvoxnhjkUktjRZ@ewMu`)-%Tb^fRJ}Y^zd0f9vEC^BL-@g?YDcD6w3sfxAtg6A;mk6$QIdBqV;;mV$+d~YX%F#4z7!eKO=tzWj*I{R zyH{a0k6Qtr`Q2msGW%}a9v#umjqDj2SnNxrdq^m=VJV|Si?aje4YpPgC=Zd$qCIw= zN(dgbZaSuDq2#pP?CiV@C&881svm?7fo=^=N5U;K6YfuSaPvOrmf?ammSe+_=In8n zpj-ik4rh1@>PA6=%^kbVasUOOX5pSs15>g9Lw6dzY}8;!b6XjF0Am*aM5w+{`^9mu z!0XlC-fa+!r#1r5tq~l>7kM9^vwS!$f>``z&4p>fYbrsna7`1(I4LDkD8M!pnlVK4 zX*#tAwM8TjCQ3yiA*y=xD>1ne{jx2kCjpFE+OdJJ?;rn=?LH<+bq*;T{k&aq)g`1< zDMM+3#xnC9}9vSoJ9QNq}lHKc9- z8&FSJvpVm#nNY4`!55DlV9I?L&l9uplH3`z?woL2HIUJA9tph)l3BKw1syhtB)!2z zoEVHQkyP!ecz5ikp>PR=0i#H?=k_1JrlKy&))btl-Lr)71D*i*so9g#T8LJV6dDR8 zm&+k)H=K4$XAqKFa3eb6XKYY%NP&d3e&W+7fQ5g6DIp!}W$9+bO<=K+qg$wfSH0$# zAp6*XnFX?q{jIZj`)dw3%GJVPVG|K*Z(*(O?t{#}t>|64UgnapGZK&!!4=&xG|-~` zYMnB*HBwrIG|MQm#Z^kg6DS+UUa}??115Jc|1x-`3^Rth$gNs({o3?hT|zJlN;Z%=w4kdtvq!+HPP~J$l34)Zh%V?PYdr zVCI}XcUc-=K!vm3q2#SJl!@i0tw#VnG;?LcL6;E#Cb~-3Jc}uEOQPZ_Vdm=&#?3tM zu4o<3EPXc~PC2g6efxz@XLvnpyiBwloU4Ys}WfK!FPI+|I%&qYB%!5`o9IDeIQI3B@QQ-X0euq?Q_ zOllR$*jk3*PS0SwHV{A0`PfKk4FiS=$BBxO zF#Dl|F&|J#A2Rw1F7^xP&++{D@Nc*m1uCGqTpHqaMK&>9*9@u#^j{gU`_d}KX1z4% zkqA|mmE_8oR>|Ei^DVhU#S|Bwk%F(*xWE1h_l{15U#z1FW!~Qra4fp)SXj&c?!3;r zaJPrjRd9n(Cr7Gi2V9WwO=>Ud3U&gy8_DXvnTN(Ca3y*-(!~{KQ z5H>@KoGeZa2sX0CCbu^E^5IxWG{`u7p5IDMBR}-^8^yNGf{JHIhE4umI0L`8<#= z&Z*p?kWG{ib`p&;El?dZ%o&dXo9igxDdZxV@BxBQ0^$N{j zy++-NYK7*n?q;~cg>vIAji0g-B-TO_ZDpUI{3OdVa!oPeJQcUNZB)6YSi>~`C@+hW zf@+(f@&Fq&l4p#Z6jUnW3_OIYj>|q`JZ$bQSS_vYx=$#W(#MFdCn)BlO|E#7;ay`E zVAMS}_{)r_Rq_t>DI-71mkE1Umv7v65VC^qqeC>SFg}HfFYp%;1EtiJh&Qr`RoOeS5SnG+hJ@dq2r3sLjxfcK$!QR@tsI3`EZ=IGibd~pN7Q| zaob53pXs_K(+2056@f( z({yjT9ZIRPvxRGen*xd?1JzIN;%O zrf@0oodfhwgd%tqX%$2fJ>o2oj?G$XoU-Wppt%NRFG?)Ad!iXpoT27hgC0W-M>bEH zd7$FKPE3U^tFlm)p=!8PGF54@K1{qUn$dZ>97I}?IHm%H~ErYS=uVI z77)0MCjGory{%T(N*MU%wv8ualz`^E&?0b4Gv1u+kag zXH*ElhBAW@Hds%3Tf1kaeGSVvczp_k=JFzhuL|dYTw;9IKpETIO&`JhrY6+cY|uOi zuY$H-#QQ^2vT^_7oiD%q0|KJVx4ST^|jr6fKN~qdPjdU}6&otBwtA@lU%)d>pgztj z>MU@EWlW1q#N%Y&aZ4FQ0AjA*4^uKdvyq*E9g65qN62iN&}+$M24sQ-oi0$lOCErk z_ffc&^LgPP-Q>VA+yxur$)w?4ArG1hi$!lSG>D;Bq8L#~u2X#-v4vMBt$nMc-OVm_( zC4+sp0lT-!Ct2LRb*rA4sZuGToxBw}^CdYo$hL8cix}y+$b#47UJme*Bi$vCce135 zn83y2uaswdCo+Wz{YE=&8w-zwNU#$AM0eBqEVdemqk56TyD?GpMuV0b3OOGFZ^hwz zUu#@JCIa56nGwHi;Da9Z;BXg8H7KZT7TqU#aneS;4h|TFJD~wDqA6*9mY#=$5(*Mr z;PTXC3WCGHV^#bYFN?!oz-9>rN_;#o^L>~ncnZpnj1ef|Iv-{9KHA;vhn?@XNqllZ z-wwQLOePLKC%kI`eGkiAu+wL4#x)nr>^fibETX=lX z`QvSS3$O}RUflL{mPKL!ECR{V%Da+@HSmUOiG?s`@o7$yh~DfZSd8par}YxI3=qa_ z6~luGRQ=FZl2DHh+JCL);YPsBx|`Sx_ZN{A)%^!Jy|C1{;XpF^Bx_UV-2jV@+8qDH z>@PL0>=7Sszy$k?iYRS`1uHmVI?Ezzt-2fHA&~}=u)@2O6apbm**%ogM&7^MMGZrG zhT;jx(Xsd`|Nb*yVxPyG8IqJ9?6)@_LefkITSCmJ49c%9j**mIeX2AuTqj0rRge`3 zMQh=f#&Q1CB7>_IkrvGl?9nyTkf9Q^^ep%5`Gi2M;Ick{&_n#q_9>XMM6Si`u>@%5 z+6JT{;4_r_KpbWQtsc2b2s>e9myvT!0XjPKqtc*(J?%?_7#!?rAyQQ(E+WhxC7Q6C zbW+jO9<@G5?UkNI1P1JFvFc&lVCB$wShVfl3xLcO#1X8(f4sBdyGt)o$;=*Z8qdgL zOUQQ}oI?=O?xR}ENDd7$+0O5yU=gudxa|{Ki&BC=O=y$|<^ww}s)EF)7~NH(G6p!s zM95MtRC;pnrw64<1UtKRM01Jisgkq}lZ4JwmR8*oNDNj4X(i7~5X^hKl>b3n;jCN% z38yge+LxmCtlF&2&F8lG9ukzTmX5O_`wrKuagD-D=)ivLJSWP_GQH*MzU6T&&1E91 zP$8qNr~@8(tL#8%Dr=Nqw7n41PY%tTWskvhM8ogf%q>(t) zZ6iN3D8w;;NBhm1oOUbP+`R152mI1VMurA<<7YGj<^2&X2flQH`H+);`u&j_tXX+1 zb-^^+&->?Nzc#J^@0dCIU*2rD(=CezRd8dJa97HE&(G6CugPs!TX}vqPako-_8*!kN$u{Is3GNu zf@4tlgkBe^gzpmmP#w0mlOE_NDxD{R5dFq~LU9$(@v>rr^A{EX@{EH0*~HpFBRl3A zl)3J|(2M5=f_zdg;^6KH`qQ1T13bG|FWd=rs^8$i%;KYG4<5*cd9vUzt&1pq3Gqwg ztOh3=j55qp457>?-}WXidj+mfxmP$dWHZoVLYlZc!_IWZCwK@bnBm01=+>26*;N$; zJh#OEfcuf|YzMKeC3*HVn*P@yT3vkJN$)LA>%UqljO@G0Y~v5 zwyOO_Z6NC{gbX!?XD&jhIdrV*HDn*)I`Bk$7FAduH4|raY3xWwZ6|vMHa&L5R3k}` zhdBA8#v(GGkoYCzQHg70{x?%9i39!Y_~NeDY- zxLef_lm}JKXIezQ2i#nctSERJ&Ta!c(W@xyfuM8^t*U4S*(Q+HMYpUspy_H*^;OA) ze^y1QZ7!2q#WH7iEGqcsLU|7%n7+gwRw89fp;Law709PZBC*#Swls5$HDy&qyt!^D zJ<}S9hi5K3)nluyP>I2=IHxi4JR!eBInrQWrIie~hGo9G54(U5Zc>Xgu}vkj6ML0I zXmHTM^}$WO+dQj$1CKoPYJCN3(cnaJ0Ma-2(czg(yL3~KXlMjnHm%HCKrb;7r9dSu zt7;)xEW<|9WPB1DNt&MVML;YeAw18kcl`_L8DG4%*T3-3yBLnGLfYbUiUgE*%^G#Q zaHAYW!jTjQe)MxD&>iZZOF< zlNAkc%oS8Jp(2f>e(mh~=HQvzcd*1EsYFc^Z;EYzfm>7UzUPDC%YF{0D-}XyUb!G= z5qK)R{gRLsdS?$medW|JRut0t2kNFw0|c2f+OB}&l4@%lmo*jO?j&@B8*ev+Zgrr={le`hl) zpaV$ZS-2|T6M{`6H=SGL=xx>Cq5I35_gN&7q6roDg0Q{_OG++&gfo#i3EWIj9+o3! zEk@!w4-)=jFcryV*iK4^_8NXe1{_Kz99SJ4eu#kO65aq^Zr$Q>Fa$kW`6tp$ioZY2s@LQoYt8C{pG`)pb6g zvLh%^Bu4o%(kgk3k%ET=Bep!@Z}&C%g!HzqX5R@=$D-F+Ei~ue|2W*w#HD}Povx(L z9-__w9^dszCuUgrOd*8H^b->N9H6=IZTSI{dlT6!2+v{<(<|tFkVToi!BYgW(me@u zb7Q+CZI4h-ky*6KX?@h}tkmX6D4Bs*LS`YvF^ij$QO5ChX6+k#yt~UlnnV&zf5I1{ z({F)Et7LxJODJGZ1R`?3`H4!QO?>bzwve&?mOUMeFgEZ zX-o~J&P-8T12iB1fMjY^?8gL=tWjRi{LHB{2mC@$ump+ot)yPB7h{odFGe2yfxH*O zyy4*;icWh2%~Vwt55e4wm?Pfwa)u=|MGE%^V@rrJWv^O>rQ(>SXZFE(Te%qAyaJ29 z-|L{b-j74*8i$TOvfPAsCJ;pnUA^d{C)$4iazZ{g_> z$t-R^+<5Ypzm1lsMSd{tYxE!#SqW;9L!ydgmQh9**ufifE7%~t1HMPb=50tYVN{m> zf&zKXot!?)7;A{;I<|xmK}sLEwo6Y2K`mp>U1Nm;{pa#2-4?w;8}=e0vu5chRXB6$ z`{B#X-9!=^SlVSI2p}7iGE{g}v15tKG9$K z(m3J&7e_Lt$a|}!3T0L*kEk$L{l+PZP&wgCBqt8UN9tv&XKyxX6;xJRKcOx~f&|`Z z^8ajE-+!a(>;Sba;DQe%X@j~BwwZKBF;E#u(D;CS2qy~i5+`i_iOtE=b4C^-pm=-s z_+=fWjU78X`>=r?^FOF0!DQG$y;W=~wyV?}fwfYLawT*DXII&FLX8ZyDj?QfJ#+rR zD7~{{-!wP_rIiq~2J#bWOea(tB}EiT3FA_D>=UBSMW!=x6uLpyvPvzE`Di0U zg}rXJu|J$nGWJsQddh6`65c=pvRJQOWE*k)D@Xwf1qQ2{Q1K~)*@in{%-b8Cvr)~b zBtyHyY&*ktgcwK6lZ{=EKF-cUwEdq~??hm7-*oi`O=JnEEgnbuZadq4y8V~<>)Dqn zuMfw32S(+jo8uL%iug`QGU4Y+hF=xSTzjgw0HE7}2ugwp74Y~uN;5>jBFtEO;})V; zGDO!N*~%6w*hJ8LY*q2t6R?RL8w(EO6K3y<@^{cVWg%&doDxqv9Hx^SvW zcrrIQp`@9NS&l~qLQs_tM|$*%c2w!^USPk5N;LnhNN7NMB!-DG0h0N>%Enz+#S2V; zDqeJZ@^h4W8619&n;3Lb^D~+&KjK9oRMNyFo~`ZJ?PcsWB=&PIN_t03el$Q2 zF3yEW#Jq>tiwNyWPKbXTpFvtW%*H@YB$l$&rEBpu03jI!d-WkjN>S~tH$vf4&k2{qF(ZIzqrh~|UJekG>Dr6TeCQ8(5&9Y`kXCtImO;e;q4UJygJ zfJ}RkU$zQGVc3C9ivLB9#e~38=4Jq4s5%zP*APAz#)6KGjB~2jsFdhnMp_a-7Xx30 zS{MNnG^p<6d?G~Bo0;})&=1g^dT_|o{uEF&*Wnv z!b@QgK@Q@}Y-k`|sQp~t#SO?Nw9r{bh7V;v+9hCOIn8RkMVFW0`{p-zY2=r?ldevC zRN+t9v&sPKkhDxJtPsORX`$VF5guGr=MBHh+jI()yf(IUp#*R)HGPeX?ergC&e%MH z+kYRBNvLD>1!gbWmq0K#rOd|B!o!3Ku!!m^kML;Swi&bHkTK_9^-4q(51K`ew&D=Nxdr?-)@i zaxS4LT`*0FBfiuhr5%nh?*Vil&|Kpn7feCI$HUCf;GE`q!|r7=R&o0Z%2YAzbLFU@ zBZ=2+lr2;!U>vn)-Rj`xx3GmlkSeQMf~?%yd(qN>@;_+L@UmKex1HRecL^hX)>2l` z%w_97-}csyXkVn-^`eo7YR?<98mOUc5g#I2`W{aWa!4OWq||9{L9Y!)m|z5*e~V#v zWem_Pz`4eCptFr9+cdgW*4_C4(_#X?rqv*26+(0E9pFFFl1u1=JfZE8D; zr*oEKFxm#ORomQ#b*o@>CtQ*rZ8p1DOC*)$g-6ooxKb|)^&*urpq_{=>s+IWr92zb z{Cd-oqvTN9{#qOu=>(H9iR3H{Fj|A47Y%HG+e~I&G0fU72x+8KfMpvkYrqw5I^4!T z3CJY|U3&Q}00$c^RSBiin==e))}EX^+16bCOuxp0f8snP<93g%XKR5#RJ+?JL63H3 z%V%8%g_OSNr&fXh^h2SZNj53zhV2Y-@jk^8S=f;1qzWbN4le2-Wa6%w-nGcxBb6fEij7Ee)?CQbp0&eoWZ$Iwd}a-IAkW){dgg!(MlAh>K}7Ez@w!4tYL)sP1ZT|HRL@@{*~ zBGPm2aQ+Kl%Pmk6B0PN(=YdlUpb%G{tROFy2WUQ)JHAwLqJT;ODcUXk!lEpwi=vM! z%!7So(~@c%%yYuOrQ=3(yVw;R^Wh_0jOL_BDs!&*nOqcMfxRR}S>g7h#H4Tr61J*% zc4$2@ze2nMWUfnXSF5O!_rZH|n_oS)5h;+yphMD$%U*Ao{0bm9FbtD6CCH3 zng<~h9tTAIAjwjY@n$wMLbT9}MRqCTLu)*$WbG$3yz+SB)0I9-7eX||LO5j~#@W*+ z5A}o+Hp2^yxIdz=wgkg&;DJFs=80B|sUVquu#ahH3Qn594wL(w9nJWb@ju5F{XY-*UUO54{Z~9-)~; zggF!aMk@XSJ0>Rn)Za1l*Itt_$WVB<-lmRmC`Sb3o40+SR9;JO7mztkiT);{5q zQkGYv$C~0+DGU(JMepG!k*K+(VBsZ+7syNsXeRhg65r$v5laYaBqwtzlKCCd>ro$i zTHHknt<YxNZs$4GrePv5vUI_dQHQ8mksKf37?c7pB+fsql;f;1~`mi-<~pkZKk z$s}XG#sqPSfIsL4w?!?CbYT`IDs9;v^0-VyxRfK!oD-v4L*%T!=;bei?U^`-boi7H z)3N(Af`%LuCBY64s{!!&C(3(EYPSV+n^iorNn;_5Jo0Dj!Rfh2MMMV&7Bb4=1tBPutzjJglrh`sgl;REb=v~5Yn;CTSvCP-xY!S;Dd9R}EWxHGkm}X%c z{x;mY?){B@!LBkeP0Y{n_h9N1%Umirwcs0}%z9+`ES~P6SJeYD3BRRslmFt6LYRx+ zJwwdDtO9jLt^ozuzn$$0kYCHLxD6t;7L6+c3?K1%gdL7EF z{(!&k5xl<>R!1i&tjwBWjA#QhT|LT|@L)}~_MU&VHn1nc7i+3u(L#Qgiz9^6wa9pDTuTLNFw+bnqm7}NMG~nH zEvTz*wc87m$@5}zLe=I19&Nz?Xep#T2xw)K=Qv6Pkd7_VRBDA76N^`F;&?Wy!;_Q@ zs?ouM6!{3S5~XMdRfiqZ4Rds0#h$<?>yV)8H&hz2Qh+~kIKOGC>%e%|O%hP-4AWyi z9$ic~$LXwY2rdYZ&4hErd4zyie{{+RG}pID`L(Gyo2-U1$FYc9w5d*!lB5aoSUN}0 z9Md9`9zvPLz%4|)RXzoU;(Wwlg_N)BON_)K=xXaxEu{66|H8Nen@e<83)}{3 zes1Kd+*Ai~HnZ`Ipbv@EVDXE&=BkzJ6?6w@F1c&zk}5+qFb|8Wz`t`5#}J6~e%|*l z5y57F-4IVmNz{4LNv6hXbfjR-P499N1++2dqJ4Nf#G0AwvaE?3t;yedc%Cs>%mzojHW$kJ zNx{sLp!(c%?&Z-5Z1?^_Kq`?CN!h2UK#6Ud;9H(jz=HyMQb$*eTnaGY{c{S|!kbxfxh2kQdsJ4>Ns5Prc;?e* ztbWiR9`-upAypD~SwI}*uz4WFc~|@bbn0#i`Tyx`RazO4Hd}*YcO`!1dfeqBxXOok z7!+y-a)vwfglVvFN%s=}TvjcHgXiuAot2me79C?hM?t6&c1J)evER}MC?gq!wvh}3 zKZAE0YLO0HSaFyxI79+!Z{_{#5WY8|cW*_bw;n8Q*_!QS$3^eT?IVRiS< z?Xx*Nm*V^cy=8Z}NA$mhW$T*xZ0){O?eFt@lsQUwCP{vV`d_rB_L zZ7cj#0WvqOk4!}kPXqKLoOm?v=Wl;49V^di3IPx{z)esB5ng=B8tpxjOZ4e=)uHow2zQX9neqA zb9x&QkXge2uWX_VM5W(8-tUGbQWNZzCSQfmMI2pz@um)aliy~_}1JW#QG7V*9;@%a~{J?IwQqp=!B^-l+ zCm2ePfxqD&LbZm(YUWkvrGxI>JGQ>4kW9jUNxA((K&E!ZDfo1@mB)e6%70iyHHJSK?$=xeMqw2q17p3%Vd^motiqvOxBGIoj>2@}g=* zl_@kn)Zh$fJF$6mQ6s^s!eN>7JMQ1$plcj%e8Xc$4F(+~wa>ydA5b(i_0-XO81W#C z-6q6Rc?e1}&>lZ2Ez>SQ62IVohZV~3%&o225>??7YMst<#e%5g(IdB(hQDVol9d!Y z=MtyA(yW(_V~~JiGV!A@S009s5&ebZay$Y&nybdpEUq4*dDe+M}XYwpf~m z`PC0p5s%)kDEm>q-%6#nxy-}m{V`IWVa}4G#QU+Lb2pFycpk^1NEc&}=H|CTh%ep? zA%CHkyHgxp`|-tUunlc<=|C0BEZ-A!pW*_I7-v1ysEWmv;77?D)J$wDfq;}@D|-Sw z^Og0G*l($(ClR9i#c+>MatXgMWudYmKT%CwR6fXxg~v}@UZo0OQ)_VjUvbTA!kc~@E<}wTX5?9yzs9s6D-D>Z{`h{bf9+5=# zaO=+V*`h(-vj-?0^}d)v!TfTw>;Iaw*Z&i7igFKE+%PkN&F^RN!$+0oO`6Ov_9mkB3=u%I>k z>6$}uk|i8!BCc&xx81I`Y(K-`H3t6Z=bdNYKmK9&F_V;gTIdmc=K;w?fK&P0Z)^7- zXCGTMbJHdxTjv&rs}6eR_%lciz&8Qa2GL`e5=sTbEQDD?5&*D#>32;peTm`27oqU; z&;^?~2X&OudtX&dvo6;uu~9sS&k&`baS;uIlxFlY5=JE0H6zm3AcNFF z$S~bU4>6$QkC;;iZ2eyN;41}u6YDxlQb<;hK$(v)#k~V6pKZOD$cS=zK2pcmg`{H3 zo1ibtt05>Exqeb8vvLpa|6SBU@rNuW_`V92i??zO^X+2*m`_;m{t8+J{L!c#-o;a$ zCs6#zzjzDxs}OVIN}JcoJAhruckszuA62Ci`Ruy0Yp#MQs9C#bY3kyH{f!vSBp#M$fW2{tyIj*OrH;A%^S0t)nE}fAKJI;Eib+zy4@i|sA6&gg&#bJQ+NOn>U&hQ;l`-~nR zi)tGD9Hse#)%<+6r%61=D0CrIsHHhe(X;J)TQqa$N%Mv;tKuC^BoK)haLokQeFWk& zhe#_!{s1^eZ1Jnmz)UD#Gkps_mbv)QLk6`)DeD)zA=$u*A1M&1NLnD!yZm_m1aC#c zpc#eANn%W;LP@Qte3dicODwbcuY^k>cKr#h(;~**If@FggmS4uOe;%`rZh0h>#p)BOlEqFGdkdek3@+@2V#;(GA_s z4nq3jK6;4e8Xe^KIq*PsZJ;Eap}FXVNni;nQjT7NMPVfy;NWaMsN^Lq!6JbV1{EQ> z@NBTU2|GeZXj{wpDp2O?Q)E^3@)u;t2s|89vcE47Hy=|HcF0hPNiEqpp7!k_f~QJ& ztfk(J`Z^e1v#3Gv1k)E^zs4o-ttS~SNqv16_Zq<(uuoC>;=aA>N3637Cp1^+-9r`? z9S@<}9i(GA`&)Ib2TPY2ng0Ul2pBZ=7r>(sP)T zo)!>q@M44F30?g(6CJTZp_}y(+wS)fMzwTl5?G9qqWB`@#)SP`?)jM)(tT7^|0Gc@ zG~nr`tM8!f-Y#X4!~WxN84`gh6?8cI$)_k2VLu?w1QBNO%*6-ZCmJtZ4p5(pzxx`L zpTLR>B_G3lVwL>Q#e%gdby|ditE!3-&lNbUN=jmoet8SsVEbI8|igvrmO=rer^(CBH=R z7JB%(rS}EG6;EtDU2!_9^d>+A&0Ip3ER)FGJ!IbN#3pjmha?k5rIPfT$|QJSAZlkdn3yJ(+Y{D!^n*a|iqVPqRG?+5rU=>iVfQ6W-jshgG7d1ia!;wkS7E z#s}^|gUW+R6lGq*!{O{CI_EHM;Wm5tR;&9{4BlMYb~LF}2tv|4Z5LcpTG)jK-i5NI zT_0EjxzxWmm#n^?-7mky6qNUN-7cf6q!sT^LI%EJZK|kd`Kjg!WZy9zbmFR>ppx9C zXG_2yiPXhNroaq9bComNvIq7p-(Bw^6dE9 z+PCK@*$$D!9xA93V{$rf(LrI|kOvxR*Al~)KG0cgam)wSGqA(BES|a8I8*_#+t!YI zuiy#oLUlUF_n0TmD7ykIzj#XNt^c&Se2MHIJ z4;VbbU%DZX$dB_32MYdwxxOAAUSZQy=m~C0&?yIQy3CioStdSpzzLJ#1v!^;3DEmB4tn$ewa=u(qkTT?ShWng;?&SSr>LSkNy~Em)`k zv5nS1*!u}M6(qCtl%f5lxQIEzbAY&FTY0Fx!NKn}mGOIDz%<3oPpu2}?1AL&Xbxk-2*m#OBw)87Mtrok24){2Tb>g8b-NnC2>&4%9S8 zbCk)>2UfcaC!m27QW2|r zY$m?BLFP5n#=SwNZM8e@;xF*Wm~e5#XbOswfxGXd+f9 zGZHTbjA2XGuMa2qt)y6YeAY18!;W{?p!Cm9ReMXbA%bQuZ4!xE9@@%?OAC6QL4QLh zxK8CKorXQ@EUICd6|0)CeXKFaRZaKH`E`h@pDLjYcsr_+IaorWf-M|nx4%J&arfn? zY@FTjZ*Bf{02Mkaq8sGi)1lem=4MF4EdGhqGGCyugC^!{PPo;b&QS9;D^PHIS)Sq0 z>}G#)6MIG%H{y*`By&~sq&cjewOTDy3+}L%`=Kz!tkhM%6AeyipTp9?shn8JBl+^H zKv8-7JQ4tyJK~A`>MqjIyX`CsX<2? ztc7hXGBiZOBP{A3c`}45nIW%GH2)bT0#Uz`A2ADy)jxZ)p>EBu^*4A)Ax=sX!F#H7 z&!c?MjAn)R0NqrrR%uNLJ+}ui*oc!-(ahN$iwio}OQYQ;*Tv$Qk7mz-YfsvGg{u2o ztAdTgKHEXcSXexL14<3{09gs=5_G+eK(qV-@s6Z)Q%IGfw=cv5r@On857V;j81oww3gvjkYMXbq-{&gJ(|pgeJc3-Dk8!YE*zyLZG~2VW8QNT z`;6q5HXTMeZFODKB1tlsdLM(HMtJU$B{ys!nsXP+$@~DS&EPT>)%2$XQc;cd|4K+~n(GNr?yXWX& z4de+A-IrlG8tAfrONtWpoBu=EHk>KPNo*IYphN^a6OPbzr4tzyt~3 zmE%7R5OGjQxFEnYYfp2yjtZO(9JP`6@n|0>Tu66tKiKq(+uYiA5b0OhD zaKx)S&#ir%!Eprl>8FxMio%n5mu;678W$`0Z>cf3xr&<$iiYRs$-V6J>ketZ9{K)w}k%?x=C9~cXHyB zbhQ8n*m#vMk`l==j=L;Cxd&^A=7X(Qc?Ze92-?{{(j87Eh;^3R4c;4F!SEAPKT8<- zP&g6X`(E1;pJS0g40c(|ec^hij^BAxnZ`4At^TzramyF^c7w!R|e^pOz{CtR9y#stGpd|^(BI(+MOA)a3;L@ zn6DfVQ&`H`r}Wm|XTHC03D5ALh*)%K8mM@Z!7CF~L85C#1nsZOC7MsW|B?QLZ4&0M zG+~BdQ6hN!ur~>q?4eL7F9(pVMh{7=WcGJrVz8pEquVgNCpKTCf@GFqtP!+7+AApE zhCL5;l%38oVV}6h@9f@4j68~KKDg(;M;OI=qE#RePkyGQSLli+-$ufH_rFe&tl4!1 zGa@%Newb~zD{n?}a^+PIy7DxWi1|mpEGqY+kj#Yp@X{L>^pS_az_;~x2Q(>!yc=|; zI6c%~)r88II7~%(3_vM2geX-t-sNHOih}=$7)v&SPd#y6qjCYHiehd)oenq&!{TOq zySJU8(lo8)dD26POJ zL@6oQSd&%m2wf@_Eb-F2QVA-oLm~~5DadhLv|p`LDQgY&Mo=Zkazjfn6k&QUd(3Rj zzF=k(jukhvSP#uqD-UZ0GizG(kE$JD0dQQSYA+^t(N5Fbt*6c{Gl7r`aq4%JFW#OE z@4yy85S4 ztmpX&GKrA0HZS|%2Q;hyBJj@s7pqS?2JaYrQvnMnPB>jOSZ(o^$2@YJ z?Nm}nlcbsUwdvsbVEA&NcPgV=MIySV-3T0XvoOuoXF|vzW_A_ZNiw3f`vI4KIa^tgoHuPQqwICRe9b4&BIQ_4hOxj!!WL#Vi|TSC z=LQNF{Y!8|G;{e|pwoUKEyweDo=4E?5Z9wC&fJ7O`X)Xp0g)`J;6YOFHC@#L^19VI z?AgcGgK11~s_s&>l(EjjtJKuJij*pTT^*d3(JgnGuWZTXHaYY8jL%kvS|k*ky}DB-|2gCHkX^iwixQ?8Pp$28~7ZnP)t70 zknq~ahy9aD-X4$JC-~>|04d*}XZBtPPSY!Ndu!iS$ z60%xJ^{iA0nnws9x04V9MvzXxF|YC38s6ePJ*_ z05K+V5*((4sjVX$0GWkHkC27z9ZzuWvW^-%NE&Eh(posIf@IEm2ge%HzVoD>l{iCm zT!Eey1*C(k$Rirod#nxzER*memWNg>0x3|qvCD39#JF(%fHZ5~Di^`qd4D*fFmymJ z5kb-Mc}-Ti(5ZFkj6Zi)C6(g|3XTa$6U zxeZ4TGI32KTTotFxcVhG6a0=eSm$U|D*!YL-@}8tJ;{DRVPBs23#d_o-Aa-6VA>M~ zold(~qC^q+Dg|L#ryQ>)opY>{p%}`5vv*>fCZUON<6D|Ib3{d@;&_xQB0*fuFQ)V6 zELnfWNjSa+wy#7*$#(ki%*wg%0)H&+#{DBrsBU{msGD?tdiyH=zQ(+80;jPlS zRTv?zpZF@j2TC{pk)(nckfnkiEI}86F#f4NoKWkjV3{T8R{*E1t)pR=8Hgj`eE!qr zy~^>DU|P3(Tw8s;jJA;b5`gA5>lF5G;5OY2%(l7^9q0%p-p+EkTywg*O(}}8UE=h0 z&8tek`$Gjco~iU}b?CRiw3PoVRt@{}^CDKiaQDsHvBC&{=%*wF^ZxhP`})(&(w91i zypjv#iq_{20%4Gl!EP>YY2vkXDZnzHfJGg&)aT`fl(^t~uBluTypc1~N*m~I72Tl* z7q5`DY-1JhfYgH(2?ab5OzgF)7cEvu(~=q_ZE`Jh+`|6FMsB(6=8HVDVvYru=(nNZ zN+=iQ@jF9P#sg!%svNw&#J4TI3Tpn@lQ;xbU~$5<^`LmEi>)eb@cPmgJp+qay{A_# zj;Ro4RD(-!q4uIuW;4Vxi%%Z_+o$F(zqjp6sVx;t0skl5NC687>)RE?^Ir1$YKduX zxEEO;M6TK0pvy?kmrYh=bRHVGKh=2VvvM}7S)+97?jtM$yng<~oKs^zn1_Uiq~yJr z>gUjqXR9HeiURlx@~;Ne8gY7z8Y7uYl%S%HD=IB+q^Cc%H*3!bhgDRVnGd;^Bg^eezO2Q`iK_dTYV zUpT{>u3DQ2j*|W9AzZMb`y(OHbR${-;hs90Ie*U~gWeTZ?%4H*Uf4KJC}$qQR&KB1go?}@F)$HiDa845ud4; zb6bdK2D|E~GF6FY&chvpBojPJN`mQpd)ztdQ8A`~PGXnn5M4u=Q}+>mTE3aOX`fvp zHJk*~h9d;B%X&pdw5o7^8z^JZ>o$sI*2o1xCLABp`ZdV@B1e*2(}9*8T2J0)98m-4 zpJC$mIS~kz#H57W)hQiy-BVK}Q2=1x$9H^ti!=^C&nz>F!KXQ<+o@_y(4b<7|tbDb>Yy%e*+FmDDb+jsxn&` zp<2Z>AJ}hrw@{D|fhS@tE+<0+ey@JYCOpq6_O)m1WnwBhX9GRGn(%F+SFvHCytE|9dAAytrqxCUM; z9Z!&T5oMMJ@`(*fE7QceF=Dju;$@U z#NbP@L>VIx61i2%642)N$ODFBTr=+QARz|=P*95=GlzV_`y~F0AiwBAOAlruQ3yh% zG_{eX;MV3B+xH%DCGC%G&MSgS{91c)gbTzJ+1baVNLA%9F?1yq$#k6wZLZ%Js+mwl z0)SG*vdax2nF4!G_!ewJk(!m1A7GjH>43mj?ijjD0RixcebZ;{sCS50YbXddqv%K? z9^veeTdrP-On(&A-1swM9dO7W9%T=RU|5A@SptzNTNj6b1lmVJ>oL)9koq0HqCTtSm} z`6z36JZyK4h~jmm#Z0Mo4%hL63)#k5!u3rsnXa$Z8)X4zg5tFtOYb4oPluz!U-?Cf z9>kLY6FW_NQ1Ks!SY~mTu>B)t$=3B&7mUBL6RE_G9M|o}CmC`D%+>YwwA`O}+WWzx zCi38vieC+hnwyK88{hh)VD}npGh{#bV@Rm3?rh?d$TAF_Ob!U|pOcD1d|MW5W*y@t z98ox9VzZW@C>D`zD>GIBLT)>dv(hN?W^P%1H;907(t$tD2CNbF11XkScr4F6-p9oo zmOy3kK-?yQUJOqKJ8?oCJ>d(|)zg5T3|K$4s;K7jrlrGLh^2+yxz;;Ao=)2PNUO$c zZi9jfT!uTdfx1N(3#9{5G_wv7H5uY*H<3&z9SB(v+#4pl(6uEdSf%=-6H?)DZ=}rMI_ZsZ6q+qH${>V+ls zk+p|+RYTpmf$*73>?5wW`O&{&FxN@5Y3cI|tryVH*mMkMFA;d1r5VK_k-Kf*dB{9M z=*2awGTQ$*r8ii@L??8IMpVTbq*;-#%BMhSQP1Fd87e>r1QW3#Sxjjot7+TwwKM>^ zoJ#^<<4H!;9rbqmEjwcYsf2PeYl5qA=HqWE1BJ?@+(luD|DU%v>yG2N)&RVX85N|U)>AX`uO4?iAc$qZ~W+5qnklO zu$Dx)!BM@A^Wk2Bvkz|BM|?rIn7E)H&S1oiF6gISvAut3$K&%Q!(zj-yP4dzEE+xZ zgrjQtK1TzCdvdqK;W5J%{Mh1EeAJ~B!&E2lS#QTI3>jI_seNN8XoB1fg2F|IXI){;a(KQ2}XvTL&OP(iD|2J(#R&m%Om#eohgk znDD8LRoO4ER*}gfR+sKfw#A7})G1(Kerz$=AH=!l(v+(4<|k747UqHZI}Jtf0mYl3Zt?0{BX zr}_$Zusc34y0M+!a7TI&)nH_R2;HXveKCt$WdMXIbcJptKxv3}L0& zrEjfe8GaDPqNz{xNY#?K5BNe1P%AK9@NpDzP!*C{>=|u$eE@XUf2c95iyIza^r!oi zG5I}unN~#8MPiSFOe_3=`)iXfa{uHiqIpbT5zRk?{F%K0(j6R%3$M8Kn9gVPwkoLU zyKY}uoa)$P4=Ge6A~qCGvYpGE;z|V*7nhufV5$@L+Wo0p!jkb>?xWP9%T*ZaB6Z%_ zF&!+ZGSae;bLil1O1r*Vu;MkY$MeCCtm^Z^Sj5+Q>fU~j=|#(JK_^%EK4Xoxf2&iIR{)s8Rf7K<^e zt4{{c<|D-F-VMo#>WbPIg65#!1BPsYY!e`qczBEu5t!*z67_PIF+M@ZuoYBswaT_k zXPf%z2m|@HVR)J@KLFqyxmHlwnyzL->yisD+MhtwZjZ<+V4n(t3D(ZGV^$YMJ3Jh$ zkyLzci@{Vb4?f#}EGlH=rFuc}ZKa(+RcCQP0()8F!F(x!C03Gn-fyqBn2{AcMgP8% z^iN)|EqSeHhvRJ!@TzAS>MJ|qfF=F`Nc*rYK{a4JXqs7B1%s_GIsvf@vs(UM$lpgL z-k7Q=0F)||)1876X}<4rmY8;A_^9}P(sx&{NI#U9A=}lHmQ^ z?s=DyQvA8*0}oq}B1dZPXtNwem|lXsj}St4aSZboue*YYP>`_d+cB#v&ib%C*@c^< zTvWBdJO{yxmn&kj|4X zo{^pWPH#>32AJw655JQ!{7HEY$6Dg02%BWdml}>sVnIxEz3leZxPWYx_6)AAq@jy!1Kf&7;@(wx^${j$>;ICDl zlB`g<(unTiO;>1`z8P4o_s2`I+Ep8;Mc8iVNf}ds=SfD^u2H0W&cAq>RU)`9FXFHg zMKNfC*2VP%~TI8Mqwb$z)^WFrAc)37 z*(IsXgo6yy8u(S~hR<+2Puk>~ZUvO&1VU&{3B{`{ld;wg{t;%Z#iaa9F1?Z{#s?)Y zV}6<$YdIyji8K44nUc)KK>3n?ODDuXL3^_5;QT1yj&P_x$*5X_+M+A}m_d(8>#(7i zk=O{(wy;(>)eNHbMb$FM*dxLzka9XQGSGA3U`jZ1p=4f$qWL zE;%@sZ}03NRtlzPw=!?_{;>S8ZW25Nkg3yU_&*IUi6g7+)|(L|bOQ8MZJ>pzF0K>y z<~PU#W0C_SclRF5^h1oJm6S3Ulv>7Um{nplcz8tE*y_hc*Td4jW|}i9EI-XbNu-^t zaX886oinRwkR$dYsTSWye5IY4ts(a4MTpQvZ0?UNYE}YJz6TV>* zaFNA!Ssj&0Ab?lL^c;gt7fVcYlfk(JCu}OlX2hJJl4i|cO@*Z0rY5k)L*fN+k0EXV zt%-~-iP70FL(%w+5fEhuAk&I2bGKX8HD2{8LWpVKrEP{pK1B!y8QbJ|6oLcyB`>1Je~S|Q_J=i7d5Y`=g6=K!mZ z<%a3bIv1sZa8S@%{$lNL?fx&gQD5(fi{|#A<;GWV?&EC?g;GzDQiH?Ue+~C#N3_mu zM*rZ4+P$u{QmpFi--rA6fF7@>c{1V<>qq*cc zc`f^5BLySu{#HQbKSn7fED+L(_vSH{J>7p{HC!1HwB~#MV()k!MEe!NseZ~zr;gvr zpKJCS81cW@I$U<#l1y)@KUe)rD=*4SvG4h8KJL$zegg`5f1YkqyA${Kv@9oBj|bvn zWEXoz?;Dnsumg0c;TKvXR;Rtof;cR3H7)rR2K$Gol7~zxW{+jqV06#=N_*Krf^xxu ze!Yx}Z0dO@)m2=lmv0L}(KibpsPEc=!?w%iZ-3Wr0j|!IMH}H* zums5)jMV=s_7*$4kLtS+HDEoXBf9Bj!T#3Qb%0YS<*E8D>S#Lx7}NJ4|D!>MRz|L= z`zk@vObj2#)+ttX{t-X$xIj$_S}DfxdhPwJM;nhQ3HLd6@Cd@Xl6> z?TAQ*#$!qewP>V~G;oXsZ5{11y{+fA&HCfPs`dhWsK%VwnKG<8Pl-tFmZsxyZ0gf% z%?xN}!A2}l%)45n!ZD$Mg`BfHV!A^1qtS9rLiir<Gvj@KQn9>#7){o&Z&!cmU(RB6A z%?kjien#`ctv^Bl*qTj7^8-zU2`wrH9J%XYn}v)|N#xY_>}9>n<4zV>bnvcr(12K0 zaaM1ZzC43vO9c#n_FSACluQbR>?mYFaQ!12mfs_JQB6zuF;qSngZ9g9W+nNF6qTXt zWCB!u5c6TIDj^fk=y|jUTwMM3AO+2nQUICjrdh|>0~*d5Mj=J5dV0aTrvx>K3o0Z; ze86Q;N#iQ4hI<$7ab~QcOf8c{wEn*W6g9VqvSy?c6H%u1oT=$)s;n)J$GD= zTb{IL4-`oyZ6|dN2M2L~l1m!P!H8SDRxGE*6>LgxCGU{zOP zr2)7b0Ax<{w>@37k{lCfi6xqm^lHJNJzE!3aT2h)#LSy=P$BpaZjwAN$+xf0`nyuP z4W^cis`!CORkN>e-o#p+_4W^u4S3v}OrPDnb<;1c7(-V=Co&?sL3EWwn>t$>7SK#) zj^4H20huWXa<94rN5v5$tm>0H3cQ?@f4?1S-^yIPFUJ~2%Phk;J3<`*tke3*7$tuv zM29MC5{#|d?m4?E_BqtUVZZIw7-v%ybv^>ide^UQnF6X zG>h2A3n6z-qiP`hNyPK^i-d3{BPCpT9M@_>R3GV4C^DrR+Tm=5gomDnP!0*!yy#=P zoVh;uT@ymxtPHLB-jS3+33zgf zh_%Bq(xR4N*-mjrFt@8Ru@+Qyvk(HyKU?0Q3-AOt1&aG*Uc&crilxH^n^Yq%Uo5Lrlm#y45TQf3|U!p!4y|%|c)kif7 zb82Xpiq0=fXLI#Tlq4e@|4yH)qdmSD}1xZQ72wv8qm3JwKolyB&)OrT2z*S3B;=Wc@gi?KakCt^+ z<3cM*0buzd4wDt{y(R5m+8H0vZ@IOcKxP34-R#Z8eL2N*!5|Oof&w=hS_7*c4Qy8MOgDs6_-C8#M?*e*ETGdP@~$7XUe z8XUiz^=+N(1gW~NMk^5$TqSF$J#nQ%nL3%6%NPu~LAqEq$kT{;PdHpgR8+R_Fv3P| z1B6;xr-r+E9Yn&>&W11yQOr%Lc$CpB2kw@pj`29iYpIBl0bP16=KB@deDLiT-F8~w zGP5B3m;*rp^nLAn3oKH4PqyK+@MLXuos{BjePJKEfbp%B-4QA}IFZOqegPX*2&LZ! zS6zTe`U)ABC~zUt1G0uPQJB_V493`zEI@8gwM@E-+|@sYtggYn)2Er)>Ad_ZWD`zP zsKkt~>>z=K>3PPG5sprliij@u77dCtaBM321szq>panoqQDJ3URGPC5=QXlS*6f=K zJ$@~;MXDJ*q#Xu)JoBevI_`)oD%kM*hkRWp-6EOnh^MHKdQ0uMo3NgH-5n+d5&0b; zpgFBK`Mi4xi&-^7W==B~?%bkkU{*^HoLW>O#iUe*&{qBAZ|phwW|ynM{>oPXfIax` z+A=cfYMy{u`~H(o%-gJ8Ac)DmdRvR6D}YDK{zft#8y zO|DUx9y7WHuC%Qh$WCxk1qQmy8fvh#o;|5S#gzoH!z%?15r_RNoIae6bs`0 zgXg%ZZQH5HoE!CREPQgS!QoWLHt=crJ|Jad%5J78Fr-6;v>0AJ@nyYWV;Z}EJEB_Q zUD&ve4D6-KWL4G`b%%I7;aF>wmdU8o0*`a=)oVWntIm1{s)r69op&+Q*s3@eOrMKH zTYXQYEv2a;(+;ir-24B@eNscFvGJp@29e8T3YNG>SD?mi)1qZ|KHs}(vbZ*&5W+yW zO{d1Rdb88;!_g9KlKs>SK!&Ursr}2^dH=LRD5TEwuJOH)=*VMR&a|q>A1>fESmcpE=6ILQ4XTGOGH(oQRbxW_PH?SF(jKMSVZ*&QsElkB~VT$P; zM`a&gWLV0|Og;YEl*_`r@xc!fP~D%8MD@$6!1do)JTj~ow-AFD1y}fjX8NAH%El+jm_L= zOwxWDlIy+$sXqHgKP^8F{v9ml0-f5gks0UL%i{^lmY;z$9#r^myV6zb6b3y3tIjxi zKbrKDQd`4~s_AP+=<jr)pCYpW-A94m}>J3nB>b8 z?BzOVZtWs04xJJp>wCNMdqccHwDPx4UD5stIoTV)E#bJo|5`J{B1dxIeH1@V&GtHy zYZf^8$h%>>4N!Gz{h`gTNiC|oewwal=!9|CqbD+Odmt41RDFwZvgOG!X>Tbq*rRaYKO7~bp(CQ_eDs~4zV+MYwbFx&5sQ5vCL^vH~cC$1npqG%i1 zVXNc!Vq4gIvfqX_%U4E(53}7GCkY(!-j&M8;#%`~et?fM>+cM|{G(-*B}F#yj`oCa zOUw~$h+`_x`lDf;d-j+pZg$gKSVml`Rls_p%Ck}mNY$rMJ#PApZt3x^>w33ba|mF$+Q)+bC5RHb9?wKWup8*_}i25Z{(`ETT*|8!dC4 z2)8sV$fs!4=Xy9w?SK(4w2`=k;v62=o!NvyLAVQN}JdJ5dX6Pe<)g?Y?AXQhN z?#m5p$5qh&dfESpP(CXR4Mrkdcn=%7D>G})&w1d7x<6Ai8m8eLH<)fiJ+?A!+|G+8 z8O@K&3ng&XnN^3stoZ2Gc^^WHJi4kRwreYMSFD*&cN}em3KMMY*Dfv>vZp*rwB*DX zX-f4*U?w$FP)ZL_c~1v5La5GeKqUabEq_7g93r(%R9VgTG-K+kcM& zWv&#QCz={qe z7QagoUqlNxN-;z;-|a=r47>=iu;sb~1verG>;lU8?u3ptoe2^^xJW7m z2J?-ODpVu5XwSm9y2N9DFcbXdmiOQN0p?jvJoX1yC2ez)Hp0!#pG!p8^9gf1U(|aM ztj%)YY8&9p;q80fb=yi%tJ7;jC7#yPq6~l#-ePjkh(kf}YvhM8XjsSk?0tj7T~Bii ztnxVLm2Zq(y+cMmm~qdrjBxjJYI3*4p>lmY!1bmE6n=+Ja0bAl=t@Na2v{1dWniiG!< zq(EXw$aahs2fs`@lMyDP&ivjDocO^ALiKBIM|}L6zQCwb4NC(g5qQKnl?(+eRmsUf zo|lR9C#@>(Os6xelT$t#HC!#hjO5sMVAW-(|7%H>bjEiD%O~|L$cRM#t(da^&LN@7 zIFj*T$w*c>7&z;T*%_y`Zev3QTSMN);?;3apn}f&ah-(olyaRFkp?ZN&nR>23rkas zH+a=`=9t9nY6q7obdGB;bZ6{%HG77*#$7YBnIqH>=FM9@Yc%mVP<&uXyQkP}a!J#Z zBIc?IwCo;aoC)hd2ShEA~6*(IgFcZ)v{Jci2E<6A_ zG>m%?yPj(@E(%tsx8`CYX7hFF@+=K42NT2X z-B8S2`onABhv}t1{LVpEH*Uk*Blh`w^ImSvl~@ zu9mBl(Tz9e7W}KBtRUgN5We9wnU=^2}j76lY>odW>fy zBlCCPsIYZBmZWLv^&@a)`~Z6Z%nvU)Ro-OrT^Th?|vNH}mSB&x{>Bt7gIAM1Z1Nq=eZOn(VNuoEyBjyTOEEgS;{d zX7zQGH*`?C;HtB<&2jlMR9yz;UEJ3vcEe-r#d5*!`7f(afT93qPnZvVJ_wjKeG7Q2v% zK~w@Cod#Gt-GyCUzDue|{70hk`EV+TQF}Y~?onXcZ+VUA%xOaxAXG zFRPcdE-3wjB##fzcDuSVB2Uf+&<c0 z>l~y&)skMF>tqtbQjWnBb)}J{HX~8h>{@+Tor`~fsV+aI&-I-L512f7jU_hK-~KNFL-i#CgG;{@DLq@0LXxnw5U=i!vI)Dk180iH%=J?n4;OKn- zx5}B1Qf)ni3S4Ickej?t-0G*1wf>0nen&<2@8O{dL%mcBKaiRo;7N71x#fG3#JRuxunz_A zLs~jy2cHr1F}mO1>F?tNGy5x}!SI9cjL+Kr1PT?xiG5q4W4MzH_A%U)<)SAe zvJ|Y|IE=(tV+dso%|U6{8L#gFQNP}Y?0?UIjTuf;OcGptH97rp$Rm3YKp;`Y=Uhfc z&zy5LR&^ZGjl)GxFJXwIdTVWGU8cK!B})bXBsF7>&vro8^a&N$;_ZJ*d?#8tZowAX z_1P$6jOvsqUt$_dK7W~){>+dTC=ZPyp#fH1{PP^Cl(A(b&Ev)#I$NlMWFduOKfzDK z&Sr+R5esXcD*Q15tD}Dfop-ckuv^Va?2um#UYRaB6K8h1DA^FfKQ-`c3o8C zZ$<(skbhzfZBqPA*kw|8SS-zJ&1x@jNx;!RW8o`(*GyHW4Q9b&&fD^&$`Wv>)lanz zx>y}qcVER{=`X*~N(9bct{OPp!%dSiW{8>{!`>jys9=#gEDgl!l>2H^6wfjt$HXB? z%sGZy=APlXp$(b}DAgHn#Hs7e@&+q5V>nV6G9@=y_g=jvJy3Q0d#R`MX!43BbT0as z?NAjstvOb};vI$(YXz)M-QIaA*+~(3y>?$l@Ez<2%kMIg6w>$^GGEn}bG}`jevG^p zdoF^4@(L5g)uMqJw~SIaurrz9`t^GF>hExQzJotX(u`NPs|0_I3bE6sG#Pg;=p5>}vK5hpNWoAavs z(q@->V`aowUjo57x#A=9-?I*%WRw}`?bB(C;bJs=8|e`^RallyuH>Zt?t&qtCpTR67fo^3yRCh=S>pgNp1$9Aes{AB&9~3W&gC& zfUPc3ED*61ethyQzZ%=xI2`7X_7qm^yRhr#ruiRK_9Qu>bJeeF^M z2xTg%2!myaxD&5B*|Gj_RjSy2Hk4>k z+!YUOd7;cW`zGLBC2v6BC#61TeO4U};8@vboQF%BU{N9}(bLB5BlWuRNY$Bjei1VV z8XnxOKg2S{d?ItD@m&;oTOpKe{p<}X!Yc0iYEN$8S7wv~9@`!wQ^}#khjujf*Rh?q8uQCoGu39NuwV3TC72*d zQFblmbN}XJlJb0O_PmeF%$t%zh5G}aWh_CeesTA;1WG{`SB@Y|2--xgRIRLc*-^!0 zGQXfkzs7qtvtYs&R!9-$yfpi3V5 zxDMx$I|t7w)SJXW$cQ*~h#WyFTU=Xg67YDshx}6~I*Qek@+IskW(+f@d(NrQLrKx8m&55~EQaZj zaEo+L&F8}%FWniMnSC2Z7w@{!jZutG&XPoiiTB9LKft)s{h5&q7mjU;i(pmv74k_y zMdRsVU7mT4u~tQR;}Fb@t?%b1tnJf*yQU{l)zWu=y8E}yUs^TznaQiMs*m3&JxhH& zginqwS-9%#WBknf~>Tj?cGVg?mn(_dCzv@DW7RWVCoeF)53 zL2{~RTwZ1k6)+fmU#T{*s*kBYeGF4CvH`B6Vyx=?13_NCCz&o>2(NH@=WO+dTc*cl`c0QtNaBuv^A!-P-_qIY54WJ+MCKbA zY1F2ZUc(9&<&40kb~|KmH@-7ms1L${BBb|FOp~*w=Kn~PK#_VRW(BT4^hepYqksb2PpOe9wyI2qbFy?bfYd$ zjl5I^!`C!OM_ArZSb&#>j!fD~trS9wk=Z6CO2mU5zNa%510iFlw>@r%ElMbzcS*ib z5J*-?BXTm+y=Y;6<@gZ7ub|hCv8wB`LvQ`=cVB}INouHNjr%4c&_4~cKl3T$BDDR& z^fhxG@VwW(tkf-1bxE!R6#3zFEH@CP0Gj6zBO*S7lc}$!VdxfUE@eYB0!^Bz)kUTb zZAn9P%wJ;+<%QW=a8Hmy)cyvD>O+M)3@c{3@98zsP|J*OEkiV~mky~q=jIc` ziqIkMLRn8@(#aTfG8$7qsi{FHL95QJ(OwiQ@%{r7V)}*=T2!(SoLw57Voakqajt_#;*r(z7%<)7#yo8<3I{)KjVbbk6az1QpkFT%=L>Ad%8C6X1Iu zi%U(g>fAlreV12j04@tUy?);fc@s~(_dJn!(66a$Ls*e&X@NLy z54(bkdIF>^NxqEGs|#Xdkt>}mu}7L14LVC93olaH*m&a1sUEa$WVg-;FD@V+r@9uL z7gq&(1$M&QwGZQ!y&3Kh8q5r%8e}IIpcqRqnPN|V`T-(^Jzd{BFsmC6*L@1o_Pg%c z{uUMzR^W;zwlF*=b5!bT0QZh_W29Ksg~y|vWzCQwtmt3@nUy=MzebH`ISIxE*T+`zpJ!%TNZWcPj6*LBgQ zP}U4`u|MA#PT(*55;am>sPLNUM5%xb^2x3V|StOfw* zbn;tV%H&oOQE7y~-BJ*1JY6`rSY7l)nNsrk&*WfqN} zx)$5CN2)GjbG|-ok?PLMp28k&?O29Ac%trg?OcjgUAFr(?(4gQguV5^ZTNZmq=NJMy=~_s4kElf3dD59r+N(Os7EJ zX|GKk;bA{ax1SGRipUpz4f;#Ik_h4fB^{t0-3-UAM^_wOaVH;mrw*50B>+~pq5wcg zg?TduIGyQ)Ce|xwJzT{77pGO*ywp@3Yx@XlDWnBFyR8b7=Zo2Q0&=JYVF?j*!8r6gM8W zlh{ao=O=7>l;OXfTQ4%L?})L_P|WnKrr5k-6UVvm0n%D;&&yhu zD4Qqkt*6K5Xwnu?%0j}c7u8)`{h z2?z+FJIMIQD*$&L4qI`2Sl*Bf*BaX|4LP=t*honeYMPN5^4j~&i*wqNfKz?G21w6Y z%JJ2q1=h<|0~?$Mv=~7Dm9T-hGWilmkgA&c3EYmLutt zy)EyeO2g<-M&jefU2X?~HprEr_guRs|FT#ylECRGC0`;&+0v-a;w%%Y%X*XMVnO{O z(U*An*$h?Ybnx3=-&Xnw62o+_K#l5x4UnZ0&WI=v(;p^s(1Y#{*PF1Ra_&N25a3XK z5~dk$dk~wnDyL|$5Z=o8DKiL}*$6;4n+~^Fn#_9FNu#w9)W~`{8~Tm+ z)8wT^T#~Qpyrfvwha%Xy)A>Pv{A@0ypZI&L&_9LnCs5uV&7mGK!;v}I^w5DicREqR z2BbO-t&!kSeAKnK_X2!m6MJZYuxCrBz(ni)cZkAt*F@pEtCK7usn3xnS&Z%yo^hjx~$;0Qc4aA6tEN1mIB?6N73H< zCrLIHVOF0%;qy#HZvQvVPZE!?ISmh7G^7vfXq9F%`$wn3zpbtDPXVi1^1&dnP;&~G zBhN+cTof3D@UA4fR)Pk|>L89`uQVA#CNa_ep=^wZ8DMWeQ~~q8ub8Zfu7*}v$n5hV zEC5+-vaZz-IQnBzJdKU*gEoAIU?%Hu<;y;6VwOjgK$b?OOz5l`#6 z*vKn&Q*6BIqwXt-CnaNDP})zitJ8m71C3=7)}S+!$-eAU1gLs}*CU*$W{qWr+Bc&; zx`KWj0kT?gjsQ<*5cR)?33ae7l>`0p#N2U+I+yG8_?ZfJP|ef2<-9Q3c3go;34=7< zM~P0i-8(?BB^))UW~faBr%;r*y{t<{qV{7m!z6FJ^UL5=XV(BLBM`0q3ot^#os(MK z*7a9l-$^P@w;{rKThoc@FUe^s?wwvXF-swHhWPIK_x%P)(2Vcusok#Pq#3^E35A?O zF-G-~7x!kcUG1VDJCdNvNt?Sglb)ti0*)6c4QJ2c0$UxJO5`?Wp~NXcQR5-K_^N-f z{T!LmL{@0EGi7uSzPCQHjx#QW3sVbnb^d!LC?1v0`Xqb(J;6w#hcli;4ax{!`^-Tg zNSj!3H<|7OjKJ^Tm}zE?#lWpa``pN06ya5uz#N$NLQNj)HJ|uEjHWv)*uMA`Zlj$8 zy}p>EwhwfUKy`IP$Ukw^lTqieyt&g{JuD&%#P^#Bt2z;krsS7QnlaS)0lTnE)V;C5 zrMp+o;Q&{C%EAg%7LLRuXJSEBoRDRtlWm96r6D_cdc&h>e^on z-6SvfY4XNa#+u=6o$|3oqm+MUez5H{s*NDR4DZgxrzD8gEmfTgJRQYn2!NB%Pd8SV zzxejy#xIs%4&h18`^g->nj(;6V$OhdLBhq2Z8#GxeY`<4>IlyVEaOYCBvPeD2C&b^(6gBIvIT5nTQtpwSS_yb+g66xNWACFdM9{p&w zvk}%x_lVU=sg)iv=+ji$wJy$rE~&mxH?9T3g+erT@!)wy2$;1i`_q;^^6eBMP0Z>N zn6;xr$sc+~XD2%2{fgnM|J847xwDLL)$LR4aH<>h`2P*cgsmaxAC}JDF$R9S_CU3i ztv}1#Q-)j1HKpv_THtFdp_Shu&l-931!1c6RA1@OU?GFj-EPH9$WAyEx~$PDZgolH zO2i``0kg^V(l(+#>FeT!sT62|3KV=JTKn3ys3)%kD*+L=O%=9M?|#j zagZOHaC(OOQM>QkLQNuH)oxmp>h!vx#w_yuzlQs`!D93JtB~Cx1!~%Wpd`a%4QMs% z$0hXz#W1sGGBHp7xG~8y6oJynHE4lW5MHI};$BKpEZE2;%)wB|gffU42|J8A1+c!g zC*7#kAHSEJhQk?+(ON!GD)ugKVJ{8_V`S6R#%Qws(3~0b8{G)Lu8Y#fWD@oJF@ZS- zA8%=kv%u9Sx1GOkHhIh?Ms9dFht_jCvk!c;L}kO65V=paBO)aJ_FscPMZ73Kbiy?Z z7cKQ}%$ydCP>W>U0i3IKb6l0_X|l?UpckDWj?>i;)s=5VH?Imp$xtc2_G9D_B4>Sp z!ejIH&0nDLja4xTQg!A}gpLRMy%ADIC2j(lUik?Qq8~5J3ZWNf5z-&%7hq(^P{(aH z>rZW_oJ`QQ|9f50{s}_3+LVhGIQqC%(>y(pg7gfp9&tf?eO3^7zdJy$jJ&L z_bd2pB)*XEqw6?-i?5zF_4cE|!y%+kff;zLE5V)mPHSLRe#UI5SBy|2B>{m(F31v8 zM#!2w<&vGqZN#1cnQ`@Np(SaG;#6n#KBJYDywlXJgUMI$+7dY;7RCw|oxG{*qK2qW zsPrellb&2bB-qNW->I`8^!xBGf+jYJk;xou&28HSSY4HD9Ci ztNMh}|Ce9>@oRXqykw&9mQan8l3)^RO|&b9YQa={my;NxI`3C546u5@*S8IN7~u?V zyN+k3JKQ#$EasLMbwaqeM1Z3A)Nf+;srP5+L}xl#aGRBzGB%OY`Hm_=m!A6Zy7hFufD=M(by8%Evl#1n_3-S zaur%o`mI5qEjP7Ve2keyfg!}<=%99jRzLd=`Ojg;UxvaJmw9Q}U6+##YkGU~Y%I=dP1TGv8z_X05Z#%Wx>rrWLjqF|!=vUc6#INW&Y zN=-Ys&SHt1<&?P;2kSrl0<7C+4ON|U#$=45hex-5GPK7^=J*O&O-BrXR2MY^%E6&{ ze+E4tNch~w>gn0gOJ=mg{vb=Wf3hlKHD`4LDjr!Wk#6#_Io#fb3Mesf7BD+YS0Qi@ z7AVyH8qEjr5R-aZym!9eBK9!jS+PceP+{eg`_6_aEKgFtjq9$;o3uJE&b2 zify1Icpj~J`skYnk5~WH+Ov$lqqS!#7KywMBJ216e%JIPbZdfAheu;|xDpL@7dyhwc8O^|iaJmZ$uHVe@b?iND-^^3CI9yZ-YCTlh@Jd z`}h847WWTWbulDKozNbB_xPdhR7R{?)G1;S+%0K{Tu<-ayZa>J13zF%M~Lx&spNa- z?l(`rJ*okVA>%$hdi-?#?vr(_2}9`z^eIA&XJ+m8#&?Fq511KZ5&V=+`|9oWyN~S= zlR5GiO}s;khw1*~yN|G8a8Q~){D5JK5J|}K0hx_&&>KVM2k?P_M`4i+lAcBQ zBnV%gJw(JIKT@NTRMBWQ%rSN#EjlT_+n+z1*xVbL#18dPHUrBoDTO78;}UY-oUx*X zxQI**O;TrP2#`8Z?W1J#GPCymQO#OPM0<%mTavYYU_&i3)i3M8ELkcwJjqGT?oFr< zC0nKGWzj}huufuZQag5$h$Y$cZ>Zx2XvIg8uq%7G@I+h&$L`K-8b{u{>2#iI_IYXE01-ff}5|-jS47hR#u}4uTT@nAp%7eJL8Z#oIYx>nufc zYkE{Pa?#7JY&iP8>X%N!Q)R0^YRU~qLM{ep@6I>}MtH#u(r}kd9*uhCmz?1V4H9lC z&X@74tLZJ++FGiQ6i(G#M=~zbXRS)5U#U6l3=Nj%Fk}-OKQxj=F zv;ac0i~r*&_!q1a-#_zif7>h$S!X zPz_FECxSRRGb^U(CcKzhgs$YC4_>!%|0BEXNBAUoF~sC;*6Z8!wCKiKzuU^7TZxeV zF*FDc(?h#vibl7D(FAl7y9}3y9XR(*5Ioz}-M^LW$OYZ)Afq$P@>$I*?2*lIgs&qE zr`I2c;{{;SIqlu!n^&Hq>0B_T7M&DNs!!0SR97%dHY46HKILOjk~u!w-b6-uzBbifB>oh+BW0eX!zJz7Tdws`O?EJ>Xhyu@z% zarGw=2_47RIPzpcnPqVlr+fg`zKtg1XDw=zqP4ML!AH=fby6dGn#-f;;9ImjVsIrF zDHzQt9+?mr6ClasBPkKSjoR&oV390cav0R`BzH>h2T*nICe`DLv_d5m4FwWCgHi*V z2<4maHQ8iQM;EM`1YXA#0%D6`RT$9yaVx8E=8bXHyO7NceCAvv`WQ>0-e?L9|Yy`_i(uf+%(4 z_-^$PH6}aszO-s{xNEvobo*Mc7d$ShoI=lVuYJBLa*`ocG;#|_8F11&iON><>G(%F z_F{07JArtGAN2wj;gjH*2^8z~sF)EwiUT2mC(U=nCEQTTcuFkZSVSW*Z2x-)&4aCI zWh~xPH8_bKqndkXU>AJRL9>`vz*bUX#gP?n2JI;1$pEYq)6k-4t}?akUoW55+c!ap ze^P`>zr6qV2mki(|0e&%fiFiU-Nlqh`&5Wtcl;H?KHrjUEM6Zq zIEkH*?zZTgkL*?-;gjIItg32;G2@N6cn>Qap^wSEUWVJCAH`x1z}kh`90&fJ6Inbt z3QQtc@wij`NM^klTf6jXxRV45{h(P<>dA_BPKgla!L=7nDYNLVP(nzd zN#+!yNX6vZ^g1Z&)&hoLz)9~?ke4=5${k9;%?7v4Y*)X9O5`zvPuj;p4JwJruH}3` zO#Z7eN#lJP$kgC<6!M?PC6yC(*qGV61zl18*ro=HFiGTWJ-JP3A~Q+FM`DUks^{q# zBkZN!`>n{!s77u*i(5#L_Guj)r1nO+C~K@QB3rWeED0qmy~T3Xy0~USk3wl{(Mj>7 zY9gA`TD0jGsUu==k~=m)CYAkJ5~q3;hgkq7o%gZ38)n6$*nA#W2XAKrJ@ihKaTVPZ z79X53ybd3(E6vlOXlazJ$be2_XTqhqxjKr}9E&@cP#{?q6dMYTqV>3#A_c`-vGIP} z4nK-@;&Iuf^So9_<9<9&)k)i`z_*z*534BYYA(232(PEXV|; zcpJi^VSoOB&D_wRz?i&Hdu-RD&zA0gB-^7g`aYShUb;Xe9+t zl3PtuN7SzxoWzcSiP1OSFo`0TRI=~_I*H*7gEs6(P&9j7QaMrcWz(smxvJl7$CZ8@cjH13O-XM{~+2tq^9+j!n0XcY;Oi|AQ+ z?ccPIoM%mreI)&huu1HkXyIL9=$2jaUnO2>#k(Sljx^bq+mDAmZMbc~dL45Ls0CY|?M+$oMi2y?Kc@xFvvq^7hC>#8L^X=^@8 z*F%$#OXr1nIG=p#$WI^@Zet3hj5t1tVQT1ne~{ub!X%O7jP&{OT$pNjl4GcD7=1I6 zMMA{l$uobU!qPk9&TeS^p!*Zi*qbF}+Z@0j5fR@lx`Uz)EjZU21W5OkmsuM6gQJlC z47k!m-1>|;5@Cce19=qm3^?h%Cp%)t>JN^BfjC&wI1>!8%^j9eZ!H#q5?m5Hn+vHZ zS|^LdgOmWto|ru!?jAHH$|63wU}Z+oq;(3+I4CR48Yz>lO`T3CCg7Kfray+FbOHqDvlEsq7Bm zY@I02i_CwEjtCD-GRLqUe?&W3KqoOI_isd_WL90h7D|@7!xlow<+FeIH8STvpX@M~ z&sCJbL1FgZ`T?$vdrvfbxg;?++`B-ab~uc&?ZjkXk+E>v(~ulPB$Er#?=qWzH^L$C z_3t(wK3MBdVR`69A9n}I;?G=BJt64^4o*R0k0Q9}Baun^GOW~+@uRoVpWa6n_10r={KT860vjVplk57&2;-au`T)xcuS22@oV*7$FKYm)eq z7c5kRqr=mMOv1nPb!a5j-jjizdw#`8_csUADcJ2-zqw_GCKE&HXUQY875<@s4BK^n zS2OJ2+gR((uy~M()X*=uk2(aBZ$TrOv%u}G;(y4>{rSkc-W4z)d0j_2!6EtwIM7)q z;QqtgYrpLwY`Q;247t`kj1{_>GtrNxhaxrq(1uIO*AEU}^kjj*91dP#0Hw&UxWggi zk{QMl9t0#3%|MdoHP02mbCBAix7U9$kc9kGJ97p389Wfl`iCYesebM&ZJ-X1aK0Yv zBl{Knsy~I0Y7<2KpJlt6RgfGe8&X8bjs9~vG9|~v20vj24({{^dx8*SSA2El#q zBNqJTbb!i5NiK#=V3F_ljF32Q1(IzjA;RX|kog4;&iswF)ya6QYrp0ED;R%|#U}WN zR$$UTXLsg&XxDxL*YW@)=pS^S3mU1wo<8k0!+J9r;KQ(*`p`8@4LkbBJejSxf>jv8 zp5KS_;rLc>O@4gUd(|IW9#k+W4uNCRf<`hQxU4rlOt}>G!F)rs*xViUlj4yD%+^DZ zpnqt?CFRegken>Iby@2u%khvEuBXEA;dm+1uf0EJuE>6(Jfyau0G};c-kS}jA$Nv| ztwZv)!ycR?;C92Co1~^Q%>U71M(FU^iiOy0!u5Z#0pR=MnKql@Wc42n@q#M^kw`j& zNuoEBLt+Y6`!ZA)k5AfyE$^{N*+00`#{!e~+eRs1XR_zzdD(hS(w=>DxY2+1D9yu`QH=RLCY|s4|gM}OXf@8wH$}Y5^vGvRTCL(f*7ZaWIFJAJ+ z)*3%g9*nXr%H}FRDDLy}HFj*qjU7&*$S8y;c5;Np5&@ z6s#A8V87eYlukPOd;Qm@o0(Mne${x0*4Y$1Qu?V#|GoPVkDMnMKSDCb7rp6xJY)TN zLp$UA=4lgDyI2Izru?Gq7Qa0iiEaoYBp4YK7LvHe)}a5}V)-oqvq|A8QWmt6(Gl8% z-fbx5Mj=p&%4A<^S=|;r2I{Tjcg-7P#&yn*PzuVHrC+vFVyiw${}%hyD-wi5jIA#J zuZssM1#E3mlL}jN&C3-}RGT6^VG~34+U8_0(Cc_0Quhx{R9!HkY-Dd+?r`Y#w70tI zKkW>*=FiXySWeCQ%`BJzcoX%wVYJfoBYeA%j1ESkh?HvwYH}lGiD^c`IV?aNh;Bqu zykhk*&i!V~9yA3PS`R~-{y}v+H6|%u$K>)LT5~^l=5Vf*v)XDBGCn?jCwL?h^$#tu zq)V9*bxae>h-i{o_#6uW%6K!*TZ@;z$cG9FMYK3kFEWy(^w_qQrkMHHhYy~pWQz@P z7v97Nhu|5L5tN3ejfI9BQTgWO+8jYP@{%*ayu!gbdDVj!VwzS?D7gDM5KdV;AcD_iwMy@sda`Oc=USkPBvWHcHkQ8t^2;pfF6&;s@!3edpWy5ap z6M6aOY^y2LK3aTc)nIH&{n&<0`jX!P2K*_OUF!7v#+OhFMflGp_dst3_i)s4>D?W_ z98M==IZRQD_}e-7kqCum_6t@!F(Akg+dYyduoiN00HMSVK1(&qO<TCmSa5=S3{vzD57aQOfTXp&Px%>a z3;te*Ya&ZS#2U_EzJc4uF!BE=Shfz2WEWzy2_O4gfLJxxy+)K9q^S=rXn}`g6Z}IL zHe2wEreJqpLJ8M-H67wUeOS@lg!|o<<~`z>&t4-4T8AV7`-*doLj+x1 z4uTZh;IxmH<6`v>$D7;J{@&)^&hJbg3#_vqizNMnvhoC&w8ItYPHiq7BduwYfT`fJ z;%`MH>>rw_qjSpV+Uk-ZT;~#kS^ml|Yi?0#%Vk0Z)6?BbI9LgLh$)4TX+3J0R|K07@te66u zk-SbyDGt#uMXrJ9P@6@k;JEMbHH-jB?DL>Tdx^})Vu`!GzVR3LQF0TA{Z7ifrFfZ9SR}M4w^?=D#m) zNSo!zA(6o4t=SIN2LE+uplF>9nS!}j6kTEMfTVVDI_Nz?{L1UcYJJ;l%yp(zvY%^U zkWecY$=p!S3FnCcQwlvYVCx$X61Grqj9M&GwqGUiY{4&T9fvAT{u6g`b;g2=vn2e6 zzlf+-EYtY=;t8#R-BPy-nr=F5*QI(ry+T2+0lBMfLxxlO8E9KnF&s(J*?f^Z%A<9& z(lR*!J#E>rZ{&~y5^T>WQIJCPQ6)`S%C~K@qypaD<6= z*4cNs=jGXqM}ev+fN?p5r&efP0@ycn&U1V4*>p1Bw@V;XBHK?xvDrL^pQinHQBNDq5=-E2RJToH_s7f z^s$C#Bd*Qnp4}nvX```Dg?FG|aHTW7s1p&qV|nTjIZM z!PiM}ey19!(ff9Aa8Gh*tRmxt4o$@i#-b1$PJ$eLh*w?rN+beJZBk%~M=pQ0D z()mB`Ot!^-zqabalkmLy?S1{qxxjc9EdDjlJFRI&oOaKO7ZH)W0>|`pe_KJ67yl6Y z?7?-%Vee_cJH3Fw1EpAxSvCdQtQKC~hDx$awKuHn|FLy_D$u}qKGVP<{HI|l_attI zJO&oL*Eoq_Qf{)h%vl(aIyOZoJ{wZ&&?MsZ2z6)*M;bp%E$a;*G-38uO#dH?*ISCp zjgWrXL5l7A6?OuRG#YW|o|0X$Gud2wyuM-9T82gW&9MD!$R0$&d~ZUH?Yop}Tp`$e z`5V)c0u#Fj;qdr}J5DpKh@^Jjse?8*_l9&zOjbk2*>|xAmxX04@_dWz|z@+^fxl8CZe%3=85yXw+8+Wf4-41L&gXtZZiyUJ#?I|$8 z?H?*C+w;c6*v1bcg+=rcSBAvgU2rx@GhFZ3q6jbgsL&*SwM}6l1s=>m6bO(xodNMk z?y?n%ajk{`lqfz6mU*{a91uzFf?qBV-Acj1{H7iA5O&2yc%*a<0_Pkd2M{pj$DG!# zO|dx{dIg392Sjq+pd|WH!(aji2HP6E4`;)FSx2c%0vylA7FlB~I9m|X3kcOTg+al= z*+?(oaftqT-M{tisW@`)IBOG{;;pu3d*q&cz{}{|3S>8k+m-^~t+?V}I2*?ZDWXZ5ySNwen!V2v@ zP?AacLo-nY9HnueO7TeTLap=$zXb2=@7bGMfxfd% zfG$MRqtQfMu;u2YUfsss+TBmgJ}HO<5vk)19lJdxHfzbdu82$qf4jM9Kmij^U0?zZ z;Xm*Ps6T@lxhVMyljU4sD)3M`*}*0aJ+~!yXpLB@x`P;gKcYkTSA$Q{?bpUYqVy27$5kS(h>o0I@J4q*x%nzea4@Tc+Kgs_{95GQ=b+huBpg9J)>E;$K-bkRPkKNS zJ115r#ur14kB`X$&hTS@u-Zt>CLGCJ-ulk=8Al z_^u1m-SN&UtQ-AxO)%pYgPGI*;`LU1Md~2OcHRhvDr5Yd>^ID+1%{k}#o-B0ZO9~k zWn=gn&i1cYCwqGk%;e+dHUvI15(N?s-qRWB!Xvc{&?1R;$OU@SIB6&qsE8wlR0B%K z)2g9y2|F0>9zs%s&fH3B1y`01g>(W+x|eE^-ih*!lmrD<(@q&a#w5KD+ub?f)eT;6 zCorRS^V`>garM}*yt|0UXB)2i(;z-^8g8`(&g>q?9Sw;EtbtDApG+rP6SW3Tdr#!E z{N0+f2+9w$whG*_Vn7Z-{6#wjw&V)yQHuqX5k}hsW|B#GXhsO=lxe$gN%bUd!|*p} z(s|RYI8Bj&4s)8-t7iAPfBV3_L3|IY`n zk@+@t&?)f18ANK~tmtwswNK7bd@T`Yb(va3t~Dw-EaKmQ!qB{^6u-g+w9v?)sUZo%c}%}BDnXS^B) zu1QCshH)^&KBppnZ+)ZZ{HM)AE6|ZS0QRy8Mk00Eohh{7NVWSiIovanUFYE*3{?>( zsa?Urh#Zl)hRyVPvN_*x9D)TqC^_UiKuPjfsnV%oaGcHI0y&%Q&g~N4TD*)>XbyDx zWsV+OSgQ*~33G%NUWFr#t1x%==tQ*+ZzIW+hrKU#rOc8l5eR_8Zgv8a-U*p#%}Zz~ z6lkWJbL()lBk391pKTt@_YKl|FEnYPNO-bjm*??brekI26G#@s+beLFEIAJ5HZ9&|h$7XB%LlGgJ5dVrZ%ge%Q z#x@sBh{rMQXn>OD+1h8L>4{OG{f=(h?!q3qmVIQ7swbN52V3bLRF-K$hl1G-Xxgt9 zPxAl+B61=%&IJg=F6GwYj+h3I?S7RvxX4GzObD zN5kF<7-*m@HxU2uKx42KkX`-6Np0dBw2!bh(FjR02N+Qy42VX{5H7G3w}^oma5mz~ z_UvU3|2toM{V{oEZy*IXJAvU`cj4*mdM->oHgY8+iEK*>*@7E~2O>@X&_pHG%ea`t z5l~Y8AYIl4xdZ(5rUQ+n&ev>fHW<8U=-LbJu1(GrkVxXcuMhWd7#felE_XuF8_q-{ z?sYq6MZH{nkZGkFu#?24@CUVl-S{-gup&zV^EjeQ>a)>gE4hvor~v~a7e#o|3@&Z> zY{<{L61+nbsk+zZnfv#Gkt=jnYs@H-K=?8D;S-C$k7Q;-S}+Cjr1r% zuH0~xnAKFEDe+irfq(F4lmRB~>vf1O`H~!CW9pbKd&=BjydJMD?6-kQqRW!w5QT{D zkGCO|LjT?$F$)BIl#yZ`zcZaKkPaLk`@9gFO}GLU@D1(WgB>Tlh_&fUL%BdJ5OI=L zI1+P;*k)ekw^YO`5TU=2DYl07uykgR)zc0LQk3rw(v7;g8JKEV)nW`V}gZlivho2wjdgp*3ig{>O_s(H1m4 z{Hw?h_N{5N>8*OhM#|QLQ#=e*=dcl#MC&_rGsALbGc49%C>&{AiDGufP)?0!a6UIs8TV%;3m%Of!r2V@doiql>9Q+LyX0C@L4N40@P63eMp z2-2v}+}gar6y!5b@kl%UvO$DxxfB!-@&UFzXj&7sQ^6_@Afz0g3?#`VDr^xpt;0@c zfBG%ca(9v33&>@ua3plmnBZPNYsSbFT+ciPd*vTAXvYDP)+hc}amQ(l4ki$zQ3-U~ zA8o$ukLFeqDA<}FP>0i@cB8WuKYfS_8@KP$Jm0&0*PRs<=SQRdK#wdt*abIqWLzHh zH4%Z{+RCV~MJ$^*ogs3{o|12__k#u4;Sl%+B5;wxNEEeNvj_6t7zMjg5$s1liPOb9HsfTe@G;QEYDAqzc$_z~f+rC!(op*r2l!m%YoY_nvJrgcO{x z9)*kvsU z+;hHt^weB)=3{q9F_a5-t$R(y7yrqL}Bi6Z!&#$^VUr-p*O%e2#s&EB-zX>UJ&-OFT~N!y@W*+DD^xH+uGz1G=?mZei=N~$tb@Br< zZ!KpbEnyypmUIu9K<@zh1}8*Hip^V2^zn7FcKia#+wI0EU;qJ+BNU$2lT`2?osFmy zL^YJZak0jNwbzy)s)0$G%rY#t-hHTe=fr7*?!yYijs&I> z83F$_nA)hZf{FEfgkA9uDJCgicL5v-KR|@uY=*3w;>0B%%}f@^foV)g8>IH~A2aaf z|6G6kC}Wf;(18$!UF-rRxo_Xb&c~ZAQXh{tcjseXuk3jIKiyXaf7BeM*|DuT?A*24 zY}8v{f1vh1u}16$40gx>SPmi0a02Q9iI3EkHh$~Hf^9$y@LvnRs+F8{Q zxhqPjunY|md?K3>!3E`pEFgPqzw!YsF%7mQ32MQWWi&~Gp$g8o?t7^RB(bw$A5Zru zuafmh}xN{IZo#gCzYKX!|qF(|1fhs}$@A)L(2qRn*BAH?0`=hc7vMNGK~VY?lv)FAA5t^MMcM7 zlTh~_PHE)isSleKt85 z(raK-r0y-$^DxV-zgXU`@!5|0aYGAQEh5KOUUkuZYg$l5>WZKi7gBkc))ZX9TA~D- zm?YV-x$AVx!bd5v{?P8Xqq4a-h_EfT=yaQ(T7h=4E#(b*p`Uf&Who@_BDnrnFa##MH!eLAjksDG4EJ-m) zs1=TsF1xBbtl={sdq-nKtKfp!QpYDnB)O2#49-}v?O4lBf$c?N_}C-)u!{dZ4$*%Z z7F+8ohG%L}Wta|T+<*h(8!TT#hYkBhfXSL=aT1tzWm1U+z>aq1jIlz7&1xygLva>K zSnRc^K%#B)%oV>*kzQ(0lKm{ol^A{OHZvA*K3Np8d>7$HA1w(s=HqT(UT6T5BqRm; z{xUaVg=Pb8w0K9?0~V{Z3#?3Svk=tTH7W^Tt-VGzo^z_u-A0jvf{bf54!36gn81?i zf?|DW0yUy(;-$^S!jJb-&U+Kb#rk4mY}`*nWHY!* zwkC4toIM}zrupeIY`NfG>k&!mb5!%2kC5~V=|WNWgAe!gVLBgg&bFt+gf$ghx(p^) zhWVz83LA78o`>Qibx%sI!LycyQ4{q+rvLu-<4{Pv1CitsWyRKuXFKWE|3S(M4@hD+ z8>ZGr8#E+E7G5w-ezkG9Z-*iXn>RcB{T`XOOnG8inl>qE`S2_SYrBX zg(SI)L7z9=g_t;P<~qnoB#W6}3`%;o_)nDcg5ieytkRUYd=$teVWnl)oh8BMB>IR( z@PC2u?^O^a?H^p3OK9I!{<{fDkV2C!WCPh!0v_ol4aZ)|0D)rlX*KSG6FI=M72)Y| ztSav&#-aGgX)gEss1n&*eKo^%;ji|jY z>~ye?41V&De6m5B1#T^TokUU~!e93C7lb?nBlKSNr{naFQ*eTM6cX|e2_)&Y)h#~4 z2>m-Q>ZOkRCspSHpBf-VAp$#-St$j~+6qVPvi-`-OCFzX_%v(U;bqt~q`(ULhUO!s z!NzJ&tc((PSPc=idwfNFe6JWdQ$5MK1=Ov>NrMvz?;!#*~>)X?MP&z{HfjZWJ zNNUT$24>7{m>scsyoGB(jYrb;WB7!fAHlN~Kg;UqC&(nY-6*D)Q4IPcBt~Ux;x8Je zfSL^3bUMi2qg3mVF@7u-yop8%pVZa7>QCUu;$_=MXx_f9;Z?vbY8ZC6eyl%Pe756P zUTcJ(PH~iIh`u>I7^sV<*%KL)ho1ru{YDC@h#VVubz8-`&DA?d72T72C&$R9w=6h! z9S#Sl6O$xAZpohvU*N6b0pcCtW@E;oK$^+rWj45^?tDv|A)y6_aB{(a(i`ZHW& z^uBX@`fM&qA=cv3olSS30t0)10NPE3PIp_eZr``ndT>hk#h#Q#7=TS_(0<(nn!0l zn3X?HT?>&hF2{gKWn^B23gr9eSQJe!cP&Sk4YHBt9#aT=ApWv|EZe)11{pI^W%}jX zWHRc3L!0fovsiRXaoE)K%REK4@|?MbZo$*nw4~sM-F^ur5-D`(WFb*$bNflk`2vlC zy-=|0_A7tKFhtmzuij{kHkl*EjL1L!|Ck#`mn{yLLM}XHD;eVszqvn}+g(>+XY{Vs z95DaTL?zX$%``|m@U~7AXa%aR?mS2ikL0eHpgmk|z?~X_TLnz5D_}1|B)!jVuz-3( zh{ANVKi)(hgo6pRC}!RZRP-H@2p!;T$4N9y!iy#UxFPrEa#I9EXj3tTx7(&_vOp)@ zsz8h2NQ-I3QP_Sk=*4yC8A9>|q5)=*3l1p-A?0>F(puVnJ|Dm6t@7X5i=h?T3Mvrk``W=2iWF|95@;f9 zLKo6q=4^K{+e+ctl=RC*G}+RNo49_!@vygc_}!oG{;jwAHi04@gU#>{29UJi?N!^+ zA4~R=!HyXId&mVQ_dhe+1xlwFPA6jlK3j1kt-<2z*=|AAWJR$8?MjQ6^;4F|#R@jK zBz-ALPccJ&dF188DQ3D|U{mSHP7wi;*cE%dgn$AE63nzAS8!}}-!E%O*Sk?q)P0QC zM-rgfXox8`Qsxn6Lf`5|i^KaWX@7vvN`LX1`U0S6j+ zG_#fI8pIHh^lmx`x6PYyB=pn0*-+$`^*PeSOb_p)-l=%7!DXuV?ce~qAGlK_AuI(- zMh8mLWdzumk1@A!o|_#YRm$u@)h#`2QdaeQl34u<4%Gn1hJ>dMa5mw~vJ9n=4p1AF znN`fR6u7%>y>(jDm?#^2U9bMnwRr4z`lBUUvp}jhNE|Nnjm0MMGZAOrer2z41-g?C zmMlnwuT477(!8KQ$fQFwQuw?}`7L=w@H;Bp&FmKV&IU}5VR*W2_4kGX8}kV~DBBaV zhH%5!wYosj=mFUf|IkRt8qnE_kNw}JF^}$hGa3b}%EOs9bYZgv4OT0uEs)5@Q2wE; z)?#X)JloCa~oo0rd`xy!4>*+JQ`Gx>(?@ z7bB8%{6z-|wk5fbW0H>iJ|1C`4FAvqOS;wxs$~G)+6l^GxvBmq@}&;GlCsg=Nr5xYseX;m z91i>D9~z*f`7!SL;;A(4t@;mW!gLQdi|0H2LwjK;IK=~;E^?3A0nR2|YY7RR?Dye@ zZ059}-z~S5I40DAlIWEXZqMKpYymK?eqshJkh0ri?Gr@OyWz8QJw|$l!SoJGH6a<$ zU^<=HJ48X63XjDx_7APVr2R>|(IKw69v@c)>Lv@wX4tR1VI!u&ww&GC+3J0R|Dk#r z;ND}VxFAMPUMIa2M|&z_G^#QLWe*npYyuPOwEqeo$7yVRVZ@aZTnx=7d;yZ(DF(!u z%$2+|J^!!8I+5)+OEVBtV#9tPqWW6n7jfC$#GFVqGo*myrKFi9G^4r+=p8YGU0Fg~ zX|ll=jPq}c0k`0^Zy0bl)G67ak%T! z48{oYq?QZ+zl+z(QKrV~Y7#rS6!h%hIdA2dlN6{!{QKO~{^6kqBaN$Y=|)V9cuLft zV_V|a~pA_PKS@XGiH>Wn;umcqtHgeb5gRvCOL2C)rPjO|Gk+fR@QpL?LCYt_58&Q^ zUn*$Kc~UsLmzn$m?biMw${6(zbRWMpQMUObs4Ni)Hj=vwRU_`&-d35RU`u#3t_c6o z0ZsZJcrM{hfX``MY}Sn_-~}Fv#Qj4XE-8QLca8Yg`M;8L1a9~Pt9350CVMcmAKQ^h zeOacB31cVQ)PeO-kqj9YLJcjmCJHWa9*+(154ab%gX`Sa4*Akj_5S})Tq&mm_~Kb^ zP|$)JjcuqOTfy0a>wbycajTHNM{qVxoR10^qDLZa|Ih+Ux|gjD3ao2u@a)jKrWITw zyG>95k>pOx)w~bG8hxwG%obR6t+Z;P2=9uvAUNJyj0>)17Fz`BDgFTtfj{-DI!;Y3 z5{4__J|5eBQs4&c5zRiyz_T6a_fR?abx;3oaWW~9SBXHXEnuW_!;4|aSpC||UZOr>(%GeK~T6d!i-=4w&>4}kVr$jU}QZOY5Rv(VA8I$ zKn|M$o!OIe_2O`f)!LF zk!=0w65`dsI_h4sO>HW3_X{)X1qY?aBX$4K3C=eBzRY4O)!R0y3KA|pwmuc3#dpKE zH=8ynv)Pe-@km3)o(UQ$G$j4)$@m}hXKAjgA1dkBsHA%KnJ9yKq9d`<!g@3$=3@-s8xOuMQwr`F5|Sr1#)lB^b)>6)spMu8wm!U6#r04>pLenNlke>d}A zW}h8#;@%Sx_u^1ew%4+VfW*Dy#*N2`^L&C3l&J`@C5uBaZE%`rtih7?Y{-*^5=STl z7lLoi+;YeO5rJeCG}2sH?v4NS<(DZL^c0mzv#s0V@D)MGR0kwk>jcJFWGcBgJAnfp zSsK0H!Q@p&@Ic8J8EE$0g@rxAHGBRP9KuIx+iv zEnIRnZ}W5o|0jv9-2E?ECIZL84j0_8d-uVT*wm;kbZrhZbXSd9Vv*ubZ!kCHjJ?Aw zlFlI^wlO*O?JtUmaV24Y&e}`%Ap-o&+js0`-4|@4k>)~C{j@Y#MK=_!gb|@)I zP!hh&-CKmjGT_DWBJGts!y>_za6J;oMAS0F#TT2y>&Y|<#7ELbiAvV1M@WRQMpZHX zNfpovy0D@cq+?}Z0rI&>+XGA9vw4t7W(06dlfIA@ppm8{Ob|1+p1s(yHmvEK4{N_t zC4wPgZ?01+Xf~=)_Z2C9CvaRetHk37D)LDSi#_QjU?0w?DPC+>ynPyChkIdR)Nhc; za8=X#psLJ6k)JRS_^PlhIi{2%@!7Odfer6kwM_RAP&j$G{Y=%n=-)OB<*<5~M}1wr zRS!J-aWT5(N|FY-TFHVw%v|4kZVP%MR~&tFMADsw`ez%#n~%Pe+u{KCTB{InywR2d zDMup3$6Fm43M7rt>HzWDaR139$(}^Y`h;NtdvX+HJnYnms_PH711ajvUN&z%+fx2* zv)oZYa^e-=R*2Z8tVTPsKh5&0Xbw?KF4c0Ij|N+9$=8yPijbtcZlbIa-T;4)y^|q) z74xiLj-#+1aGisa_nPY8?zi>#Yh>ro!c86bQ-$I{Yomrs<})qFXaw@Yglkr`L*Lfn z8y&$&a=YS#CnEI_i)=EN%ex_U_zNo_A5t3-U)60eLk}-kb;)h@F^?3aeK8$y=)M$- z9neM3ausz|#XD^fzBHrmIK3hi$@^eQeAX=HSCVtj@HtFI^(7pj z$njBQor_l&IlAZ2MnS^_uTuEtqwtxbb@&4`pnTG%*~h{DoQr4NUnIex6gYsn#<2HX z;q?%y9Fqo)M0R85=DM4mS8uj4CrHv=v$@MK#=Dc9`^w^Qybb66rV1&1S}jg2gP>?KILs!00pkX1JXR}qqg z7m`n|53yfxedt9w7)29CS+hwKFUuG$OftykRm|C@(gsuALXFzQT}C} ziM>i5x{qUA!0G`H$K8in0G#6rlk{h@*Jz`L8{SM?_CtzURRf6b1NNCb>8wNjqJUux zqMRy{WgVTpxDgjnoq~V#h!#42iUH zFT)H28S_A5f0erqJrRME=1N&Ll{4ohzvwS7N)4GpsO> zqF~%wpTMLS6DJNCMP+8BL##J?${HToZpc4-x>!$kP%s+_*jR@M21^7ftg^@qw5l4A@Fg?6jz?7>vT8%8BDEMqCF^hU zIO#{C?-r+Dh-pZB{c?3OUyojuaqkX8IicB!(~z)RpClDRHTqfHK&YQEL(|ix1lOUF zsD(Q>B<#|;Bqt*_U{pf9B478FTZ#bIk*5>YlPIn0yys3ubpt4+{= zlJ~}HKg6k;vrsqy;~@D!mf7Cq5DXM7Y!ki6WWUu@Jacli$YQu0R~LiFUYKue zdCtJVj=ZmBvuzD-$QWW#%KQ)<<~oIA7qroZ%^rNHW7m2SQC&Jj7nX25vF`AWM2-sC z^*RcC_N2drJG{Op*52Z{+_o=}>`eQM%8gPe*cTSo?N4JYNqF)%^<=4^L`0Tr9U!jbSU0DvXvCCK~P$amRrfm_2o0}&c8fr!1&}kz^CMjg#YhEoEFK+NCQ(=pOImEjLC7U1yl#JI$JLAFK zukSrUhPaL#W{44Iq@oDO#Y>bfJrCgl8t!DK9}d|#!LlEzC8#|l zVRmGNuSJ-b>#pg7!(XqX^mT$GS;|jyKYAF$2Nb19F$%*u98nFYV~bKH7@t}j9nj>z zk$kYzhbeSD7fh@N26IP5Q6onibY@nNkRmI?FXuyhtrbJi{#dyPHn!Y+fSn zY(iap>?u>NCUq)~SnTztCl1APT{RoA$nx&N;b=Vg_Q~CQ^ujU(4)Xwin`58h5c~rf zY{|)^8FTRnDIbqyL3p}l2pzJhB9c=ZJ@D+u<-9^4Iv{|li^Xy>{>jieJl^x6 zu8x1s!JcS^IQ%6ogN*!u-b>emp;;V!4L8Jzvi zle0mNM#9rnS4*Vq5dH|2 z`;p`AC?2`B(Fx8z+bwH`an|eN5==!o}5r z#2|-1p@0~!7RSr6-Kjh(1)}iLI{?Y{F5O1tdGUYdI_{7ltm!(#B0+Pro|d(2-sol> z@yPO_k*Mjh0kr|F{Gi`DwUkH?vD$Pwn7Aj8~kS8?eeU{~IUij&DER|B}m@>3`n z9>w3&&Y=d5{b-tXboSx%e4nfyNq-TqBh#JH=1nF?W~cHmd+6A|Yq}GBXS2K)zU~fx z7ljIMX(@?rzZ}$X$^1cA^%4sGQX$120uHNHLSzq8>#nVi(!ys)uEq>5cXxLsG122G z3Iq*@q9`4jSK`peSMtKtP)U2a;^n%Bv(RpB4)2(XV_mz3K)@vBC;EnT+n0wtMzJ|K z0U{O(Raz_CyF(UGSo7jHaj-{M^k(o>>Xpb%;|ZLgWCJ|y&?^x8pp6ohtas9e(z^9S zj+K^dDDrD|@;QuL2{VjBdy|TKg@S>dxs-lU>E(j(XR9IiobSq5@^h06prp*~YA_P7 zv$Ug*V@=i7q|-*!T?asN@oL%5mBR$L8lYY})%5srsE$wGZW}SZ^7fY%8ukZ~ceA;; zDeOSrmrp3yf-@J#gPC!T?XCf02byM%OWw1_wSRg5A1*`aP#Y-%>9oN}fdEIIbLwI# zUX`eLSk$HMIq7wP6@o5w2BnHa|dW>g=xI(9^n=P*pPau?Y()6Mgo~tIZ~p z07s59ZQm~m^|d+~#|5?K`4xajaLy)8`bnat%&YBr5}ml+S(5@BiLNB2gkizhVV(0_7Ce4sxUX(mG%+@h{ z5rR)sgCo&}pa??6i{L)7x0vNcMLk>0f$YFxgW<;< z%YN#_iVX~5&$gFPr53Aa7DS_F1&I_XElH#Q*hetnY?yCMj(t*%1YvS#$?_4xl5ok~ zt?rYkd-%Y-IvEVnlUb$e!&_JP)hWXW)e}{fcW#GL!9sDI>{lAM6VSLK9qjGN&buY)s^B2=BwBSL!oe*I7G8-$+!3MC zUVt2_tQ0!T#Z&OGXO(p^WEkcs&!7Aj)UnIAept%jm`mW7g7{Kz;HT7w8*)LLVUy_`sH*M z$_E@X)ic$h!%H|}A8VhfZB&w;OR})&ODmGFW9=4pRY<}uH1b^9`T5Ji*Z=yZBrp{n zr9|)*{(lasTVVKDU3g@>sFELCE1=k!;jwX2+88W{50s*Wag0zIB>8ShY!s@|KboTw z5K0##Yy$rb-z{sU>7RD*MR8yGBI1#FBR0EmBiEZlV3ick0|ro-nd(pl=3wkd{-tGL zFD{3<@Q^nux_LyKz3G5s=!-d3fh1#5hDhc5EW+J$8IEtb`np@N!>@O*=3rM>X%Y<>j|L0oZ* z7t;wwWZ>mvKhKVq%hAao{0SGKycDQoG{W!3iBN!%<$OHxA4)Q68L2|O>fp)62Mb1? zOSu?|eW1vC?J#O83?E7xD%vV089(IQJ3vuLevpcuqP$xmh5O3`XbN}pGzSicg9O=3 z=M4m5kZsVsBpAx-DLQ1d?s)l#N2-f@+rE#BHqH%kC>&*8bPhp5QTUwN$RNpg**+Tf z6>%Ozw2;}b9WS=~@miRq{4^c$Mn*uo?KR4#PJfnil@cOg*KJSUuY~6i87eI7)FnF( z;yH&h?Q5%QcMN>@Ff@?yMQ4)p3U{8#jv00b9|UZQ^5I3-A<1`M|7GiFvur)uC_N4o zqsoRecqiOTFR5)2S00(%(D#Tf!M;$(oKhIlX(Pwv)19-1YNkOkL+Mzc3PCn)1jBd0 zBh!2B8Uxq|tUceM@hq;p)LRM=@%t0j1vQp=GKc?+Mhf%EQUkKmOta^z4mIMlC)e_u zO-No;$`OtpfnrW687_XkpeS-UvN>kT;68j5qE&rE*(wm>KO`RRD@ z=$^J^bNQZS)Judj7v_bca z07ss#oN0TM(aeH$7+5NWK;)nkafBcV~&9~YH^mMTciI08Dym{a% zGPcp`j+fKz%@g2ARD?;!o6t}ad}XfYZyF|lc@;F(F_cuqwK5&(`|(IEtZ zl5phdr~(`F)CxiEJ4l~!lg5@>#@9FwuY?hpn`Zjd24@c% znQmD+?)8X1n`OF)N0vY3LUng>S(%A&2xsZLiFHw1Y~DF?9=?J6OE)?Deyi?JBku_N z?#luTMDNW*35hCel#B*Ef?zrY%x}a z;npIMHV*h2qjTic0?PSIM}1#q-%>_-tQwyav!T!uP%q97n3b!AT^U? zym@>IXm+powug{iyecuek_L{IJ%ZB?u1ykaWP0SdqnT*m4oGsouY;(u_o0+nitabW zj;W$><^^?Ovj<6|sJ9x)ziMb5@`EZ0NUIG4NUm#9^KhR5O{k#)TL+Vv9-Y{%Rt}q1 zMTt>`CGqDP0~NCVgn%lYcrw9;40RcP_4_}XM|a#26q%2%4F?VT^-(z8U=)#Z$%A|G z=N{6h3|9~|ksLD5Z*a86(-^^#*zb{s=G5Vl_FmtK8YW3H5(kgWQl0FWBsDW}8;(pj8SxCbJNUm$$M5e@cYpaHM4F%jyJ0aq|-(V zjyxCAX)wZB4I3$?bn|SEqo;Zf7(kLWzJSk>ujvceLL<-3s1z;~!4(adW6pR~ z%n_ONH!{hW**kU*YS%G`vt^gqo1v2Vv+j!;hkMT2C`DGC9^Yj>ODr&_l>MrGDa^Up zw`76RBOh<=aZ&2h5yhKi%66TY0yJB`^fD|a~gPo{ky_QVlq3(~Q^@OPeqEL2}J2rfU zBCj@{RB*|BNq1MjDq^wPlR>P|7%44S{2$Rxmr_Rb;aNR<8<_c@Yse9p6R%9^Fe?cap!)?j--V zc_An^JEIL35&M>ET(?XA#GBe%t8v|h%^v)^skT!}mJaWXT6jkQBK&15c}QOBo#XX7 z%V+AC@!i5l3zL*r;y-2O=WizKdyCoe;rtPz63kZYID;yj6;P61ub-2ZDq4=bX%>r9 z%YLQDaD-pF8oak$?kMD`)Iy7AeOD<*6KJy^xyLc7O# zW_unL9^)1aCOOZhfJu~Y|9P@pWJg$!3eBMaPmtug4x1hnyNm~UCZRdvZFwkWXXcK~}@> z(4SSzw^djY+t3$L*&T*-m1cZ<-l{%lSLjO{l8jeW)YcObT39$VWAPYDhYY4be4pAV zQOSDa2|P>hKA@dvaQ8usR+ccfoxIqw!(R={d^(!YhBP31KRSDGM|*gndh#c%Hmw~l z1Iv0!A?Tup*ZTNLcc`M7XU5LV2KJG91{5pXQ`%Hp$lr26G9j5xF4EpHh9VY3K`-{au6AqbiT zPdPd7Pxo=Z=@dNwU|3&Q@N^NeZ`bP14ik8b*=6q#$Qvk*L(^=#Q3Pai_r~7Sg%F`A ziz89L*@M%ekXP6J@J4!K?{gmZESqsSk}y}yn|Y%d7x74SM=z||&6gFmhEj(!*Tg&S zXNnn~zJ3X|1nf&)fTIF5cO`Qi>>dFwVUz!Y@q-b;Qto(W+#T8*1>wVMgPt`Bk!;tq z$V9n=Q(q)?4h^Ye?kB9kdU8lJ(jdes$$UnQPOr?Wp2M)M8N7@Tv7X{ET1Mh}fw{S``;EB$a)e(rN=qu1}hiNz2cZy=O9P_yd7NVGLp|Zs4!r_%;I*-tg`;ps!i7-hZaKK8ADGk} z*@jkM>ff0TIYOTG_rgL*tv&{J=1fyD3@Z_3!0aq^B-^hQA5$n&+{o;Pl=vtizfLBX zZUbV5OYRGeMxK9N5v&}ht(rQ%4M(cXzZTJ}Z_~dvz>%m{UK9hqGsWw(?&XfvyTQXg zf|B=F*dGS)=9;g>N5D)_$275)W(!65+sP}_IDgXagtA9@@im9;qygkIZJOy54vscH z`@yvT_ZHAq$~7AUYo64hh%}Bs28j3{l+IkJ;f3NUlht@RElVsp9yB3_?MTzkCTFn% zpB=eq11GB$(;S;|cidz`B;BQODh-}2;P)~c{D68=$7|%TH^b{tCxl}z>~md^B>Z@j zIPiEf-(OoFc*n(BQBNayL?(9Y9|RzTDwMGcENjDL$48@aXCWPjUCbTE(9Ou+eiViq zA_tryB$}SNIiTS~8WuUjc8ACjVTDzPPhkUEm0ao^?9W+QUEfc4u`ZD&7@au%PGr_+ z21SmhI*i&}SEIwDm($&BvN*Qa+G$mSlJ&C83-RBSoZHb!?%u(4W_9KcPQ~HSYNG%R zoH0GRYRji9h^~ct$Dt;!q**U9N%?LgaL6aK`W@LtYSIRA!t=C~uI!4=8__{U{sxEh zZyP60(I$C|0VeO66k3enFKDMSMoTSh;%#L%g1w!&xJJ|IIO2X{!2L1oryt@TB61^iApXCq7+5Ua% z$=SdV_C1yq5iOsTPRKRq4mU@8J1fvgavnu8nVj~!oga{CCOB@Hm*UtfTZJ}DEYe&u zBFl8OB~dH61FS#;Ikv|g)AcB&mR_O4g%y;()E-In2orDYSB7f0hAMT-ZdulkWiqvG);stvs*qisUh{ee~ zMO~~$dlM<^y@Cf|o>$iqC>`PW{F|WJflG}$`g7we*N#tjSlb&IayLzjO3oXduRsD~ z%x?0OD%yYg;tL3ltHII9`T&0TsO9>_mtUv`+&lKf4uc;2mtsl==z+hPz|T`Wb3`?m z)wgimWOF!lUU!JgzMKB>NJm9Gwws9Pjt!oOJV^g<#2iqDK0Y{!P$fP~kaSM4Dt zAMMk^`QUpdH5YG=iF!2@*?=4&ss%24QheLR#?CcS0oZ`yL{u2Q9LHth(h`hlibkG` zKL@2r$PX+IN=y`NM&0p-iNeS1z$4jZd%-~F(#7%kAh#JiUUK(@YGIP{wuTMrSWdQSrs}uOKQCG`v<(A8oBq5aW!}n}?Gj^GjKE zxZ@sRlu#8oa{W^89Jw3%KW^R{i;IR}5cLcSXUf!k_T96upomtqDrdn&<5 z@;C6R#+=W>O8>OE-&PV$C| zT1xpyaJJbF9eSOLCv*Wx!laUu7Y9A@*q*JgqmpZo$Z*l_xv1HQ!W3EDoWp+7z2hcC z(iIu5kf3C`JCPfo8AOL4sP3)RjkX0#-cQR3)k+H=m4thfEIElI#!GQURo3mn(ZR*8 z{jFSsXCmubyQf2soNY4=PI$Guuq#L+eB8vRzU^@G+84Vn(4qr2)n9+7yOwO&d8T8IcgTUc3k6F&iRcc>H3BA)eZR567{j zxMAXWN!X{}+-NZmc9g-*dvIug-A2WXhW)y(yN*h9&{pBHi_}IaXkmKdu+Jz~bq6!R zhNLFM&%!9e9$6pP$kP31(37UK)Cdw+&yshkq zZgTd$sR~IOS>`nEnsT@ljNs1*7dXC_6g8=Uj)yi{lAOYl_gCqCAsLZXob`wb&4$zU_K8M@Gwm$OV<|#q_8G@*up@Z)P44H|DCF3s zv>dkyHxIj&xjV^7z}MG|L(f*J#=UOEm;#cFZoXyCZOOp+^)cKhF*LI14EuPq9$Jpe zfa*-TT@bQ&ze{=Ct0hz=(lkCVY|z&J`S0DGOrRaf;cMk&b1HW4J#+9ME$qd_p(O1% z@&$a}7Pid5@Ll1k1%%k@3$MQvHsvNxC zx6s4NPBV*ZkNO?~Oh+hIXBTwOOwq+8(^+6eB-gWFzr)Y?wb9=vDt7FW=0p!^&|&I) zbuvQs8Z%gqeOzJq4z-bElJP@Ty`^CFt&(ae{QmE44vM`*HE?UmuGW8jdNQrkj)RD>lX)qy1lW58?%TQ+ow1?ygL+D3LM;x1o z#btNwSNCEv+X@wXc4luj5XA^9Qw$4JfMXQ_fV?FT2`-e*Y`N{+ac@o_q)M&iAD2w& ze=j#PaqEi{RGZJk^-Na~j$Y9+)L#D&n`h__IQXwx*ES_O6)#8VgCg~Y1f?SZ+5+Ap z`(>R4hsvly46jBs`tTxN4x$8E60j#18`%SD!+MB~;~G+vKnxzq?v!sacp*L?O;?lE zb2!buvPMM5qix5VaE|(x%icsr2LJF81V=f`%72uN3$92Y+e>QG)Ex+vX75FJP-9U2k>8~NA=g> zxTz=xyPypNNUm#XzA(e&WQDgkz}~R+BC}sRWZ?u=PQB+AnAEMhCa(&`Mb9GJthiVP zJhC*|eU~t$NUrz&*}@jzag1hVdNot~b|L-F{Q>t&nW=!Yi#%@{2#f=c{I z>oi89$Y$;kfkVJ>n4cSvNq;RV(b9+MYEiMtITlAk;IpSz`p^KA`by&<8Z}4Ns>lvo zY{f@3M{p9cc-W<1tq?_~?6~d9HsDAYTsTR!3 zbF4yD!-ct<<-I2$xi0I!Q+3^s$0L{>ezp_U@%j{}%9lXHIK~SUGlV}`z?IZm3woxe zDn%<-ur?ZLuIXtJ4~UQ~9(QPn{bn>BJAp#+>9kS9CG({w5-nzPkQ@BmZgh^x*}#yu zX@c zonrElwb4t!zI>){C2DeT-A1QW!HL9Ucw0dUWI8l@Ytm0AT^On)G$v6r=G0pwtyUB- zP0t)xFa5nBL8Mk613Pn}*y=QZUk=?v1C5P{$AnNzQ zQG#0Oih`&|)YE;@R59*=Bxj*kECOyFGe9+od>7hKwPF)(TQfGT#?zX$!EqPsJ!oLY zY9aGUKf=kjH{Fl3}Tl5_Mk; zb_r^!XGqR9J`sh)9GgD!1T9`>k#P^XqpZx_U_ZgYBf6Eox;uZrvW|>52vqS zBS%Z_D^Sj3eTn0rov;r7i8e0#*8ZZGi2XWmZ~C~=jK)@3?bsF-gZ$bEs)Gnfu4};o zE+qVwJR8B2_{UW)eLE7G;dSob=NGL0f_K7Gc8!~fRdR9 z&){s*J>9$r6B-{bwSp=v$7TmUOGYTMXFXofvqV$h#Fu6IoHw#{MLe>cZ_=D>vtDRXE6yQLG#Gr)rrCld+hsV^O<&Pa*?ihP zKKjy(tV7}1{5BbzX7h=#WbI8=D%CC#GPV1FB?s?M#vv@RXrXaRw%RpxcHvgHn|?^5Y&zj6PosG3fi@s< zXs~FE0f^xL^UuHdPrs1=*cq+RBrh7(VXy(?6Z5ZRo3LYfb}M%+EQy;E4l#xZdI9s` zJ)520XnJFk1dmLgBxAT%D53*WXwa^RWamhRV%QzolM<{kxNqQKkFMxF1se}!094FD zu94vi)rm|W99kd+;;Yw2iAvTR<|vYrZ4i8X9>S(-pWbodPGF=?Ej=_1H0hK3+<_#1 z5NoD+ScgcFyU#U1B)E*g0Uk2jqvbJmRbtS@z>-Il?^$D= z!-J+Iuy3E<=*c&^dVj~z?&h73Tj8+GO_+xLn%tEXkJ7fG^PP7^v zi7vtd z;O^J=o0(>h83^nV00axYTMa1R%m+w0dC31V0`l4XI&qEGR|c18F0umJ=lTKF^iEP*td| z;IRaxA*t|SG#*cmtWYr8d~L~**_Zsw9y<09Wv%x2Md=-_C#%6W4!zyy7?U-=mb+cl z)(r|7VsCRF3v_m}__m*u9ZmOm6^Us%DN=$tW~0j1?20x@RI)M+{|e69_U)Y7Vkh|r z0}Np=m3MeLew%6NkarUdpCz@DVjzH$@?xfM#55IOEyL(Ab@nJ56_Iq;qL|up>#i5_ z^60us>9-0?;?Il8Wn*;Vfr8Xa3t0H=4Q=PGP3CSscJNNC21@H=Sbsw}3l(LR9QrYN z|7|093%K<$<6w6_#mw(E%P&}F?p2{dawLMq&I8*<;XF1*V1L zg0WwznxSD}Kd#4M8!;;2YR7DmLotFB$p9VxYn8yAIxeX%9Z`KW*b*hufayym`GZxm zIRqD#`1sIWm}Gpnx$+MVUsxrv!-=|n+b0s?DRX@FuqTeAZ>lGYTmWgCkuXP2Ud zA3T2`e=dg;#FH2jhgca9I9?Snve?vHAv7swA@XHNFjHE6b?UIdCOt&ZQw}XG`Cq%gke4{boSvhWa&6wPiKSsCv$N$*+P<% z>8nSFM+g$Y*^R%&hf=rfD59>w?29%wv#?i}@;fgsFMEi7H50+HaVHpdBDLa0T0u$q zn_h=2$%HalKtwB@yBtYd+R*Gt`-{T4E8}ACE{HN~e0T)A%~F0WC-Pp*a5yd_3c@~U z!y<;Uc$o4LZjIs1Hk<5zA8hcrv%pl3Z+1q@N>XHpn9IaFwY-Fznb@~7fn$~v1S-zy z%4Sb;#481B1f;C)1deqccIvV$&M1&Yt-Gc zC$xhxUH`;ZqK(HP*fC*}@hp^JtuVi$pr=FLZK=_6BvPDjD0pg@DV-exZ%NX^BF)Wu z);-B|i~E;dR*rpFtRPXy;EUUU&MthULmlpz%hfXxA&Q^f3 zKgG9IDt4>GZ1P|RAC&o;2?+S4rel8%vq{Mq`d2(lk?Cr02FG;Mzu{X`RdkSrH(IKb zf(y%*{$CKm$?FLA9TmMI1-Eg=CNH zSDL2EvamnzLXtz|z-VxMBmw^B1$oqi_)QXKFvR{pD+$Ezee)=!ILo$ewXN3c6a2J! zs+=OPnZFNwj0@uHwL9RS$Kv@{CTDioM*~P0t12G3&aPVaVHg}=BbG5D1f~*=H0P~Q ze>{J=99b)~L%Gl)&POovoJ+3B2n}brZ+1=TISF0i=88$S>kwyI$oG-T$!)u8I~c|x zqY4(suoslPpEcI!_Wl?@i(#mm8fI_vq;7!mB4w*zORgDqtNE)o1#jF*%KWa+Jwozq*l1y)EU^BGdn+jIr#ctzkDc;h~;takmCe^q$N_A1of-0 zIHbh`$vmrL=q(_*?N@reZga3NZS4iZdu?j*p8a(5wy>0N;i$cMUu@T?rrN5ib)WWZ zRHZIzx;V615snYK37U_2*~kVlRoN;Jz;~GY5)QdjOC*jqDoKBvbWGJu!0>OJU}v15 zW+g6-=9Tx{6cgqtBI+_Gb}p+uKHbgBz&h;y-Ofe98<%@1&Z^s)? z_N=A6j#p161C?T2OH@dMh;4l|-b8ubNx+_*Q^AeBwR9|N%HG>F+q{1 z?3n7&?QK4$5@Hy{hUxGqqv_cY9W;a^M=OMnX}kt6N0~#2V`pmizic~fL6YriyHc(k z{~b929otewB4H0IX>V^7jLm`PP!l(Rrx(J54dtWgawiHNy6$~5S#KS~#cO%;XdcAn zyds}tW9akas}pd5Y#QP@b~a4@EHc`$H`Gjs*cBT*l3iZyA4;mt!PYlV9zT=#$(rEh zIE57_tlKWo@PN8gVOcZk02N+wl{T;4G0_!;jM~T`$#+Nl)_O*mB%rZgBMCb0ekWL^ zhTZXU6|?JkOM=jsX0q0a_Eu)R+-*u9!*ch&Ypp(FW#Z&A;T5nXgrU-eL>$A{;1i;2ghzz>J)Jr=J%Q zg7h^w5`9uR?d4d4SJ6K1f-Bm!q24ot;J5-SY*?vf-PI}wdvs<#583XXK1I5_qM)C{ zRYU>Et&IkaEEhDI=*g4&59y^W8W8i8J#vgLJq00?HY_69OlY<&2i!#7UTAg;kZe5c zWd=5DuPNz5pFQ)Ojwn8zy>TV;arL`y5_YCc85SHIbmmJ{w`Zu3oDIHX8z`(R>{jt@ zCmp+YPHdmkH65dugU~ReB1nFyVB)Xx+oYlheM6%Mz!CzE{_T*=Z#h}UAk4*OS zg&X_ZO}T>oTmZw6+Q6xU!uIMI((W@Yz>(;R*k)wFrLA-a#W4Gdv7rkg^^gd@#8Vg~=Om2S!qhS{JsXyinb zTT9)2*pYZ6kIF9rN%($aNoYRFzpc3fm^dbRssLg~Np*2k&3hRYvymJ)>B_jlrxkhaRg_Ng-IIxM1CpaD@}Cli_hJ zo^D?x1ti(!yi~Z<$|$1V92cRU3gHQoj2)2LF2R3_f7JKDn{^j7A{P>E= z70kF&K_#CHV%j>hmBF*i3 zB?Os`@o&uBaL9QI7*@w(yv8~kAXlr{%AW-tbQ_($C<2_T_W-86G~F3(o*So=P}-NA zK*#=lDCyUsw^>D|CwJ^zM}&r8Z>2B2KgI0S}bP8m(S$O9}w4NhB>VI zfBNDJOuE(J=wy9>Gjy@s|KiIp^q|kt*^~Us4U`;;t3mt;sk~$Px502Y`7s-R$DVDF z*dg;xC@rVhB!9Q@0bfD&U%Wtno1$kU=_Bk;@eWo8|m1+O#N9g_&F{NszT+<(?&=O(l+Ux zRkQYVgkC}=H@9X5hZtA0VYkp~kF-L;wM-6qvqy@6p&#kHTf5^QMPg_tWcY4xRYfQ?a^!Lj;l~4)kY1M%BWHBK+jA9vX)9dn|A;czugiyAm}0_mKA z#_s1y=C0{DpcICT+Q>1N2EE_D+!&Z{__mQfD_i3cJ z5=X`;ugi&bEQvMEdv(PBCOGyXwK~8#4vikoV*()oLZLT4;QxcbVafe~6;SJdGoRLoGiTal*UF z5>Zsr?KvK!D-lIRBU9tXKMij8?J%1jH?qyz)`&-z%y|g6_Y<2d)-lt%4Xpt#5QS^Q zlWzw+gcmcYLCvdi3|pZvw`k<)DArL%mN^1(@~b3wy8O#ftRvuuC$(}N1i0*G+w=1D z@K*>jY9q*r0gp^~ntCoFo7O*%a7bfA58n@`d&8_Ms3QQg!6bRp?4e+9{+7FA8I9^# zb9Ogu;Sl(u&3>8k&$JhW!_lTYpJqZN-TUTJ#nkL;NXGYJLc1rGP|d7$9Fz%;X{o2tx^vX1J6!e zFXuvtZr+CS&-B3I&6BXmpIT{_wU9}EW_1``d_pxzhj0!naBON%?m^K0(L?hE+Y2rO6~ZO(Xg_E<2u~{u`5lpIo1L$d9ODK zVPYZ}q-TPbZ2A)h#*Bf(KGc~3rUD(Fx^9h!G-asW+UThC4KutOo7`9RC2{vg66>a9 zwIO$S#3_<__Z3+3ejxw4%wHb;rw4^3@5ph{AfD2@z7h9Z$%awRB)d#Fu8+0LL;&JL zUr1LXQJ;znF(Oy21;8OJ)-FW`k6btPbsQpJP&)IWAec|&otT&F5EFAW^O8F#*pEx; zA|Un%)HU4WUBHS}p6xBSNZ>M%A(HR5ISYf1e2hvYYdsn*v*WN&fPCiEYEY#U3=x5}Di=8hu!ZB`bGOhrX);A#2lYW0LQ^c9gu# zL^HV@%cdG`Paxu77G>qu`UF~?xUz@g$TB<*&4p2VRsrMqHN}i1tPHxOota&xjtQ&9 zi^Awt5y^JR`aUlZ?nD)bc{qoAS@*TPfh6IzvlAo4@vvXFaSSrL@SCT9-bTXA)l8xr=BvRB zeqH<<^LiXNLN&U3wrX} zvoS|FGM#PQO_?|7FuRZT4C3bdDE3T=(FY{CHYB(eb;NW&o*kq39{dE&*!Cn-cpZ;~ zoQmChk6P^A9q4{wBFb-5o&y@c%V}Hy5&ulOZhni9j-uY23A=Nnt`S3ES`p;p zuo+q~z6Sf11_dZS`%sbd=9HrCGUyReR21ry^AwVlw?t*XI}n9^^rMga#4xH0%`0%I zIRjo;eVd@ez{eY^93)3je~BAAs*4WxM{5K%8+ykPTe{dEetGWF704lHck(uffh|dD(Mf2C+}Wr0zp#!AB0w56GMzcx{fB}4 ze=vEqJC#rz^C}&(8Gl*QbC*bDxGX^>vQ07A9HFqfdtgY6P~4eRxWkOZk05@7LQMJ zQ?>+bx^VT}eue{0-&! zexxGpw9!cO2eHwGBVaW^lFHFqviZa_;lX?tW_Y=J-~v30nRLul`VUzhtKI;tqmuy3 zXFfd}dwFAf`U>axE8LF|8MrGSqa)A|Qo8ApV@2b)!x7YvO6D^<)3B_ErPqk#NYCe3 z0~82UID_JeRkI-`YGT#vDl&PF?vNhx;JY4ApX0tuGOF@jHb%%0QZx|Co~p`|a$*u_s9LHhn=Zv;hf z5YwZf5kXHoB9Tn&{m79bqrv4sHO&n)?9~Okkw7RD-$FAyJ)0v&a*5QwUv%#z3P`dW zNejGna=5dYg%T0)X=8CoL+X&56Br*mwW`ph|Gd7{K&pXe7v__>dMHNunr+RHQ_Yv<*KjKCS4sDpd{I!eA>bt4MR;&@I(GDVszGcSg%l zNqlg3xlbqNXCWO))C`spj*c{036qbQT73+Brx%Wxi*)ekdHAqI3f|0t!m-Ci5OUW6 zNmf{7#b`8~PoPA%yULqdWZSr8zKS$=(PR+v4MA2~!t*mHcIcm4NPON_o0*JS$l;-_ zSJQGb{)u)oY^K&(%5m;TsK6T>r{Y%@mc)Oj)z}Kt+#ffKh4Qw9uhL79_%_GzC!ULi}ID)pNK)9j{DGa_o(|v2*0LQKFLd;?eX7D!FY$5yIIG zx+s*pg)D7`*R^E`3JE&^$<}51f}QrSmZmIWvj=C?7$sltz_Hgl(>mT`VTfvw$nd#Q zVl&PzL_po2jv)wRap9)4b-aULGo#$&L8G!)LgqlHmb#M z0?e@YXIhpXC9y}#B5>rmwZ&thm2ED5tY%hq2o~Xd!Tay7y__?!BbCV1FxkGr63Vw@ zkJLOzT~z2d!j{oBlNFp@xX5G^2T&#NP3Z_fEF-HOu>=W)Z#lIrCJApgUdnfmU~n6U zQ&BEXvqhG7!STqQuE|w!_8=v+(u+#1mV)D%VW&hS_FSh-)gCa%DXXb$&qDqIyb_N^_uWk? zQbj)or{Gs7FrMK~kmn2B*}U85(4kA2TW}vAd)UNIEN82O>0T~s^*APO7PT5ka$U44 z;`QQqd;r_Fc?S-EgKiyhLL^=K>UnoI*|UqtAw0FQIFH(26yW6lD6bejI^LZw zaBBZF9Zv?;5_$i!c~ZAQ*^%}aQkS~U!XAC$&mKKlF0*}nvbk?NZy@s z>T@%B9NWU{_cHRai>X3e_)>i6p*5+MBzwAb+8(M%s?dDT`Imis?BVU+nXy9M8`Cex z<*g04dG3*cJ-L)JgTwy{S*G_UNKcMkCPAyPU-pb_wNEH%w zB>K(K3~%2o1BYTc$KwFxUlt_cJtQl4)p(9rGJDwfyoZEz3VS*6!=PxjhrGapOp4Xy zM|&hY4oJo0U}&QgoPD^int;cP{pY9-vSb>ND2WcHC>&v6M=s#T3$bSKXQXR|`~|H_vZ1&)?75|_zc+H^hP7$yLNyf9r;TAI^lczo6 zX3Q7H;jO@t=jy%1;>8sCxE9ce%m&}FX8cweGV8dOhTC{hPxYXZ)>mVKxq!`-b~r-j zTN)of|1#a5+BGHu9s74HZTO-g+nvl1=oj1!R#@`$UAxhETn$tk&+cqQXD7~!kse;Q zI}3&e9WRl2*RF7f+nEVsDZt3nsN`iEwe{S3=Go?ZVt^w@D+3H-#iY25#4XPE?La#A z4D&o8x+eo9U!Ib8IT3GbGnaZEO>bw zKWC~AOz@Y(Su&j3x&EdDV}MEhOLzgoM;_+yu@yxf)6IISwt)zp`7Yyea*x9|@?DO2 zq`K7@tG>tnuz1M?8{tk27uB&fb9-E3B^v(aVj116Ho~(Pm+^dJXnL5+zWo&3pv=nh zTr~qunA%;Kr2KWrf*k(Dh!`fv)eU+nXr@S%BN4yRKLQ-S+PNb1jr5NVB)M+DMi|{9 zG2S6H0lka%;KpU2%pn~%V0^l!S;G#mPX+gHqhlmW#XvirourQIq2iEO8wDsiuXSWQ zDT)C*3>l7GCxj*O-)V^N>o`;ual(y5)vaV+NCt&qDu23IKll-v4>Lm@5?8|GXr@*d zIv)nvrKlulKV1sdJE)-hR#W= ztcZuGVRhVV6Aqs=wQ^LFo=Z17Dhf;g3de*>5adg(79gqe(0SZC=GK?iAtm*M&IdeF zWd=SN?r|fYS)Jb-8Tb++>3$bz428$KrX?gRau@2L2?56#qAicpHiJeodCmmET)BAPDsz=xMYmrShb7e}bXxRzNy z+R6Mn99yOJ%Pir@^|=Zo@d0r{(!(yj5ehyJ3hSH0u2mp&5Q=ZR`PjjayH7UtH!7lb z{_QOvp@xXPdWZLR*>=s0ICTxK28OWjst8sI{&8RzLRf?e11Sc(?$~5;>lO`wd7km+ zfoxDu8J(O6*}E%E4&&_u8CP7`?~f)(=wLeJ5Y8GP&bOwS>sLG!nLA)Pwc{HKQ34F6^IGUgk#5s=snuvf0xC(bwtRZ2+k(7! zI62(OQ@%M4a77AZ-egqHVZ*~VF9mw1-Kpf19TXCphm}($d2)8blJ(lp(<838f1Mt& zTadhua1+6u-mYTDBvU9pt~P48WWIR_RdYx!_XMA|5oHJy2XfP_hQ;3H(IX}_(r*A~ z53U41=Ry2|_k1*&Ea#Z1W_dYovJoN7E)%2E1|{ir*&8I1MpGBn1u%e?hk;hVwkI*e zk0M$|z58Ff310Mp+#!j%T|M z;W}Y+x4b!Df`T)# z_|`$pE}uJEF1YRECcvM_sAjt4xJ)Sod!mgtUYG{Dbi}=sCT!s|T#mbxf|&JZ5y|#` zZu!Jfs+rG@5KnG+9ZIDfF7RjGsW}IGV*JpT4CpT&+;KbZ@I!9_lI@JFlN8`ANsrBw zIyBs7p;;s{{6=qWlJpIpf75a29rX`}+Y_-?i;nm3uxCx4%5Qlq4fR?~A6|EcA(N5Z zb0Z?zJ`Pv2R~B7DWNWqjwAM^bKF-MHn5PUkxN5ylFnk?j8+8c+qYByvP(bsk=jz>rl=IEOLB` z8P@IQCL0jEaEi*44&C4Qbnb3#rtsGDC4lS+$M){;*jW{%x~Kvo+1_C~sKUwim`y7O7 z40B#5#i6NCsIV6l*SQ9l%(rVs5Y1}E+rHWS9T(aJ$PT1d%f@2i*^P@88GF38`;p^} zQxsBbqb0TrB>9+7I!S`aWn-Sw;rCJ(DFul5fAGbRh-+E&gf$)5-+XC${UDMyDLeaN zqY}-EM0J#*a-2z>O3`ix_T_d<5^H@7f@fK<&rzF0=0foL3O+6^)Yiu~0Xx#pb#nC5 z>I)qrP)E$8AQ8TmDB|a-l(iFsHo|?)G;nC=l1-6QKDE{sl$2knfAk8KnP%d)$s7pZ zZ+-KqE`GP26dVz~3eTQs!^_1UUVDJ;;{J4mtN%(YhWlb>{u)`Ik)_uRj6=+y0BScv zu}6K_WKZd5?njl&cr;(kC8F4HJ5=&jsh~t9>-m(dbO|3P2}b!TQ{nZ@g3W%rZP4(P zs=R)7qUvk9Z)DX@98al099?acsARp6SEVck2ZzEecN%yo?zv(+3TRr3W0@>e~B+NA7k%sd-6 z>KGNnR_-wB@D~df={9bREh$ zP`F6-tbV=OD~?%+1!#E6=7hlA5GL0}#XHqOnPAA7T1-;ZfRge|D|-NZO;GO1Y^RR6 zhmNx}f|2B-mvEktxT5dz^Dm>>@kDY>;VzAgr2|&f!e3e$-XX*&C?8TA{S55Q#rDNo z4))*_Y@XY(3w7MCTYzNy5GNF5IvkVt^uq~E1M*T<`d5b9AvEdl1(7MWdI;DREuY&i zlu#&;944ulKcK%%LZeT*ndPRDl#jzP+#AFfGK;oyT-~}-(&VswKuzI0tBuCj3ga?tV5{{P`R5rlyug$huron z^wWNdZjekNe`PC0Qnuo!Y&{F%$`vqmWv6Z3DEM40xOazyaRbfI-_Go{{ofvSLp%b^=o5OQe)l0XZQYz)7F$KUMeU}QKP zY6z-Jpd8c6W}HJhQ=JeWrwfye#?7IS${cFdE;olJ{^D06Uk=tR_?1aTj;u=d)mx~_ zn895earMP2eWNjJVUiJ%<8ZJ-@WJ4_BN4u$pbhg5yjc-Q1GVw$2>&B%7&bh+T{sjB z37u~*wR~Lc-~~9x!*64E@|WpqDxSVS$xpNBdM2#O+XBKa)X~WF?!JW5qkL_s%wQ;b zM89TDAV5*H9~i}$RW<_*uNZ>He6kivU^^5Z3zU z%2}9IIbO!Hgk<;N@6$^A>4qV6Mh$*tws%xOc?gx{@zSb69CvcXWM8z= zOTfN-0Wm)0z6~L*tHE;=*^q<{GU3#-XLs=&E@VahN{14#fM@@TZ#R&#t5PDbyJ%iW z%nvnswPN1CZ{G0zA^Ig1`v*I?WLV+Fo1a*AQ$jA;GV92(J2hw=vZi^j2F@OwJ6NpY z{kj(G2t~fv@NHBGl4_%kN2U+eC+^RoG>lG^&Pp+kNC|}`vo`wh*^_Hk8*=b{G(+yV z`zI)NA+_4Z=?F~f|6_}$GRepM>|S(>yZ6nb(5@QIs;czW=D8W{WSIY`r)50lUb_Q) zfQxYM_?iXnC%eyKDB%{I#V|P}-j<6<4UJTnT2yUE4)cl}yM2Yrz>)0S_y7}eaF2hA zh?1AYb39al2urVmMxOJ!kLmQE9A@{09${V&XvH9vHVh!SKJB)d#;Jz~9YWh@M${2o zthnUYMroMMNZ6;OYf9G3w_M?-hD+x1no-u`ehb%(07}LyM(Z4^{7R;w#Y;2b4$0R5 zg$dTK`)i;{eYTz0JNQ2vPKQ3X*O@wqfcH?y#%yJ1ckN~((}aBp3BJdy>O@K0bnEBM z`x<_^+|=GiKR9kpx+~nDvP)6VR78~5xHix(F4zZ+*$31c!8~No;;2kNEKQoPHTOFI@}Zh;E?B1ZaBWIbU>bgtJ9kRcO-xAxs(xJBg=!^F=1c?kShM^ z)@Za zzI%$R4rXyknv~6E$0d?5z+DSW$5e#vd!t*7OiTdz>@>Ubij4I zD^}=1A2iu7w`1KxEs#nnV~2XIjT5<>V$uefyz1^1ZpnlBLj3<0$98Es?nd#x92mn* zxqu|$d6S%Mv_ysX?0j^rB*h?|Hkj>90m=1&`ih9V32Kz8)hg6g9`4PuBGnFgRuRdp zjUIUR!-ivu-<6q94#~Z~o{2<;n|e2WdOTCzdMthW7$HE0&ar1J+JV{|__+FQ2M0TH zwU*CCW>uD3!7-B?B(gV6I5)-oGZC1~w<|Jz=s(W>Ln#PsM!~U*C?M&z(Yi5Y=81xse?2d7{XqZQ;43?>4UV)qd7$A^vfLG z)Jh+SNy4kS5Ersz?qPKsQqPW+rGp@M4?OwLw3YLv*480`bg1TA%Gy-@NW}VJ*pT~7 z_yp;W3GAYd-8}SY^CXh#DHT8?E}vPy^U!e+uIPsM80J?o>Wk>X#vsqo7(gJ%(-Ao=qH2xd zL#9R#K6`RmUy6F_iieI|RL#qEXlWJ4yxanmoFB;rZhUxz>|gX4y*pzMG)`We`pB4AofV~4nOdIA;1*avNhRHjLN6qn4kyoHr2P7dBi zCLwdv+}3=E5tqD7In^$bAvrVb9m_G#jVM^6k!eGngx#2ft+u)Tx6PZY`-FZl&zab} zOL=S!GN=^VA%}-nPjHPQhH+mV%qFh};ZK=m>&1&qW9#tI3ct?xT*o8V9XVwrf8G&} zYWWH89%k0sViNO;_mm^?X^zQGK`L!fcR@6=G!Ds2$OV~IyyuN=wu(nQvRu-rQw=nYx^nYGj%$s=@QJjMW0LWs zZuj7=$r=u92rXFK47u9D=q2av-$P zjm}ve!n>ULbn7zus>}F%{KEQFwgk_@h*Jc)ijdGujKX0CO36#&ATH;R7%C&1L*d3|^ za2J8gQd!&Uo5}jo{OEWcPaX3f9O(<)5^K)Gp54e_32x*Q#EC#j1k0Z3i^GnsU|~*_ zxA7J-*_*SVQpV_w&Vqi4Frc6;u$ibJuawD@=806_bpYRT_kKXS5vd9POOUk0ndJ znMaN%EM&m~kbD;_UhuDxeN0jKfZAv|)~D=a7i~%zs4IUwMoflzI)|jIDCE;d$WoIa z`Ft_CN-PWouW1&D8VrY%A2adLaRi5eeZ?ZT{VIcJ53c2+1BQhqu=Dr@$CAmR*oFMd zHa>fBBWZS?+<&OHJV+2Un)ZxvMyayn*7NH_Z~6+`spw;9E&L zJXRnwuV8Ppu=4sD_*$IoYU9Q{UF6jjd(N!Q?<2sG<3he6mDd7?)=WY83bdhHTtFn- zC#u}R$Qb(rDMm?MvoHS}q@p*upj6t-VyRHtIc{&(z*sI6;bDE_$lW!q?b1tH{( zdI}RfC-k@0;^x@hEEvbxe%0Q)1fP9)FUY=wt!*TLkkD~6nH^fN`1|B5ut;%!G~F8y z_y-<;&MYc+-*o6N`0FI8qLJv`##b3Z;&uT4wE0bye#%54^d&8dEbh3HiYhvln$hYJ zi&aW2iY(`NWIJmVG_Q)_%ATdIM2f&6(+2fD0ggN$skoSg$oq&Whsp1-Q!;fdwE~oV zD88*yv0Ill!Y_Ilvp_--Nbb17C^QtqZbqib+ATUx;dGP29VgG47dV<`8fdg>>4;Ajx-K?-m$*YMiF4VLf}N!*xip$f}JhFu5<8Wrn`RJD1jw=l_gyGz&=x5w!`S1bR^<~=h94AVXH{ZNs*VPS8&wS2R`u9mNX zXFsfRU6in9x;YLfeUW^6ZE&+C8d*}ozFpR`G!za;p`u`4gdz5Mz4qdKWj!Zkq_@+^ zp{XpcyatRsHD|XbLS`37hj}cA?ppoZIC9!(IlE=(?8S{36Y%G`gaANKeasKT#nA}K zNKFqMi?$MA&;d+xn{M>sWU?EzReShoxE)U)N}WxmPL*?}{9n6S{#EO)bX%vJ>m zYc*a$8#J;MUVTL(D~A$AH(nBH1G}*3_y$cjtKa3DND3X0i`bLV9IhD>4ix{G|7+F4)voTDFsybRm#EgLBVsIKYH1XM!t76_xR&6Y8 z*;t^7$bEG@r!kPi9O#A&vo0zYqYw9JyWOC^vpgY&7q2lFDfptm57QuNwQ$EM=Vc8G+ zRW}p+)heeO68C@4j0w1E4CR7xFtwUZ#|-F9&)S90e%uL;Bals_3yFL}tyf6`EZO19 z(h&}GWP{0pX`0Qaf`YyIp!o;QC-Es|S9YMivQZTdlURe(-4{#1p8Qd_n7cc$IKoA= zw+8zNrP(EeO(p|5l%Yz)&S~Scob2(rqp4KO-JU>0gR2a3N@hp2LpBN!>`M)eJU8_I ziYwDpZ^ogj5&p((>kfT<4o2?$OSvgG4D7`P^mjG*h zsKB!u*H=HzFxX!W?m@IdUed{{$@mzt+~ei+$nMgP`<7yb4)g(&`;s+JrqMUc%%LPv z7}9DZm^>TIFzD@k{r_cxvNEY2z>A5bfUvqi$2Cs@$*m2k22e+5FFwjIMVO`PDkj;O zE7A0hLpuj$kMb|;OkpOp<2>&njGV_N>J(sP?65f8l-gMANc)Qdoc!-174TqZijx`s zDr;NA*UOZa|U9?k)ecSuD2TEgS+TZ|JCM4`rF>YgM$1e1=07UPxwU z|Ho!tIV;4?T7fx~`Ip?|s%-3CB?Vg|ov;pt7ESrr(C^3%aB^sH| z9J0{)Pt(cELB&(i@$T&WE#XLWDL36h6u@C@(=#}>V};=WYD3Mzib=+c5}r6+54Q1R zIXHsv8?suxvQ@nt28f74z79mvebnbL2Ft*3Z?YcSjmM!TZ-cT6?Jsh-w1$N}N|AXg zr~Gvy^SaT)i>HcN?jJ`B**HT|hbMNIbZBR+mbrpQw#NGq*ZQ}bv^wIECGE-BEu&vR z88lKR9(Jfmbo-5{eC7JxW-@l}Z?R(yDs@Uue-bq~1isK1&>?e*{kbr$I(CbiJ-!V` zs(0lSREt`$6TovPyf0%#TqV|uXcHyKe9#w z2XR8;L#I~e$qrl+|3gYzSWkh7i#i-7<-mgmX=jP#_(KHAn!%WKi)D8uYf z1y9mjGwz-mKP&h;W`|;hfm+V+fL{)(z~sJNulphQZmiRye7fT@odDT`)cUSn!lVt) zZq%|2#*paa`Oau2(GPaJaOn8da>|Zqqh&@d3D}qSAg_NdS=k6F_d9Etu>&ekrg*@IWujpw7;1Ez3%#!!!Yc-riA=vfBp zXyG=b^-!|Ew=gT}@lEkB%qTgo(u&9TuZ<$QNx|8NtKnEX459C-YRAjb%xah&>=ucA zuwSX(kloIF|Oe7VP2AD^7sF@Xwr@50hO-GNS36#eE=9fF!Zoq5zgd_M1mT%LNcp3ZF~kmFjd zAmrADN@xL*Y&VkPIjFmXsu>&7u(*6UUTy*-ZE97aNq-44^f8n^Tj2*&hvF7%)fNs< zh6odAJ0JsL^gIZKNJG{vl;5xk;T`oC|4ct;CJ?X_5QG;X$gP z{kPc~5j)ic(1d(=an8eDHA7ZQGus_EBQ+UuFtqWcicIzow_o5*<39HNbQc3KfI=?l zF2oEUb*82djup3#knDp8pFKJEGXx3feGgfmZBQy$9rijxkhTU!nvcKTPU)*#ALC^W znGq_9tR3g7khXn3TF|YJ1q-_rWsMNuKKPb0KZ3|$T(>nJJqllW<#5?yMG_7~5H+gU zB)=F}Omr%e_~P9>)udymizuY*KqTFn)xl);(`2xPAA5t<$=s?c9q%{-kf{VC$)~L$ zZ+(oTPmK$rlX8DdN67N2-g29V-AYm9dICU`Yu1)SL8ylaA72}7yubt_=z%OJ`H9R@ z`;#nDn1d-nU}k@q8ZA6B-C6F9|McaTNkGOP0tpP&_Bx3RzUHI(E z=X&FnM4N)@2wyxvr@paO9qE?m`877jP9S}BVPDv7Tgaymcc znTRw_YxS?NbIT#@2OvIcH)a^%{P+}kOkRSSJ&plZoIn~qiuFuRpyWJns|g|?d^fw# zI96_V9l?l4s;g0PnjC_V)Mka#4`Q}?K*yVmNPNB?RMNg@ssracpkx2H_aR8cV2QUer*4mzt?hD799@vE~-%uzwPrS>YINOHbimT5IaF$<(T zGy~>PeRa5tCpa?wL51^h_M`rdcu6&ue(Ya*>y5#!rW*&{%3sxbznXv?}#}lInRZF^nrwOR72byQzb(1 z)zsif)SLMhyY&Cc%(pomJJ?i%FVai&s9!ekXG9}|9tn+=E}Txeh3@r^gc>SoZ+1j1 z?NvgS99LjR$dV$H{!*IN@o0vyJA}uU*$H}14BZJ7hSN+NPclq0UXjF_*$PoskNbG_(DzN1Jpsjo_bnUC7JZ8_~+TTWGAKG7ZP_QqJ z%!cP)EO)0ry-k^|g-Nzwac~DR&WLX^@7W>XWcM<8PYEi#&^(+E%S`+ibK`{Lg(?yU zQybecO0We>-uHHX{&Mj3zkc~pVrW*AiM3TZq(k|AG8I6?zt}j(bl&_N7nGWJjKL$> zXR@IU9*K4mLpS|t!jI4nin>y?#WJLm9R#_W_ve_T1m$tq= z?~_~`35*;!b=6X6e6@z;vyZ)ThJ5qlFk_z8VGK|-GHRm(n*7`vyKIlN56kQ_-EeG; zZrQV8U~g{s?jH!~vIFAiNgI%Z(*B~@p~%3VT*!}f<~%dw;LwvQ2${8^LP9_!+x615 z1uNvwNB3rkj54H-(=lO@HMNq{ObeOh7uy|!95|IdnBJq8+f1pKW}f^9M_R$31+QI?cyeh)V}0WS(8&dzxNzLnVqVx8^!HSy{ngm1^d&E?jYhq+J zE&fGzQCTXsP2Bo6==PA|w`LhsoZ|)aZllY4ND_Y06}OKD4&gd6G zZlW9=H1OX`vVj@VOQ(4ySR}Y+#Qf9I!b;dRCx_Iu<8hJ?UartfNw~NLn+VB1jT`7&)Y)A8}Da)HG9B;qI5N;($Rm zz8mZaF#6GBlm4eh`rE=Qn)q9JOjCrx>QP> z?rrQsPD{m2S`dvq5TQS9qz5OW{0oxpPDkHQko_QUqS}R5vDX?r_N@7AfoCgzCbu}a~umzB8U$nhv0HZ1%ep!f#)%36;8bcx7 z@M4xEuq1siA;xD*J{n=7C0_H}DISkQT0FCmrsLsL`8I8+*hd0J{%%w<^F=R_+L-M* zJ&>5LA55!1RoupgC&ePmO`DI8Es~n1E7p%!uV>$s4kN>eo>U3qw$d{IgUQFmI%b(v8@s z<-*3+Rm8W&upHC)7ou{s@vv3zVH1d!?90VT9sK7gMqq;&Yit|m2cp!4F)o9;A*K~T zHhOlbR!FIZTQfir{u7xdIqqDn*YXTAKM~h=DX^_dUUP69+dgcz;QjRJCfWR1_$ZydDF&hXmvkF{=0Xl$@IeZ1rkU20tNY19i0(ix6nnAT9~V8V1lGbI1jf4C|E z8>JuhY;5IcZEJZ8VLJI%sgSAzVCPn8;Mt6u@tDffs@X|cAs#43Hc0`HTpgz5Cn$Gw zfCO4I6BTNjwHuS){z}(~+-iY@t@-&W5_jEAv5lYhd1oA5AZ1S;2xv4%yJRbli3Zn= zM=cFobtmYWrW{me_N=Z5l=6S;_zG|& zdcS!hWZ%80i>VQ-ftmV>?lm|hY(5iMvfhLhGRjeMMU4$(g}mr7T>naVr24#&A`H=n zjLNB$ljX@&#Evp3JNR`I} zO}{GKnF_*w>4#G*6p?Iq^nmdPKf?zL8BP_eMv+LV9|c(QhU6+K;H)P}`6{dMqbi%B zE+ad3XB?M!h2|$bl7dI-UL-E`3gNMVAb<1O{M2BR|8`ot>|ZY?7bvcJVOLW{jkXlX zjX+Y!zCkBDwPU;~IKhJn-w)scOQRPqs~x9UWVs$n)J_-6>P?6MJT*@AUcrQNJsqwNrPPJkt&k1m9L5IyYM>cr9G?>4uS9Z$jTj8SDtC28cF%{ z-~aEw_|cDk|9|k0KUUat3Ne}`RMLJ_4s0w1r&sCl@aYECl0U;OG#Qt6-$0V< zpCB0jZhLEYXMJz7z%4jPzvV#1NZ>!g+3j-38Ov!#WZu6C@WN3qDOA4Ont-?V9Z7c+6ln~AJ2DYT~Pc{nn?r;9sMiL)1jDprlcu!H)M zVv^A+CvHGZ*D7vEBNznb#AA`=Rur)B-)n=X%kWg}Jq2N}^aCjX5u%%~0|d@WMX-VU z#~(6BVFg*hAY1r~5lQxut{;(D^@Nv`91l$;4+~Ui)(U1;W*OPDqrN?32@*eoykTz- zw<~i|IB3$xiID!an1V5*;v^^^bKk(!Ep?By1`Ihr)a&j+sG;c;|9#B3SyB}zfnssI z^`i((?$4IXlfmBJ7DO>oZYfucPR?dS$#tH?3u?uoiU}7$lJ_IK5!V%>$CdakusZEg zUoql}V^&%QO3q>dTo_OG<`;`G-GF;9mblwC?V(s9&xp1!b%-RA7Wx$1qQ4Uj$o+bA zRwiTP!i$`8DdJFxja#y7&5Ee7E|phe3pQKuC6ZE5Mg@^X5^J`uA8t{~dqQV;nanh! zB0D2sa!kTk7Xusfc{!O7x8(><1C|psO{oyLs&Wbq0b6qO6mI$f|G{b&e2TzuS45xi z&p8A|G!lK*QFL}R7RQ)jt*}xDKr)9fsH106&_z}%%c%@KJezU*43R}JIPLIXDC~<@ zSQkSnkZ$NJwx$Onc{?acZ8lIYu}PXdWNuA=8`_z-gpY3(^;&j`FUC+z?ctv3dxeQX0ZpIV(b%DwgCh~om^{e__FiUUmQ!pF`WLoL*`-o!az?iA zqjEIBP~NynH1CR7Rtv_FvAh8vYwHjpP`Z0jM}06^88kkz$hZ-Jm+l4|wKbaVR?UWeEcc8N-*wB;gHH zqpy%gP;ndwh^*#coK28jhd$sF1x;WJ-1aXLuPqiME0tZQg)K#|YVzqv3pDv}7re@-K$>pO3jLwSsq8^XdUGs!^swL}xQ0JY(h_kM zrZO91Q$!@$yTOxXBErmi?C{rWMuMWanJhjH=mJ%5=NTd^mNe>&RaH#(@x3&pSd4S{ zo#|x70jn_Vq<;MS^z4DeG$>;a|RVMO~xta=RjGh&x8 zwb#;BI08$>PZ}`Nw8-;WrgO!3_Q~_aBY9yA9195OaxF`^;{y(CZbB?E2A$%@+I} zCjl-qA4;X4-UFeIG=x$~&NBi?c@>#VC#2)KMj>=x%L4_rK zv^J{ho7p@o^u9si<@gRS{H zJ?NIGSB&ZeK1T7oy{|Wu&5QG-c(RWBcdl}0m_A^G@+3$>_4)kPN?V~rh9_&>!hCTGCmzIq_kc|TO?ngThysDu z4qXw-(H87TEK=On;~oF@{@EZXE+6j6CGxM51at32mI_lb?+Wgb*>C+_9U&WeE!ZMl zvA|@1bnMMASzp1lG&+Uk>;3aNBAGr8hPYsQLzvg%8EQ_7dCx4gii@aE~dY<46YR}%ppnbxmX?}W+$<$S1kVq zjQq`K^V3YI$`xv$iHZw>&JKzkAE@54 zcaG!kR7KwW!KVs$fI_*rgoV%R(BGB_*o3zvBp;8V;ve#p*$)+IGW=`KRDwhB+p;a5 zEf55&X87vj~YJJY3G-J4(mS*_}&oTLVotT)r+ zVEIE*qqf4*t{Cj5e(3o^Kyqcq8r-?z4whbY zzG8;}!Y`g2iX`uqD%WAFnEq9WZ-vv;RIU?95@tRCW2xFRycP1Bu0-}yKhy`1K$HI( z6-y|76M1f3>d+g?ip&H7AYG0`hMP7y6(4(d9^?+{rbP3=05$UI+ z=fl&{k)f-w-6{;}^drS2<45U#mGF zH1enp7l)r5qneeO&5BT86KTTEncukB69SX=i_zkUB?Sj-iz7Y<>*GK~tMv-9X+p&< z9Uw^`zB&llln@pn#oi%TE$jifLRdrtM1qeS@v8ZWf>xfOU2&Z>80=^B+58lNvjw-u zN7KQBDIQqaLya`V%ZeU(h_qvSHdQQN0dlk3ib%$viW6OmG{qtMbv3Eo8$Ee( z!WV?h%B|246@euB5y6qCKTdoH?(FIK|ED5R55e6s56UcJd+W<5|(Z;wTAF z9FFi+04DWqAKSm@;?U&gz#}(VEzgR@on{LZ5Iv(QT7q@VBHU@w-wH=ddnJ?@l%z?9 z-DG?`mntDk>ExXTrc8E9;shr zv5;tgcRYl+{|1aSca|5k(ZyixF-)Q^I(LQz0^5C(HdC`KiR89lJ1AKTFGwKd1vNOf z(oFOUkubPJNFBZ!=SYK0@-NI;sX>*_i@^$@X?Rb?6{C=Du)Sl1XK@QYTk=^rruJT- zRLe>8v^rj>Jvl(}OS6(IvLphan+9v0F2J)He~W!13jE+9LizU>quKI=B@&hlGl4FG z-8PhCBfWbosx~S#+oK;fJZ#ygeKj7<_*6)HF&>)~|Dsex(&?Z{Jo$2r@DQuIbR2GK zscb()Js!LKISvC`7$37-lZp9CvmnhkhQn7g->M^&yegALIf(T^f9xj*ZATj4YdU#>8($AD}^{EOZBlQ~}>^ctpPU`u`(#HS{uO&Uq zQg}CuNztu7PPX(0gTRjEnY!uW9REla%!>UTAlQuX6#GFo%w6j`}#-c2-Q5aH4iHmO#5A|fUZkHpMlRA59M5? z&pIHI>GSAKjOfRU+4nP4M1gT@Y~_uL^G!yP*0RnAI1B@uqNUUx&!mc)SF4^}$O{N& z+0=Mz4i-2t+#2-}@Fi5z7Am2OcWP$WYQ@D8N6m00#lLU~MjqI8H_7rB@7U0(*rvM` zK8@5Apl+fVlAKo1h^kocj;07?F}yD)Xyn*zz)knO)q^=-s=_sZlmly5t1&*{pEe$=W#ygO}2^0jzf3!WWSlbH9`PGkZ2G<&QYD&A^nJJHr zNVx|0`%)3>s=zIIs3Z(V9S7SJ%*aoUX2YY!{K6(BtYAiNfJpGAShkR#uo&=d3%qr) zwzsd(Uclsqih;?tt{DA*>9SlP5B89j^;tg-O)4i zjoq3*zg!U+jZOhHz7Y&;D~&Yi;^%*SCz2v^Csu{ct3`&0@_j!t5gz(F$`DttI04M) zS6n{jV2=!yBOVIaXvBvras&Sw&L~4%aRF(F2j^TriooRlJ6XJLT9z~^o)7RFKTjKY zVrqe4<_$a)bN*s?a#-3RerOh$!kp=Xy0A{mRe2hrR9B({eDOzwB2k)eoMdJ$Ay(x#IJ zi1;5M-F^lc3{uHHe`4_^nEc@6FymQa4R4@0jm>9{Ozx0eCANTqb*&<1D6_6bP~`X` zSi&ScOpJW~)eJ(hc-3;*m=)a8=)FZMX`nzr- zHtKrV3V6L@axi_GY^)9iy5IlXK)PX1Z%$Y776*^%bcJ&y1!Aw$UpDAue?NDcGSAnl zu^s)zNxy&w{FTEYWh*2ZKM%Iy7Mt_TmXPRhSq7v_S($;)h9m(6F6j2e?&XSGzuo>8 z5J`947#8x3;~FP;i|a-MKPQPi0sX0ic8*)azEQ4Yz8H9pyD9Q#DT`y7Ne5+W>Ot2S1c>e>DD>|k!ty_ zsgA(iiU&vS5m|Bbw-iWd@YpMx@`d~@b0}4)%B?A1f<=n28J5(>UUR}eIhrK|7<>U z*N1d1A#DN0ZbIEjxh}JMO%;-Qz#?h*Dj}2nhV^`mkB>(7wyPM?_H)<4k?2kqf*>a$ zLLe{f3|5>4ouLN}svF!wmM>CxaZX<(Z!G zUU91_NVbX^M6w|Zr=;&8zQG(673X{dM9$_j*7gLKyq{vkDWqlrIHl;G3SB_)NUk5P z;B15JoO6lZTNWi5QM|o$Bp!4-1s&&BK)r-ilX0b5o(O6f#^y zoJZ(Tgh|SuCN3yxm~+cZnam+%`I9Gb#hC`w1cP0EpIT3UF#>sPbXDmy4bKr zgGBI8Vpp8jl|7v=C2aE)_4iBDjGY>@Sc2JTgI)hvqSFAHckYxN4`2IoY2mYtQ$rPm+;7y**Pf;QRVf|*rD=JYm znCx`(*+Ie96jWBxQr+w8=fz^>SEjO-h}ft`WnEnT18of?xo!mYc!8CMSjw~@U&oQs zuOCO4WcwKQTSPKT9!2;G3tg_;~J)N~cfL0uwJKD>*n4y-!nt=rx1wkY6U5H2?E|-TKj={Yd^_e1=ve);56b zZ1b7mlRi{_ICd3|28|09xiZub4xH;qbOAHy2mMNb8h;d=4N8C6&B#`MU}}R(tR7zh zL6xV(NL8^A0u&n)zQPZJ?tn@CpiqyX@T*Xw0CM4CzLY1NrNoieOR!?d|Jy%uOYA+= z`Fz=e32m)m*KWv0#&dz|@~;8P3#OS5HEY~Ka4bu3j;OJ`vZTAX>djKB5RDrMay6d~ zBDu0`Uq~WN9`&A~ec5c^1e*L`?0-+yVDR1a0EguOj-N3u*7J#Mala2tBPyhna}UX$ z*WkO6XvPR)qpw9ao1deWh&&-}8c`vtH)zQO6v5eo&rv;#N66q2%V_OL1^@#!G}+Sb zi;AHLh-^goYR6|ou6t41)#pR0&EyT!3L8;D7?06N^P$$wgOimfx|?~pc1P#7rxoXv zVzHz8Q3NLUH7rJFsKmdaADr3p#1%aZ09k!xqLJlJI3~jnxJ>in&lQ?y0AL5hSNI{| zl9=gIOT-Dl$vH~`+$!v0R<8gwY8wPB68u!(&S5P%e;LX-J*1si7p&Pe72>XUg)#$C z!X-0>{jS3Oxt;e(|D`ID$BJe9BTMitD;h$yhClY$EQ|_+VY?ws0XYz#Z$ljUZXuD5 zgXl-rlR2j2&Mt%s=YmA9cq=|9BZ7^7Gz@GCpDW4dBr1Jj#-PL2qT2VR=OgA~n-Xu5 z3yHo;Z&E-c-P=(J+w3F>S*i$hXo+AW6bXLmL`!)bZqL=XY<`gx;yaiRzuwq4Lw?-9 z1)N;T|6No+vmvQuWn+IH1x+9#BV;>0o*}Ol0`R1m_tfz;u&#@M>kf8|-OmjcDVo<0sELG&D%R6FbaCxvxamk0zAPpQZ+i2d zW`Ee1#h`jV-re25Xp8&|A*T?Q5_4R zRL!}@SmhDe-ws&vUNb?XNIrOKCb`1DVB#o4{XQa*;fqEj@v?^ej|M7tYv*N z61R!Op`$XOFOt^$r*<~Bt5EOYV7`vB;%jiEx5%mn(g8o z+K8El8qd}mLV6kG5z4mQY(k4NGWrC;vr@Y5j*f}AJSNGcQoCo499Y*PBmoW)JLuX5!7 z^#n1sW{p)?#QdLYv*I_E=>2SpO%c z(2!)a=8x7?_(~Mb5Vk;*|DE`0$jm5Tv3p7{LlTGZKMlt;e~=19=Xh-xWvrh~&yVGK zcS+!|T4Ti)3aIR7`0D0hgRW_qEGqFV5T$haO0ZdIY=cCGFPlK!<|j_5SP(}i`K$63 zHtYt8J#IdmpE3%zrl%Us0SY3F5v?_v9bKfasb6t5nv{yo3niEDqZGIZ=H651W%1&P5-Da9B@x*{RS}Js!a+V2^NO8+ZWW&9^tpRL7hNVI`R1o$} zKPck`MAxD5^63EoC&5IpS;G`)UA+}nQb8b10g4>gpux!Hhu1P@n7GB%zK2tB30Qwn z4o8}|a4moWX0sjQ+q$r&WAhwSQ$`D{jQ6 zFso=KXJW;al@4NsBFQal!t_r-nMGJ5kR<_$d#)m;qLJw*Uh9c0i!2FrDuvCF?d7~C zhPfhJu%K4;5V&qPA`4_05m~Z#%PUrENo0xPNcB~SU@gYQ;zcW5>n?2w5mbpyuEQ7^ zU@s9Eo0GAL*B4TJY_Pi_|6C5UqPP`SY=^+5T>v9X!5+IQ&ra|0v0RBgDFzF641rqg z+M@>AQlxDftXrS`Gu~$L)qeE@* z$aNEW47-z~$@540UI2XRhN|M2j2;Zgu}JfNzM~79xWZ1+y@@?0DTAHjzBe;87KPYw zu&SLRM|E?DU`WP|{JVb>Hn$~L+|&xfO`;zbk!+tF%;BShr3n&Blv2ICfKIwdRoM!K zPT|O_A8pvKzt-ths)10E0~tUZF;vkIAQ;Ljkgi7@g*^WK5bsbUuUigEvyQJ=98Ia% zymy-jt9_T`OzWy?M}_aCLE(5bp9YkSHy}FRdx15u`A7nL^8}rWn?I61Gbob0#wdQK z@R_busCQO^if{=0NtUdFqaATNPcDv55Fl+O+=@ir2F?v!nqrfnvkgCS5{UPji;ckl z2nFxyM9TV0sJ7{MMWG#MYa)a%y;euVCVgQgE$0r$lAfK-MCCo7BgMfqsA6lk_>Rli zY{kvsWRRnUZiT6}zg3)M0fQ3~zG6g@HBL@s1szWh&l9tG$05=m7~epW>$Z<_-Gdir zbm}8>7*1mbwPK@sAoi^tl%(&eX=U5H%Z9@fRFxVU%8Cn6VaTZ;DJB`;_wh;b108tB zcy7zHRCrnpj_a#?YcWSAag@-@QAMz362noUCzKL;BQz5IB(2;$x;U85aeh3VjwkRS z%vfFDjBtg;ItFEL<6lU9=rRjibSGcouBiE@b@A0i+iA=U+t7jQ#ys_(!0~MFzlwl1 z#UP`8s6&Q;nA}QEh@RbuApgDhk-MIT|%{03O1+pJt1cqMK#D1 zo4Q|NX$UU}agM@Q@}5vkz@`);1fXL25CJnF6^C{>FxZCh6)xTgndEP&VH?hi@wwe( z6|XjCR&5VM?7xwCRdMtn&;~!rOV~?S-pW<*mA810;4oj&!4?>W`sEBv6aq>VH&mtBMhpV4`ov;D5TrN3yHV+^`Hx%ExG37XWi4oSpaQ?iOvI%HU}e# zrpWsYn#Bl`S01cTBhW6VB1w=dL?4bIZ44qzQhv}3{~ny+XU9^6L+#+PO{d~`Y@m{f z&5_CdUTk4MnI0XZc-#4TlC55GT$D_IF&xQ)Io~~uo^3?ovVl6clBOYV20r4+dN!*CTk^;9JOpxJ+qAjvQ>xB>qB;6kYF8mO1 zN&H!RSgQm>;ixh*USUC0K#qWZXa4K4%fNX_+w4<{X?`o*I zKMnATN>;eKV#zBCsr4g)Bwr{yAbPut6lm&CVwz|-n4Oo-rixnCa`yH6>ADEn$j=Lk z51)eDm%0NRKU^elde+EfRd$&OpABg#FNoOMKXG}%hJo#Pji*z7X0|bX{Sr&viPgi&rhece zeBHzjzHw)(YPYeTQxVT*ptzvTZxV3QzcW6@gFuK>mVaiZ`-k7ht>4!xm+xrE>Neo{tGQ@ldJNIyx z6vmw#+Oe&$_{2aQ-}o06nap=|8{2~db>wV#Z^aF-NTk(|0xWqEk<~=lE${$Dmb6`A zU}%Z43vgt*6-=j$wt?N`WHh##dW9qrK-jzRWgtoSzJL8~r}IU*ie>9@$k&QV$`AA* z?@fIk+||Pyo+tH~D>PGuBCURuaLIflDl;KR;n`?uGhHhtv8B{RfFsdQ+cX@OirYeh zLayahWJm;5b~k)A?jveZ2?rbWnTSea(G_crSiRlum7vYx`2{|0=t_k)tblBaezc>r z6GU}gHhgG+mpH6F{whKP$}DV=EwvH7$%pFMjG8>#7GqUX7^$LBVRAaBDq~@z zZtH2ZH9tB+tUnYOe=eD;tKv{sAT~lja#XT@1ks#Ho>`gT>Fm%xMpALGD;Syeql`@U zTkslisC~#QTx*aFO@Av~BvH(30n80hF`gYtM{XT>Sl3br_FzO?|M87W2p<}ta zXVD99=T_veE20}xA4l5(&vu0LFFDQfx0xzZeTsszLn6axx_6F)y0YDr?wX)FuQ)qk_>lnNzOG1vnA zFo5KGLkxO&nt3UixaLf%I0bE3xIrTLEu9g15#&j&E3+3^M6$gTJC+YGl3>*ei&u+} znoy3RDKUWKAkECE7_d^20gpt2>xo?$a*&ymii4%YBrIs8c{kko_|+7i5Ukf_vc)Tm zw#A?+i|FXQb=N=ij{gOmo>y!mc8H{VyK!nrX16^?Dr7>ts#7phe9ENPO);lSVg9ER zEJr>F$cn@Gm6^4Q)0ueOs=df;K<7)d@bWLt*CAGp_MFyMQU)sQqScWFt%PjrbvQRp zo=ygP_}AfJwcFAmaDWPEq`6&q8%7ph@-jk&5~M(m?gymOO@4#g+(8HSsAP@eU_}>V zLMLA=d?1D7#iJ@~&@6`zpIKiVY!?Na^Y>|*@flwD9i+e9kzbC^&Q4H&TFU8|=AHBl zM=74WW0I`rI%c-|r()f1EoizgRl1~Vf@x;O`fX4zSMRGKWb3+L4c;EjP%;5!jAhfA z7LKlHAWt2`av)hvmX7VaE)DS154WO=hT( zzG8EO>Bs#VBDO7Pp%0|E7mPKFfeTmPD27s181aI>Db;iIqaB^C_^}9v*)y>fI+(qP z0}4S)rSRbCoXwxjq`XWPG*n?qP|uJ%_VZGBDLmV8Q$<|WGnPLj$3TUwt{7z24+BW9 zkAhmU=CzX@SI3`)(aqYbC=wLF$Qr(i(4_w)DoP#w2rZ@%yihUT66Q}gluxaUFryzE zcsAnQ(+gaJxY6XF=M$W|&|MNKxnjiK-?Qf}fMokDz3H5aA&YtFVvo(JSD1NIK;MLu z^Qlj>k!O%|7PjWv*};>+4*pM0cpCH!dxicX0A$RO$Y3kfNZ9K6G>NUM&&#)ss$G|*R7&Mk^R=xEC3QI-bM_f5An^*MOGxlXb58p23GZIC4VV2rNd6)QNp*7*};4g?yXO%Z5sHdmDnr%;Z! z1DV|K>;1VEyf#o8QaQIGzCm$Fs~;ICIj^fxRE`ilUvaUp1@tPcB$;J2f+B|xl1u}i zu+BucP0S1xd3Yw&iG4J`3BgYdft%Wn=S8=^xZhK`m&93 z-i8O?O!q6ctYVQ@KZ?L^w*MekI8-JSc7s8EImo5Gj)O_f9|R#|8IDvwS!(cLG#kHY z9-f8xjxxAImH|bW(DIp;A8LYim>KF;w9A#M;9!%k1?TJG^l*;HR&1_&Mb85Odmp|6 z9BFRk^7^HvhjxM87u&t15=uzY$^^iQ!!Q$4EE>D>u91BAE?{DmKnt@{E8^G!3WqLy zi8S3{lJKKc*xZ?)Ovf*%&dqH&Vnujx14iQJ(+RQ`oBW^R`DwWNMhhCK*Y(4hgkDS% z+g*hRm!3B}?; zNMzNHFb2I6tPQe&N20G%vrfD7BcJfY{s~Xv-MCjfTpTA`dNaM*R(YVZ{hn+dsLXu- zXY*&tKC3V#sWFrt)(`bcI7D{qZnpScf;X&by3>%@dvS8`;6z?@j?-@@{llMuvpLys zJ1N=BFVw~yWgi@K6GQmMt57e}T-S>sR|DceFAfj9Lj6j8w)tQG7KuLQGJ~~RX`=iAsVpL)5Ihomuw_;5yi0f++k!*h# zyt%~^Nxs0PQ>E!Q&MFcgv@gwoeTj-mEsSjJ%>x8p9XvT5=)W_+aD`P}|CS@8ANp?s zlIym$317^X7f+Vs#q^0)k}5p)3PeKvaF*s6m8^U<6ZU6Rb6gH2TKHU&2;DCRJMw#T zEL2=c)$tJyovnCP+*p6WBDBhGg(=$JL=6mKZ|PyAr(J%nSFCIW;c)7QMI_sMAv5;` z^`0<$he$WVu$lp^;43BQCWxL-t~&1AM)6FwoQmbbYqVRP6;yJ5W~+CKy#{6zNqnFo z0T+wuZG{mrb*{U7LRuwLWVYaoM#hPLlKX48oFAT}Dn^p#Q(^jVfH=p^XY^CTz_wiH zmA|gqbtW`aRDel@28-oL;ylyo5)NxyNvuLJZAn`7U}SmM7=~Q>DGG9#*{sl*%a)-A z&h^NiNfHipSsq0w9C3tmJaJv4@$npmGYwCL%{Q$yB*Cd3i45*7C@)6l1PQPuV`-L73x!R1^upFK2e)lVQlqRh*?Hf#vPi$^&#YLn5ZmVQyWcfg45M%>R zrHYA^ERozJJjP)$cWI!XzjEohF1y%(oX5TTAx95IRHiq7iCLkXGWJ?~BD zuV(yLyKP2o$1)5qs{L~D=g5%|XAIl*san@f-8d}5;nV4IinG+rO+_go#dC|$mkwzK zXB!%MYYJQCRmxi)k1QXYouO!;)Lz7a@M1@P4)MySlNEkz55+!q!IJoI!jqutPKlow zr5{OVGQlU^71cudy;w%67N2h$@chnFSb-*fIVBocfc87o3yyY!DyI{C|*6`E*+ zNZ#hN`6(e_OWsqL#C@M_iX-cX*~l6bDtyQaLvsB{G0FIu?%!?uK(7Sh!4QWhd(CK9 zSTPll-1^au&Q@d@MIlFJ4>zUes5~ql-WC3q^lo%bOWa*Ol$U5H{7DB>5zoxf{Yl%| zP_msj-K%cypHJi=DC|wsnhFKU{WZs`2i29gcb#`>oTB`<Io#^J8AI|aKf+4D~dniPShv@IM|-QQC$VcD=!j%cKcrs#gshcA!tUWLUmSPHz;1a>StlAte4E&?V!GG zJU@eII5~I#)#)NR1S^Iq$RKWutIw?QPDeXxMy_uYH}kHvT)gGzEr1n6gdkGX2`NGlJ6zgo9S(ZRZ%h7Tm9%HU|U+B{6y#? z1k@o*PNj>j!Vl$gUmb`$KV1k~B(D1(QzAC&E3rqoc*#6~au0ITxzEq?5rby5{*z++ zKY#TV3U)3BXD{GroDJrSqpyDbl`hWeaLN)FTUdM&8h38uva5(jkxXT@lN0BE-oqUl z-kElwBu#SG<#K=xGcRqZb<i`dEtBiE(clILiSS)6zfDIUr70|m?G z3%qOVO4voBi&V+g_ zu)|X;@Ku-yVn}v3{zaCw?>X3-o1^LBc))+ipis}Xo47(<>0t;AXm=%{N&3@;3jf{=Ek;=+QCNs^bFd-=fSBrjNm(YkRcx3um|I2-E0EP51 zh3O1t9q57fbgGEkRy0G}0!{v(g)Bpq+RKXDUSQi4ZiEi;KftvlEq0SME2GuhE~{gF zJUuyBOsrL}V)d@-Z8w~34|p1kQd z4p!KK2YZkJP9{#n!kC%md)mK?QdD=~rU5$1cMCP!ebd<{2L4~8u{`x`T2-;B{2#M1 zMLbe5m#2LNWs&cdhl)eIWS}R>*eWaUqUsh7gGStyjb=vU<>lQX1)K6=TM6>BGN||N;;JEe$TXnBgZFFhX4iP z@if;GnGO@rQ9wG-JL84k>HsXT&TE_8X&SapD8YR znYknpX{?-ffH$U+_<{;^K{>v_V>uSB8pY80;S(H~mkx5vYDUFaWcgVL=vJE$gHPOt z%qZLi$b+{r2NgP0fbESFk2u_{T1_4cO#T;g)SB&5aZoD|=Ttv7^})q}N>+XJ885C) zPEb2R{+W8TD;APJ?j4F-$?mL9aY@=dRE8puPfzD*B0`5HqJOV8kmUNZ5eB_aLssy> z|BUJp=V`Ros9$JmFfS=3csjQ1eV+lgi&A%sgTdb9d=p9o!qv=tSLmySOtKu4l(y_I z68P+KRbjt1`!|&RB@!7vQq4p)AUWSgiwPe1JWr~9R@`_B#ucR>Wn{9y>Z0_HCzsB# zC}pGBgJM z(>XyTdSjB@S{23$_>7z48y&FZ{hQ3vzKg|x*NToF;38Ffd-jrE#Xih{Ik4GpTj|)m z_w;|SEg6k}xIootGx8PNP+?3PQcN=5RnrCjE&2e?dNJm>pD<-y;j?r9x27Ex4krco z$ZU@Ou8xq6{In74;*bI{8y7C+iZTfe9-GvBw!pI$zmk@>da99vJ3<)I1`BS9gCWg; z_^^4;`zoYQm$Pp0RmNmfmTQK4{8 zT0ByH?kZ27BEAo=0R;(r2vLj`2-DZqI*er6O^e9R+Fz--ZAjRfkIVl<91_D!;I9Z{ zv1lDF2?T7#XQ{?7lF9<*c_n^`+t(aY6$Z?9V?qwiCddmD=3U<;#=b&!i3--HNTm3M zo|4C24Y231ysZe6H{X&p-L1H&Qe=*N`pXVFw-yRqJNTyHJ2WC>bWn&gf*gx#Q=oF3}){i!9wjjJ-y6qisSN3|T0VG!` z2>%b6>#9Qg4eKdiU0ihM4%LxjG*LC<6y}u0bUZv@U`yt%tRT&$?jkBl-;zA*@#qY1 zb)KXTk5*Vv5-N*Df_LRjX52jkzRe6RrjWZ`aXAMRF=d1gdG5J^Bwtii0QW&+ck8&9 z`!|Fy^y_+MP0B6+J;{*h*nN5zdlW8?7DUp$16!ty;m)I--wZCM2e!0Q#XR}HCsBq) zir=KZm-bS_7*{^+ZIzPWS8V#kbK^FD^2-`tw)lfgXrE1Jvt%R5-^%gcto7)mr{pdRK2O7W0Ky&<2MHCOYA7 z%vJcG{nL}eawyVYwsCP--ad4BA`ehdCVR)YqSTZBb2kSG6bWu65fJxtyKlv|QxNj# zhmWc7h;Eiu3%H;7$)6{Wzg8F}6^fktQNks2``e&#A%u;ms8DETxkCC&_cR*?7F?Qo_v2~O@tMuhW0CvXl^ns4GaMpQ$_AgJCg#sKB+W{cL%T@$D@Vq(^~&Q zst9gtg?O<5N1hLDr(m-XYZjlTOJ=j;bZPHff=gKb93G z1-?`*^|efKD4eFpRK=~RXdFZRXn`jGn{MyG6eGr9)3XXowcUUULf{YyP4$G1u#BPN zEGaIE1d@E$#jO#%8JMNSflzUemK`GwiX5NpPw~v@^tnt9>2{uq)Od z{@xv6eYj+A9*kMnw_QZIK7~!|7^n2|*Jk!A0yN<`fIS2Wuv{(Ss}0>X0=u4Jaakb= z)LeuJWzX;m=egps4f@dv&Nk4A{oV8c|LXysy@ciX&<1i9EL9uSe z&4^dn?gAux8@?XJ=^&QC4SM;1359Nm|MDkF9Es4`i0eob@Xr{ETOzBLIr%f~W;qBJLI<*=MfT)J8C759;%v2Xg(0!{w6$EOE_b^ISJ(9l|DpI-TMlBGCqzLpoW(ZyixF^=ug!C*0wI5g9z3OU7LkfaDlrrT%p<@7lntj$k{ zC!-^~JSr}U=Fdsld^SHhT=ISvlz~!^@Uv0!!fc1nF95Y@6@~C%!m}9~lj7t2#wUyO z`DAV{hYFRmT|f(nqzi?n;f)r52F4x#G80?DR`mW_L^rp1sP`OollP8CXA^Poi!L{x zrTekMjP8LrvF)I)i>m$7#efREG+ke|iwZ(U{ji8+`=rgPIxJ+?SKRW62;5?_Rd6=p z4#fJ!c;NmyxmZD+yP3~q%bu^3`7N+QSPvY_8TZYp6ehVc0~Or z(Qr`D1!E3G&q0uuWezH(d=|8$S}m_F@9?p*()cNd9`9nrp~*ZhmCq)SL1zeH5wiK{sOhI?eSbO*@|P9cm_(&TdG|^X~oP8UGaL;?}}qXK}e_{ z7Ljb%yz}~7d9-#ttDR6$bf)0_j=)HA#~+z-(4M@4dX|(|f7m~t28o?Bzj1+vicRv* z(*(QI>2r7!4iIfRo}i9$S}vj@Zazk28{%I`4qt(SZF!w{ul!?X%f|g*{XMs*RSZPv zk6k4uR#fvpGAh0FWOIcT-BoyUQcDjq>BW%UUO66qFjS5IW^!V)pekbI8(0o>^XX0p zmqYLC(?=|9)2F2~#~&woa6yG`8t~Yb@D-hC2Az%gz&%RwfX`n+xRZ(VF(CHJsPG16 z?^~2n$$MLr$skS3K~l_msyIrFR$4|RaC*xkuLO0kcaCU&Xj~8IdAXGQS;{B8ErPa8)Sq zEk%t5iTEEPcNQo8`Wy+7h`ie6J5&P5C;6X=YEY6XD*CQSCH5GWyzieMi#m(I$-zE8)UG zaNMZ3!8+Dbq+u4mSRt?}4mtHB4qqfFIYT^6lSVERtQqR|l&=tR%EKH|)Gan!@Uu?& zLn3>S&$L{O&Cpi}&oL|qBK}1t=R`bg)o;Yq@4Vr8F{q8%L8$!>Irzl8yiE(A^b1AR zLAGstZ0XJ5Z;;qW7N|_T!WBns=5~m&Nb|nV?6&tKiKRSCCaqYUij!?byxuSfpyd3i z4N8koAXv|kqf&_Xtf&)aQP~drt5zbm>O<9sR0V=-Ydo6GXOg;Z)o)e$_wuh8WHG200DM?@&^AdWu10%^hBD%vb_+%~z1I}l|QK54h(cb_O z|Arn!+w$fD9)f}i$52$PF@@kz>PL)6rq4oU-KduCv(a+z0%ZV}%fkzMYIInT)f^T8 z-R3Qn>b3A}#)k~9q3*pcv2G6_AVa4sl(?vHLo`^f?*iBcP4+wHjYPOLTb@;}xj|eU zr$k_OfReRIex6N^5)G^4yy_3abZ~BZ%a?~p6lbFs*^`MC`LY&}18je#7gWr_wuBe~ zSj&bm6P@5fJx%((YK%YvNxq*%k%7^V-jV?K^#TRgZRN&_)DY>hJCmIaCqj;XOiA1T zXri>3(NOA0>TIO$+>VLY4VL9fCvfEYvd0>WOzA`ttFRee+UDz6*r4Pogxow>ain!r zGmAn${R`>dgoA4dhRn=;T4A1PGYUnBZd$cjuCChY3*>hlpIhyuVqGf=x0HS)kmS47 zC~mxiq5t8sHrGQ%@?!%+!sau^Bwr!07}UmZB)NuZ z#j9p(QUI$k_#MZtpIQ8IWC@hoMY%mWeKJ|xpV%U^9kF^4?vFW2BkY27{%ANQXuP~Q6Gwo;Dhe@iqU^)0 zR2Ya}U^z+^)1VOe&7BwPCwSznfZV&}#`1>^bc{pnS24ha3bq~Lw|*P)Xl{TNgrL~t zd%kYxcHtfAju3MPF2gZ@^7{roMI*~wqL8_^%M%3VDD2(j2}J@${C9R<=o8|Fk?-xq zp+0OLmUn_i5*$kJXG^>sGQ2-=YbnvdI;2H6_{c$( zzi&EG0MrQ(3rb;_dMAK}l4b`rC9{>QJH!25I^ugbZZh^6 znD#=>23-ED^db`hEEXAFmG|||v+JXG{4+_Q!Ev}@cbSv2ce%H1DR)-lviNqiD2zq# zbyvD98YnjTjpgKMJinObqtRhNF5cG$$YDdupc`E-#mkL|-9!W_@yUQkc^IrGmeUj@|}^z&N+=QA9)J)Yuvwdd2dr z;W3gnduu*BTBX@1_`9ar5ek7Jj;^nQI-b+|&;Tn6QL%5Jj23YFC6`%{^Z`O9l3Q^;!i!E{Y+v$PBy31bzi*5hwyLaUdG{7B7as{x%Blw@+ zwYqVI84`B`a5?YoGFfn8{x=vx2LE`@3r6wyy=&V+cpu>||% zOulpLX4GD8I@Vpc{`~HD2DD?FUPv{uuaF8NNup^dzEe0`X>e6IUuf_Z48;VJrD`Z29OzB{`=*6#mz)6`YF|KA-P_KLLGKvpd2?%os8ciuX0S8eUF zcK*V&bXB+u2Zy=m!C^2vWO&_X9Y>G{^qse>s>1PEzkz)OAG&}Xi^N4<6Q9v{CV5zP zE)vg zz61YaW_#5R{EMCuyH^6Y>)L^8CtD5of*E)krUxc5w}Uy{Hhl0c4#Ed1o9 zZ#W0(C-AXp`>GT8SSQft5UmP#;NaYXUZ!sP4t2Zp8kXHbFr7TC4m|vB2H>Ulx5p&K zEnHIbv%4pgr<0Qw$?(6fbaR&2{5;!gqaF6#a8q_2V>35FIEp3y;jUzQn_;Y2qp(C| za-#e$hV*T>2G~^>l{dlu`CY3Zt_rtwL-5AkyVIi?QVV5*%^1`q6m%Rk5vm`C4FkVw zyEk0BAw3?anM)nIa`(m}l5eG52o=iPAEqpbl8PGs*LNqby>b+ay~d2eOA34rknP4% zb2?pS6_G2}ahFJ;kbY>Mn#Qj>flu9lK;oi4m@d1T6Rcy|1x(-OM_1D3N3P9(e)k6h zSFuGJi8Eaw&3^%^Z|!dk{Hi1T8wdAx*xGn>A$@ebB80nZW%%9gfqm<(9Px4*{E-gH zy(<}#dkSZtqgi!?{Zo{Garcp3UmaeC&JzeQehmNhO1k^64i2XRvc(Z3VsFo@m8g}$ zci?wd(t+Rk4wUUt6&+}HSI52+9k5|w2UH}GtK9UY;wbGA2?$9NNcPSRW*926_xp8C zk4qX%|MCL$rxI&kMNhi6zC!x>wlUr>e_x)sna4ax0S3svnH$l?=vI2jkl-f%}$l!GbSd{{JZ! z{5RLvwzh^39zR^)-+c7YP<5zSsvp1}?M{aInIPV^U~d2H?LXQXW|4ax9=0~{28h6K z?rrQp-WfjFe252R+PZCbMR0pMr70XqUcL8tbL;+adu_+GeT7MFfCzjI#iNJ+@_2h^ zxcOlCU~Oy9>N^#(e%k&VkVJ3Y-`LvN-x#_nup(oHVw|!hXpUm@;m+3D`o?hk(f!9; zR>oO@B0+N$kGVo0ZhXDAzxk~ls}(2`G*b9Q`b#s>D=*St`qLPDc^8BK_}<>SHTP8< z_UYIgEVlVIzi8L)+eEky-L`FSMM#8xee2QM{o&RloOJfm>+rs}VaHGe|BHu@?1t)y zTx$ar2sa2g(uP}`4>um#rMJQ$L`ZHBHn(>k?d}gBu5H^jx56OAPy~O2!?M2hXz%f^ zMPFfU7%alS>6Z)7OuO$_xbQ5PA9t?pY;0B;_Xdg3*UbGo{C3UmofS^U9MBCCkKna? zdylpr@7qaOVUR2s30~iLc)xgcudsq*D1yJS3&~*jA;xFxv2FYcE689G{)XO9`@4@f zhL3iKxMIxdSfLxFXIKf+&BXenhx?lkLA3QKp;=)jESMwkC*1B;N;w{k1n``0V440o-Ko3;UbEm3Ip?NbMU?F!2H@vdFzk1ch(?FCzrzt(nf^D z*1!Gu;m+FnZ-;vu|N402;krGySI{I=IFh{S2kq;vNB7pY%m}S;U|28`ys`1SeMkr! z_lIk{UmN@t&Q*g&_}Bk!a|4=iE^4f>eqtyG?zH3et+lxcty(>MZ-YxCCT-u`fHX9t6BhI@qpiJ=JohLg7oi)Dq$G*}MapKv>mzT2?FvI4xp zBK#}&VXuNU%nZv4s6$e0

%qO$!q?V57#n6|G1-5~jKr!t?-=nBwop*K_dy5G5C(lE_lVH3qrY`3wOSP^E0mF}AE zjIJudxMh^7x2p^cmo|}H+r2zcursdEb_+&=cU1B&TH9Ax@fjXzZmM~J7V(nFp(5ZT zmFA0>r1K_UYaCnQo>JSon+vm<%`#nKE-aWM_-5_f4H5DlZ*M%b+jj*53q}HWBxiQL zRgYu>5%|acLbqQ36(q5M;|4?*Q!dV|Fd!C;1b&^^Lt*80;*SGW$g*)>;V|<%wi)Ty z+`8HL-HyFhS2$}TBo4-F?r6*O$Q7U?BsY=qscF^g6(-Vxk-$2`erY!6%j&7#)z?Kx4&lRcZD-1 zhH}H?d`^!ZzPt<>Arbmjw|B3=?cM7CO8{@QN(aE3k$s3|oEEx~1SDA11D@ z6)ut@Ch1gI&9wRzmZle08@2v59{;&%Y=!$aLUNP4ySBNvApr!?m#k@dg~_#GBnS?! z!d3nf+sdPn;#JCP-|TK!o5u?0O#|d6m7`U#F|RPGF_as5e{&VaWrdNqV6OGff&&}h zmK~TCS|39>a6RAB$f^~^&F>-XQ4}g)SMaWb_jW z{AETTPy&AO$2X<6$FI-lzd4jw#26g>x_fsD*$<1Q5lAY`|AORVg9GN>7>+&qOJqte z4045rRYE3?n*){^Lvih_^lXJWt^{rHNb%#z^T{~Nsjs-qOYi~9LA%0n$>Y*1LI*5D zzba_}`BYY%I;CbeU?^5JtiO z{P+L+FMjl+-~S){T$)DUBdN9gnb=F1EgU4Vw4QWihD7J za|0qzZKSVnt~ekHMc_Z5P0YgRNDomLb7?Su;syfsUWR@o4DN~p5yO$-uNRYpi?MC< ziWBIO2>Y5ONTVuQS}LGI94ZY*ghu$kk{VX_lwNTMIv_U`?&%jZ%qtFsM{=-*#H|%! z<5aD`LJjr#Gt<~rhk!tC+Meqx7u}2>A+L8~Vd!F*gIT z;zm{|H*JR(QY6~ot~hNTiLif#qKYTBF7b-f=71dNbas}!sk%buq_7yL$7~B=ttwOo> zx|co-?uza8NN#K)VH5qyKYVtX4fH_ABi@W#xQ zY#fDhzs^7{P63^`2*N}tQggy7di$! z=yrmFttc_pbi~4u1oh*;n~c84|9U8{l1KOcWg|(i?zsCL(=+$?4NU=%TzHt~v9nJM z*YTL?2q&kR|K2`%lSIRm!I9_PhG%WLeQ$klFIP}I+_SD%ty~6D`8Ih04L6?SiPnQn z|1d(l;yN-@9G|xU%kaAe?m)NQ z_UDBW?I?)pdWdo(0@QS|3z_UF`21*Zh>L4EwX)tnv=^6iTxS0^7(~5;r(qZ4;uM#}A8Qry z;e+YPiR``U(Z&2?DYJNxtexIzOiy5UkhdU{{sX+x1!;ZwU@<>^Ji}bhCI|8h`9E_2 zbjW6I#6?(dM!Ox9v{<`eZ*J|$`&V*??jKK=@#78g?(8T|>xgan`Yu>f;{@^-(>J4~ zyfRnVFTE!MZaW;{O?Qikq(hZ>{~y;;3C0X*hw|on*1|#{g5%=ep2!naT&~5UD!u28 z^N}=NDFKoUw>Ea`XgQuvhokekEoM%R|QJbnx`Kx#8yC+SbFzHh!gdlCrxegCh?g6grrQbhUAMc3y2tbA1peNYjUPd^JD{ z|BywHhg-|z>7lhwbcpB<-qkv82rLu{Xi-aAdmS zo*Kg$H=BTJ?F5B&%^A?4CAsd1alGN#$Cm{o4R%d*d=B@XB^pDo%xllk42vXKws@m& zxI0-+|6m2)UXlHDa*Edpnr=imgpQ=bjhPJX*64gXvysQEON9oKeD61}rwt#VdN_~I zEL6CoP?wvVrGJ5~>6pHvmY|XpdWkF(x$m$hA1o$z5PKK4j7!6mLXiSO8DF`Q4P};D z@4-T+bA#TX5EoAn^8F)e`}WAbr_g(gl^#-3Afm@YpU5F1sjbZpLPUObyG4(x%@yB1KDuo=ECRGlbjzr%IZySHZTe(5=RDbi!; zK+3Wh4>xDy#pHAXJ?_LUeoN9T%gIv9PPYOmS>J0BA#vT&`*+fQA`u_w1#YH-Akw=G(`SV}22pX)#Wx5TO}l#!y7tRRphzJPN6N!) zFfJ8VKrch_ND5He2|Q@z)|gy)L)(eo!G|@ySz##>86buD6)5Z2yJ<3c ztpKQ8a;maBa<0NGerk=1y(&*xqfQV>CNIkVZu8;#B~q;2f`z4v)v*z=(2QMxA~p^i zZ+*d9*d85C$40>}NF6zv=5{AIt8q#2r9#8j;ZJbgvg^5kMk4HWFRJcd zoz&~0NPtTm&rpsR!_6huf^~BB_5r4d@nU+0N2Z#YF=$HRE+Ds{%`o-K3B^mt1L;)g z`d(Xp2kXc>-tROVt8bVHkX(?c!<*M)5k(-|<(QsyJff|D+ABZrIML>d`_rfBnc?cy zd1us?nu#gkkqS!;qQUfhIy%9LwsA>0&MspMM0nVeJoDyk=VUaVv~{Rgp>F9=0hYut zgIMC7`LiTkpm$|-Q#wGBHDba2i7Z(s7C@SV=VUpzHM?I%EGVP136W!fHUvCC_}nVt zz1?kf3`BtB!etJ_0Jp+@@9AfkegQ2El@m(#hW8&mzL&(q_bTCKsU%>L11gK2fnI2EUYm_2-Zizy zMz6KFPkJ!OWXDGHw=b^4`RHIff1;pw<+a?s29RWUs8V#KwSxn58vb3MsJ%=zBtg&# zqRo$Me1)}K&`}~NQs4~q^ONk~jhXF6$K!5JYUt1y3eY5nR2&Qto3n$7J>Yv+d51Z} zp^*dzZLz4X&3G=Dsp&lo%EnoRN(Rua@1S*Ey(my#Ml zohk1Xz!DcHgyHEuDOwx@ily`9%xrKwBu2;HGqr55b3i&!+)1LMucCkzc2WeT6z(t= zEBOkWwRA5uP^5s6*Yu*GI0v@Su@4TRJusvBEP1fCmmWu}`qa!PC^vb{aIoSqF z+7H8}Gjvx2ED8Ta=j!2wbvbrCAmnbHR+*pxOm3L&rK5O2o~D3x|6#_rS06{zr64o| zT!hpi_9DmzBH2XSbd!;2GrcCx7BM6PB`IuQq+eT8yq5o#UpSQ##1VHVd zw?|^nA+j?%7Gtk?Z~vBMBWDImQf!g+(b*EuP01dSAcQnYptpk%KjrVEDa--MCDuXl zV$t@!J{lj}z1S;56dYm^6e(~fa=*wwWQCZ;*n1|nY`y?S3ivGiG&K_h-@#t$8te5N zw9HeEN?P1lkxTae=GUA1rgOcv?`(f(aO8Ps7{V4HxqO?LS$fY)N(yk{H34oJ9%()c z2iHEb5tb*|BthOQsMC9WqJM|X+)BWPxLfpMf>>e19whF~-WAg!I1@}Mw(vF*f{Iu@ z!FuL2#Igl)u7NV$n#14F$jIy^HC|!MCH63ws3j%8bUDYH^4T z9h8=&wWa*atn!X%YbW6x<_0MbLuiQW2uoT!#NGQ~zOaEnz1V4JV*{h3FV_+LvwXaj zN1c@nd(UsNIOd+&7>-Ph8Nzw6C=8VDr(U0W>qc$Ap@L53_q3Ux-d)q8Qz;g^2N^;H z71%wG5PkhHmFIh92)i>=C{i?Gf^ZE;cx@plzE=o?o}PwedbQtzk`eJWSa~83j1%8n z@0hg&*C`g^;p;^p=!~X+Gb8`lcdI6&6+j4!>mU*xVLdrtT#TVn8j9ZQpi6p;Fv$oL zDC0F2K1z@uat`EILa&i6m-V`!Ne^8h==1b){4VKi?;dVd>H{2!UW3du91qVHb89*5 zJ%ti&DuN-dtTTqMO8A?ZrrvY8&F%!8^4Q?WF$^y`HUdW?1aJj~Ob(*5PrFz6F8j2p z=2=vd;_|doim2J9d%apx>uKtZ`2wgTslnUm9t?SipEFdwBbgpNIUI>#ezBc0EWM&{ zPlsG*AW2alTO0pyF5*LZ)3|bGdi%M2rNc{k?X?f?1(KA_2}#s30(dihN_hdmBDY zgMmDVHe45zvuqjc-W}L_b$T#zKw#4Sk1UhT*`Y1g&`Z*Gm?#)YU=x8zD{9Qf^Rb+t z-%V!+^Jh!^(sZfUFZ2PA^Amhdh{e!$oIe#fvs=y3v2&l%g{giTF5hc%n&4uD$&G!@2XU0f$21%wOOV zF=2hXYJY(NCO7m2FMax)2y{7ffcBa^S_IJql7tfWCebB2w6PVvSKuw&IEq7XtYp7U z_viNz9%z<8uNvC2Nj;Pjs4s+}28N(lZb~$P##Q66$N*c4BvC`1&TJ{Y%goq2Viaxr zHY(&GnsX@I!(R5iZHGxw{G)6hgP3-NL70FX5Qg{XShl{yA;a5{& z2}4{QU+ex15h>%_`Sf7td;#51VmHi~^}0L9=|R!~Om3_=Pp#)be4g|!>Xa_QA_dMA zXC-txp_QF_ua%;KP?3la`5SF7L<{r={V&tVs^}Prbci6!{OTXfY^<(B#E9$zG|DJX zHGi+JSK{l)dUa@|fy5W7fJmp@*xg(=eY(8FR{+#$r_hPHfz*`Ltm*X++3je72p_p^ z+-Q~ryO$6F@6dIIPg?Q0o+104%am^bG?M6dMzbT5<(01r@CCK?v%nW zkP>JGpx*nu<*vw4NsFYL^~uRemigIxsE_eijgS>Ebnprnq8Ys2L%rsT4RR1H(jqQu zDptv3)q6&X*CUo2TQJ!{NI`zGzFr^7v1=WEy@3u#$Xs&Wp5@RpRbl(Je=tLn1sjrs{jJerMK|-bLN2 zJt`VmqHGG+Pk3~G^Xp>dWUtXOlOg;7HX)f2vJN4)R7sQQwM-Otl;RK^7p>DGb|+_& zi^auZZ=l}Ot*A>_Je@4Rvv%f7q?bLl%db~5YS~l)Ogp3_>eQLFz4gsav(9^WZ|fYz zh}tF5CKqy_%1M>vF!#!?2d(*%4Pe@>XbE0Xw_-%HLH83wdR}*+_kb-O5e*cVq(4Xy>|YVbGrabVu-?8M^3EIq6LV- zCbKj4^0t z3Si-0zd{Ajqq7O#B8)R{XLNpS2J!M1VMQS_>?uBV0;WeeQ@2Osq-=ceoz#+w5#x~x zMnYL{-d!s{LYa7kIfh_mYvc4PVkh|HMnmdAB{38+$-Bzx`}7W7Dd~zRgoXSqD(w3F z?8RbwbZl)8y?VJd4_P3>YlsFYBxn=Wm#nPNd$pEyWQyT2BB`*vB+jj*tMp0=E!!x7 zkwA_eCZ>v2+NoXZb5?}4qt-j|?Q1PTB`vPMIL0@>V|#mNXDJ6GO%uL_E75GuUh8un zmLF~g!6H1iDBWdDVUp7tSNg9FP4BH#aGF^(5@E%K6ZMcTT6-DwuDF)9;Eq&9B-PJK z4i-0sj2V;*DN73bt}iSyzb|rsONm5h(Rr12Qkz4scckc1A`FqGwwYQ{ocwp-Zhte0 zt6NblCMg@I2$oT%tMx9+7O6t9NC7b^1hqqgHht+O=m?M(EE3?@=DJV8d+le1)gC~x zR|%TCKYMS30<1$}YmpM+MLHL|PF;oNS1YL&8zTwJpXo>MXmu#u z9*#7aezm<&B;fsGn0ghUR?|xasG}xZakw`>Jl{J@9ihEz`4E5G2?CufrVxIH=_A16h;dymI9r9MN|-gr;=-sHqu{(H587AH7? zbS`A~xN6KYmS(h8IK2`ylHm06wj2rEg%8HA;oiO2a>NHPl0@!rlxB8T-t1+(UZJRU z5nD_$LLG1h*sb~e`-?NIizH8^cle6t*BFgFSaXe=T{e?DbIeTj$^o6O_6U@WKCb6r zdT7^M@9s&$(OhB*VH~d54-u%B=HLE(pCrCa<5HTe+s2&YOuU>1(SKn%y2@%@Wps8+ zT;9%8vbL0<3m1rO=BIbz;Vwu+uuGWagUHb=h-@%>uY}H}&&1IC8Yr51c znHixYgJMrau5qeN2$+kbt$I&}W!V!Pz;t>%35*0N^T#+ct62A5ZY@LxkYu=foZ6SW zfqOkZMZGU_0^^caXFax&kBT#M(%X+#Uws6~eh8PZ`oR|D^?53|T55hofaKDA5ixz4 z?(|x83px}*2n(@a?&|MGi&-M}_ey4MH?+qhJk%Ds?0jvjgrRrkmZjJRj1;hQ`HR!L zpCji*yia;1j+PrVMhWTObX&hEmF^lg6ZWuA^lM#_Wo)(}(gj2mz_Uzid0>C9sTMb z3iG@AC|gYJ46Us!IAYyby`3qD3Lb{gFh65V-J@V>3P>;ZGF4Bk0Qx45886I>7bf1< zy>deC(Xn7`JmdtYiAFCtI4i!j6ZUF}MTN8gN>&^t&iW!A#luVw={-sg3x=EqiWHPW z58OLGlhG-ymbOd1+D@@cSf~x0c7~=4Dil{{m2?}z!I7rXR+IQ_EWT9uxI*W@M`sh7 zkT|zQg2IfbxP`UMJX+;=@+W=~oDF~@Mus|*CVTaxvdl~z0z;4R;_@TANP0JLi+l_i z0^@e}z)fk(co+8?dRp)sG^G)Rg;(|-9_mZw-(H7l+ihVGNrjCS%4^7Bwf*Sf{x{}i z>Ln{k90*Gd6%-w!_RAlC3>7#$OiH)+4quC9q(LJMln1AJ7YnfU9!Ev(J3x^^%oULv zW`1F}ORorTEFviq8K6|UGsBl&GgH#rg=N_s;xrMrlp)jl(1}PgjMsASf!Y!?5y7!1 zSYcGtMRmJMC8fD4^-2#DNs4d$)JcEK3SSiY%QP_T_&p1`+q>Ben{a?z}X> zx+1(YqYz}?>i{UaGvW~Qw;B~_6UFn*1of`xHf4%PY(4g*lT3CeN5~LJHh%Bi6ff@p zMFyPBltLh-JYJ$C@5Rh^qSw|_5JO@todh|VagDm&X@;qH$Fv>G4ID|JH@UI;-S(E4 zk#{GDaM87dcK1fB7l*D5nf$PqF z21!aWPb}ttn9MN7Z8~-Dye(s~z6eJytU$jwMEApwGh2J5_a^OF9}Oa@n(M(?p3N-v z?xvRO!9$S%>SFY?oq_LN1g55Aj6!6b1dR@KWxjIgQ^eAVP&s40^onJ#^{X@4E6GRY zbtL~_o?v4B?KRirqHKo8E@{#qWHd7wy+KQbq(8wR=&LyMrS4o3Cfhr~Mem-V=;%jD zwfmd<$?GV++bz2qGdS|#nDW9nJX2;+dKHKkF`ORp>A_Wen zkan_uGFmR3Z{PHz*PP#(dlI9P5~d9wK*0ZGsCuvXmIwleM0lJ@ynyAXqAnIolf42; z;r0zcgoiE9n|z^>L zq(NsBa1iK%3D!ch0DHxZ3+H`NcUK9IOjzu+e&U!!m0j3na|>wi5u1xNB}meVS=T=v zfiCaNvAz<`u=j{-Es7Wck_*y#6p)dJG4xvCi*})O1HeL1xTPM>@8M-8TXCS*XI^nt z{eQH*X_H*ZbtR}as>v$sO98b}6kDzC8MDy@M<_O1t#2q)qL@u=LZVodYQrvf`w-D5A?D7|IWF`{rdCk?l0VP5zSc0m%uyc`F8zoeqC|dKygaxq0E9+P*uBj zY!LWtZGL2Mq#kn4v0Xn*CBTsPA0=pwQYJ-I}fDxwttXVuKAs^yN^Ahj2}02xW8(v<8nSy7Uz zEwPr@I=R%L5Ept$nA2RnW-?Uuk{yk3XgVJl3Wr8HJ)R~fWvhE)ArKyb2oFtPtx;D1 zvEVwYY7jjp1++LZdp#oQ#1E$TOyI9&=QN#G-79t^V<;YppmVW?OumMygI+L7qt$~! zcgnqFZ%Ulke1CO;LS&fhi4rV+JB$hc>u_)|KcQOP>3WzFNbM{y)bO{aJr`9_1&7db z2$EI9e?OhPcLzS_o9W4Rv9*!$>XJ{RE4`?s_0EIybIkG;z#)Ftm+5Q0Kf%-$a- zqqoR$a@z}hpQg8}yV&mQZUv4!ESkZzL|1K_bz5wIRo7(V1`#baN9@=ne622PI0s>0 z#2Z0%Sr!#ni>F+=yK%?ify>_;u4>DA_qZ65Y_RE=iSffywsyl(wdo3(7#@buP!7B7 z=8#Ac_gQs;?#yrwkYt1QB(BOI<~WG*Hs5Nh{*lb-86#v<nd76?r{MPmD(@sJwo2^@+^kL{Lmuo$)=ULyGBIhkZ-6 zx+m~Yzj^)m$?wc4RfSU)WGF(C4U>){DL*k&6|$RBRpRb&$1lUOiM<<`417d&J=3Pw zm&gO^!)F7bk0Eso`5vIo+!I z>^hD<=2&5ZOwVxDrrdjMI<2~K<-&rgJCQz)J>JJPUo7T!kFPpSO1nr5#;-4X+RzuYtx(O-$gPw^1#GF1^d1!QMEZw zCUe!FGa%x_htf%>bfc=8&6#9M(a3>mp#mNU#Z5O=8_*}&1&HAAGU;~y-{BTC=v5z3 z?^aGI;*0SL%eb&$8Vs1D$YBwoXwUok?K;PNd3E~iSS}t;d&h5h7g+E;+g!BZv318T z1ZOFmhEy$x-A)9L$hJsS2-5Mp>3Td`Ssk@H6h<`0C^{6ud9?p#&)&mYm0UY~M+DQ4 z_iF%$A8Y}wi>?6z5gazE+x1ysND4$rXvmC1RfQ^U{}zv2;M zG|o#`s&xFKrdRDWWOHotV-GN)2s3f2GIVG3!O3Wd36;^#Fq1oA3`^CZ?UmFKAR8lv z{`Nj3d5Mo|-DdJ^-TOq7Y#NdN>CRX+c*F_Q?Yselpz&1RKe*DVtZ?KJv2coG3n+L7 zmrKz{THR-?;Z}kp6{awx!eq5vP4HjG=l=0;!Ec7TTG`Q3?t&$?YzvGiWpAE);fF2Xku&W`Q2ze!MQ7;I2yc-V@v%UN$XpTjEt-B(HGffi#G8 z-7CI9WB)(_$pvQ}BR2jPsB{@ugIu}uDRD-87(P+*yt z_}Z0LHG}O+>x0xmix)pqF0jze^sgEVmaTwBA}nWDR_X%FxmZssTF$^`8d^b_uZoJX zq~1jmT^>CSzZ>h69Vn469KjP2XrlyGJ<|414n~@Cfp@xL?BHMKAbR3Gm1AZk?*f!i zp`&nOY;IQ-{vM0YB9cxPZ}3&*c^K8bYnQ_!N=1S^Vq^kyTFUA95NX_|>eMa-C@dP= zgPbR^zZVP9eH=B&5_Eooh zGDM{cb{M8~RyMM_)$K6F6puuh$kq@1Y<)UCwiZ*hT|MTp_X2xF(sjO5e@N@~=)G5n z-7$AFZdE;^R~L5fstlap07sJda=wP_PVXhG`WAaUriw)h$R_b+(4`CkVq@gZ<O!qDvMI#Gl(zlDnjNyLqK^Tszv*r-5c5==F5grZ{zYxV7N8Iy>htypTh2g4( z?|K$x376DJzLGNAlMS3KhN)`K8vD4zASx7K@5mJ5u9Ages9JqH9GVHNHpQhsrMi!8=ZU+zI=71Ytp_4H z_G*VNUFMej`Pxuqh``8#WhhEaWSJY1s<2HKc>+ZW%v9|Da@EQQyDL|RcZ%1#_1A$A zRyGNDv2DTUUKO)u5m+3eV{GH7o9UEl_|21YxCO6vJLq@bG;gs^HK(@4ry?CMY! z?BfWE6i~0lp^7F+nz%YXV@0*P_2iC|0wT%$v4V7auFjg$u>t`hC``LZVi#sk)e_ku zs68BsRMqxc6$+5q5N%aUvnz{Ac8o<5i0dw+5o;JJ+w09JIT%-U9rR~3#*ieGq>(=q z>X%g~7k2)!oX$2^_XQ|oV{+-afN0*uldI}k?mZU}0g{WEfJey9``vu;eqKy_s2V8Z z79MxvN&Lboo^m-AYH_j}oju*oW?9Znb<)|%P=X^BM1Z%2o}(VybUCvX6|37`j~Nue zltjIl*stU~qmhnP&8^pmsc2+@U(A|yuP0}?^9R+>4O=yO)6*ocHg}*T#hxOP8CMj3 z;I?R}s#|(4ojV}H$65N}1G1{#)s)>Gma#=8DU3xYmt@vtW_VQ$Ey~AQ6^j(mv_y~G ztZ?AyY-u{JI_1WTIkp5T<<~8x7|aoLSyJhCP$k$^Ln~|xXu*#w+(=I~#a=&AB`BT8 zjltN0F59KMFi=XSA((T#wZ5Keafe>h$CPR`I)B~UTE zV&KU1cfo*w*T5?Km1=nZPtA3VZE;^)D7_KBP}93Jm7RTZWurPCsk4)R1+om{zu z`>>8}Wr(Ug$%TFgM0jlfk>c(mbyOLJkV3s0CwuK4o}BPH5<6bv18J@OwIySGgW()8;eOsxNYEs zzy)_R96>Y!xoR1e)Mt-FX!M#3yzH-$am!GOA*jmBV)P{fBMVlJx`!@M)u&fNIxOuX zKecdWqG>_3i+X03;1C+xWtRj3f7HR7*ZVKNHyqW`-kJQ-VUiEVs;Di+4Zhl#Tx$t9 z1jkhJ{q)_`>Rwgoo_-P>LaU7g5h>w_OqHxk;#xR@h}sHv5e)$|5>-EDp@SR>fn}^+ z67&8V=2z(qR#gJ`n3M*PWSuyaNVsXnMa3b32##5_PxG;GqO*#gENTNpbeJaMfTbr^ zMDWnAxvBv<%dcjkFUvtGg}5ag1%m*lhpH4k)kwVWjTB;VLrs)R>>+hUn=W|fs%yLV zdLfIcqr%#|&d&eFw5V!o<+?8vl6|BYC>kkXAq?fFhjQjYHJ99O=Lr%CVE1H-1GOd7 zn(At|L_LTkgkTAit(0d|wR(DHn_`g!x};CFgZy$GDkA2bZ8863}VTAbxi(9>1g1xT%nFjYk>L_wOGp6G9Ak(?kQ7kOz7>gv4 z*9pUTwbdvhKypE;5rtD4m1~<-y{W8ic3`ByZY>lAsZ?FZW&A|?1*Hse=T$K~xhnno zl{16M=0G%Io%c!f>aH|ROV^~~4~z&yPjcKZ%NDP~7s5{gh@ao>*CJibQy_8^);y(nlEYu_l`%vN7@4-cUI$p%|67WOBl}Z&4H-NiTnXA19*J6@VLZwKb zi}VgNF{lywn$MG}*JGz;YAvJTv&rb) zt0IUrgX;FbSK9Pzx)`MfJrIHkb^ ziR&Vp5vyv5>-bP|ilm+8POk+$C|+_^5m`LA7NC?tRE1X`H>ZpFZx?6Q3sP-@6_5!M z31AQeC07ns=b02$e@?%K+X0eG6^+*ujNsZf?0oYhAnH;MgDRuvS43y2KEpIkepU%+ER6doR!N%b!bY{rCb#X?pM34 zH{~iWy8k!b1be(rx2S^N{!cX}s&~5e!t2nvuB6Lmjl7YuogvkjV5%|Za3sQ>s4L2C zosSQm?C+ZatonX>+ZZE~En2^DlmGBy|H;em_6*s@*KY(!F45&5Z?Yqb)l&c_`%Dpt zs5=2f-1oD^VR{Kn_0xBG#1)W4P@w&AMU_<~#np6G)tK*@0x2dbb5+HCfnmI?s^TF@ z2kS`QZAPRvcTT+Yl8r*7L?=*FGSY2G) zLO`C#4cyoZaM85Q)TnlRu4I%T*$Aj=<`lBi6`Tk+jjE;+?>v!gU`Y&R&ChBqAW0ZC zY}LJ}XErMqDY}Kj{*|Qfg2r8K7^qUE+kbfqOIFAQm7%^4vT0d$1MHQbibfU*$hn(N zI8#>JrFB|W#dOJD%MeKg#X(03rIhBd_LBt3D%Z{YouDn}R@{)?kFRo;_X{ zRQqbzjr*!F8c3ZDe(H%?G~e2Nw%T_+vre%{0YU94V8Rrpc6C4KA?eUa)9dbq>?;h| z6}o#n0)7bQN?bGi0ycT!0C7~%JUT**IuWJ9iBDd?JlK2k^2K*%idLP7Iqhz6wiYfn zKf3M@H^9%}B(U0fHB-1}lyg+lVx4H1MK;PSztua&B%wI*wRpYHT=qrhV_{QmWj!C- zqmmT%q3>LLkNYW66RRHZo^FltNQKi9q7?i%TG?7=)&06pB_I-^v0wXE?0uMw#b;QM z0#%{b(~ty`git^=hY{_}l&Gq}>CIkLG#wl@*@ycFIB2r}{P8oh;;Nf=rh^m!wF@IR zw|E)9{o(1;q!d-P3sWV&3`s(G`(!%293vdEN-EA*`>$_G1T<1WPWrGIY@@S+Hd@_N z*X7gG5gduI0Y&|K@apjs>tm_%>>4HqN1iUGlf(ltZCq|jEGjNjs-WoaP*_;#z9iyB)OydB5oWHLug1fe;z>A|H0m~r{>e^n)?J{h@;Mboq~}B z+W@~mJ-Sl$=oEZV@rf0jb!xT~kIzXQbRkbC@{#K2SCP5gjC%L|VGRzBTSGV`f>r((E zla%|L%x03OYlfn_>I(Oi2nInhn?yAh1?iP5W)W{cRlP2cK1N6+kc29p@}cQ(KD;WR z&20oRitG8vt`TAP-Q#~Y@KvpMhbg0YB*J1)SJIo&bapmMXKR%y(+zSwZBm*MV474F zAiEO*+>pa6^7}ImCS7r%EQ`oCMF(FFma`;ju-c&Bo^x1a==MAnWv0`rqN?ZkTL2>o z7D_Pfa{p0P?Cvn>A`em&SakVXIQsa_Bh#9y7rD2`Vnm&7dP@ywX?Ma~Ks`I7_pd^eUrmoRfSkg5DR4(q*5Ta5ye}#nk#1g7HnRkUaBTUkXJ)|B6 zIh}(O|BH+SNX>FOsA=u#s!@wuL|viEM$_(cyZOHmoHc4MeizBG&T&fRlILZCzl`0 z7**w7dH?IcNCBPJn?c^8_0onQt1U@&^9)UCB1gjo1ndsCMI>OMjfleeY6aUb$w{kr zSD(tMU~C5#O>`dV*JePfT?OlQF-BrjTspv@k>V3j{C@vn|BV5!8jhKs8DNMC*QFhq zP$MH&2&=Me_h<)9?JM;rzWVr$ttM0LtG>|?Swb|W&}Aq`d`yp3ZH(SENGRg>)Jt>v zm0_!9kERp&TXzUkj3x=mXXkwWqnpamt59Z&C($VEieSn1L8BJluus@}#t?p>WPeV#@K#qU=e4%&hln~T_RfU_aU62+xV(zwq{AS@28Rn zv{^*e)nX`qw?r7yGVoc&va0%IE#5L9>EPR7LRD7hp<3^&a6Y@M@gVl})6r%$gXl~O zE>yeUs7o;lKe*fJyCOod?5~RC9@*caX}@s#WDc2XzZ7NE>s7lM<{h@Yy>PO6?`GgVsG25 z`Z#)sx;V@4gZn|ZWGK&Xp8kU)KA*Vi-I@&~n}#0beB%aM;HtVH3ezseA_-)R_o?^_ z{1BSrS~*{B^Of!N6}G zc>ku6_<+yPz)WW_^91V8W zk}*M@4uh!J5-8U$U|JMpS!7y3eu;l<*Nq+3C0|$>1xU6-Ca$aUh8^hl$$5(E>e#&r z2^>kF0(cUy37B!HZgo9tP_anypM#HKZ&&d{L;QzJxEXe{XsacygjQlcO{(f}ZYL&a z$@mpc$W}#YPtV5ZW5tK}LIu#-Xg`&d_h#!sxQfb$J^rU)iKx1k zclt%twPNA3lKbm3v~YXre~^)vsa-tkUF@!ALnhUE}P!e_NYZr&w{iGO5AT> z{$NMDng+T<;8;{P3nEUtF+}?Q{x_xJqfZM+!v>*o7=CgpWb>B36Gl994t2e0=O6#&ccO>3^9osM?U; z>DGCKun&alboqp?GV~R?i{>*%BLp1_0Lh&|cf;()Fs9<_^Ms-q|qxLBh z2co;4j4>`Zr%R`=t3IOMbt2vli>uRF%xHwzrDA&K`KpeQoz5u~DIi7lOvwJ(=;Vse zgcwL|l8PJnIsnmCzxPAPJ`E5%akBsuN;&FhwCr2Qv+V0f*KKsT|di z?m8}CVql03kGIKT&Xr|QAsLs56yGJ%ofpNgmQJjcjz37M zSv6}4aXN=W;5*Pkyc8~|GgUjoO5hBO6xbcTkLSr^vPz1bRF#SzCy$5H&gn6 zT4vf))scHfBZ4Cl79(QLaQy!;$31!T$&u`a&qr&UJyUHM(x0NiDFc!(N~Ls`G$MBY z)wHb2)vM`6fZBrzf){_g=<1fSnV=R(jYxk2y zc43>@SXERO-dJvAOlN6WiQ9<%6S`2>Bc2D znW~a?*Wg4(6C|sIIA2J%)(oZve9;r;B%6+_x&}%UuLqZ{>*6%87VndD+tqp3vuQXa z!lRzDutVjcYhtyUFM1OMUtPj;UqS1B*{QSI8Y!;L9eT?we@mKxC^XSf>5 zIS-(%B|^A9J>~6gpUlA6Jjmhb;PA8k7kl5n-h2EzGi%N-hl`Np!#wqZOv3+kmAf@) z7^`+&ujEfa$qCsXB6al88Ln#Bq8##bK#K1if7qwl%Lc!y$r{(6`Va#Y8Bo|x4CGfy zjj(!QyVS%M1R_HAd6n<+;d(LKo;UlxXYB?sl3)tUl`nGF?0bI&o9UYBmT@F+PnRY$ zGD9R493SqQI=KsEvlt#Nw&zaq828?NXF*Ab&0b5rN6F1^7NVJ%MpgwwZ=LrXS9>)W zmp*;M5LWff9mb{Nk*IT8U^Zs?U{xEZXA@Q|Qegj}{i?k2{#*4e6f9W9(T)m&=*`P# zFMmvmNmTdVOv+?%s&S@v>O09YSM3PlP`?=a?1N9)Z{ZbvvU!(NrrJBB@i zBppn1CL74UC_fmY>c*3+EEY^VEv#gmojFXDhpJt+Q#5!$5`7Bq!*D!YZ>H-+s z3R4{lQM>D3^a4p-wkf5e*T{;s{dMUJBn>jzv24`w53j#9&Z^U`*Wphn;zPLE9TQ1< z_}ll3)sZEuo~YTedB&Jz#dbkmbMn5dy;ir2UhOqTBo)rob!vzYc@^}KYLGjV5Phg* z#VYph|JeUw7FSg!6=MJfj#QW-%*%qb&Ag9Q!CFYoQXGOqJg^-i9^?npf~r1MXh8rX ze3zjo*)8tGjG?G@QqR^C!D%Pak%GoOo6ha3t#(quiJ~|Jhh|+kUtx1xt6R0*8j5%% z!xkh<2lpIc-EPk&$(`d>Y1+4PVn7|6Zi@S#%-B?$v}4IA9+@KFolK8H@uX_2dZ{8n za$!QNcPRHZR27|G=a9o91J)x(kCFRq#Z)6@)70N-*Ne9fpk$koIKOou2>e18aI01KdNtf0aDD^UkGD{~7y0%2bb4$Lo>g~*9y7%vk`As0KmD9z z7t0CvxnV`ShMS(fkgH)QIzIvWw$2gBNJyf?Rk>Q6B_4?QnB}f9s4)L#wYBoDsy6h< zR1ZZ0i9Wmh04bndypF6Y9?B^K29I3W!Bb^HTtnX__v`-dqFy1ag`kBfu=Zk@m+ z30dvM-U&%45`jRFL03H8tNLs*cW-#2^t~$6VxVp&af- z#yo-|g;9AW)&e`gO#;(nmr;2wst!@&K7E-eT2&cdb({(!$+|NUi43QP4=0Xk>1C=D z_Tlq0#5!~J%`Y%ldNN5ORpM`VJH_1$HZA@AMTKCWsz?c?6`lyLsu2h@2QCzYP6leABPHi&Ew)}hM@#wi`d>(IrI z*B|F&Y&K@hs_qZB7GR4S)2=4Y@KNZ~zD)n>@S z&c)#$wIvA@n}LZo^xFYC_H3Od3RmZIx|d{VIv{S14u*@v;c_*3XIfHaNm`o#s!DvH z6cM2E0LeCBI4(Ot1SA*yeYTzR#FJ6g;w$|ocx1|!^WkWntgXu~XNRbLr~`x*w>UnA zu(Iy+YQy@*DZ(Qa9QL*gQOWOAA{c4uwrVu8(v>kTnX{RHHu{hYkIT;d07_0w7^F~l z>oD6ztNog_GRGrRHevFnU3S7a#4_7bD!rLicUd-vNH&D9RIzqG_Vr->ry+vid0ED4 z2rKK)UC3m|j4l5gl#nwmKL3pE$0c*N_sl0BEahcI8v)4$t)=iaqWPINo?mO}LnUjr zCO0dbL`-iqz3iF{pyZ4cTX=nr7W3Ih)5NOE*(d4(TDfUOE&8%e3!vo0Lh;d7T_Xw2IQ<4lRm3I&HqHhA6bMndsqcde>vnn{BqB>6Jc)0Mfi zgqKx46|;{~vJbAB(P5SuPbM(^lk!TJZKGn6F*BB6(z^9!X6yOIPBM@Im8`j79VMwF zmlmu7SmqLUh-utqxd=$EOg}wJOr!Iw8@3+>k4!KCb9pe!uQ@-z0oV&mUI_0_o02jO ziPlkd*k>y~gCkFQ(_c-NNRc;#cO{#?$0aj7RQ{91A(HL*)!nJDfdP#ynKUb@;Fn$L zib=+7cQ~GnPOL1u?C#(Y$(AV=uxLb*EzICucJ~dS z1B1zgX~E~0+;CINc1MyRG}h*eW`k`Aq-^D8n{5ZMr>!IxD91&>TwEI?u_1z~!ARq%}sqja$3g`yO8 z3LK8Z>NV}Fy36}y4;n@=l4SB!y!Dpovhvg+mIv)DQCKcJXo5$kY(b1+KAZl#?1CU5 zxiayMwK5%NuF%Vh?+%r$Wv8L6L-CoIrk>vyQV`Ptx!k`{@$LG%Z2uCFT$v{X8zc4= z)5ObqLOdk-G6C)_`m5Eg11LFnZ;b`J>`J%B*gnH-c3E}mVw)dgYtG6-oPRd=p-TI= z|9WHj@gGC##{ZNAfCuZd4H7^O2M5pJyu!)d5feepsP7O>cyTpaef*VzoNmr$|4|<- zA_w4a1NnOJY65+Ie)1ir^u*nxBFQ7EHoGI2N68~h@<-489Q>TmBvD8j|6+kUE%W&# zyAEo{`cituAh$jkKyrN%eHLqkOOnanhs2As!>Cif2q$f>#U<^R(LYCK+6JeaO5MC8 zZ?u6o0VeTZMZ}dc-jPt0+@QOtL#Bc9??NM17fT`rwd=e(j&O zlkH^ibenAKJF<`z`cHh5z!3;hKl^Yt8>~kk1_zJ-uva{~->~o$gADp$0Lk@WKKG0K z#U&)1f{;ufUKm8OeIXxmv^axE5o!7uc_r^BN0-B7KaPaKM(HuAGjijN;JtsRfXk`@)k`=+o z^DvSo&#)@D%baP)W~odOiff(Dz4ahQCFNJqKYol-`lkr1OvgFx4!y5|HbwRW+I`pK zwOl)mTgGzc%L(lSn8f!ti?@?GlJo{|Qj zpUfM&H%7{5t;Ht!*Vyfkrzb3kzQR&Hz|LRn;s%ioj|!lWd4h3r(|8xS8{b%fV7u5X z#*4xgK@AgHf!Jz&5V2%Y$@(|uyT02>-Y-&ed)wZidR5w9=HSQtwQ5Qzw6j_)Co6oM z=wBEGCJGyI*)Rtbjvb*7ec1ehFE*nU4>dkP-p~p{vp4}7B(>tW`Q8Ug&WG!hvl*uC z;Nbh`&p7+?3BSY0(h099WYmWQ((^g-{4bN$;`L;+MY?w;pmzkj0$(DaQ#f*cjj~yr z!Fsz~;%}+d;0iz&h`dCD= zeI9KJUhBmGOi}tbbfqG(ZTcW0FoAWA^m5us{=AV5eHlyo0vc&PIr8e55o3>J zmaYHsSHD64d_7ox+??X>(8cQHSC4+BJ&5<%j_|(w>gi(eEfSR9!aCl6nSXVIo(}{9 z7m!GCN2kb}(JCisP~!A`GsOZJIbtR5TV9x%Gd1ja(OMx{^cqdpWDy z;*$33=$rQD@20E8Tn?${&27=iJ6$ksZU#;AzcUMYpSLJ3X1uBP`4rpS{KQ?~oPW*# zTc4nnC0=9W2i}i*2W2+$?`YTpBZ#zD0wl?P9{tN7=7*wZKEu7e1$C=I%ZRX2)*PGk z#=rL4$!w9gwqbixml{d+LHuhSBH3tHi=ntbKbm}yGpe97GN?g;FIt`kkX+Zsi{;0H z(_u&PWtDP#lWmDG2>RD?;~sA}r&u+jr51Iwh5=K!tm8`9{DN3Wxs{!d*yV&&jOrS# z+Q$#`xAVpO`J2^fzCNC;ipMw`8m(|_v_AA<^9u%N+u3FcMO++L5D)__bFYmLN<9^4 zV@~QqBSq(jrN69D@;krK)InE5_YlfhEH{Ji`A5#&pt*Piwz+^tn(NO;sD4KYW(BXZ;-HSH3lA_eGRYeFSh@KUZR5zz* zCp5n&nMK;7&ia>0VUdV_V>JJGba+_E-lHM z&|oYrKf0Gm(}zjMTZhy6Xg!`z3(IoHd1h@+c$-Y&$xTZVJX}u4Z)cOi4|D#24IrPh z4MXoyNYjHzI@q&^^U-|%aqvR^`(k7Z6*S0#06?zr6yQh`>;6x-aDEgcUzgMUEiP&Q zv)M1a#_gSKzr|jKeLb7;|8nVVqo0Q#^|$7ujFyi0+2%C=q(5BxlloZrLHAv34RaKp z_fp)TVZL<`oCe)vhv+84pQp>IxEMBrf0-_0^()q68e9z>4hg%*1eUD7h$J7>6wuBl zVgxc8lmtn3q;Kgej?hRRJ(tk=2@k|Eez^D`@$J2{<)&b2HFUFrkX9coBH3=NPq!Ov zS@~RQkh%U{au^&!f2n%B*gOYF9GI+7(|)^7Jc|u_xdJ(&DEGmllJ)i)E*F#(J{e6X z*^=FnMXW>SUw2dq6bb&5jjmA#AFU)6L5{B#ZJvLwFG~YTa`T(#eKh=}hw_4~%HO`Z zjE7oLNUskGB>C=7k;5!}`_CW0`gLI^-I1)O{j3lq(}x(3Od&G+BfK#uD4fN*ftaku zK5nobR0|}XK4hTe{483fd+NtAd<}|1gh9&axx;jH`ZaQC-Fk_9-?VuRnx|rz<{3b8 z-92_ub*_vdlHr!7T@4;X4?vzA%#E2YS6TO17Gjg4Ns07q7&FBonLcEou3_2%2On`X z_(R%*4R)3Sm>%rV$np?AUf%05mH)2bc0-@2gnWoDB(!FlR{2!7+}P)?E*ghj(f$~Z@X;~0A_+g@jO1kJd$0q%kMop6-MNt=T@EVVIN2LuksXv1@LwoEQY8X$T&^%4+ zUN+1Q#b9&w!2migZymf6v!mF;2B}}LHY}d&(c>j##%#bsji7q9n3nwT4I;z?v1$FF zB)yADtQ)S6gSXSAEH<+O8VsBOK)Uc0;9T28(D*DW8PJ|vP#Ux%1tOb1AeAaXC2O46 zmlydo4Q=qRL~DZN(Q^TuAMgvS&bV|Z_odm^up@z2g^fXT-w@}M_?)K*pC9oc%2ndU z1^Kqruv3&WpCU9e#b)dQT!8y5PzL4DboJ%TSc^;APv=v(H?j`hQDs*h6te2@Tey^xCH{{$Y7@74!G`<|!wOI@+OkpJP&gYAbn1iq7PRm4gH?&!S z$gB@JDp_L#L3Hd~iZsm69ZRCaB;9qo%?nes!MpEXb=@hhc#lHdPgawHtZ10`c#nwT zeZs{7;y0tiyi*!9;~kw6AW3#_x!|}{)}eMFvhmC;ZxG`ifh{SZk>=*n_Uy3il5X&K z>&v9j2Y#_TiFIH7GOliX-eV04l|qn1A7VVV<3B{|0h~auC*#G5WQ-n_S89W2O99EN z4^TdO(D@a&yon&^85UcsUNv-Q!N5=?!r%CCv=Uj6_hW;F;oo)5iE#)W$Cramm>9GT zLT1PGj!{W@-KF2t18Amp!>Z4c_#FyyA4DI){D8c>F1Mjapd`G1ygZg0|2E>#eC&=o znFckOC;@`w6P_Z#Y?yGp&Z3l>e7RwYQ5~i3(UQFOda|4q+_epYPf^%DeMlf(Z$`uS z`{xJw;5Cp%5af%V10>1f$l}WaSA!oq!cMsqkyM``2tCOZ*M`kVgV*7G*G<-=I66ce z!A!aa(W(&qZhdebN{2_LFN1@0wafk5koGS;%P1qgADF~ntLNwkoS+wbxlfumSQ!e% zrs_ipm&{-3KC}11RepFfgJ&n7iVYgBB9T}h3b5pTi2R2o4%n}mfAR1BLjFhMTPvR!U6`T`vE1-B8N-vC?j*PyFZsM98?+e(Aca1N0C8xp z|5UHtpG$q7*<>@3JRGww8v0LBNTm-6B>6s>jtd>uu%_`I!NdE6`?;tYZh>eFA9c`2 z1>bVRVygu5BVcmh7jAc$Yx7jn5z(!t-x}nJLa=H2fGsTGk?GU2y4hgD%ZtSB5QrFJ zDBk*gJoYCYO#>P>ef?(BfDF`eMsnY&Hl@YdAekZ@(nik~m$Y}cD~W?Wf+W_N9}99O0Bxy^<{V^5EdH{G2zo!3z=tkvaZ_MJDrCCIInb z(U&RyqCRgb5eSP-a_i|F$$`MafznH^^i7OQ+Iw*{qTqpPSn7ST2#-dZ*zo%SX9ab{ zT7Bq&CVwmgVn=9Vv0qLGB)}xT?E?&ZFQ4WszrhQUh86;j>(BEG! zI??azDKgyDg}c=94s6hk6@nc45aW^QYd2?59RwM9^Ua&Z;@}j9ea_fmd3va5DwbhM zd;T{gB#hul%h{99DL+$-vRms8CxE@|&+4iS#xBPB`llg`^`ioj;+Lj*@2 z9vkwRG)B-Bo7u3liqsT5vg(72X?2o0fb$z}I7_skt~Y3V{$0`;974xgZ8#l!xPW2B z#j)BhtuMR5uG?YD=GdhFTKACOB9D5s8lQgjk#+30W;h$>k3xlx6;E0Tm&|wGPYw@P zi}x_M3M-;Pwnp!hF?x2Yf*ZQ=7TH&&s6)fh`F9C#a0va&sJp$ZfX72|p1Yv)y{?<( z5gsX{=Q2J&BhFKhf~vWm)Sy>HR4H|b>FCB%uXa7q+ud`zhOzS)u47Ahr22Hcepi?q z4Ng*d(SZj9BHmMT*4ve^O3W;85cG;bczuZA$P;Ht1nVx|K^q+KJBB1cx<;7{?F(f| z^s9QzxggCA1X1La>m*aX8dj2jmz`#C3N1h}&h{I7;LBv0%ib0^G}6SSA0&Q_9P;w% z^#-$g$LM6xB!B3051?)Jo*-#(&J;2jQbf`PbFJ@OTf-_<3yq_u4>2B@ZlIp>c6`Bk z;ol{L!69^PQdhEs8#ewOLskIi2gEgnya>+aU4t3AgWAB7G*pWC?&b5npoqlMqe1;G zZpH?XTp?=o-Qo=W5C46sGQ~xsMj5E%RH@k|-nmI-L~#SB;uuk!fx14`>5HiIYE(L@ z($J@hVb+5IBv%NWqj=qReEQrS^t;f!(O5Yd^`QVu-s{L=8+?0o_)puUa&3coA+M4o z#vtmA^<;*$gNuoM|1OaY4xwYqDI>uV7@>hcdDsNLO$!Z)rop*vw_! zIR=9X;gz5#rz2TmbO)Ig-7t_vsa3*di(={g<8*!mV3RVw(^u!rxM zu8K&io4VrjRy8D2>dTxT`rwd={+W#F6DeTIQXB=lp}|LJ=0yfZo`-V(&T4Xux`Vxr z{swheQP>=PNFd4gi?n);t30M|WHTjykae>=#-5_N?o4X(BozFP`_eb4zYEtQLJozZ zRt-5trh8K?*Sm1lM~8GJ2%lYe+0eU+!q(}7%YqA#s2)^_l9d&(hDEL*Y@j|^M6%uR3D1*@m{o;j zX@?`w+kgG{<9~cNTJbUgT+w|%{cb4sycw+>r#{F3=V&?ol~WA8L5(dl24Wj1dW* z7qr94;6Hk?@Fjr8=n{{h-zj_g1-?_9sNHvVAcVc~>LbmR9QVKVOELGYP^^%c&6y}4 z8^I{@0SXQmzPO6KmiId32!_a*b?z38{G+S0&Rvz-VaGt)&)?z7pd7k7ALIg~4!8p$ z?7b&1hfjZa^TX@C;dlGL-#^%Y`NAxh9fq^(ZD_I|Pp2oR%22=~(Y03}aVtdr`TwOh zoF|jHVn-0fy!Gm%Hz;%59c3}xhi_fJQ-^J!6dzaP$T`Oxf5(32@a4)bxmu$mFjyqO zB7Xv9I7hDz>KLze$Q=k_aqHmze2oO7(k$PhOt}vqBlFoGoRsxrk%$io_;j`S^JIQ7 zDNM-fT*qxb-KQr&#FyK?pjA(XPlkJcc(V8EO*$)g=xV<6aqhX}$iYbSGf1)*i@Dt& zzNyW}Io{}?9f0{!$5gvC(xvEM- zH?3f4ZfEDc;0)HPRA>qtND+~Aa=WJ#MkuzYI!6obF<_*?J}4&<*7=B6cdKL_M=(T| z+5cv>J?HE{w2A-$v@hghn6j{}_C+o%Ef^_8C7P}a5~nIHXLzj}&<=#Kn3K+;$@{n} z$_`mQx`U2^2##&9C?u=fo)MA(LO<9|>E3H2zpC4HI+6(%DKG(tdq~D#uBZ0W z#2x1sopekz#||a*x!dm^KeHjaDsXYv5EKGKKt0{gd6`8%SE`Hh*uUBhsRgs&{%rrn zp6T)neLGPIjFp4bfc&$oD`z^7)_Q;-CN9}@8*5pusBS@}-tM4Cflb;`6m)vh~ysLOz!g=?<*0LH+UJ=yX38nn&o77&D=e;Y+XH;|oh zT+U~>Ld~qB9kWuQ{p(a&QYaF9cDA0%K^U39!z0`WhU-P`&cDOZQx=awmLeXh?z)o8 zKR$o_4zZxoVUj7eLl6g^w0v`nMUDr1qxHw{rlZ;71i2aOw@(+dqlr!7X~~cT$dLzO zqspjc{1PdCo5_cbbfW(eMNp7|Y*`z^C=rlTF?)eYeDicNTK;Ju|3yUyGck57M(s-f zveYlLIIdA^cxzdoYk)Kbxsn?fNDbjcv%6bED5C>no4Usom%Mk*kU+bECb=FQp=?7E z4cg&B(`I$=yUCcsxt{YYVKF~iC6#@5=ygg_SW+H{;P-Jh8y5CvNN>|nGJ`PIcl4tShewkc6{+FSP&Ih`0|>dolYw+}G97U#jwI5E2Z9b} zJF*S2a}PqYG9bzBh7Z9kTC9$y?@YTIx-bCPb_F=n-1l=CQwe2p;TD3ydS0T!axieN zJ&?yIaw-z5{uzEugyRk$g3dGrU~}}LLnF(>>3l7<0ffa(Je2NBR$s%EP!v+>Ljp;@ zdp!Org34XbwmAHw>Ai*>EjdbRu}Jcn&$x8u)u-#j*=YXO&@^ml2E$E0mk(-DN%&y- z_JmcE-;ZW*hbYnd7Mq!!=nZin1tFO}SVXej#A@0|$&|r7755E-GQ8|)3>4w7ACKp# zt%zwqww<=a2GJ?!UL|sjLfo(53t}fN;pl;>Km9Ot-l1e>H-z04iA4HPfFd-gva8@Zv3js2Y{JLR*%);dliYVDxP9sIcG7OsUhL|`Pjjw@_Vk5+^Crz5+R8|ILI zmE9l15csyA0rJNXnxmPZ4QseCfdZ849=`xbM@K`rH`1t2!`@R^!4Viq?)wwAvd7I) zCG!!UO-mXEyKqR?z>(;a5dsz{uW03UgW)IdaRdT@>;Blh!rU<*-LSOubwcZdm}-JW zhC9Re)Aj@5E8H$GP*Y`=G4*`rEcSX@3kH)7H**@jLkTkfkIsnpikBaAb zSn~vD%klS*Mn}uBJx$yo?-aldg;Y&3Xk-!V{`d%M-+B@o1{p6BxC0>I{UArCYYCra zzPAR;H9$B5wY?)iQmKOK42#jsuIC2B!LMicKDo?q1kn$LcNB?*GI@tnEM~}ChQb55 zp~%q4^1mU;WQ{~}5vvFo50>r%LPn}(i`DvOhWmfi9VZDaKOy;DFBL!RI)?biH+!$2 zAMAf`$ah3RRJDp`Nq`{eP4ALG8H#ilY0yFnz6}pV@CRZhBf`HL$b|(GYY=nLe0zg& z9zfjGC_<9%p*v(M>N?V}r|%~4Vs4X3(vUFOp^&h9G@xX>w%L3XuiR?%-n6P=MC46} z-$D2hk?6*Ha5gzh_r{hHaWA{BGC%}RT?;3x(el)MdW*dgI}#jI{F~|8p*lj@d#3a8 ziq}jHMaa%=DdUFiz-(k078}dl zWWVLrsm#Q7qDI|xF`wW$(78qAL7{zrq|pgAgngU{i}^Vu=Zh9E%9=!#rmhJzwj z!Dz@==LM<`f@DQZ(p?)n9}qH^OmiA0se986LI*iCl5x7 z`?BN1%RgNXkkbUO38bQ-X;5N12=a7~9ikf(pKB_C*8!5`CMPK4Y{(k6s2GEE@h<`> z`9AmCCv-prE4dxR!@IFUzrkl2!MI^^SQ)JA&^UVf{bYk9^ERB(Fz+V2BC?7}wtGSF zOhd3EJ~Y~33j_qVEj)F2B)aasM}Ne9J!Z%nEaHOWi7*8ID()}Du>X0oezCxLP9!84 zo|fa;ySgobCiiU|dSUUb&EnnkXks_#26IqfXV2+_Vv*s_$yjW(A&x>JgoaB5O`970 zsCb{~84lr%&qb_s8xd>}reVD8=)>pY;M^E_qhyKuPG*Dc5({{Om4pY|o)>jfz#x&+ z{KjIF{1&6!)C(nT!*pPS4D8+}TlYvXGJLT*9{v2fb zi%H6xY8j7Lr~qo()Zn?-mr0}#4vFZWCu>S7YQImNxee(IJLM1-RKRs@^19q~o$a*^ z+D<_c^gslEfK5wQ61*#NdmM9h}ekM0D zVXrcu-%vc;+~g$h6YW;85?MjpfHnxR@HRUpJUJ}a_bX_~DC>hj^c=BEB*si301Quq zOT~k@#Zd$#*^M*g-JGJlT;}#`m_+(6N%Vn0#J-0>qi>)p1f~@Yx=w^ZlIYnZCw{<# z$%bbQ4N-&KQr90@^dW$;IbXbApG@VDEn~AQcRSK>yP6uV2AxWA$fXY%C^>J34P!W* z{3+RQ8k!YeCs%m#V5GPXUl0$)t+sZ7H*A;ssvDaKhsa;Xx}wWISim`x3X+C%_%RT< z;$K)~GT#)l3Yk)?Wfl%@P@woSX)Fw(KRFidc9sOY8l(x{BW8G?aG&App~}p#+F=v= zEIl)!8rHgE5MLh*Ah~`D>dn+jl7>92=)>i0Lf!Rhgp1_h%-Ok(B@e()&cR3`aSzJH z0e;vb{brWvBMn^>AV?IRB0y5z_B#}ockan+SP1D(7jTGv^KAWYjKe*MVZR?+d#FXq zx|i7i3qPYBQTO& zJDCmM&3Pu-eE5!2!Rlkio9vAUfskKGYzV1_$XP{iyPTP!bFLeT2HlcKB-w%KIx9$3 zI8m7>Xt*wJ6a+ZZ{LK-PPn@H09JGe@>EgX^v5B#>qZVF3`V~%|%ZA2whTjf)@%bUw zz3*kbSlg-GkoA;1Ux-57hj3`l;Za}1b-$VqaT5>DJtqskVc-G^8x@``CJ7mkfX7%) z%qHg!8#W0ENVtyUPXUI|pTn;+o*W{0G=TF>;D<<%NwUNm{NEjnn~FWCcT#@`h>0ZXPgt=3N1q#VF-L%Q)Mx*S=6_|6w=p; zt`CYuhP&PI0iPOex}|}mcoadg$Z;psEk1lS8lpD2p=hvj!~1MUcv3Wy+;YcLzMpK~ z;L>mFfoM?y(z7W6$PENKZ6F=DUQfK=3N8;7Xtwcc17P!*aw4s5dpsPk;B>80W zVKNpo%3wG2kDl}LBM@MS8eRG0Lc&k7FmuC}*u|AO4&7sn>AK47m&=de*bsVyE)xJq z6`te=!ja|+Hkz>_?}2=eI0&*nOy@O(3OXFpb&m-wS#M%#%GCq-KYlV)4NFj8mP1YY zvjZadXUKbC4l;DJv&DP~wQ6c5Ny8SU7;KC_7(j9{NUQV4w4)*ZWrDN;gt$LlLv5be zEUgAa1yNt010mwqMtOEhgU$)_;SFAs9*sN!CGAb`{2HGwP&&sDHH>t@bLN3u@B7$5 zZYMVE(n);5VG#BUJq!XjECP1jsaf;+4gI7zoJ9JNfs)f@<1>=8NjWhfe^ zOmxj+0z`r@-6e83thYu0Y$&;1um>dD-w?IL+@#2$zq--ws{PQe?^KLTK0uGPibq4= z>Dxvkc_`vbIw7{z@p~&a&X-Q;0SKu1k{$Jpz>&SpN^j`s- zFa*8>e+v3;hA7o!2RoaaN0RQ zkuN+IfJuGVxRa+RiPxbaP7wo;GycU95y|w^57=E!?8H9*7VANX_&^P(v(ekhv&Bi_ z97)6XD+s?`A1or-;&{Z#<_hBx1S7@I{QhAkZ-ak5-96mi!RuxvTaS+9gIwq~q-=LVmyBLO}~1eU?FO1zP@2`6qcR`BDh9L#YD=Z4-Iy3K{R$)q`1Wvtp-y#kl^bu z4QL3G`?uLg36dLDjn~EbG7T=nM7vZJVtyGsD)5zxhi!#oK*Q6;!pf!wLm~k2`@>TP z>u7Zjge1)^P6CfdNzKm}_4Et{690@>pY>NcHn~5Ku3&-Vc|OD}k&`E8xEdN9!LZ5E zvwH&)*pMhK-G{5;+DT?8C5aqgUkT zf=%7x{7|ieEIpVcysu&Z@1W#tn&?h6e%;p{qKj9ius#vD4}HUk>yKGtdodR`#;_ ziC!*Pz$4MWM_4&=P&Q1@M0;@<#QRU#Mi2Q0;qQx-4hzL?{^e>EiXsoc>5eQ()<_-5 zPjl+*{vsANn%BcI^x#2P*;*A?H=B68mL1fW%pPF=NIrW=lC=|T6;e4%drC> z;AbJ3VJPRNCFYqJc@4&7z+gMVQ;g^aNH@rrP)yRZyA6AlzD^o_P%JXsfOiVbK$g-; zQq8Ji?c!b6fEa_YaV;Pe(!i}cvX9#VZ#ZtK&RMeP17>jyNxo0;DfuWj*u+s2qCvhV z8U%QbW*D2f6ne3r-nKSe=MT6fzH7hk~XNmb}U=SSSt6mfL%dL$l3)8>YVvI4Nh`p}_~r8{H* z@;PbSInQnmm$R*10u6gmA;rzWxvuLnc$UyIun4TB-q55D!7YH00~7$s^ouZMQQdGk zltnPW%*Q1HC#%KQ9x{8;uSf)xo{3+?<_COzG(A3+q`%)HMEV_mMoi`H#8t&G!`N^V zLZR4VeJJ6Q*`Ef?64Dy%&nzLW%SZdqF0z8D!$N@Tfy9T7P>|~oTG~d^f%tpVwExlH zv6>Q;qOytUFMFui+D}9ID?{Co@0rBxqzac0u!TKZPH|eJw_zU+Z?i4o$zk!EZ>SJE zoQ~{5YjBO~yF}Lq0ulQ!r6l)xyCTuc2|+Y-#0&RQCE8DeTnO#Ay#b->;9Q5OyW`;7 zXEvp##Q~6~)CdZJ!+~Ep^^4#XO8c6=X=nf?FOCfJ`}HA$^9?`*h&O8BDlEg$V4)Uv zgVT-R5c+4(*s{~~4c(HAsiF|`vq-(7vX*UP4U$+f*fIKm4(b5Obw@;lJH|Y{P(E7brYKz_%FPk7$;Xl` zYreQ)2N4K@H?ebtn!QOM}UONV7_gF*i&geVJdc4-Sdw zf9148SMF%F9=IQd|8=qYhr=XO;hl+<0I##_1TUQY-ErUbIS{w}w`nrBU*S2Dj;Q`7B&=fhEyklJTZ2BSbRx}*% zi9tM936+fE13Vl3G09ClpAXQzPq=%il_`o66ui-qT%Mcc{WdIUMc|j~Lj>oBLjAIP zDB*flK3>Ig48hk!D+JqAEB-B`XqVuk}s z^I0vc!BHdcI`kNXxO%=xPHUNdYEX&_X&QuaUE?ByP?vG=_;@;*CH2-?{GN<0dTreO z9HWuu=Hb!dU~+s6)fxFFrUeapiM-5?u_#0i*#O@>avQz@ZxDo~Y=D48iZ~%~mb#!X zv-$|;`iDEaoL*Z`PweDu7~w=M2r#aL!r~tempDpm>-jW{Z+M?W5S|o`B&xJSBd~@* z!`Bz~I>NZG*QiFZx<R@_a^r#Bb@`Z5Xh!66Y{>pmi0 z4&REkUK-#F^GK0g|M=6fPoDnp;>nwTezj-5zd=$IPSH_$jV!|n)& zE|Ru19B@$_c9lM4pyd2?0;}qxPqnGP9c@EgKIQFdN{An4CdN9!wa$SVpl>EguaUxkY^ zf+2Q%d6y&@AqKKew)Tdp6E<^>X?PkUmmolr?iwt!tvfVmy1ZfT<4uR&ArP`VlRkQM zc!g)u6^$e}C8i?>ZwK-p^XUyUKD^8ZgeO9Icz3&`j80-xv_ufx%MRQC5&V83U){8z zVSpnD(nQY~ZD!WHwfmJ9oZ`~K;QL~DxnrkA5pspH$+rWQZS+U$wu$TIe4cvrz5oy~ zF2anIkz`3UNT9F?`2FFD`657bB&hJkixP0oekJyU8I}fBh3}IfLn6Unh0__nj6;8g zj)nu30gQ~{sR&K_2j)n#lqeP}*EF)hchYm1Ilz(Xwo^18iPkDJ(vURl*ZMk}rVolm zhHFfphL(|p6B=}FzDeW=gP=FU#F!@Ds)o@I?-DvZ2@=8YsBaDv8;3TNwC)DgOW$|+ z-Nj)J%r(Gk%d6?hsSSNLD2@e9+u;~!h>|2H=VH(fhtQv^4&t0VBNRd&&5)LAW=(_Z zNMYDP`jBFh@xC$Zrt9%0Q92rwc>_U8^BWIJy1OHPjfN=WNW)1E0yW4l1t5<;bZBmb z#Lb7v#k4EacMV=D6C?^C9v99F9M2ieMoF=}hLIP?haU0qKRX;k|Ku!5@@UXJ60KVh zi1lSya%(AYiMr7H^YLtpas;L?8WJ}HkXvc$SIuBat2evA9E8JWlhiV6kad36#51VF zBE_x4KcnVwxKGnGr@<2=ZxcO%A-3LiH$kC@^8y#XoG=9bNm{Ao{6i}U#QH2)ols)n z+T2R0-h6FKWJ(QR*VFnGBa-ZMx>;DxZF)2x4J14z2M-KigOV2C`_czV!iOPq(bZ>_ zLOMvzHhepzUwFGG?~(bGib=wo-Z@(ECpGA|1<$GnBKY+s+`1^pn&q}N?9B2iM<>Q0 z>KzeDQ2GZ){s+@L4V$OFPk4O@VC2x`m?I>eO5t)t(O_2;mP3GYUE^{#moO(Sc!RS% zOZRjr#C_-m|Iy@lw4LD)2c}+Hp`$^wOSga&&UDf-@{Uh&;N}WCDL|3nGj$;zO*f~L z)uWTuJ?`)G2w zwdc7SObdOP*!tj*i2j)-nu~)6QWEKG$H!&_8rFtS8gN20x*>$k;;=GlUy|^XtN<*r3D}HpRn$MGB3j zWqBhF8eC!C5{AIB&u|LeXmT`79V89fN{`M92T2D>y1ztKe=EEiIzG|a2|=`2x3!EdONprUvm4Ugr`BPacdE;xQec<_FIjl-uZ& z6@ifAEL)=c=iiv=d_HHH2O!{IW^SGHj}ReUz-m5qI?1$96V){|L$5 zhO}W)>ig_QeF$LWc<8b{#7IF=Xm@UDIR3AOslme=p^z+kj!{W@(^Z8%__+Rdl9)yf zP61w*<|c;4A@+^qrE}U0u$E0D8n(*tE}IaZ1c~5sL8zSW!v1n@DHg5Z0O1DUshpzy zaj|+kaM#WpqS$GYa?{{Z;tIp{J8xar^nj8v+J$AQx~-Bsn$)7bvR$}{%@26c9qw}( z^f(rjxMFwMtSZJk5Dr)O7-N#}6D0cO7xXsloypb{U|cJ3uxT?zByWsE@GzMMk5{Xa z4b?WJj;A1OOZrQPOjenLl9&nQ%4%s1aypuW0fM0SkGGJBli}fZiYCq111Ruj@iZv? zDTG@?1za-vC{LPTd%leedcOb=@G~#c#Wjq3gbugJEVDXZLrsjrwqWr{^%E4kG`-WX zfhRLb5Qufhd89C;C@hb|B-W4Cpgj8b+1nWwDXwi13LD6O&YfArHwhhK5HvoAjhmFF z$7vE=gVE5dHU>aa@p|^`UgL(DVys>Q5buW1C_rbQ+H8S_-KUU^;BW|iFX(++skuCx z9$R_PFa-kwyFEO0cqHO&yi(y|GT58(=HEB+b9S56k9BQW&aOBl)PFid#R8&|z5A<- zgkSM_$emw)L`KGZSh_H+VebksWDQRVC@Dq!@fg-D(fiLQ{sII+Z>a1zO^ewz%!rcA zAP%9mJR-!%`lCH!+~6)Pcm+KW!N2wguS5=_^0wUlcvN)YHN-6n=edfouES&$SYRX# z(>FM3qg|-OAZ!SS;K=z%JS#@ZHVDH)e@W(n!y-kR*XfFs#%FFClwD8LpVt|cKK+?5 ziE5hC;ImCO3`JohuH$a1=^Ak=*y{$jVG%^vS_KH#`SHEOSyFj}YS-lof!TqYoV#S-$Y@CS*jcN5|0lf~zTB1r7Rl!EKdelJZOS z2;x(43=wsyh6s0}guS(*8djbHv4Q%KqmuQ0S2U-~V~yL`5clgK$k;u0h~z>R^iuA! zdyA~KnO&0&^G;rNLuOEjd3APu#U!tL<`w1(LXX8Wd_bJ>69DKV#}ZEeL=lQ&S1ya1{QB!hjpc z?78X&X3FN?QYh}>+0y%u$eX8~pE^UymH_NXHYvx_pwRRK>YH% z5;%4yjwl|fA8?0oSEqFcK#uNF@mvq-t>Rgo;)XWpyCl#D0ulQ*RyWe2y;A~AVA2odkAF*9ACOy-3WbS+))&nLN#_YW~1nI4E} zr(Z%QG7?~B)3c=9NP{6}_JFp#*VR znk+d3(qJ+K5Ozm+GLWQ`y=KA#dA zscxWem?SComDw{JM2^18&d~<~5gWI6jNZzP%lIq*V}6ZXgU3N(NTUxaCK)w90G_7& ze$9*J2Lvb*+(d0{R4y32<N=hXo?|mprfu$0btoSz#Ob2CllcA!-Q9bwK3m z9#dTM>fR6ex<)c~QZ4FYdw+*TieIV$xA$Q=njh`CtCS_|aKJhdRz@|H4_7?4Pak^0 z`3+sM5eP-hNL2rmjBV4mEwjO%k{ z$KR#4DFVcEsjab?BmIAd5*w013JEfqCl_&zugDnQNyu;1)BJ}gECgeEp+WU4xEvIT z@TqTqo87J2U=VxtwcoezP+faun@3T!$r918TnSea%#Y|T zHQm)9^%cOa{0xmO4@cY0;`{w)uR&=oxf+f&3N)$MN)VwMHw|1>NOje!T9uahRl zB12b~S5qksM}uP|s4650PXUfJUv%k05MCoVVBX6*NZc?DQN-RXqy*NDlwZ&;?FpXq z?BHR;NEL*F#Us^2SL@H!XLJc-*(r?%;n1PDsop))fq`X8R8rm+<9P~ga5F}^)Wn(F zFgf&fj+;Ix78&j#+!Bft;=sjfWRt@idM_Z5B|PB=kEc!XcT}Fel^TF%4mNCGp>CjW ziv=UaeN-kzpu<;rbY4h9(=gRN1W8J8t}Wg>sK*=(NrPtSUnfZlABf0^(Wh~N*>+zatUTWg?UHwYl42~R$q!$Fen8f>*e zA=23peUdi`A3+dPby(hbe>PfMr((mpEBLQEEK>Y!IWI=;H+BM$GA za1uIxSr!CAV|WRP&r&oWbyY!-l!IUL6%J16<<*lFPVtIhd<2(b64Y+kQxu8Atq=PW z*RrtWy@spC5jhc8scCG3b0WH=ToDL)!{3a4GTJ6Clm>5a;Z}8rL+G1+_mT;dIMo{# zb7AZAKm?CAAfA#l{n4-xbkAYG>%(U3u*mS2^E45@VdW-XK0*-ftM|CBNW26*76jM# z>0&uN{3w5zPj8qqio{RXhXO2l??Vln{N~q}+Il<$`ATpk64wwEFzXjRpKFM(6YPc_ z<;qI>H_RM;m*1-o1S0msE|=QrN^;3;5+ZI$>+4Y56be_k7*H~Pv01#G%%^{r5-N1> z;szD@jWx;}G_-)@DEm-JD!GL49-;k-cGfV9@hTZ&hyaQ!&ht|~=K~E81ohd{>1|#O zIk5IS1%QBeJB9x_Qdz!DTs;k%W3Q&Kc<#fOn~yGE(=6czX)G_YhdTr!{uDWm+p!hy z=Z`IT5F&=M$(RdkOhNOd4RR7)%n+~62RxC1kNtZ4Ch8e*Z3EV*t@@KfXF#~Ln zC3@eZzD}^OBsh;R#@%--`iT(aLP&X>o?~y&{Y;p@2a=rO)a2j)Ms($*Sa?IX7ewx1 zz#_$M^^}PVy>qNBvF)KnYl7nFlg0x^zT0ByTtuJ;Z{#YUL zdWx`v>9q!bphw_rE}*&If-rNpoLoM={v99)`hVCAyNluIusQd^B!yt}^nn-6c|0=R@?Rp= z2vK;*w4-6V7uumnguezsu|4D}FwhNMl&qu(h{#gqU+!D@wZT1Km4Ej>;qI)C$N%sM zIUqP~j#C6jwkH}Szki>-onevUrnB@1Gx^inCk@@dQpe z2Zu!Tp9e7tOW7AnV2z}#1jCN>qJYsSigRQ)G+x|6HIS-<$s}zUnu56OupEUi6$Y0x zscD!fpmh!rQLkvP(Te-y5QaO(uSw z^CJF*;E|G|q z+b@R*);5K+p?jF$?k>dIE0^eKdNELCFZ!^lS;zm0ptYG(Fkhpx6ft&V=yfe;^{sZlA5EqMX8aGn9kE zW<@u|RQ&5?Nuk`B?TywSznhNWs#y;nuipyw)5Yp#>P%~>d^-Wskw+ro4rp>e2$>yg zAXa-0*dX&%^J0 zI5~}*WC~82hR@e`iLMWH&hYcUiZ>|d>li|*eDvrWdmev>wuQyD!ZiTD>X7oSFF_`? zroj~p)HN*3!aftANbu==DkV{Hmd}hzgMUw6WQTPKM7;0ogMUBSJcDCl??Q(`@^a$_ zjzsr@JfqT($;Sq*Dj={S;i}V~Z^M5WvWB+h4sUqXvb_I&m6SWZ~wn07U{8 zND$*H-G>{z&6qg+ba4VHgah?PDl}+&UZ6o4E7-b(A@I*N_$1|QrYD0n%0E71Ff^?} z`ns-{Cs=Gs@;i&qPq-7ZQ_kMXkuYm-H|#IreG-NzMI%X?n#lA*BQkfmJyrVqZL&W# z(V>#?p(vP(rD}h&YGuwF$|envC~R2|BI$4$9WIK5>kyL2a5S8LcCV5mMj`H3sVh&! zgp6sTf&Ei`cBDuoOn(`{lmCG~wU6H;g<`Wf{Fq%h+HfwnaP&U`B-sr=z#D8J_Gm>z zqCr82ayW$kyC7$=uvLV^*N-!UJg2Sa@eyoK@>u`xdd~)Ic4>HOVdBUAB9w^T;)51r zCozz^_d5`_r+bVs$#++$0CaG7(Wc>Q*uNA&j7$Bw0}FkH1hm3g#Pju4he6o*KE;zs zay+Nu%X^$pay&TaBSABYf~+!XuKc_S5(RO-~)z(_VtYETpk#s*;s+)WS^s+^20 z_{ArP2P4HzDI70rn0YJa>l=14Q+~cfaUb8U+Wcy}1`VToJ&^$pjT{ft`g?dO^;0xx z=P8OKOse>KX!1r!VzEOaHNy@~gL2-TfhAe@sCeYT&CM>M@RhiDpQ0+c-5473gB8Ki z49&MKxg*f52K9-v6@S?3=+UA*@XW-J<1*MPx}3QwrY5fEKBx!Vz@ z$bqo7O~azkE>>_T#4Q)-_%Egz4T9b&LoCnBhD6U@fsX&;21YdiXCY+w5;eFf{jT3< zVi1z8`@*|vm{ch_F$k&9M`haAFrPgR+t!Oo%KJWH-Tg7luc>Mf0fqc`14p9UBFo|D zLJ=NRaG9K26*pT!j6?M9lEd+8JWM4(!)_4Pyp;foMv_mC&jw3qoK~f22&m&d!iM(= zSDwrN&5ZR`&E@~*<}%!K%&pmTp^~R*_@besJc65AIT~AbFAjtvez92EZKYw�cby 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�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�sd0%0FVUz@I9ix>ysnPzPrW<5|=d>!Sf0 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 diff --git a/doc/sphinx/doctrees/examples/asynchronous-client.doctree b/doc/sphinx/doctrees/examples/asynchronous-client.doctree deleted file mode 100644 index bba09eeb2ae812a4fce3c0c3c37f5b84f28db1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15603 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 diff --git a/doc/sphinx/doctrees/examples/asynchronous-processor.doctree b/doc/sphinx/doctrees/examples/asynchronous-processor.doctree deleted file mode 100644 index 72c7735d14b621fe440290244e3b8480f7aa64c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18069 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 diff --git a/doc/sphinx/doctrees/examples/bcd-payload.doctree b/doc/sphinx/doctrees/examples/bcd-payload.doctree deleted file mode 100644 index 6f70e22878bc5802c8fcaf638288dbc45307d11b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16238 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 kxkQJoa3?UUv+;JsZGr2#PF; zv?-FyBKxwN36h5Zvk8%xC_oV8m*j8c59K?js(4XL-nLr~{2*aGEm3tjb*@$CoI3i) zkN)F-{4@M2*ZjmQ@-UKiocKac%8T@1EaH6f?~{#xn*1>7l`ENhAd@2V#H2hkDOZO{ zlE+CdoJBS`Y6wrL80X`6e3g}yUH4`^jt(#bA zVwrVWb(2pp(zO?pqP&p1Bf{t;_&oR^I9p!yf-v#{1905~nCGy*NHl;fKl_TYW&H*t zf1@#GeXUSA0jxJ#uo5tVnJw51`ZP;$3lGnfAMJ@l;)~Z0`Ogz(8(`w+82xrJaLbRP zFcy=CXG_BZ!IfeV{A3DgZ9vM)V>gU%rCBn{+_A)v6cRK607WZ1WI_s8~#KUk@WP(xU zMImI^ijvU?cwF>s8dGL;{nsA2GW6~-9KDSWo?1Hw0(&I#UjrDCsc&qF&thLhJ=6LA z*IzyRcHJj_pG~*A1oRPtcI;8LZ(S9MK2k=1Ve3XcPzY!-{|jMkR^(gmbH>0 zK8?po4Bk?mq%}-3rdOpO-85{CAPdhEQUa5|x4Oh|h3s0}))!k_)(_lp=!OwdeX7A< zaD$El@)6seyJ-l8c{fdG!)oNwNE+h};6PSL5qN^$Bn+*wWDEf8-hSu_+p-?ymKH}a zBkT+Wa&TmkG?G0I^CNV2xea$5yRVc?Yf+O{@1?u%N-qo3e8X;`!C{k|5)?aDw-2!T z`?tFtZUd`lIZhadx#RSth=!XM!6Y(G3{4R00a}D^6#fpPXvN}yltAvr7!s7BRaa|O~1<`=noM2ew z;DlaCFE$r61tYkD*i7U_7F)lsmdq%?Mn`n%9lf@(?ivj?cq7k}$Og8>X1kj&qHs)R zhx*RxcHgv_>YEAIPvYo^r=8RH*CDJ#{MTqT)j9N`Ey19#>-<2svGoqBw=p${mlPx^ zkWYr*551hRWf-7Z`90Ney1yS{9|SuVdKh8O3P6baRkJ5zL<@pStszlLfzjF~oMYB_ zG76g3q-^G|#NcG3qT>&>Ox8@}7}T6>Zqxepa~mu+rY6MCS~?6(oXe9-6Aa2M7)&(QMe#nUbnn)}YQ~ zL`K~r?LIaYZtluF!RGQ?k-xLOh2yZHz+8+EY~ENZf8XGd*uZubJAuxah-hZ}V6%X>UtjZjhqL|ixm(7Z(hhU7W*;ddJ^D*mKS%(2o! zC*7U2&iAB_p!{d8p*?5ao$c%I!nBvU@kkhGD-2jaQz!uVs?SDyAYiG8a)JX#1Rr=L zgQ7=Q%9Nm`muhJjDO!o%6MYIXYJPfD-q@)w)w;!@C(<0g7WxC%(Iy-^+jPjYMV2L5 zPaM{xOmnI}skAo;UII^@CcGvSXx!CQ-|60NQd^IxXjHS!?Fv=88;+5*+-d_9;!FWM zdD?lt_#^WKN#x_SecEY${zs+>PQ)N_LdEzEn22v0bBvX$A$No3}=IE2U#p4VL@;Y*nKGtHqFD zm=?w6#*V&Us93XEo+H-{)vXaYbLYldtX@J}?kh?+<=(8i5`48em@oMYg`}w&W<#QN z!*NZwP&k^ZV>TS~l*dBBXeyTqj74ddb#fG^?nqedsg(=z>#cXlTx9x4?O+Z^jo)+A zGzvYqddb|G1{z;*^ufs&h$t1AH5Pf0_!gXGrWL!DFs@4m8bfN3;c#L;CD(U6g6o@? z)0oFr226XO8eb?ERO3PAe`-$4gX_))6xCBZ)GN=|G_1{$4-mHEk&HLf*wZlf#UZ=B zdkwbHLTcRIy)HMigM1w6(?KPhwBc(w&wJ!SCkNm0(Pp&*5fHB1>DqmG7(*9>^T1}I zHj}N_?PC+6D6-T2_Uk=-qA7N|GnR#f z-i4d{p7#GUpDs!$REz@gg_dl<`?@IEP$EVSSj2G}%*PZ(JOM6b_{(AR$n63FwBdqP zVIzTH17r>iJa%K!2JkJ%R^aYa+$c{puX#yEp%>wLfe}w)YYIAX@J0zFbH@8AbF{S% z<6+Xf!7>{m>^N#7N^6wu8;Wlg!&A6GN4V%rG8W?j{E|&YHr*P0O^(FK9S?js$G0s+ z!>#!F)(abW%5q6a>vf$j&LDaUH3G#i)PqfHSi~NtRqjI5$|iR%{*7f*SEQjpR0B|| zX10Weg~JBpGu>!Q0{{JB6N(YU+Obr7fP*L8_4)1X`Y`5Zqp20s6U6s=1k#30pJsJ< z-o0~E{<3S`w9tY>G4vNJpbp1|heEMmCSly8Z)-T|6Ci{gfD-{~Onq(b>{wfth@?QY zqKgw8HLKP}s{&OK4#<03*ofB##;yY$^%NQj6#(>kLyxKaorJKOQ*QpH+_rAY8(3Jc zMq}gDIHlcaJVVzV)qz!|BF=`wVuy9Wpg?HeX#k83O(WDo=J2~|V~DdChd*Nnxz*Tc z9pfzWuo|*LZ1V#OhxiNPA{F@~I1~?Z_5fIqC#7&9QJjKqN!;S287T#O3b3clzMysy zD;OKR1y-3WTZ$@&!41IzctpctJ7)occMJFCS=@%#IS z>%}3riALylhgGxVkZSKb4yE!qPFHy!*R9iJb1;3^X$PdUql}`%zK3%KpJpZifU7h!CxX$FgJmo)7X8PWRJo)$(|s=LE?--eQw)ZI=keQsHdIT zdbJC|zK3XA@$@2yOEV||F`JU74fgKw6x7DAcP%r7hxVb*Z~xVcKfk@T)kr7s5@5sV zgJTjmr&Ex8vTo;LfdRw3jiBkRx zSbM!2=S?W>#ub^Zy?c+fB$I34rrcI19TVeYe#eP}w6jgw1|mie6I6SC8%IcuHI4>~ z44=e~?u`?sVy-z`Cf#$RGod`$D)F{lIUGmZlG4+Vw4EYmMpkuFt_9&Ji106W==?{C z<(DXLn6iAZvz|QsKys$E$ssNuzDXLn-Yg);ya;vvcpqjLG)Mk;iVSZ`C8k{M3wqAU zA2{I}DbRmgr9j_Vrt=z;4w@{}d66s((W9i{WjgONop+heTcvW7xoswgz$z<~r;h-q zIhR#^m+8EOX1uz~bY8}T%HQEV4S8}XRHc(W&2Ek(%Etp|QwiCo_3Lv@ALtb4+V#9l z=k?KMJ6)>#GMyK-CF*=e>sShX9oAf?^DfhQRX*`Dop+he3rnguUq&r2(|MQa zyp+tNQ=ymXybZJZR=Lv4bly5Oj2##46kT{Cu!mo!^Fk9ZAbssv%BKmyDzDt>(#3fU zGawH3Dlu-E&Wi$G_M>GwFXh6|$;@4*^Uge)YoVOVz}Ly1%XHoa=)?Nl`;;I7qDqe$|(NVZB zEK~ingB;grp>3Ty)-w+#zUX~0|K9lS9(ydM0!VXcS z4vj)-w^OJoQF*#h^S{(t%I_KIHTM4v*e@0KSMc^HC<6VjRjua#+{0xLgW{=5#i*fx zo2=?$Ae9C_5V+Cm$`0KR(Fjy`j@-yx2Xk?QmPQ#C8Cqpys?0SI9Z&^-P)^*pMnxRr z$~)>*cxaFvrMNUIa!*x5rdSg$t>Gs48{+=`T}DlZ{|55^OVMFf(Sc;u2*h`&lHCn% zpkBIL56L<0E*5FygBrpJS|X z#T@l$j=DPXhjQ(}%}B$7qDX)p6OnRv0F?Q8FnM^f{M-wm*F9WCRQN(66XFS6M$KLo z=>!ANid#^20ynC#d#=2s$woxN@N2}!C=Ki2(#kMAoRlAiK+0t#nW7GD%sfv(AWnz} z_^ASXxFQY_dK8$NZbZ5fq2e+jhst#@JCxVyhM&Y0zdT9sI}D-7hjx;U`cw<1KPf++ z!Z`?5PRrEa5p z%kG{fwg}LoD3Ad6t=E6hf7CzJXLk3Fq~aDWK<5()Q#$SK&dko+&d!Yg{K`N6d9Y?b z)lQU$rICpqWO*cXU2W1pDl$|5z3%;`{0acKa67Hmdkk?|CNJ*}(t_GzO5@@V)(3#EseXJ7N_@V>{WhbPj|H!jD+Vw&dB zxYR??Gt@;av-6=i=V_4$Jq&r0jCpvv4=~S!8Ypc*IgMD7fc27$EcVM`!nL-Pl+`s| zjOpjxWVq z;6!}oX&t|Y?@b)1dd=FnEJf9To49$9v=`SjCeE|Y-rip4p_h8IlP{qRtl6IK>@V%p={%05X86amMhYySFdjuRJ7JCBH8VNm zOqE$i!%ii=@H%I)$nf$RPf9_M&XhC;Ls%lsfPI{?Ttz~$Nv@b7Ytqs0a+{agBQRU#WT&VXIRAkxha3AVAiUE z^1cqGbVHqG^L;_s&b-)y#zihMJf91p?mQH_8aEeM4pt8Iq5fP z8mx*X`N;{WST=k8rW)w}_h8Jm451bvq}%IYlpQq`3{Hgk1jGpC-oO^jC*qk%y3OMI zAARuT_q`Xv86~(8Y>ES%g(d7FWf5$EStg5f zINOaAr4rb;HX>>^3X({~q@PyeGfo`BdGnNxXM%gk9+Q>R*+EXmkG4GUlO2_AZmTu+ z6dsd{FztMbJc!-&(f^$VvyEQZ;tT+Z+sboLl%{JL(ukkjK(}3ZoM)ofu;@jYKC~C% znK%6=M)bPAY*QyofoR}LL|_^3ly1(bKX-4fgk=Wacr&(VK8YPi=ZUaQ-+5|{<==l?*QMr!O`nYMT=^SF0w6kift;+n(5^3s6QdVy~ispFe{r0G!11>lST zFEHo~*AT%Tt5P^WO~&GocohbJoZ6F;J1$s*B9(~n@;Tb^)#&MLB2Gfs$+$e}-u{wy z(Y>pCSaw(6W_MY40ab6d3KGLz)KhZE5C^~|lunHZ{T&t|g3qRO63dXm<6HKW1)PjG z4F?)LT5|M@C=3UO!wr+WJJ{pY<`a>+IFAyIv3j~a}@9xdNyT=yP zkPta7Y)}#<&XNg_1+-|t?qy3+GpVs*M}j>s-GOMM8$<$`fW{)b7pu2*2RRP(OHG$Me7861r zL>P%UBFFb4&geN8LF(`B$k0QmWa=)rOBR*1S7$SAH-G;*H);s5nK$@CWKph;ad#!I z?={!?z1fV1Dv!$0e25Gp&3O3f+&j1WiAt=@_F`j-!=X>|4Z=Jf;?@*XR%Dj(n_KN6 zTjX=NeR^naB5o8SaWu{o`J9RT>s);*vs`_SeQUZP0Pw+JwD$rG5P2i(UcFRt2V-YE zGs|}V1-1ZA(Ve@Cm>B2pk+U%$X7m{b^^uD<`ZzobI5EV|kn&>wrRxm?87i+ON6iCZ zxY+xsdmHH!p2WE}xBCcq?u`Jkj(-#HwzpV>kb-^iRyjkGnCj+aiomig43BD#E ziYRw{g?wrTSfHnV@RGK9(k7c&9sfU>;#qn)Pt!d6L6*3fy5uJkvejjew*KB`U6Bj@ zZJP`I)hbE3N>Z+plvI6LB`KGbg|``ac-K{u@*+bWXI4o{RFYOnN`Wi?DoKe%4=&)V zB&A+_qWG~&QX)fPGx4*;jZGM@l9aYc=&p{dB&97lt&)_se$r$$UqFszE&=A$ zZkDw&wYz$nj`JjFFi@+iZT7rk`^PBv zFI0V8ZDq*1n`vSDYU8(#b+s$ANGi0R1}@QSn_RCp9juhp#IhR~z&Av%Aj-S(*~tV z>f^Y7Ty2{?45&vJRGtFLI$HSDw61<;3u=K#1hpOOfQoiO)3$qDT~&hm7K4P^rRoPS zSFc88S_Fj_Wt0cVGlSAsgGg#VM(cq~v0&(O)6N_3Ry#teTm>QvbL#E{>L-tXxBtt! zx>1NCpjsnQ85n`?VpN4GWi5*RyQ6oouUoEy-YyOttQhS^31o!ESCj)ov>)%NNl0=> zfjL7a9wgjcM0;`NF7X1jCLLpkiA|N?0<5&viW#)PrP9BzcFwq>PE<&gDwrfB!^dD* zWa9e4W_2r!5w?VAEpYro>k{b%%E9WiENTFt9WPMXiFwj;cfGpe#YRE`_#IN<0D6xk z{zRVF)yoo0xr%xo8mTj@>_h|=)1lpIfj@S|d68=Y)F30{39;fTF$a|%%jmkgNo637 zI*`e8w4O_0CWBm^3}cff!@7F)0?#3^(o9HTJGKJc3Zt&J?2COZA=O=hz9zEJDSE_X zAq@7rZIz`}-Q(&Cn%S|QlqEvFq1tFQX2(ulpjv}(CitdAv%4l>UcIc!Sfil!dE1X2 zoRiUF&bn=3AfCXKLqRgGze7JXdRs~~paDVz1$!Co+|^I5=E)4j5!;a7Q1xB4rr0nI6W>m7)vc2WU=skIxLgvt-qHE9gB7ek0aAQclmec15z#{B1O5yRKSIhx!c zLsRO;*4C>VVUqLHK%`tIfiD1o72j2t(6|kZHy7n`LB-?0R#!>iW`bvp;Lpy^2CgyH z3LbZkA!cd_AHFd&{5)t&MK!w2bF$iP=O|{b;Waoyv{*wKQQ}9zDnu(Yh`LU#`DpcD z6wKC%$fzaIvU8iJWMw*I%hpWC-xSJT3jtgm3Hkt@x$}sq_CMq4mQXWNda?IUf8Q(_JY} diff --git a/doc/sphinx/doctrees/examples/changing-framers.doctree b/doc/sphinx/doctrees/examples/changing-framers.doctree deleted file mode 100644 index c7b4a142b25b21752c4b5e5fbf420d1b20ac61c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7861 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 TNS*(2L>Grw$l1cSay0li=fdvT diff --git a/doc/sphinx/doctrees/examples/custom-message.doctree b/doc/sphinx/doctrees/examples/custom-message.doctree deleted file mode 100644 index 8779f1c1f2e97f0bd71d7881d7b9eb8d4b199a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9525 zcmeHN-ESPX5tl9N>ukxgQ~RYh!azuL3Zy$LXq{H5(>Au-7_NoFv5USK3*Ij8$a=rB z;AG;N0 zVQEyX2Wb`wUDUVUBl?MA^*bygOksO(Z@H^*6K(#(jU5MzxIw#SVr z)TlHdKoi!ZGEaGeU#}{=(tcZQh&&&@)S}Qs&C|c|+3-=#Q4c4|(4Ql2K}vf=mm_VI z!Fsbah-%@t!m=o^-k_H5*iXi?Zg<%n)a)y{WY@F^iAt*^xguBXYR-vLC70y}^dPUk zs^ok4yTj!sgsSPWT5Q(P8p}=E6M)eR{nYQm}Cr$Jwb$CroL^)5az&8#9@m zGLx}V3uZ7&I9tH?(`R7?kz*cShQ5{yw|ZqUNlydvhe;~ zyI!14CUF1r=2n}lp$ z`TM3dH-<(hRVCV5EpK142v%~vt zgdQLwzEo-GO*t-8w;SPI1V8{f#6)a{NfV`k#xsfhL+fdm^@E1?su zUN?YY~t48IQ1!YmJG7v-If@9CU`yah4_z>bam_e`{&D*I`xyi^2TX-Os-GVs{^4I_FdWa%2&2Br7e*dq%ySh#S5@`1__qD!(HP%5;&P zn?5HkrUGfG7k8h4${-@o7-f&Ap~z`# z?kA!svSRQgj>Uw>f8uc|=9;c~)XWDbJXVm>%QWcN`G06@ZrvX)$8T%TXpIWi*i)do zMixM$6IMIr|6pNSg0()nUhSi+@0q;|SbagT0y`n|amkJ3Cjtl~Qt~DwkAyMj9lqUd zcZB$J8BCLM*W1!_pyNYIYUTpH zrYPb>RBtz7oVmggrzO5LU=w9nqA)SuV)S(0Sw*)l($`2rRtwOy;ZR^Pb78TIUM+Isev7nSBkrTL?> z!i!4tN2zUbl2akD^`g>T)C#_P#b6V^s5CDsP4b3|N>l5LN^@#1D$O%U`Bpz2tX@=_ z7nLTpIxZ^B?~NVA$^T2GId3MeqM7(Pnu+qWrz_O3EJp%gm#Gv*tJdD2qP^Q~M(MY% zqM)fZ?G{c>vq@}pyIw^bUc0;dN7PG)d8=lEW08p*CPdTeiRnSgktrQ-B{#m*U`B4 zeRA}jdvwrRxMm`8ZbZ{f)MDj}svrn5I!>SN$f{2!0jny$Lswp;G-HE;*hSOHkSeDS-3UsU#1F7jZk zFb`4&MxY;pB$>_~M1Jt$y`N!SceB#urD-Pzo|Z(PAcl?5gNF1WZUJl+lHnt$EHbis zx^C}=66bk1TPnQ1&bkc314x+H7Pbkl!K)4&e7Vi5aVD zWiKlzqTNMmw+G#r{N z!vzo}%y^I$lc6+8Jgn^XGdhRCN;4*dZK-t87?s^{FAg+p4#vqyP=wBKQ$q@2u-;AQ zEUoJv+pD-z0%MZ1L^w3EtF6auxuG4YHS}hJuS&GeH4&@b%ejmT3cAGNE=B}X3R;X= ziNvTR2i!m?hk|Tey}{K4o}!^XAqS1%V3%>P!rpeChcj7GxO*XuRB!B-cdFn-X@yo9 zsClPv(Sda82IU}_&9o`dk>Qcw?7whXNe$bnS7*#pOTjHS)K);aOw&)6>&|zk=Zm zABmG8Mrs%z*ogZK)1W=?t8n2Xqp02VKrx4g_W*=h5y2UAU=YGixwyMYS7dPGrfZmu ziAZrf#H(|YhNNXOSIfrS$K`4{B3vZcaWH(d)%zmcyBjR;bNiFCXp2a3&at@&{_e>d eAuU}H`nr-I$vfKK>|6|Lad?%2%?&F@gZ~0u$j&YR diff --git a/doc/sphinx/doctrees/examples/database-datastore.doctree b/doc/sphinx/doctrees/examples/database-datastore.doctree deleted file mode 100644 index b02a1f3c0dfce86c9a5bbeaae8e1c4d5b4791024..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15916 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 diff --git a/doc/sphinx/doctrees/examples/gtk-frontend.doctree b/doc/sphinx/doctrees/examples/gtk-frontend.doctree deleted file mode 100644 index d18a345c05f0e87679f495adaebf0806e6e9e0b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47222 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 DsNmLY diff --git a/doc/sphinx/doctrees/examples/index.doctree b/doc/sphinx/doctrees/examples/index.doctree deleted file mode 100644 index 8e0a735b2e172568541c32efa4de62a717ddd834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5145 zcmcIoTaO$^6<&L9v+LdQ+VKVq>v#;ra;(fwBtRlO1Vko%!3g@!tz3KO$P+O0il3E%1e|7#1G&PaKHYDNPMUII-6Z%kchms*{-frr%rv} zch2drFTK^hvf%!+-9Y-82_wCm$bjqIcIZLO6O+H0KlMg_FTZ8i6g$!~Q$Ek_LT)$5 zQkp~>?kPUjc*CwUV^lcG3=GhMPLQPui}Bap+%DJuw^AAT;^2bh(*d8dIE}a-gh{}syGk4QJ7WHUa|C-WhJo92)sL9g zZvV_)(%DFx(BPOd@q*IluAeD|V|t}i!(uVHf3@1XAB7{u)U01^oQnm!s<}^=>iCFd zv0_(JM%Hq%DAr&@T)3Ny$MCbm#3mf8P4-HYz1k!bm+;>9-8{3ahD|71xwt0IiACG- zMHmIJi#XoG*2_3W#9JHNtFM${>b+dJ+Iz8#Q7&$X>+`0YRNtmos8BAz`tu7lFcbeK$fM(|#B7wc8v!lZY|R46muJ7P0^I~Si5TMs?x=UWHu z@HiDrhq~pMcme16!b45G?BevSef9rvg1iar3LF_Cu=ppQ+gqk9L_D7;ct|*-Cv%S4 zDtoq<_UZAd;t3g-JRe%Es9MI@+w?x0%#$G8wRDNosM8yWYZoSIFbwpUNi1kA8eB>jW-szNCHk(^Axnp0*{Hj5++a{EMWuUu2k z^ebmSTEB4GNt>g5a26VgSe(ATvR>g)4{%XqsbZE;PWf=XX_n%EI797EGv%`=BB`&Z zTCouH>axbrvF3*D z)`xb<%n`}1h%g8s_s4d#L}C44X%fj%eoRTlc9JX}am9mtZ^3qAHVt@cM80?4r4hjY z4JTL6?OgzO4js#e1<5#MrQ+MeWu=5-CBOZ)tQ2##G(*IleCe74GYM7Lw(4X*xD+UjcEnUb zbB)}TBA|Up=lrT_CXBPF*sE~_{*|>;ErAUek)_MEl{_|FR6Iu2SP~e3N(^a+_fl!K zSCQoXM<&S`Hfomaub*335I6Qa_*HP_lc#d!>>d9Lu2hjgac>UlSmiA$obmW*+IqWT z$VeL0z|GV=eD*(%GXW3#pD2GnS^mE1e*aGp`7}cHIF_G8Nf|Vf)WtG>?}~T!&*N3` zzW9oG9jyn;jGS+mNWR0s(}pRN@13(u{qFJdLtjlwD>a|;X7LR1) zRXfmX*En1-iY1ydENDHnYt&SjS&HO#4~5=nDBc^2o5TGjxH`=27BWz%P=$MNYQl|k zVx#JhT!}xl+b8y_POyM9_uH`$gz106qZnsmOdQ?1;m!3ht0R=^s)4}uplh1q#W!N>DnKU!?Vz01; zGA4*fhgZmZALUe6jeP~4HtIiw>`OXi(;YC{G#l^zEoXZgRQuRNMp^@Da{|- zE)qk6Bj83+E5&q4C^8YUfNF}4z2*yabH3rKh?f^8gb6QZ>L5$W0G)Ww%XPt`I=ajD zLV0a;Nig3fGdy`aMoN6n2)P;WN;Me>6GwyGUOW+VU?nqSy0C7Tv@avKYi^>iap%|= zl@`%;hHgM`Zm2eMV5y-yv={J!1eZx*K}mMbuGEO>x>x7C)`*+&zM3HwYBE;B%R$DG zfo@o=4$mA9u(L6Qq5oAeC1S zY_|ZFcNprBss|w4Iaf;s#nio&!eH!pLoY!PC{NQf0LIY9a4<~9Ad2%32fkd3x2Mh-k4voP||mMPRO2*m@t$dg0txHEqrCm_Cm7ouf12y)Hc z_o}-;Iy%}-XGX}x-F?6h(Q2d`_YbX144Zl)oQMcNVAoP4sa@JEw4zam$DoB$1;As9 zv<~J`S1`1f>BA4cCC%T>T2qffj_4H>=S^hR8kmcfY(&yX%Hw4Davl1%{JYZqI;C=fmSgp=0L_xPQ8}0rZ^^47@ diff --git a/doc/sphinx/doctrees/examples/libmodbus-client.doctree b/doc/sphinx/doctrees/examples/libmodbus-client.doctree deleted file mode 100644 index 7ac317fa22c9e5b7c0842ad22bf938395caa2951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37552 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 diff --git a/doc/sphinx/doctrees/examples/message-generator.doctree b/doc/sphinx/doctrees/examples/message-generator.doctree deleted file mode 100644 index f1c8e740c4132bc00fa3b3f93dfc0dbee30ac306..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44289 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 JGI@XH{{Sriq8R`H diff --git a/doc/sphinx/doctrees/examples/message-parser.doctree b/doc/sphinx/doctrees/examples/message-parser.doctree deleted file mode 100644 index 136037c4cbc3c2462145f98f358c8c1c5825a33a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18888 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 diff --git a/doc/sphinx/doctrees/examples/modbus-payload-server.doctree b/doc/sphinx/doctrees/examples/modbus-payload-server.doctree deleted file mode 100644 index e91de84c1774cafadc6eff0b9669e3348e8c95e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8899 zcmeHNYmXGi61N)(}1O?S;ydAqyX z_1N8sWGPV;2}|`Yo&S=bms8b`d4Q8x8omwEKvS=K>)unh>)z9Uz4otv-&^y4Y&#Z_ z(L7Q8OvF?bcH1?iG}FaDi=)34-xeLaBguslMn<%-YlYn#386EgX(;JPVT5fFttB5C zjRo96`%-D>KP1taR}8Y(dF*xAiV~uf*T>kK$_$m} z8rv3G7*~5}M@C9)JFJvEEhl4l{dY?1MIzJmQul_2Co#{)y-K@+t=TO_Be!~EL$<*- z?PgA#go3TJ9hiw-e_gN-@Vi6U9+a)*1l6vBa#ukmC#dBFwH(53V)E_Rg|SvlV0Pzu7}fDZK8z;+WlqmAu9^VSWXmnIBecoPO+l$#13R+|bQmnJXRN9@CS zt)X(G06St`Cz$;VjcfMWOBe>yez25(6drM~)-eS3&5+n@3D0QpWZl;2Vf$tX8G8xW zRFWhdCL%hU+1ekEcGuPpJ{lM$2Sc6>Xm%dt6U{`{Iy^jVJ+E+8@3=NVwb52@X@6R+ zFGs;dnBanBI?y8E8P}X7{4X>hi{8Be>d_hr0Gvle(>O?JD&(Y<5UioQex-m3BGgMg>Gkk|$Uo)gK1QS}zklTa5ih=aUpEm`zP ziWCkk4`IJL>S~fjwMs8Ek@{tnmk@5X<|oAToJX`CTcZAvZ~HQa&V1yo4ZRnq5lxg9 za$)8R`i*h3Nb(2+9y;j#pA!>uPOH<^4N5gig{#Kavh6nKvO1(C)II$L?gV88I;$s6SIPg0FIzT02 zJVw-Cwz$d|_3G8X{UK320#cwz=ct9&;H1`|Kc@OAl%cZh!4c6<={Ze0_2fs7AHMqC z(R;9rN0SRovJOJaHb;e5>~;0bneH54-hZ&z{h8~nJLhMjM|J*u+`Zp* zzw+zFHCA5`b)s8xpfX7Ws+ z?!+9(^NV*82ByzUPM>-6eAGgyaCbsrO1PLyb7;E(=@*Kmo}n!HCl&R$T|pNq~EBfa6F^;x0P4 z8qqY@6QIK#R<(3|aQ~)QIe2hxMKDa600-6tRi)7kEqg z5zl7&%Gs}E68PCn>-_UUmDluf!y6!)vkM{5rb*7s>}q8%d`5P4U!55Uh|#3faaPH9 z3?yF*`HW{m{s9*sh0Bf`f4_fx_#SX4O&Na5i&}I4T{ghyFMXZr;B|xAg(vkxH^6H^ zQl(Bh_i$Y!2@^`+>jpnResGM#U$9@Z{U))oJC|wlxyp%4b+>a&b7@gw+l-G{f}akF z9Q&O2y30#4tcA;G@#Ko~DO{bS*q1*f!>tlJH2^kJk$q2gn@`Go3mK!`s)QHc`TP&* z*KeBi>zAtp$mMxUk8Z03$dzMO3DDb#HS*(yLohMsQ=jlORf^2sg+=kRRT0M z$J^?^sP=av_p$Dp=p7PtR`8>}bo!Z+A z%hyV;A$huDcV?y9ZIrT{l#<+xQHz$oWa6aP+wnrSQRUFCWKr0g4Ur1|0ac(ZF6`!4 zBr#Z}VNzQqxfmLm6sN3vYWK8=LdRG_%QLL90dhf33i}gR3duuS5-Tcn^iWunn5TAE zQpd)GiL3J#Pp;Y^Qn{3~(dGDvkpJHEkK}h9BHmLBND6`m8HEs!btiNJ z-kedYvEMxpmIk_~_BsfDIMab8MlHi`Hi&8ap>tX**iDDu7<>Sr++r2HJY@W#aGw-- zzB#;fhZbWtVmdSqfIB$K5p_N;-hja++1MaXV1*a}y9&D6{@5drXDGaQdcM}`jcu2p z3S9*Y#2i*DLEl6NXH!2Y$AYONBwfo51O!);b#18YXeSs7xnQi;IhX z$y9sCgSi}Fq=NGi8$qvLhD{l&052}wsog6B#WXa0fIui@3^3-1K{(zVx}Dlv?u!I` z_%QF7oiWWoqL=2}b3-zdPR+72#W>qELl+la*zsZbR%7?saPL0=_>kBiEk;|M6c3KQ k+2HS6wp^rj-)VeXu#edt1yyIi&uHTCraNqYm>Kr}1Adv_-v9sr diff --git a/doc/sphinx/doctrees/examples/modbus-payload.doctree b/doc/sphinx/doctrees/examples/modbus-payload.doctree deleted file mode 100644 index 37ad8a6ecc00f06c6ff20a6bd6d657d0535af5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8627 zcmeHNZEqa65tc3M?PSTaQ};`4gt6f06x^HS)Kv|rEgUCk;6x1qr!CML3*Ij8xYge7 zhUDt*P#9=Y6mS53>-InN2lNN_A-P=LNe*fQN2e%d=4)X>rL=++`nD|k zQpF1A&C(#Mgx?MeA#mQHlJ3N9#<807Y})-IPNFy+wj&m1_MsA}X6df9!mi#`y z#+UVa$RQWlK-*17vVtQfY(@^<{L-qDeC6~-o>m9xKC2EwK6RQc`3L;{c}XE=&6@A? zmSM?1!r+p=@q$eZOx}V1-%ATA=%xo&ouW_mjU-N4`FvS>c<`N~59(V@tvKqr0F+*e)8FG_J07q{EiWX2r|r|2cj}kNDL5( zBP6w&Ff3Ub5yW63*tZ3fN?x_jDvKP?;h?#9aQL%M5C0DKTEw9E_@}+Y-hRWaHW*J4 z_Mo$?7H5}yJ|NSqASq*!(Tfd@&`g*a%}fYx7fFXelhaMhE)HpG6=)zkGQ2`D2F9=mwh`65=huJ#+%rVfpwzzNzsSIzwNqeC1funKBg1 z)X;S5nV&u~vwm`Z%IK(hNj>`wZ}DS~rH+*rxQDa?NJJ#*O?n3nJQs-~_*!|$Sl|}J zi_$QbxXomO@+(o+oZ)es$3vdrqXH_1Hox37DMFgzby}$M`88>CC!a3pFW)7b ztW!w5N8pOTm`UbSm+c@&(`yyi@;jS%A^G`Lo&5ZKk%XAc+ouz6y5=vWEfp3PNys7z znZ4O&o^i=Jkl@moO-2_<$RY`ufyrAv0!xb|WRZj{l90FZmbY89NJ17#$p1kSa^8Yi zMGN97S`hpf&sR+2qv$g{E}JX`jUs)U7Al+Xbs;NQk4<^XB_eto?H$R2supQGPFrED zsBJL$?%16mJ7zH$e zdQAX1P`I{yZ~8WtZKs^*yBElNp_h=yT+D`-rJ zX{mo=$^$5aCCs!QWiUn)Fz~&*6Ma)KQ+y5*Q<5*AU)Q&yVw4BDWJQz($Ri=?tssge z?I$d7tp*IO`JNu%(c4UjOt?ZDP5{>5y!fnrRO-7q%Y#9TeULIhHl8P_`kIuKN89Q0tUqDy^`E0xP9-LA?qw4Y<92Axa{yIhTuZmDlw z&^ZiNsDUxqwySJ;W0ZQsPP9=KFTr@!XU0RP=o53s6wbS4!BRu_L~o*@4PzRxM5rg| z)fzF|cIlkd5_(g?w*?yB(h#fQWg%mo!nDwB%Qcu7r^T9;i1mx1H4F^FjE&3JXlT-O zSfFPC3K0Ny9UWW!V~e~vMe)N14KLMez3o61oW(L$nTZ4r^mTMFI<<>(5FA;*F^doo z6#BAe47C+y7(>7~9l%knd^qqO@BTBsh~e98g3>r_s0!(QZAITjnTVbSY((QEsLGH~ z#cREc&MP?Ho43aWi1WYcn+9*^h9}$T;{qBxw$D`jrZfAC*(qeS3mW^|a^VOnn z;-U#VHVogX^*$T!Z72MFs(*Ab+QL&TIJRbkza3dKk=Fcq!mE;h$nQygXYS7u>Nvb= LoXsvP`kns(ClSDO diff --git a/doc/sphinx/doctrees/examples/modbus-scraper.doctree b/doc/sphinx/doctrees/examples/modbus-scraper.doctree deleted file mode 100644 index c21e58e591fb12e5527129f595312e6b67408b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23370 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 RZi{wy_$nzIH>(ET{{npp6xRR% diff --git a/doc/sphinx/doctrees/examples/modbus-simulator.doctree b/doc/sphinx/doctrees/examples/modbus-simulator.doctree deleted file mode 100644 index 3d5b66c9a0f03ab381d540c77018f11928fb3e8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11210 zcmeHNZ*SYi8F!o7v6a|y(q$;H1ii{gt!%Q?7kjZ8(6%;Bx+1MtpzbhW2#6DT(lMb( z?(S$?0}5;y2DAX*jr%OJ=J=lbT9~QSRsX6U|GoOU>Xkc2p4+T2p{mM_s@$DqnM*UL0;47tJIao9 z&cx%w0RSD?j*2{$GyHl{m7DFitp>>H@GGl~9a@>bl=I=oHAXv}#*Y4UF&^ggSr&~8 zI|MyLo9j5e7^(|7%M)dX{?U<*XGJ1iW(LMOkUo~-E2ar(Z^RL!zZoXdS|+6^@7iK) zUF^VdmIhHx{$5xZ1CE25z7u~KjJRpgkLliCPqJb#&U2MDmqAJRpPEJW`m42w-&^OBMP{&CGu#jgDm^Z;f zqL%QM?|ja}5??kF5l_9WD*c{*ca;*5(W26ib)Qh^pJQ>OeCt$Qkm6qh@1GSL1$g}c zpa;cRmTx6-s;cKV%0|I@zZe7BZW23XWD<;%EPS;@?w|gd(>aIf2yBmr=LV=n zB%Kt}igT4D^uNG95oYNmo)$)q6D7vd`fZH31JIdqB9FsYiRw&DHWOLypi%6qpZy^x zoqs_~#_w?Fu>~!I7!;XQxn?H_31OQZzpJt5fv0sK?K};etzSB6+-aD9>G@#9?E&J# z0#HkW*R|jKBm>q9*RR(Sd8X>6PUqn0+CB%J1Myilok9=S3$~VOQp2wQ51^Mg1S8N? z?{TN&WftJ65Mm^nT~p;g!$D*Xv(K_K#DPg>z#(A8GdQ)X5619COB|C|lfN^BgBnCl-vIw9F!Uaa(MWWO z((bjI0a?NCy*i%wTy&lCKIpItg?AQ&H40BpFG9s}s@Hy7l6$+xVhfviNC$;72BIWk zv#dyWK@g|03xb|i$)qnVQhhqD!8NM<6gy&>#D7(m^>8&cFgfdF8Y&N*4j&`9%2^Hc zSip=0>IN&P&}AlMo~tyXZ=_t+aK)t6sN3%?SA(kwZZ{Ge1J4CwiT|?9Emmq~FERO1 zfh=s{G)CnH?v^?hHYF({FB`u^L9oP{w=;VzKCH34{va_#pT^SZdu^(REAkXiNlC}z zkv$ZT;5IEgovUo2^*0s(TOcJuma5Nes}?Yc;gb?l=fvy3`ZUV`+H5rNoRY@ieKSOt zS`Jr$iy^hp6_V2T%L48$8J5rab-L|~a~+2o9!p^5ux;9T{9IU6ecR|d6<2KE#xl0 zN7VEn^VC6L6^4;9GR2c+uWxtuy3a`aU=cbc)*jg|Osp2*!b#X}I3BD@ReV8pkr$Rf zB$(QTIgxUGiYBO3y0m03bFOg$gp6w27?5@t-+3;Y^q zvvCWaq!ZZ)Fg@@;A4c)vi#wus4064*^c<%^;Sld5kv*P9e6am|2XrQYD`S|k!hkw$UU7#v%(fe4ptdz77IG5*;=Mp1w_0c6Nt_bBYb z;f{{Tz`Okw1ELf3q3UbYrO@cTpiax)8R}s3JxB2p?nYg*@><7NQSh;+AX4LE`aN)J z5~x-}S_e**@*59|!w~uVdrl!rgU3;qV^ZKyWC4>WsYZrh6Imo~^h_qU_QW1U(?``d zMG4hNjL8nLW~qQDp&T?MFeG}FKt1472XOKhlz#v<;0=qYbwwDY*F7ri@iyf?Q)epa zHSYu;KmF*dPZs7)h@0~M2OYTVs(qn6B|9DzELC*rt%K>e94l>+Q-z6SMWWWoV0MmI z!WrsFI&|P=a+NJmU__xRurS>}t9=H+DFut6o(2!pD!({;mUslU5!*ev=v>xK=r zg4PWi^cU9+n^AY&utBz{U)k3Un{~tH^$nZFT+0^bT0X*Di~h~?O`4u5#tL6=P)7&T zL*-prxNLO<3hk5aI0~AkO}XcrpY=s1k0I@bvA->BhoQr^D=z9D)8 z4WBp4on@@$HfE{(@D>_VxW*4Nf4fZB8+I7UHoCAhqJ#0VyX`y~?&{EtOrxsY`lCz= z(Af@@b^M@JP?)4T(fyNh7n2$RO>cq9SAepKyHzu<%Ae8gY#t~-?_&cR@Co?78{kgL z+qj5D-!(|616)0Sv%EvMgh6gq5oG~-ZrF1th+<2f?|_=3@f1rpn?WzVU+(dRcc9WR zi@*U;e|7ro=vP&FKUaA`ZFr&*qYD^SkdE7TDnEMk!7str!>n+5;o8H2hvl!A4EQGM zLkyqSU?MWTk+d+?_3(1n1Dtx zc{C#>VdeoMi=3{WZk8Eta&y673d})T0#=(B zn+!VzO;+-pUT{H9i#?m1kx3?W38P5I)i;=ulj*d;zylyeFt9f<=2!ldEf3=o%Fu;O zOVu~!o;RxCEVeO*!T`-1eH$G}ro1T!z!}ZS(aIeJ1iBiaHT0n!AqIhT0aMclhVM1* zzvPQpzKdH`3`Zh<6}IuU&GLSTOW9X}LYF)Va6iV^^%ih%V4M#aAFS%*l8Nhol()&= z7K#^*;?K{|2Yxbu6(6ayA$D3QAF&ZL7Z*X>Hm@*yh*2iYr20Uy2n}x|5N0NVG13GH z+%9InyGJvd7y?~Y%+6G$7*zD)+@&pPFpkRtOP+SKxyp8MGU8^n>tMa*C2T0-jOkn zWXYvI3Iu3T6i5KRmHkWm)~EhvzsTd=Nf*VD{cs1%qIkPIA3HNUGaSy}-}uje|8PNk zid8Rma~_0QCyG6mmBkX>7_x|$|1LNFQGQ#ti{;cg%;G$CSy@~ti~V*#45XM zPL>Hw^5R;S_c9)E5FAIgr?6jj^E3s)wnA@TP6l0XX*eu$!5wc)AyE1kic1-DX&J*N zf5BfY788e-D*cQ8GC1L1epdQ#;^(I0uK+8(prsbH^n#9m4Wn*6EA!$KcLv0=(!b@u z=3gw9Tt5gstO{nf0eArfgscX(c#yZKEVdE`oTW}^_rlnHUPJcJ z|GRzR!utAp3pitUEsgqPxs%rY9K^D;wRQGStM$YWG7JBlNHf@q`&N&Z4x)kOSZ<#2 zcxWl{k>3C)_Z@DznAKxeo-xk~B8&UX(z0lUK`(XEE<0!iU&LzwcQRrDJRlw#;W?lF3~h+Xl7AVj3(`<_thI zk79RT*h-R3J-j0(D^=ayZHYe#4ZX#CQ;67Tj_f#|XMYSf z+c|cueRuMJyC0bmJJkp+ta}=4M}Tk35yTk*4OY#v?H~dSyPdJHzp2H1Z$FOMCghXk zXHSYz=L@hPWQx5+6Be=_Vs_w!!QU8kC1MbCA%iX>H4+M;v{f;n;>a%SpJNnj*ZR^q z)Zi`8;SO=0a8s)j=M9h4T#4VV^#qD1ud!)?$ zb-sy%NNl8`ZKJ|AWf|k*+c8}6MPsiBu)(eltjRgBON=8~l0rr!#vq)?jWEb~#S3AP z=@!{cehBqDhO=NL;2jGYxf{Yx!uA>j;RQganZ;A)aM)tOW3dE;Fl7TQ1|OnR!8o1Y z0w>AqQEtnvgEZhma?_v@vShIz;XI@-W+77Tp8X}AI-a16T{ zhO|Q=>(deD!9$X^blV~%3Et3o&dj8MTUlJ+Flj6V6;esWCC$TP^owkbR2Z{JU2f&@ zJ#lhRQ4+=6BbU{t~=KHeR&#^L{FrV4)wO0uBmB|Tsvz{rTOkhuL9AZ|9GN5*f9s} zsYHLU^C}Siup%0|=|Lx@)Hiq6NSzraFP`q~K7(~qf9&ow&qH-OY2}dP8lob!gWQ%= zc_x+PrK(1+V%U#UjhP5mn(l2<0rZX-rBp0_UCzR5xEXEGhoj(gw0 zMNz- zbP{bO!Z6SURunx*`SaL8;If+6Pb{qlQ_L|j!h_p|5K*cgqCC<$`h3mc#2jD_HiP_a zgp)nyI>^>hl;R^PM=^s)HTV=UhJ^32ncic__ed%|01$&gBT*=>b%Jk9A`HgTh1Y+A z5@L{ubzWp%ql#tkMYV*9XFVQKK0}u_9>k)c54F}Ao4Qm`_`9)d-3HQhOk!Pdu^+-5 z^nwU!O|u%UqD5lQzmfmh6q`Y$T(_NWR+6Wd===PXfw2+Rx?v4z)p^5 z3)|}tBUs_UYs9q%xRvEe5(dm$S6=IMjrmQC#~p2#{?`bctELFZvuKGNI8{Rs!?b&G z95N@`FnVJ4P+2muhLl;leD&p3AdK{fkX1v?s6>(^*5Z9JrIMlZlRg1>O!CMw&ybhX zwl-0x0X@CaP9dy)$_?>#>$|>FJLjE=(h7 zkg1FtOM#q;YqMxpEz@DBKACGTT(fk>U@AAp^CM?s$1G}9OM}eFju)<0r?O)_d2%Lp z%%W41awI29$IH;E@hnP)hmU)ArwWuzq5NcAo0KVe^|(e4S>)3y`E;Bd9}0J?6JCT+ zho~^{DZrue((gR`2|uGw&1Pb1KAc>)mT^``_ej3z6roT#qo!1tlSjG4w2JhI=}Jd_ zRl-R^HnXOCUvPbB1v65eB_|7tfUbr}FAn}n>-O2pUB+hKZrw%&5Y?67!PG+!&sKwe zfJdb-7>I2Ek>euw!z3|lS@J3YO!;!1jI9@s&5M~(dNeO)nin%!NPG6FV$5#j`E<$C zXmoT>*2hiC^_~CI=2{YPBy7-yIO3Vh$rW6URNje1PfF*VKhcx&e3J+@ft3k5<;C=D z-b5abg_fq&PbX?l(AhGZ8$VtUG^-YgxRrQY`giCW^=N zapzC*q(t4Mef=qwVmu9ZLItd1+Ps))Ud%-AHqDEfs0e#r%tT3Oe5BQ$7cuXHg})evbB4Uz7n zA(H>eqXp`^l=m1eFH*G=T22+$oSes_ZL?5Yv=n%@E@&!N(F`GDw(dDYowHWlfZqB- zt18`S>-xw#X6{;cJnY4xtszk7E73dZGDkm&4DT@xSz7KF%hXqjA19(sm;c^=R;&f+ z29x3?L>q4$3>X(Zv##idSfaVpesQC*yhi#0s-a#hmg`W9C7>!BetnC+U{p$%3K9sq zCPx5SLVpsDo*8I4cFpu4!$FES<07vt7XKuATbRyKMN4+)vhy@7_x;WNVui=9O)pIV z%jZ~S0flbqaasI=G$*lDTanDB9y7M?0=8dVp%)@kZinoEh2^8yi>qEfOzb3Mxfk20 zM+2r;Z7;~2UdU|Z^ZLO6w=U`KVE$UM%F;AWZSm|G6ae&BPky`gaar6*SYr1B%mbD- zXXp!sNS8|6ShDr*_J^SBR-E%B=Vr1k*OK0C3c3k<7v0QO)4ogl&d~V_ZJmI^%~7z; znQO$04BgIrP#B7mx?5OlXr!WA&6Xv1-xsTgP8xv(>?q!o8`36mrw5jK+%F$36}Ma; z{d`=!tSI?~zCt7u_RvY6=ShhLh~g0}TfP$-?k*IU)wakCeV!wWHR2HuX zV9FKrVnbiH$Vdv_-@^?wd&879hFV5w2K+LXMovhqxI)b7Ik-#WP~7x6PqN)^m*aJ) ztP?Qa@5Je#>+@mQEsLuSo@2vu-lq*)4WjyHl*O|6VhgXemjFEMG1AauG)3_ljZ}tTXV9+kef`J1?Wflz0h|5lTVb_(Xd*`-qel zV-`Ht%Siy2p~^0!JubgPdo{F)$fgy!gjbVKg*W-xaG;sO$s0 z7sz9>1XAdYbs(OKK?xQdQac{Ha}@@GqbVHS!=orpfPr8T^`R&NKM;IftA9-war+uO zLI*1BATB2!POj^4l4Mk-d-h?5HQxC#OMHNsx z^hX0y*QwJVItPw!%<_Om=x`_5xk5vtd|0t%xsq{zG4GLG6cxF|{OgAAb#pJ;@V)I6 tKWkcBXo?VymAdg4cP^2orACL}mi~MG%?zm48yp%tyhzF>hULA^{{i{jqAUOa diff --git a/doc/sphinx/doctrees/examples/performance.doctree b/doc/sphinx/doctrees/examples/performance.doctree deleted file mode 100644 index 414dbca74dcc7422873430f8956794c004aad504..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10613 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 F=Ra+lHhTa7 diff --git a/doc/sphinx/doctrees/examples/redis-datastore.doctree b/doc/sphinx/doctrees/examples/redis-datastore.doctree deleted file mode 100644 index e5d0f99252704b306624d9ec66d7d4dffef9582b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21030 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 diff --git a/doc/sphinx/doctrees/examples/remote-server-context.doctree b/doc/sphinx/doctrees/examples/remote-server-context.doctree deleted file mode 100644 index 0d823732db9548d074ea014cc5310d801f7076a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17518 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 DBVeUz diff --git a/doc/sphinx/doctrees/examples/synchronous-client-ext.doctree b/doc/sphinx/doctrees/examples/synchronous-client-ext.doctree deleted file mode 100644 index 91674e5f67288e155864274b5167df815a2114be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18229 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 nm1DK;{Oyy=QcYfx~oIkzs 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 CjaV)K diff --git a/doc/sphinx/doctrees/examples/tk-frontend.doctree b/doc/sphinx/doctrees/examples/tk-frontend.doctree deleted file mode 100644 index c7f6716b364d89bd5e3cda6447348b5ee4f589b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29046 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 bKJhlajV%8VuvV7~mcsZvIZn!E{m%aZ$(*FL diff --git a/doc/sphinx/doctrees/examples/updating-server.doctree b/doc/sphinx/doctrees/examples/updating-server.doctree deleted file mode 100644 index 3d6b4325200eb1d1a2efe9fd65dfcc2a0b97a67c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9631 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 diff --git a/doc/sphinx/doctrees/examples/wx-frontend.doctree b/doc/sphinx/doctrees/examples/wx-frontend.doctree deleted file mode 100644 index e3f93f0754376cd7925b84e24ac1821d9ae26621..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26776 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 Fe*kdDN!0)V diff --git a/doc/sphinx/doctrees/library/async-client.doctree b/doc/sphinx/doctrees/library/async-client.doctree deleted file mode 100644 index 549c6a58e846d611635f37d560a5ff2cc3fea110..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27467 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 diff --git a/doc/sphinx/doctrees/library/async-server.doctree b/doc/sphinx/doctrees/library/async-server.doctree deleted file mode 100644 index 0c5f143c0396065d4534c8fa797fe303717573f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55492 zcmd5_eUKbiahI*T)9K?*l8xeuk?gV8A1B#&=Mu&?0@(v~qhooYFC!wvjV z{Gw^Jyx?rG|NX&z!GyoHqc6Blw^K6$e^cO(%{h+Oay+BjG3H!&!r!KQUdNj4de8t? z7_E2PExie)y90k%{xu>RdB^l!uF-L)UA<-NOVe-W6y520%ftVh-P!5(Qq!r=cHL>< zXWDI>R%>y(Va;~*&eF8*F12ct(8Ot@Gu3fD;CfcCog#LC;%2K(l(*Cxy6X}bU4OUR zopn9SgU&jwYMpaFUh8%`(Ag?yZH86GPFyEAnBs(p>eMmf>aKeGc*pUan$wu78jA+V z5QMXn@j0c}>s*@SAk$jawdPy8*XH(vCS|R^aO$M5yMpyr}BTVfy(>rbu4ec~w9la(hRBdu{QsY%M zYKT|WSXGTZ9O&k5U}n$VLD%2n=^)dl5tvivdFEz+v}Rh3ItU3&Zo=H;4}+>3io6dU zg2oQr6Qz3(5kARy){dZ63Bt!n&Dx!0V*!ZxpdtLOTVM8^Jw2`qqex$T*|h=jidYAxuUR&WMo52MeRt2<5IY6brJ?WMrq4qq6H?S@se zJa~q4;*ZdCwZMN>(l80AS#PNgX1W;!0Yj#}bchB>Fyn89zu`;JZZLz&CZe9+nKxi; z?TCtui644=2lf^Oy`^D!Mn`W%`e_~qdCjECYr-EQ!IqC(XsnDAkwCk`@mWX1#I7d8h9qCo&M zyI!iD&| zj~u^U6Rw@L27d`WPYpyQr4w^W)*r}a?}pY&Om%+lQoGov^zLWT@ZWd=A_0Yt>SFqCg`W^EQ&hFLtJz=%;~OUq&2@eDvhfGzZt`8|Im8qb6) zyF$3K3G-4hl>Oa3BEVSuZ!A!b&UG6N1_FLap>lZ6LNv%?;&aSJp|gBW_ea2NF}(SE z66FIhmGeF#__-wHXP>{5;FaD2*vnj*0LK92Mwm{Jv6nK<_vfNT@NS|~Xqy-|enGYg zLid-}$ay3f28A_-ClSaZ$cps#mlEYSmD_uJ?7U5zA_7QjM-hm<6DkRr*gL2IF?TCz zBgUEe!#oAp`&1SZj7z0{X(II@r`1@Bh=k$|)4V?fz^oJaL#Eek1O%OXgSLHbl#OG; z)}a{@t^HxZa#lSsf2g3p&8`Qytrz}9pxx+c%UGzvOpc*b9E1WFn(t9i-6d5vBHVDM z#UKd_JrZFEoHt^%2x^6^#hkX%zW3-Vd1z@^ACfJ#Tx~BpiV!VA6Yan)X{n7U@ z=zDjd%KaFVJ1V|nPq6|49PmYeZeV-}Ti73wp70A|#uDWO!Nr8IKAazHg&CDT-_hG< zM3erNGFZ6~@jyTj8hNBcpUY!ru)gCnRop1uI!c$%ML@y@J0!(#n^?bM&k3O;vbNtt zB{go*my(q@$T|Wu(H5Iz9@Fc_#C~le*>Cjtcdco7rc;MVc0<7$Q!1_g1Do0a(GZ3=`x0nFj3a+MF3pPl5y>6T1;j>H+^@!)kk&;W{VODq7AWky;Mbzj;hXR* z7!ZpNUu1 zv&nx|ti38Eo0^d!>3?(z64#z_=#U1Pm71Y>rlGZYW>%ZiYo60t(rN_UwOK>cYc&H> z!gXz~<23Q%ZSvu26&bHqucbCr^+K*xYeF2;ELX$&EzbgzSlR|jaZS|YfeVoE3H!yo zZvFxvpmgCTe+WE{(x+Qi*r!4qY&)NE03cz-^g`|2AOdluVfxnxRZh4?r>ahtq>g2S`!3!8;Z67f}6;KV*nEs-A5M}4~Ux9A>U~Lo^?<5+GxGbDhi&p3Jq5#9Asqv zAx+i^kg;e7rJ37bKy6m+$A$C>HGYOlhzsT{qfxIW0Y-c#)eMleC-H$0FhU9#nu-in z@Ksqodj_j>Aja8<1 zDu$WCsCzu8h$}L&r5UN)Hfq+KRSTARUc&xaD7|EF`3jR9pc&U6!fwTqhe(iqys}t- zrC$7k6~G1<4FmrAf#3!UUt@(t=h7DlyQQvs`a6x9VVySWeL=A6izd;cl-2}*O>Bmd zR{(%r(F?$$yiQ<&z*hwu`F=sZ7^@`o;CN^+JQN#ejuZ9p0* zIgUfnmOu*rht@BBrt~omx`y!ALOqW{F1rKcM*=t5#_f61yBDf)fW<1Q61$U0ObE?> z8#1U!U}6)Jv-eTC7urZQ4HnvL0dgA; z+PpDKuBD*O@ld=K`vz8sc|0cZ7_kZ$g3W&hB{XX!{Rxix`8{!(8kEc!9u3%>hrLLEDQL_OpuCpq@x0T{edEiB7jHM zmb$0t@EInJRLp~fBA6$oJF-oVc~TzZjN=+w#eP^&#zL1B5~$Z zdv|kA5s5WP=zI&rQv~fKY;a<7;C4q)=Ns4}_iO1kgI5rbF zz`cdxPFr;?;;K7g)M~m6G!yJ(%YMys2=KHFZ^7xDLS(b}&6Wo7@{7tuIv>2vo zvOU}#!)-e)w@*wXyc1~5RfJIp(}>zq`xFoEWAaGFG)Rbk+=qFb^bW~Z{hS9m^9}xO^YsjOurt87 z@x6rkC$RQsEx9R;mEt?=43_zVJio+u@v?2|Ujoe*fn;w?=qWg7r(;|TJ0)Q=bm#Dl z(}IFk$Gwl<5-%P&a0*T;&$|TK{tSt6$aY~ug9==G3?2^Q8Y^YNwWMQNugJ9`aheK@ z`3cEIN^r_Og=IetO$f~4zjtk+nra^a)5fElnbHnT73g<==dZpU5rzFM6_n!w_Ftp8 z^Q9h#$cgqLT^R$+38a;sUDuQ_P)yt9S%w|OwG--Mxh)sf{TExh%a{ZI$9h$rMM0uP93_tfOC! znNFk5^1pZGAgihYHtDvi*O4E`=sK}`8f~cVCGxZAB0*VbYrCq=*A#I z{M4a>BH%6>eq;xO!y}TbWDgR@5@BU&Mg$-}4edx6_dDwd<3gDWcI+<@Z!y;ysw27M zVO~Xb3KhL!=`P-^!7lVUbPrQ}WZnB780R3AqJw+__Ev6{t%e&cqhErizRG$bkFfg} zXEU&iF>q(8i;c{8!^w467?@M0cQ7unAgXt|Lv zctbuzJ-&lpQ8F5LfQQAgw7l&Ustc5duS@tpL8-9+>$y=R(fuVKy#57tx`6MyJ<0b8 zPD@X1e=0?t;wVMS${hDcP%CtltW?@jPQ*NANU35EZHZVw{PG3FB(V!GMrCEyQ|^Lx zglqEG)l*6a;|mmJCwsY~DKy!;G*7^JlfC^+vU!ueGITN~dp9Oii%r+S>6D=ttF2nj zTaqb;bGDMi!ip-LI|Us+*}H_wy(>Xd?Sq}{jRLuiH`zM{T*&|sAO58#d+!zE#mSz| z3bDx^lXwiVgnls(u}r9tW%3%X}qc7)J|>d!Ud@?Q3Uw7(9(=%+l#b9XW0YfCJhfIbbIxg z3MKW2Oj4hclET>{msIZ_=)8`s?lRg}^2irjMtf3r6_?St8|+y|%cUij(ctji_F1?^ z&F~UW-+eQW=jZSNetd2#p5KdK&_JN~pYxjeE^kIP?*lBG!FMS|0UcT}ToM|lJo?(J z6ee|FQWz|q`vo2bt7mQFa^Cj@7xoMAmzdtH zL=ji8+_YF-Sv1RKvb5ZqCQ>*?PMtd>5vjG zMkS>5MK{L)1ja z)ak;VGY-XC+*qXMc6&ak3N zXQ!aUb4uJ;do~bAa~o_<2}j??%PCzALP;GHrE*F)3h`o2X&)=ZqA-(qET`lip0F-p$7NeI{$GndDA1}g5cv4qndw%L8oM8t2KO!g&OyD=jv?|X)aW=)Qndd#U3Aoi#hXa``dkVld z3sR&Uo8xooxh0IGPnFg}SY3*Z)bNZDO3DllDUliuMAVSiKS{zbQ;YYDDeEr;UjtLt z^&J1iQzbAFgX>jc9RcPZZKvbWS(90KD+Oo|(%XHgY73`?n)=Vunv%7p6iHD(76M68 z6cQpu?T_Y6vO6a!_$4awPBAroS8z2jH67xxk<_HkHS~E{o2Xkgc&P@w;l`TNmYlA( zpu@!*9{7d2G25L-=Y})L{*)yvSL{98qLHnrb0gAHl%%Xnp`ok{BN8HIO&=-QMM=jm zT@@6^=wi}ihv0BvireTZuv@JDde*^3z$LW8I6VUSbI;;JFN~SZ!6Hf0;~C%}A9bs8&|# zJ)KN1%n_BO6;@Q~JS*t%y}&!y;iD}SCU+cbWIw&y=ObQ*$d$x3IUW{+D4_`47mDUZ#J5LMSP7Bcw!X zD3c}%HB+V*sEAQRW!*3M8kn-yC%N=^X-%ahm!1#;Nl_FMB1M(R6NP#zQ3;g8XrY=u zBe)uvnl^fl;ya}kS|~^HeIdvc^&(kPZ{G=qP}zMq0Sae)pz6ORI1Y0Zm$R=DFfv#^n~<-+|Y zu)C1oAa}&AS=McI^T*XU$9C;(L&kVsV|Nd6CAF~`9t~3)th8FGjXjdBWN6=CYU46! zRi-x9?4``TQjKRfei?fUDc`(K$Fds<`jUg2u+?>u{@T-2P!k-#mX_dHv2kH8B)2~W zb0LTG{GHR&oaFAO-Hq$T5>PKL`g}u!ip-Ldj%by zVd2KwlVOo2HP{Rb4#168Th1FR5>&P?L53`-atlHG7>hUK+I zx9_m99!avSqgzgubwZw{&kjnfw;xC4R_xCUWl*Z+kEzs~YQgU_xm(>-%hP$}3#D5A zQFawmEqsLcq*`)mrKei{EsxENRLhHbb=NP|@>7Mi6{K1=j}iQ#=|fVg1qsoQD@?Vp zc5rU+-_#%RlIwW zieIuK?;G3D^Jc-_!1Q$mZmJU6a%sX%`>ar9aDS0rGvTkkw(bmJ%ZOnYN~?xdl_Dd> zykB%ZMKMT)6tfo^HzE(>fl%6r#tnMqhy7;WVZ^NzZ#y zH%?o%{`OFf3R z>Ft@)`obN(37g)Y6=F$I7ZM_MO|R{yH%1qO(boir15?~aPbmKwdRz`*6iO)npAck< zs*x*k`iA%_+P*|#MSUeP7Wxg2IBXv6z9?#kHgcB?S|2W%lYAUU~zj^S8hdvLl&C1 zK$igHU0Q3FFzt24S-rDk_Y9Zll(cI5X;fat{#zkzOp=-hAigV?XPO5jBk`LvUoY+; z%)2==;&u6%Q@A%c^F^eQ8dHMG3YLMa)JJy;ou`O5FQ{Jt4S-zpf_fP`89`l3rWOm!U^Zpw#cHc| zGnGs+jLjv9g%wpgZxD2NP~Sr3-pewj+6Nod&%yB6ctQOn2toS%6z3N6r*=)F`@?-E@7 zTPb0I@;>AyYx))gIIGW8D5(!KNu80B!mBd5q=O`r`3d^4QE+Jbp5-Zt~*s+FgnHErmgm`hhf%J-m6-re%J^mi@Ey!BXG? zP)HRfPSpQ}DS^_3NejqGhJGw?%cV5tf>&a)wlP2W_kxSw)Nr4QSd%L;e_mP#$%~RB zyEw2)N$4USQbN{cm!b5to&sUB)==y(4_xePdL`ynAhys878wG3{oY%Oz4hU`90edH zQb68Cm!T5!o&@o;R#6fA1pR^8|3+ULIbK?Kg_cI%Ed-e|l8`JZvhQ_`P{VyU0Sae) zpz7Z$I1ZOaKE{S+B4!QKP(|}4x7Kw}pNFmD?=)(Lb=t^%pLt{o8|F=JO1=%VHzg6L zw)**#-$7FpJ&30=SYUoq)N9>mDKjXD%$6{gFm8jZ|*=E#b9#>9|3Y3FL&@Pa1{c9 z*ivYz1%dAi@nY`a8CHn-VJ7id?jUp&$zw1zcW~LQdZRI`*G_2*CcOD?!GK$-$xUl| zYl-g9#|43nGzwD%osc&u&^u|~_A98xiv2Sob;=d|h)TWNr}6ttPF8mYeBtgK@`Yx= zd!ZHbv`29U%!hK%3^Tlzp@RhGo zgir*3Cwa`nObCR^l4hVtg?@ZBZv0E@h%_TV^D(e5)*eEy1A;OZwy{FuU@s54USBm9 zjat_;`dOqh_nIR!UZBej9q7^cLdyN-dFE!C&@axIC-6;eR~244yQzv-;P=CkKUoz1 z5sB5ud>&}42)qBEj&jnuj2S^Oi==&qufqsK)5ZuHEieMJmE!9oUEsc z?vqS(sX(p_35NdE_Wwk*&w*S(_i z`F1Ap7?2CSK=QCl1#(y2iLVz4Un&Ai@*TJ{lkPLcfZKw1J3F0Ii00OPAf}2q0m2pS zm$YvCB~&8Zy()xGIPSYt>cw&ReI`4ri{mz5kVC!@j@tpPggB0mcnW&alLsD3?gcMQ|utdag_RDm zr(?jIC0pWq7j8VqV6&cE4fq_Wz${ZtYFxim|DiapOVZKTE?Bt$>5^h8Q`WScyTk@6TA zI%^O8+t&nTEIi5zF{JwxeJed1GyQXZ(#B6YWD)+dji2UTIm^XAS31QV6{!)JsF_;k zFpOP}6V{Y+BH8~q(rKIZRo!nn#&yPK`}uUUW|>0$AneT-=D3mQEK}4|Ss#NY06C`4 zGRu%i3dgS&?el2Hr4v6t!1XZLDdtO{mW?;Xd`*_pN=-3u6|%)C=6+U49C+q)=1b;7 z@G9RCc;C^y;RR;{;f&CJBX0uqhb<34n^ay_Z-4J{{k01C>K6)>ky%%-|*;DXg-eexMaTho3ySCp4xnuhy`0*IF z_5^-lPK$CfHeL;8(@i}$+9!Ysh5v(c5GV70V+#L(zVKw9jaRC(TehDtzij^qImh?J z+qh;*tDE*A@Za_w_;C)|-wa*q`n&b6=gc{d2QSh#svTp_4ekzn*y2%j@x4;P(ewQA zw%&2!y`U`FN57BNEDzph;j~zd`vU(0r5#y!m%G%QbsAMc0c)e|{q1xe8@vg@`a ze``x`8s1XdaD)4T3G>hl33Zu7woGDOCXp_idzVR~%jUx~=2vG(C(G3NWzyg>X>Qqk zZkhVKOnqG@B`%XJmPt0tq{8K{zYE{Y0jot`m6;WFZ%3`$=|E;5UKiamfV(}hUI^K2 zg2O83`CFr%^G893*ct4IzYRk!99RcQVJC&un2cS+!xw_Mfxo-%K$_cXxKnc-yji_f z5B!mL=?w_5(#-vBuG8(*jB2;j2xiPT&iG@VQ>)^t7jStBS{Vk8J4=E8YD}86s|G(R zQ(dq;vr4z&L31MwJ>TD1?>5`jwrh0jPIa*ft@}Hxb<5Rf8%7n* zNzYmH@YR+oqaT>N{Be2#Y?bD+&;uZS*U8%^ZwmZ9ZKGYCv!EVuS@qye>kT-*5B3D# zPhNT5_0X?7ifF^3h`CgT5yyh;H1-yCI zHKB(Mco_~5gSMK|_`=qzZX16;3px0!lFN_W`b&eeuWg679@oK#_WwV{%=82IN~Ae0@| zI$$ZQB`pP3Xy6OI*@h~+jK#JC1CUhLX^gTL4GytaF2dfIawup-Ow z=BAv^{Iuyc8`FWmGbVFTSl63Fg^gRSs4@b7EB!F(g3f_(bJjpdu+%VI(*U1)#vdbN zk)}K2Z|~>}piDHDI(mx{X))vUsKT`ia`US9cEQ)U*cdl2G8q~a<1i9D%L4;iMBf0< z4Ac8@NHL%Y19coM`(q8gHQ$A`2WX)Viay_H1^zFQ5y*{TrKaI%w;EMU8h}#;Q7rqLjn-+PxL4Ij%*5@FLe%hgpvi^0*M#mD z78a)3OP&e$TcYmaGK^_>(gpp47jAj_V%4bdBhF$l+fgMIQ|; zv?g~@_g@uvxG-4AKE|S9hQ8T?&ep2)xMAMJqA`VJinsJZahX0SF5?HR5AJ2L83VNW zuzA+}s`&(q@f7GOpwb5+1NtCTfFFQHo?`)(qACSc`XIDG9~5}$gMu-A5N^Pau73eY X6NbD8ejmc9j2I*67N|Gf*{S~r2-Dy> diff --git a/doc/sphinx/doctrees/library/bit-read-message.doctree b/doc/sphinx/doctrees/library/bit-read-message.doctree deleted file mode 100644 index c850597c50bd00d6cc3213d4385dfd8c941d392d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67175 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 b?0M&bM_|~xkh@`;lUaWRhc;Q%Ys~&1bN~;L diff --git a/doc/sphinx/doctrees/library/constants.doctree b/doc/sphinx/doctrees/library/constants.doctree deleted file mode 100644 index b606376fb73ad768b7594129ff5dce4e8fe82818..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44657 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 QHtqAq$gpvL^yg;&AK;LvTL1t6 diff --git a/doc/sphinx/doctrees/library/datastore/context.doctree b/doc/sphinx/doctrees/library/datastore/context.doctree deleted file mode 100644 index 9c8c53ff77bacbceb127195cbd77e640f94db12d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42980 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 O6~=Mu6UW`9x&H$;J&sQR diff --git a/doc/sphinx/doctrees/library/datastore/index.doctree b/doc/sphinx/doctrees/library/datastore/index.doctree deleted file mode 100644 index 9159561b458f082737bac4b0d6376c252454a54a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3067 zcmb_eO>Y}T7*3nSv6I+ITFQq=se1sGs)>8x036C!g;WJu2nrWet!8(}o*}z4+nL$K zK2(AORV%$WhX27&<0tUU*xuMFlnYTDIkU6x$MZhVGxN*FAAjwv#UJYBI;)*5?6J~0 zx1QQzq2$W>-~ETb`e*(QbqqVVx;7d2wC1Th(%LEQcw+d-Vh3$A=Zs8ihXCP)c3xMC zmH6+8r_JVDYZ2tT!4H-jJFras%%+2f^Ne;dmM(lmoervLsq?h91JpCHm5^#OC}e7w znGSO1n04ClfmAu492@IUc*?TVSP_!0%RDCE$_i#}ETpCbTc_4Zhkmt6@_F&StTqPy zCiCisvzO7|c)wMWN578utNU-(ls8Zy)s+jAQ}n zz6I6P*!CSe4yLjzv98kCjPq>v1@0#taPpNv&;3wT;m_0Op3_#wswl%@5SY0APZdS0h)k!Jka-Rb zy`=8Emu6vOT_rcp8JzEYL{%1^U4W-ay4obAd1L=2PbVz;7Od-Fi@{f zIi|Kg`)cWc)lRQ^W(Y3x#5!i2Ke<9ZXu|RYj%nF=W}Dqix=8rOWv{KoY2Mwp(=ydX zvd9p8FM7p}Gfdf$HYJ8Wq)zY=H?0uKJo48tU3z*kP3KkZxQG zzbJYQ{a>NZa#m`?erIm~4CBjrrcG=iWM8xsle8^&E~wbkK~Q%*fFNZUE4WRqA6ZeO z&gKN#o~b*jO@Wc$8&Ve(O@iU0%2Pzy4D6VCdN;U3mGFXxBg`h}I82ho88D<>!z*oE zQt&fgV34$z*JYJdme;vXCMBZNUXn}8(t;;o>PU{Uw6!=J#6I=7G1??t!D`R}QvdMy z>!Xi7-Kcn#1Wkl069-o*7`RMrtRKC9|0DEuQ`fGlUGs7>izVRx1!e@NMD-cYvYr`b zVeTNG$^gWW4p-A&ese!yVR6<8bXc%(Qr|?ZvSGzVw8U27`Ah1ZGo#P~CTchW+IIVGw zk=%`rwHXhDD~o}ry-S#5V6_{Cf%T+X9)_n*d~jqjb0miJgF>e;Il;LLW)aEKP zxENuWfh_QdE7WQj(~DbIs;q6k;9XnDybh!%S`bDq|LfE`FV z<6*}B1$7Ii#x;Bb5poRrDx8eojLee?SC)9YSyc6cdNWcbXVOaCnGkJ8`oLE`-{P!pPwIBQzx{FgU|Wd06Q&)4{ubC zO%fr;qQD2z+9-5TZFgoA7uIkcMyO2=GFI>)$S#~UL%J3&c(^yN4yH5aio@F?oZYYm zN5us!oePeOR-Fc447L+(_*#SevfamnwmLoj8xwxGQ2+n{ diff --git a/doc/sphinx/doctrees/library/datastore/remote.doctree b/doc/sphinx/doctrees/library/datastore/remote.doctree deleted file mode 100644 index acae54db8258c759098e7d472bef85ff363d3227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26371 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 diff --git a/doc/sphinx/doctrees/library/device.doctree b/doc/sphinx/doctrees/library/device.doctree deleted file mode 100644 index b8952ec2c4d2035960b3b87438b9fab21bbb9612..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87838 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 diff --git a/doc/sphinx/doctrees/library/diag-message.doctree b/doc/sphinx/doctrees/library/diag-message.doctree deleted file mode 100644 index e21c8c32a19535b65bfa8a7c94166cbce9404100..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168993 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 NjA1kjL`}ar^S=}9&7lAQ diff --git a/doc/sphinx/doctrees/library/exceptions.doctree b/doc/sphinx/doctrees/library/exceptions.doctree deleted file mode 100644 index ae59f9a71cee43207b337634cb4a346ba121b48f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19414 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 BXG{P9 diff --git a/doc/sphinx/doctrees/library/file-message.doctree b/doc/sphinx/doctrees/library/file-message.doctree deleted file mode 100644 index 01b9070c42fa9d799bc217ab94388002badb522d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84656 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 F{{VBfTU7u6 diff --git a/doc/sphinx/doctrees/library/other-message.doctree b/doc/sphinx/doctrees/library/other-message.doctree deleted file mode 100644 index 707b782c9f439573cfdb552fcf6d1cc2bf262ecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76848 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 idzW#jB~ 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 diff --git a/doc/sphinx/doctrees/library/pdu.doctree b/doc/sphinx/doctrees/library/pdu.doctree deleted file mode 100644 index b148c8e716a4b79aca0582ef20233c1669143595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56390 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 diff --git a/doc/sphinx/doctrees/library/register-read-message.doctree b/doc/sphinx/doctrees/library/register-read-message.doctree deleted file mode 100644 index d0ca283c41b2f8ffc5245f2025d7beb2c4dddef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92068 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

Q6V59`E(hoReLA%eu7R^E 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 diff --git a/doc/sphinx/doctrees/library/sync-server.doctree b/doc/sphinx/doctrees/library/sync-server.doctree deleted file mode 100644 index e8946211ea3121c35bb26b1843be897c93d85850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99274 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 diff --git a/doc/sphinx/doctrees/library/utilities.doctree b/doc/sphinx/doctrees/library/utilities.doctree deleted file mode 100644 index 0749c3e1d7bfd85c770ff5cbbb4414bdf33b49ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36183 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 NKS2YU>FCuL{tp|26374m diff --git a/doc/sphinx/examples/asynchronous-client.rst b/doc/sphinx/examples/asynchronous-client.rst deleted file mode 100644 index 7f5b7d3c3..000000000 --- a/doc/sphinx/examples/asynchronous-client.rst +++ /dev/null @@ -1,16 +0,0 @@ -================================================== -Asynchronous Client Example -================================================== - -The asynchronous client functions in the same way as the synchronous -client, however, the asynchronous client uses twisted to return deferreds -for the response result. Just like the synchronous version, it works against -TCP, UDP, serial ASCII, and serial RTU devices. - -Below an asynchronous tcp client is demonstrated running against a -reference server. If you do not have a device to test with, feel free -to run a pymodbus server instance or start the reference tester in -the tools directory. - -.. literalinclude:: ../../../examples/common/asynchronous-client.py - diff --git a/doc/sphinx/examples/asynchronous-processor.rst b/doc/sphinx/examples/asynchronous-processor.rst deleted file mode 100644 index 4afd8504e..000000000 --- a/doc/sphinx/examples/asynchronous-processor.rst +++ /dev/null @@ -1,15 +0,0 @@ -================================================== -Asynchronous Processor Example -================================================== - -Below is a simplified asynchronous client skeleton that was -submitted by a user of the library. It can be used as a guide -for implementing more complex pollers or state machines. - -Feel free to test it against whatever device you currently have -available. If you do not have a device to test with, feel free -to run a pymodbus server instance or start the reference tester in -the tools directory. - -.. literalinclude:: ../../../examples/common/asynchronous-processor.py - diff --git a/doc/sphinx/examples/asynchronous-server.rst b/doc/sphinx/examples/asynchronous-server.rst deleted file mode 100644 index 14aeef298..000000000 --- a/doc/sphinx/examples/asynchronous-server.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Asynchronous Server Example -================================================== - -.. literalinclude:: ../../../examples/common/asynchronous-server.py - diff --git a/doc/sphinx/examples/bcd-payload.rst b/doc/sphinx/examples/bcd-payload.rst deleted file mode 100644 index a95c5e7a6..000000000 --- a/doc/sphinx/examples/bcd-payload.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Binary Coded Decimal Example -================================================== - -.. literalinclude:: ../../../examples/contrib/bcd-payload.py - diff --git a/doc/sphinx/examples/bottle-frontend.rst b/doc/sphinx/examples/bottle-frontend.rst deleted file mode 100644 index 95507c5a8..000000000 --- a/doc/sphinx/examples/bottle-frontend.rst +++ /dev/null @@ -1,22 +0,0 @@ -================================================== -Bottle Web Frontend Example -================================================== - --------------------------------------------------- -Summary --------------------------------------------------- - -This is a simple example of adding a live REST api -on top of a running pymodbus server. This uses the -bottle microframework to achieve this. - -The example can be hosted under twisted as well as -the bottle internal server and can furthermore be -run behind gunicorn, cherrypi, etc wsgi containers. - --------------------------------------------------- -Main Program --------------------------------------------------- - -.. literalinclude:: ../../../examples/gui/bottle/frontend.py - diff --git a/doc/sphinx/examples/callback-server.rst b/doc/sphinx/examples/callback-server.rst deleted file mode 100644 index e57475216..000000000 --- a/doc/sphinx/examples/callback-server.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Callback Server Example -================================================== - -.. literalinclude:: ../../../examples/common/callback-server.py - diff --git a/doc/sphinx/examples/changing-framers.rst b/doc/sphinx/examples/changing-framers.rst deleted file mode 100644 index 3679aa43f..000000000 --- a/doc/sphinx/examples/changing-framers.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Changing Default Framers -================================================== - -.. literalinclude:: ../../../examples/common/changing-framers.py - diff --git a/doc/sphinx/examples/concurrent-client.rst b/doc/sphinx/examples/concurrent-client.rst deleted file mode 100644 index 1a3799ac9..000000000 --- a/doc/sphinx/examples/concurrent-client.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Concurrent Client Example -================================================== - -.. literalinclude:: ../../../examples/contrib/concurrent-client.py - diff --git a/doc/sphinx/examples/custom-datablock.rst b/doc/sphinx/examples/custom-datablock.rst deleted file mode 100644 index 7139c0f08..000000000 --- a/doc/sphinx/examples/custom-datablock.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Custom Datablock Example -================================================== - -.. literalinclude:: ../../../examples/common/custom-datablock.py - diff --git a/doc/sphinx/examples/custom-message.rst b/doc/sphinx/examples/custom-message.rst deleted file mode 100644 index 2ced10cbc..000000000 --- a/doc/sphinx/examples/custom-message.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Custom Message Example -================================================== - -.. literalinclude:: ../../../examples/common/custom-message.py - diff --git a/doc/sphinx/examples/database-datastore.rst b/doc/sphinx/examples/database-datastore.rst deleted file mode 100644 index 9186be812..000000000 --- a/doc/sphinx/examples/database-datastore.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Database Datastore Example -================================================== - -.. literalinclude:: ../../../examples/contrib/database-datastore.py - diff --git a/doc/sphinx/examples/gtk-frontend.rst b/doc/sphinx/examples/gtk-frontend.rst deleted file mode 100644 index 3efc72644..000000000 --- a/doc/sphinx/examples/gtk-frontend.rst +++ /dev/null @@ -1,26 +0,0 @@ -================================================== -Glade/GTK Frontend Example -================================================== - -Main Program --------------------------------------------------- - -This is an example simulator that is written using the pygtk -bindings. Although it currently does not have a frontend for -modifying the context values, it does allow one to expose N -virtual modbus devices to a network which is useful for testing -data center monitoring tools. - -.. note:: The virtual networking code will only work on linux - -.. literalinclude:: ../../../examples/gui/gtk/simulator.py - :language: python - -Glade Layout File --------------------------------------------------- - -The following is the glade layout file that is used by this script: - -.. literalinclude:: ../../../examples/gui/gtk/simulator.glade - :language: xml - diff --git a/doc/sphinx/examples/index.rst b/doc/sphinx/examples/index.rst deleted file mode 100644 index a41f01129..000000000 --- a/doc/sphinx/examples/index.rst +++ /dev/null @@ -1,60 +0,0 @@ - -Pymodbus Library Examples -==================================== - -*What follows is a collection of examples using the pymodbus -library in various ways* - -Example Library Code --------------------------------------------------- - -.. toctree:: - :maxdepth: 2 - - asynchronous-client - asynchronous-server - asynchronous-processor - custom-message - custom-datablock - modbus-logging - modbus-payload - modbus-payload-server - synchronous-client - synchronous-client-ext - synchronous-server - performance - updating-server - callback-server - changing-framers - thread-safe-datastore - -Custom Pymodbus Code --------------------------------------------------- - -.. toctree:: - :maxdepth: 2 - - redis-datastore - database-datastore - bcd-payload - modicon-payload - message-generator - message-parser - serial-forwarder - modbus-scraper - modbus-simulator - concurrent-client - libmodbus-client - remote-server-context - -Example Frontend Code --------------------------------------------------- - -.. toctree:: - :maxdepth: 2 - - gtk-frontend - tk-frontend - wx-frontend - bottle-frontend - diff --git a/doc/sphinx/examples/libmodbus-client.rst b/doc/sphinx/examples/libmodbus-client.rst deleted file mode 100644 index 17ac8e2cf..000000000 --- a/doc/sphinx/examples/libmodbus-client.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Libmodbus Client Facade -================================================== - -.. literalinclude:: ../../../examples/contrib/libmodbus-client.py - diff --git a/doc/sphinx/examples/message-generator.rst b/doc/sphinx/examples/message-generator.rst deleted file mode 100644 index 605554c45..000000000 --- a/doc/sphinx/examples/message-generator.rst +++ /dev/null @@ -1,26 +0,0 @@ -================================================== -Modbus Message Generator Example -================================================== - -This is an example of a utility that will build -examples of modbus messages in all the available -formats in the pymodbus package. - --------------------------------------------------- -Program Source --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/message-generator.py - --------------------------------------------------- -Example Request Messages --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/tx-messages - --------------------------------------------------- -Example Response Messages --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/rx-messages - diff --git a/doc/sphinx/examples/message-parser.rst b/doc/sphinx/examples/message-parser.rst deleted file mode 100644 index 0bbaee9fc..000000000 --- a/doc/sphinx/examples/message-parser.rst +++ /dev/null @@ -1,55 +0,0 @@ -================================================== -Modbus Message Parsing Example -================================================== - -This is an example of a parser to decode raw messages -to a readable description. It will attempt to decode -a message to the request and response version of a -message if possible. Here is an example output:: - - $./message-parser.py -b -m 000112340006ff076d - ================================================================================ - Decoding Message 000112340006ff076d - ================================================================================ - ServerDecoder - -------------------------------------------------------------------------------- - name = ReadExceptionStatusRequest - check = 0x0 - unit_id = 0xff - transaction_id = 0x1 - protocol_id = 0x1234 - documentation = - This function code is used to read the contents of eight Exception Status - outputs in a remote device. The function provides a simple method for - accessing this information, because the Exception Output references are - known (no output reference is needed in the function). - - ClientDecoder - -------------------------------------------------------------------------------- - name = ReadExceptionStatusResponse - check = 0x0 - status = 0x6d - unit_id = 0xff - transaction_id = 0x1 - protocol_id = 0x1234 - documentation = - The normal response contains the status of the eight Exception Status - outputs. The outputs are packed into one data byte, with one bit - per output. The status of the lowest output reference is contained - in the least significant bit of the byte. The contents of the eight - Exception Status outputs are device specific. - --------------------------------------------------- -Program Source --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/message-parser.py - --------------------------------------------------- -Example Messages --------------------------------------------------- - -See the documentation for the message generator -for a collection of messages that can be parsed -by this utility. - diff --git a/doc/sphinx/examples/modbus-logging.rst b/doc/sphinx/examples/modbus-logging.rst deleted file mode 100644 index 710e5bd4d..000000000 --- a/doc/sphinx/examples/modbus-logging.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Logging Example -================================================== - -.. literalinclude:: ../../../examples/common/modbus-logging.py - diff --git a/doc/sphinx/examples/modbus-payload-server.rst b/doc/sphinx/examples/modbus-payload-server.rst deleted file mode 100644 index 9144f0f53..000000000 --- a/doc/sphinx/examples/modbus-payload-server.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Payload Server Context Building Example -================================================== - -.. literalinclude:: ../../../examples/common/modbus-payload-server.py - diff --git a/doc/sphinx/examples/modbus-payload.rst b/doc/sphinx/examples/modbus-payload.rst deleted file mode 100644 index 79e46dfdb..000000000 --- a/doc/sphinx/examples/modbus-payload.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Payload Building/Decoding Example -================================================== - -.. literalinclude:: ../../../examples/common/modbus-payload.py - diff --git a/doc/sphinx/examples/modbus-scraper.rst b/doc/sphinx/examples/modbus-scraper.rst deleted file mode 100644 index 9931c4a62..000000000 --- a/doc/sphinx/examples/modbus-scraper.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Scraper Example -================================================== - -.. literalinclude:: ../../../examples/contrib/modbus-scraper.py - diff --git a/doc/sphinx/examples/modbus-simulator.rst b/doc/sphinx/examples/modbus-simulator.rst deleted file mode 100644 index 5adcee5ee..000000000 --- a/doc/sphinx/examples/modbus-simulator.rst +++ /dev/null @@ -1,5 +0,0 @@ -================================================== -Modbus Simulator Example -================================================== - -.. literalinclude:: ../../../examples/contrib/modbus-simulator.py diff --git a/doc/sphinx/examples/modicon-payload.rst b/doc/sphinx/examples/modicon-payload.rst deleted file mode 100644 index 997a12f50..000000000 --- a/doc/sphinx/examples/modicon-payload.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modicon Encoded Example -================================================== - -.. literalinclude:: ../../../examples/contrib/modicon-payload.py - diff --git a/doc/sphinx/examples/performance.rst b/doc/sphinx/examples/performance.rst deleted file mode 100644 index 93185bdea..000000000 --- a/doc/sphinx/examples/performance.rst +++ /dev/null @@ -1,11 +0,0 @@ -================================================== -Synchronous Client Performance Check -================================================== - -Below is a quick example of how to test the performance of a tcp modbus -device using the synchronous tcp client. If you do not have a device -to test with, feel free to run a pymodbus server instance or start -the reference tester in the tools directory. - -.. literalinclude:: ../../../examples/common/performance.py - diff --git a/doc/sphinx/examples/redis-datastore.rst b/doc/sphinx/examples/redis-datastore.rst deleted file mode 100644 index bb5554e04..000000000 --- a/doc/sphinx/examples/redis-datastore.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Redis Datastore Example -================================================== - -.. literalinclude:: ../../../examples/contrib/redis-datastore.py - diff --git a/doc/sphinx/examples/remote-server-context.rst b/doc/sphinx/examples/remote-server-context.rst deleted file mode 100644 index 2a2ac3c05..000000000 --- a/doc/sphinx/examples/remote-server-context.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Remote Single Server Context -================================================== - -.. literalinclude:: ../../../examples/contrib/remote_server_context.py - diff --git a/doc/sphinx/examples/serial-forwarder.rst b/doc/sphinx/examples/serial-forwarder.rst deleted file mode 100644 index 87f6e0a0c..000000000 --- a/doc/sphinx/examples/serial-forwarder.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Synchronous Serial Forwarder -================================================== - -.. literalinclude:: ../../../examples/contrib/serial-forwarder.py - diff --git a/doc/sphinx/examples/synchronous-client-ext.rst b/doc/sphinx/examples/synchronous-client-ext.rst deleted file mode 100644 index 5012ec8b0..000000000 --- a/doc/sphinx/examples/synchronous-client-ext.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Synchronous Client Extended Example -================================================== - -.. literalinclude:: ../../../examples/common/synchronous-client-ext.py - diff --git a/doc/sphinx/examples/synchronous-client.rst b/doc/sphinx/examples/synchronous-client.rst deleted file mode 100644 index b90563402..000000000 --- a/doc/sphinx/examples/synchronous-client.rst +++ /dev/null @@ -1,19 +0,0 @@ -================================================== -Synchronous Client Example -================================================== - -It should be noted that each request will block waiting for the result. If asynchronous -behaviour is required, please use the asynchronous client implementations. -The synchronous client, works against TCP, UDP, serial ASCII, and serial RTU devices. - -The synchronous client exposes the most popular methods of the modbus protocol, -however, if you want to execute other methods against the device, -simple create a request instance and pass it to the execute method. - -Below an synchronous tcp client is demonstrated running against a -reference server. If you do not have a device to test with, feel free -to run a pymodbus server instance or start the reference tester in -the tools directory. - -.. literalinclude:: ../../../examples/common/synchronous-client.py - diff --git a/doc/sphinx/examples/synchronous-server.rst b/doc/sphinx/examples/synchronous-server.rst deleted file mode 100644 index 1db715d7f..000000000 --- a/doc/sphinx/examples/synchronous-server.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Synchronous Server Example -================================================== - -.. literalinclude:: ../../../examples/common/synchronous-server.py - diff --git a/doc/sphinx/examples/thread-safe-datastore.rst b/doc/sphinx/examples/thread-safe-datastore.rst deleted file mode 100644 index 7a965a3f4..000000000 --- a/doc/sphinx/examples/thread-safe-datastore.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Thread Safe Datastore Example -================================================== - -.. literalinclude:: ../../../examples/contrib/thread_safe_datastore.py - diff --git a/doc/sphinx/examples/tk-frontend.rst b/doc/sphinx/examples/tk-frontend.rst deleted file mode 100644 index 1849d0abc..000000000 --- a/doc/sphinx/examples/tk-frontend.rst +++ /dev/null @@ -1,17 +0,0 @@ -================================================== -TK Frontend Example -================================================== - -Main Program --------------------------------------------------- - -This is an example simulator that is written using the native tk -toolkit. Although it currently does not have a frontend for -modifying the context values, it does allow one to expose N -virtual modbus devices to a network which is useful for testing -data center monitoring tools. - -.. note:: The virtual networking code will only work on linux - -.. literalinclude:: ../../../examples/gui/tk/simulator.py - diff --git a/doc/sphinx/examples/updating-server.rst b/doc/sphinx/examples/updating-server.rst deleted file mode 100644 index 07d1baac0..000000000 --- a/doc/sphinx/examples/updating-server.rst +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Updating Server Example -================================================== - -.. literalinclude:: ../../../examples/common/updating-server.py - diff --git a/doc/sphinx/examples/wx-frontend.rst b/doc/sphinx/examples/wx-frontend.rst deleted file mode 100644 index 5d68142c0..000000000 --- a/doc/sphinx/examples/wx-frontend.rst +++ /dev/null @@ -1,17 +0,0 @@ -================================================== -WX Frontend Example -================================================== - -Main Program --------------------------------------------------- - -This is an example simulator that is written using the python wx -bindings. Although it currently does not have a frontend for -modifying the context values, it does allow one to expose N -virtual modbus devices to a network which is useful for testing -data center monitoring tools. - -.. note:: The virtual networking code will only work on linux - -.. literalinclude:: ../../../examples/gui/wx/simulator.py - diff --git a/doc/sphinx/html/.buildinfo b/doc/sphinx/html/.buildinfo deleted file mode 100644 index 72a1539e3..000000000 --- a/doc/sphinx/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: a869ccec57cd788c41a89393439ff025 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/sphinx/html/_modules/index.html b/doc/sphinx/html/_modules/index.html deleted file mode 100644 index 1133838f3..000000000 --- a/doc/sphinx/html/_modules/index.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - Overview: module code — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - -

- - - - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/bit_read_message.html b/doc/sphinx/html/_modules/pymodbus/bit_read_message.html deleted file mode 100644 index 53fb041ba..000000000 --- a/doc/sphinx/html/_modules/pymodbus/bit_read_message.html +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - - - pymodbus.bit_read_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.bit_read_message

-"""
-Bit Reading Request/Response messages
---------------------------------------
-
-"""
-import struct
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.utilities import pack_bitstring, unpack_bitstring
-from pymodbus.compat import byte2int
-
-
-
[docs]class ReadBitsRequestBase(ModbusRequest): - ''' Base class for Messages Requesting bit values ''' - - _rtu_frame_size = 8 -
[docs] def __init__(self, address, count, **kwargs): - ''' Initializes the read request data - - :param address: The start address to read from - :param count: The number of bits after 'address' to read - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - self.count = count
- -
[docs] def encode(self): - ''' Encodes a request pdu - - :returns: The encoded pdu - ''' - return struct.pack('>HH', self.address, self.count)
- -
[docs] def decode(self, data): - ''' Decodes a request pdu - - :param data: The packet data to decode - ''' - self.address, self.count = struct.unpack('>HH', data)
- -
[docs] def get_response_pdu_size(self): - """ - Func_code (1 byte) + Byte Count(1 byte) + Quantity of Coils (n Bytes) - :return: - """ - return 1 + 1 + self.count
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "ReadBitRequest(%d,%d)" % (self.address, self.count)
- - -
[docs]class ReadBitsResponseBase(ModbusResponse): - ''' Base class for Messages responding to bit-reading values ''' - - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, values, **kwargs): - ''' Initializes a new instance - - :param values: The requested values to be returned - ''' - ModbusResponse.__init__(self, **kwargs) - self.bits = values or []
- -
[docs] def encode(self): - ''' Encodes response pdu - - :returns: The encoded packet message - ''' - result = pack_bitstring(self.bits) - packet = struct.pack(">B", len(result)) + result - return packet
- -
[docs] def decode(self, data): - ''' Decodes response pdu - - :param data: The packet data to decode - ''' - self.byte_count = byte2int(data[0]) - self.bits = unpack_bitstring(data[1:])
- -
[docs] def setBit(self, address, value=1): - ''' Helper function to set the specified bit - - :param address: The bit to set - :param value: The value to set the bit to - ''' - self.bits[address] = (value != 0)
- -
[docs] def resetBit(self, address): - ''' Helper function to set the specified bit to 0 - - :param address: The bit to reset - ''' - self.setBit(address, 0)
- -
[docs] def getBit(self, address): - ''' Helper function to get the specified bit's value - - :param address: The bit to query - :returns: The value of the requested bit - ''' - return self.bits[address]
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "ReadBitResponse(%d)" % len(self.bits)
- - -
[docs]class ReadCoilsRequest(ReadBitsRequestBase): - ''' - This function code is used to read from 1 to 2000(0x7d0) contiguous status - of coils in a remote device. The Request PDU specifies the starting - address, ie the address of the first coil specified, and the number of - coils. In the PDU Coils are addressed starting at zero. Therefore coils - numbered 1-16 are addressed as 0-15. - ''' - function_code = 1 - -
[docs] def __init__(self, address=None, count=None, **kwargs): - ''' Initializes a new instance - - :param address: The address to start reading from - :param count: The number of bits to read - ''' - ReadBitsRequestBase.__init__(self, address, count, **kwargs)
- -
[docs] def execute(self, context): - ''' Run a read coils request against a datastore - - Before running the request, we make sure that the request is in - the max valid range (0x001-0x7d0). Next we make sure that the - request is valid against the current datastore. - - :param context: The datastore to request from - :returns: The initializes response message, exception message otherwise - ''' - if not (1 <= self.count <= 0x7d0): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, self.count): - return self.doException(merror.IllegalAddress) - values = context.getValues(self.function_code, self.address, self.count) - return ReadCoilsResponse(values)
- - -
[docs]class ReadCoilsResponse(ReadBitsResponseBase): - ''' - The coils in the response message are packed as one coil per bit of - the data field. Status is indicated as 1= ON and 0= OFF. The LSB of the - first data byte contains the output addressed in the query. The other - coils follow toward the high order end of this byte, and from low order - to high order in subsequent bytes. - - If the returned output quantity is not a multiple of eight, the - remaining bits in the final data byte will be padded with zeros - (toward the high order end of the byte). The Byte Count field specifies - the quantity of complete bytes of data. - ''' - function_code = 1 - -
[docs] def __init__(self, values=None, **kwargs): - ''' Intializes a new instance - - :param values: The request values to respond with - ''' - ReadBitsResponseBase.__init__(self, values, **kwargs)
- - -
[docs]class ReadDiscreteInputsRequest(ReadBitsRequestBase): - ''' - This function code is used to read from 1 to 2000(0x7d0) contiguous status - of discrete inputs in a remote device. The Request PDU specifies the - starting address, ie the address of the first input specified, and the - number of inputs. In the PDU Discrete Inputs are addressed starting at - zero. Therefore Discrete inputs numbered 1-16 are addressed as 0-15. - ''' - function_code = 2 - -
[docs] def __init__(self, address=None, count=None, **kwargs): - ''' Intializes a new instance - - :param address: The address to start reading from - :param count: The number of bits to read - ''' - ReadBitsRequestBase.__init__(self, address, count, **kwargs)
- -
[docs] def execute(self, context): - ''' Run a read discrete input request against a datastore - - Before running the request, we make sure that the request is in - the max valid range (0x001-0x7d0). Next we make sure that the - request is valid against the current datastore. - - :param context: The datastore to request from - :returns: The initializes response message, exception message otherwise - ''' - if not (1 <= self.count <= 0x7d0): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, self.count): - return self.doException(merror.IllegalAddress) - values = context.getValues(self.function_code, self.address, self.count) - return ReadDiscreteInputsResponse(values)
- - -
[docs]class ReadDiscreteInputsResponse(ReadBitsResponseBase): - ''' - The discrete inputs in the response message are packed as one input per - bit of the data field. Status is indicated as 1= ON; 0= OFF. The LSB of - the first data byte contains the input addressed in the query. The other - inputs follow toward the high order end of this byte, and from low order - to high order in subsequent bytes. - - If the returned input quantity is not a multiple of eight, the - remaining bits in the final data byte will be padded with zeros - (toward the high order end of the byte). The Byte Count field specifies - the quantity of complete bytes of data. - ''' - function_code = 2 - -
[docs] def __init__(self, values=None, **kwargs): - ''' Intializes a new instance - - :param values: The request values to respond with - ''' - ReadBitsResponseBase.__init__(self, values, **kwargs)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ReadCoilsRequest", "ReadCoilsResponse", - "ReadDiscreteInputsRequest", "ReadDiscreteInputsResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/bit_write_message.html b/doc/sphinx/html/_modules/pymodbus/bit_write_message.html deleted file mode 100644 index c1a379119..000000000 --- a/doc/sphinx/html/_modules/pymodbus/bit_write_message.html +++ /dev/null @@ -1,353 +0,0 @@ - - - - - - - - pymodbus.bit_write_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.bit_write_message

-"""
-Bit Writing Request/Response
-------------------------------
-
-TODO write mask request/response
-"""
-import struct
-from pymodbus.constants import ModbusStatus
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.utilities import pack_bitstring, unpack_bitstring
-
-#---------------------------------------------------------------------------#
-# Local Constants
-#---------------------------------------------------------------------------#
-# These are defined in the spec to turn a coil on/off
-#---------------------------------------------------------------------------#
-_turn_coil_on  = struct.pack(">H", ModbusStatus.On)
-_turn_coil_off = struct.pack(">H", ModbusStatus.Off)
-
-
-
[docs]class WriteSingleCoilRequest(ModbusRequest): - ''' - This function code is used to write a single output to either ON or OFF - in a remote device. - - The requested ON/OFF state is specified by a constant in the request - data field. A value of FF 00 hex requests the output to be ON. A value - of 00 00 requests it to be OFF. All other values are illegal and will - not affect the output. - - The Request PDU specifies the address of the coil to be forced. Coils - are addressed starting at zero. Therefore coil numbered 1 is addressed - as 0. The requested ON/OFF state is specified by a constant in the Coil - Value field. A value of 0XFF00 requests the coil to be ON. A value of - 0X0000 requests the coil to be off. All other values are illegal and - will not affect the coil. - ''' - function_code = 5 - _rtu_frame_size = 8 - -
[docs] def __init__(self, address=None, value=None, **kwargs): - ''' Initializes a new instance - - :param address: The variable address to write - :param value: The value to write at address - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - self.value = bool(value)
- -
[docs] def encode(self): - ''' Encodes write coil request - - :returns: The byte encoded message - ''' - result = struct.pack('>H', self.address) - if self.value: result += _turn_coil_on - else: result += _turn_coil_off - return result
- -
[docs] def decode(self, data): - ''' Decodes a write coil request - - :param data: The packet data to decode - ''' - self.address, value = struct.unpack('>HH', data) - self.value = (value == ModbusStatus.On)
- -
[docs] def execute(self, context): - ''' Run a write coil request against a datastore - - :param context: The datastore to request from - :returns: The populated response or exception message - ''' - #if self.value not in [ModbusStatus.Off, ModbusStatus.On]: - # return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, 1): - return self.doException(merror.IllegalAddress) - - context.setValues(self.function_code, self.address, [self.value]) - values = context.getValues(self.function_code, self.address, 1) - return WriteSingleCoilResponse(self.address, values[0])
- -
[docs] def get_response_pdu_size(self): - """ - Func_code (1 byte) + Output Address (2 byte) + Output Value (2 Bytes) - :return: - """ - return 1 + 2 + 2
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :return: A string representation of the instance - ''' - return "WriteCoilRequest(%d, %s) => " % (self.address, self.value)
- - -
[docs]class WriteSingleCoilResponse(ModbusResponse): - ''' - The normal response is an echo of the request, returned after the coil - state has been written. - ''' - function_code = 5 - _rtu_frame_size = 8 - -
[docs] def __init__(self, address=None, value=None, **kwargs): - ''' Initializes a new instance - - :param address: The variable address written to - :param value: The value written at address - ''' - ModbusResponse.__init__(self, **kwargs) - self.address = address - self.value = value
- -
[docs] def encode(self): - ''' Encodes write coil response - - :return: The byte encoded message - ''' - result = struct.pack('>H', self.address) - if self.value: result += _turn_coil_on - else: result += _turn_coil_off - return result
- -
[docs] def decode(self, data): - ''' Decodes a write coil response - - :param data: The packet data to decode - ''' - self.address, value = struct.unpack('>HH', data) - self.value = (value == ModbusStatus.On)
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "WriteCoilResponse(%d) => %d" % (self.address, self.value)
- - -
[docs]class WriteMultipleCoilsRequest(ModbusRequest): - ''' - "This function code is used to force each coil in a sequence of coils to - either ON or OFF in a remote device. The Request PDU specifies the coil - references to be forced. Coils are addressed starting at zero. Therefore - coil numbered 1 is addressed as 0. - - The requested ON/OFF states are specified by contents of the request - data field. A logical '1' in a bit position of the field requests the - corresponding output to be ON. A logical '0' requests it to be OFF." - ''' - function_code = 15 - _rtu_byte_count_pos = 6 - -
[docs] def __init__(self, address=None, values=None, **kwargs): - ''' Initializes a new instance - - :param address: The starting request address - :param values: The values to write - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - if not values: values = [] - elif not hasattr(values, '__iter__'): values = [values] - self.values = values - self.byte_count = (len(self.values) + 7) // 8
- -
[docs] def encode(self): - ''' Encodes write coils request - - :returns: The byte encoded message - ''' - count = len(self.values) - self.byte_count = (count + 7) // 8 - packet = struct.pack('>HHB', self.address, count, self.byte_count) - packet += pack_bitstring(self.values) - return packet
- -
[docs] def decode(self, data): - ''' Decodes a write coils request - - :param data: The packet data to decode - ''' - self.address, count, self.byte_count = struct.unpack('>HHB', data[0:5]) - values = unpack_bitstring(data[5:]) - self.values = values[:count]
- -
[docs] def execute(self, context): - ''' Run a write coils request against a datastore - - :param context: The datastore to request from - :returns: The populated response or exception message - ''' - count = len(self.values) - if not (1 <= count <= 0x07b0): - return self.doException(merror.IllegalValue) - if (self.byte_count != (count + 7) // 8): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, count): - return self.doException(merror.IllegalAddress) - - context.setValues(self.function_code, self.address, self.values) - return WriteMultipleCoilsResponse(self.address, count)
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - params = (self.address, len(self.values)) - return "WriteNCoilRequest (%d) => %d " % params
- - -
[docs]class WriteMultipleCoilsResponse(ModbusResponse): - ''' - The normal response returns the function code, starting address, and - quantity of coils forced. - ''' - function_code = 15 - _rtu_frame_size = 8 - -
[docs] def __init__(self, address=None, count=None, **kwargs): - ''' Initializes a new instance - - :param address: The starting variable address written to - :param count: The number of values written - ''' - ModbusResponse.__init__(self, **kwargs) - self.address = address - self.count = count
- -
[docs] def encode(self): - ''' Encodes write coils response - - :returns: The byte encoded message - ''' - return struct.pack('>HH', self.address, self.count)
- -
[docs] def decode(self, data): - ''' Decodes a write coils response - - :param data: The packet data to decode - ''' - self.address, self.count = struct.unpack('>HH', data)
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "WriteNCoilResponse(%d, %d)" % (self.address, self.count)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "WriteSingleCoilRequest", "WriteSingleCoilResponse", - "WriteMultipleCoilsRequest", "WriteMultipleCoilsResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/client/async.html b/doc/sphinx/html/_modules/pymodbus/client/async.html deleted file mode 100644 index 51c879075..000000000 --- a/doc/sphinx/html/_modules/pymodbus/client/async.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - pymodbus.client.async — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.client.async

-"""
-Implementation of a Modbus Client Using Twisted
---------------------------------------------------
-
-Example run::
-
-    from twisted.internet import reactor, protocol
-    from pymodbus.client.async import ModbusClientProtocol
-
-    def printResult(result):
-        print "Result: %d" % result.bits[0]
-
-    def process(client):
-        result = client.write_coil(1, True)
-        result.addCallback(printResult)
-        reactor.callLater(1, reactor.stop)
-
-    defer = protocol.ClientCreator(reactor, ModbusClientProtocol
-            ).connectTCP("localhost", 502)
-    defer.addCallback(process)
-
-Another example::
-
-    from twisted.internet import reactor
-    from pymodbus.client.async import ModbusClientFactory
-
-    def process():
-        factory = reactor.connectTCP("localhost", 502, ModbusClientFactory())
-        reactor.stop()
-
-    if __name__ == "__main__":
-       reactor.callLater(1, process)
-       reactor.run()
-"""
-from twisted.internet import defer, protocol
-from pymodbus.factory import ClientDecoder
-from pymodbus.exceptions import ConnectionException
-from pymodbus.transaction import ModbusSocketFramer
-from pymodbus.transaction import FifoTransactionManager
-from pymodbus.transaction import DictTransactionManager
-from pymodbus.client.common import ModbusClientMixin
-from twisted.python.failure import Failure
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Connected Client Protocols
-#---------------------------------------------------------------------------#
-
[docs]class ModbusClientProtocol(protocol.Protocol, ModbusClientMixin): - ''' - This represents the base modbus client protocol. All the application - layer code is deferred to a higher level wrapper. - ''' - -
[docs] def __init__(self, framer=None, **kwargs): - ''' Initializes the framer module - - :param framer: The framer to use for the protocol - ''' - self._connected = False - self.framer = framer or ModbusSocketFramer(ClientDecoder()) - if isinstance(self.framer, ModbusSocketFramer): - self.transaction = DictTransactionManager(self, **kwargs) - else: self.transaction = FifoTransactionManager(self, **kwargs)
- -
[docs] def connectionMade(self): - ''' Called upon a successful client connection. - ''' - _logger.debug("Client connected to modbus server") - self._connected = True
- -
[docs] def connectionLost(self, reason): - ''' Called upon a client disconnect - - :param reason: The reason for the disconnect - ''' - _logger.debug("Client disconnected from modbus server: %s" % reason) - self._connected = False - for tid in list(self.transaction): - self.transaction.getTransaction(tid).errback(Failure( - ConnectionException('Connection lost during request')))
- -
[docs] def dataReceived(self, data): - ''' Get response, check for valid message, decode result - - :param data: The data returned from the server - ''' - self.framer.processIncomingPacket(data, self._handleResponse)
- -
[docs] def execute(self, request): - ''' Starts the producer to send the next request to - consumer.write(Frame(request)) - ''' - request.transaction_id = self.transaction.getNextTID() - packet = self.framer.buildPacket(request) - self.transport.write(packet) - return self._buildResponse(request.transaction_id)
- -
[docs] def _handleResponse(self, reply): - ''' Handle the processed response and link to correct deferred - - :param reply: The reply to process - ''' - if reply is not None: - tid = reply.transaction_id - handler = self.transaction.getTransaction(tid) - if handler: - handler.callback(reply) - else: _logger.debug("Unrequested message: " + str(reply))
- -
[docs] def _buildResponse(self, tid): - ''' Helper method to return a deferred response - for the current request. - - :param tid: The transaction identifier for this response - :returns: A defer linked to the latest request - ''' - if not self._connected: - return defer.fail(Failure( - ConnectionException('Client is not connected'))) - - d = defer.Deferred() - self.transaction.addTransaction(d, tid) - return d
- - #----------------------------------------------------------------------# - # Extra Functions - #----------------------------------------------------------------------# - #if send_failed: - # if self.retry > 0: - # deferLater(clock, self.delay, send, message) - # self.retry -= 1 - - -#---------------------------------------------------------------------------# -# Not Connected Client Protocol -#---------------------------------------------------------------------------# -class ModbusUdpClientProtocol(protocol.DatagramProtocol, ModbusClientMixin): - ''' - This represents the base modbus client protocol. All the application - layer code is deferred to a higher level wrapper. - ''' - - def __init__(self, framer=None, **kwargs): - ''' Initializes the framer module - - :param framer: The framer to use for the protocol - ''' - self.framer = framer or ModbusSocketFramer(ClientDecoder()) - if isinstance(self.framer, ModbusSocketFramer): - self.transaction = DictTransactionManager(self, **kwargs) - else: self.transaction = FifoTransactionManager(self, **kwargs) - - def datagramReceived(self, data, params): - ''' Get response, check for valid message, decode result - - :param data: The data returned from the server - :param params: The host parameters sending the datagram - ''' - _logger.debug("Datagram from: %s:%d" % params) - self.framer.processIncomingPacket(data, self._handleResponse) - - def execute(self, request): - ''' Starts the producer to send the next request to - consumer.write(Frame(request)) - ''' - request.transaction_id = self.transaction.getNextTID() - packet = self.framer.buildPacket(request) - self.transport.write(packet) - return self._buildResponse(request.transaction_id) - - def _handleResponse(self, reply): - ''' Handle the processed response and link to correct deferred - - :param reply: The reply to process - ''' - if reply is not None: - tid = reply.transaction_id - handler = self.transaction.getTransaction(tid) - if handler: - handler.callback(reply) - else: _logger.debug("Unrequested message: " + str(reply)) - - def _buildResponse(self, tid): - ''' Helper method to return a deferred response - for the current request. - - :param tid: The transaction identifier for this response - :returns: A defer linked to the latest request - ''' - d = defer.Deferred() - self.transaction.addTransaction(d, tid) - return d - - -#---------------------------------------------------------------------------# -# Client Factories -#---------------------------------------------------------------------------# -
[docs]class ModbusClientFactory(protocol.ReconnectingClientFactory): - ''' Simple client protocol factory ''' - - protocol = ModbusClientProtocol
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ModbusClientProtocol", "ModbusUdpClientProtocol", - "ModbusClientFactory", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/client/common.html b/doc/sphinx/html/_modules/pymodbus/client/common.html deleted file mode 100644 index 5eec0cabb..000000000 --- a/doc/sphinx/html/_modules/pymodbus/client/common.html +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - pymodbus.client.common — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.client.common

-'''
-Modbus Client Common
-----------------------------------
-
-This is a common client mixin that can be used by
-both the synchronous and asynchronous clients to
-simplify the interface.
-'''
-from pymodbus.bit_read_message import *
-from pymodbus.bit_write_message import *
-from pymodbus.register_read_message import *
-from pymodbus.register_write_message import *
-from pymodbus.diag_message import *
-from pymodbus.file_message import *
-from pymodbus.other_message import *
-
-
-
[docs]class ModbusClientMixin(object): - ''' - This is a modbus client mixin that provides additional factory - methods for all the current modbus methods. This can be used - instead of the normal pattern of:: - - # instead of this - client = ModbusClient(...) - request = ReadCoilsRequest(1,10) - response = client.execute(request) - - # now like this - client = ModbusClient(...) - response = client.read_coils(1, 10) - ''' - -
[docs] def read_coils(self, address, count=1, **kwargs): - ''' - - :param address: The starting address to read from - :param count: The number of coils to read - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = ReadCoilsRequest(address, count, **kwargs) - return self.execute(request)
- -
[docs] def read_discrete_inputs(self, address, count=1, **kwargs): - ''' - - :param address: The starting address to read from - :param count: The number of discretes to read - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = ReadDiscreteInputsRequest(address, count, **kwargs) - return self.execute(request)
- -
[docs] def write_coil(self, address, value, **kwargs): - ''' - - :param address: The starting address to write to - :param value: The value to write to the specified address - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = WriteSingleCoilRequest(address, value, **kwargs) - return self.execute(request)
- -
[docs] def write_coils(self, address, values, **kwargs): - ''' - - :param address: The starting address to write to - :param values: The values to write to the specified address - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = WriteMultipleCoilsRequest(address, values, **kwargs) - return self.execute(request)
- -
[docs] def write_register(self, address, value, **kwargs): - ''' - - :param address: The starting address to write to - :param value: The value to write to the specified address - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = WriteSingleRegisterRequest(address, value, **kwargs) - return self.execute(request)
- -
[docs] def write_registers(self, address, values, **kwargs): - ''' - - :param address: The starting address to write to - :param values: The values to write to the specified address - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = WriteMultipleRegistersRequest(address, values, **kwargs) - return self.execute(request)
- -
[docs] def read_holding_registers(self, address, count=1, **kwargs): - ''' - - :param address: The starting address to read from - :param count: The number of registers to read - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = ReadHoldingRegistersRequest(address, count, **kwargs) - return self.execute(request)
- -
[docs] def read_input_registers(self, address, count=1, **kwargs): - ''' - - :param address: The starting address to read from - :param count: The number of registers to read - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = ReadInputRegistersRequest(address, count, **kwargs) - return self.execute(request)
- -
[docs] def readwrite_registers(self, *args, **kwargs): - ''' - - :param read_address: The address to start reading from - :param read_count: The number of registers to read from address - :param write_address: The address to start writing to - :param write_registers: The registers to write to the specified address - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = ReadWriteMultipleRegistersRequest(*args, **kwargs) - return self.execute(request)
- -
[docs] def mask_write_register(self, *args, **kwargs): - ''' - - :param address: The address of the register to write - :param and_mask: The and bitmask to apply to the register address - :param or_mask: The or bitmask to apply to the register address - :param unit: The slave unit this request is targeting - :returns: A deferred response handle - ''' - request = MaskWriteRegisterRequest(*args, **kwargs) - return self.execute(request)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ 'ModbusClientMixin' ] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/client/sync.html b/doc/sphinx/html/_modules/pymodbus/client/sync.html deleted file mode 100644 index 04e0ce562..000000000 --- a/doc/sphinx/html/_modules/pymodbus/client/sync.html +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - pymodbus.client.sync — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.client.sync

-import socket
-import serial
-import time
-
-from pymodbus.constants import Defaults
-from pymodbus.factory import ClientDecoder
-from pymodbus.compat import byte2int
-from pymodbus.exceptions import NotImplementedException, ParameterException
-from pymodbus.exceptions import ConnectionException
-from pymodbus.transaction import FifoTransactionManager
-from pymodbus.transaction import DictTransactionManager
-from pymodbus.transaction import ModbusSocketFramer, ModbusBinaryFramer
-from pymodbus.transaction import ModbusAsciiFramer, ModbusRtuFramer
-from pymodbus.client.common import ModbusClientMixin
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# The Synchronous Clients
-#---------------------------------------------------------------------------#
-
[docs]class BaseModbusClient(ModbusClientMixin): - ''' - Inteface for a modbus synchronous client. Defined here are all the - methods for performing the related request methods. Derived classes - simply need to implement the transport methods and set the correct - framer. - ''' - -
[docs] def __init__(self, framer, **kwargs): - ''' Initialize a client instance - - :param framer: The modbus framer implementation to use - ''' - self.framer = framer - if isinstance(self.framer, ModbusSocketFramer): - self.transaction = DictTransactionManager(self, **kwargs) - else: self.transaction = FifoTransactionManager(self, **kwargs)
- - #-----------------------------------------------------------------------# - # Client interface - #-----------------------------------------------------------------------# -
[docs] def connect(self): - ''' Connect to the modbus remote host - - :returns: True if connection succeeded, False otherwise - ''' - raise NotImplementedException("Method not implemented by derived class")
- -
[docs] def close(self): - ''' Closes the underlying socket connection - ''' - pass
- -
[docs] def _send(self, request): - ''' Sends data on the underlying socket - - :param request: The encoded request to send - :return: The number of bytes written - ''' - raise NotImplementedException("Method not implemented by derived class")
- -
[docs] def _recv(self, size): - ''' Reads data from the underlying descriptor - - :param size: The number of bytes to read - :return: The bytes read - ''' - raise NotImplementedException("Method not implemented by derived class")
- - #-----------------------------------------------------------------------# - # Modbus client methods - #-----------------------------------------------------------------------# -
[docs] def execute(self, request=None): - ''' - :param request: The request to process - :returns: The result of the request execution - ''' - if not self.connect(): - raise ConnectionException("Failed to connect[%s]" % (self.__str__())) - return self.transaction.execute(request)
- - #-----------------------------------------------------------------------# - # The magic methods - #-----------------------------------------------------------------------# -
[docs] def __enter__(self): - ''' Implement the client with enter block - - :returns: The current instance of the client - ''' - if not self.connect(): - raise ConnectionException("Failed to connect[%s]" % (self.__str__())) - return self
- -
[docs] def __exit__(self, klass, value, traceback): - ''' Implement the client with exit block ''' - self.close()
- -
[docs] def __str__(self): - ''' Builds a string representation of the connection - - :returns: The string representation - ''' - return "Null Transport"
- - -#---------------------------------------------------------------------------# -# Modbus TCP Client Transport Implementation -#---------------------------------------------------------------------------# -
[docs]class ModbusTcpClient(BaseModbusClient): - ''' Implementation of a modbus tcp client - ''' - -
[docs] def __init__(self, host='127.0.0.1', port=Defaults.Port, - framer=ModbusSocketFramer, **kwargs): - ''' Initialize a client instance - - :param host: The host to connect to (default 127.0.0.1) - :param port: The modbus port to connect to (default 502) - :param source_address: The source address tuple to bind to (default ('', 0)) - :param timeout: The timeout to use for this socket (default Defaults.Timeout) - :param framer: The modbus framer to use (default ModbusSocketFramer) - - .. note:: The host argument will accept ipv4 and ipv6 hosts - ''' - self.host = host - self.port = port - self.source_address = kwargs.get('source_address', ('', 0)) - self.socket = None - self.timeout = kwargs.get('timeout', Defaults.Timeout) - BaseModbusClient.__init__(self, framer(ClientDecoder()), **kwargs)
- -
[docs] def connect(self): - ''' Connect to the modbus tcp server - - :returns: True if connection succeeded, False otherwise - ''' - if self.socket: return True - try: - address = (self.host, self.port) - self.socket = socket.create_connection((self.host, self.port), - timeout=self.timeout, source_address=self.source_address) - except socket.error as msg: - _logger.error('Connection to (%s, %s) failed: %s' % \ - (self.host, self.port, msg)) - self.close() - return self.socket != None
- -
[docs] def close(self): - ''' Closes the underlying socket connection - ''' - if self.socket: - self.socket.close() - self.socket = None
- -
[docs] def _send(self, request): - ''' Sends data on the underlying socket - - :param request: The encoded request to send - :return: The number of bytes written - ''' - if not self.socket: - raise ConnectionException(self.__str__()) - if request: - return self.socket.send(request) - return 0
- -
[docs] def _recv(self, size): - ''' Reads data from the underlying descriptor - - :param size: The number of bytes to read - :return: The bytes read - ''' - if not self.socket: - raise ConnectionException(self.__str__()) - return self.socket.recv(size)
- -
[docs] def __str__(self): - ''' Builds a string representation of the connection - - :returns: The string representation - ''' - return "%s:%s" % (self.host, self.port)
- - -#---------------------------------------------------------------------------# -# Modbus UDP Client Transport Implementation -#---------------------------------------------------------------------------# -
[docs]class ModbusUdpClient(BaseModbusClient): - ''' Implementation of a modbus udp client - ''' - -
[docs] def __init__(self, host='127.0.0.1', port=Defaults.Port, - framer=ModbusSocketFramer, **kwargs): - ''' Initialize a client instance - - :param host: The host to connect to (default 127.0.0.1) - :param port: The modbus port to connect to (default 502) - :param framer: The modbus framer to use (default ModbusSocketFramer) - :param timeout: The timeout to use for this socket (default None) - ''' - self.host = host - self.port = port - self.socket = None - self.timeout = kwargs.get('timeout', None) - BaseModbusClient.__init__(self, framer(ClientDecoder()), **kwargs)
- - @classmethod -
[docs] def _get_address_family(cls, address): - ''' A helper method to get the correct address family - for a given address. - - :param address: The address to get the af for - :returns: AF_INET for ipv4 and AF_INET6 for ipv6 - ''' - try: - _ = socket.inet_pton(socket.AF_INET6, address) - except socket.error: # not a valid ipv6 address - return socket.AF_INET - return socket.AF_INET6
- -
[docs] def connect(self): - ''' Connect to the modbus tcp server - - :returns: True if connection succeeded, False otherwise - ''' - if self.socket: return True - try: - family = ModbusUdpClient._get_address_family(self.host) - self.socket = socket.socket(family, socket.SOCK_DGRAM) - self.socket.settimeout(self.timeout) - except socket.error as ex: - _logger.error('Unable to create udp socket %s' % ex) - self.close() - return self.socket != None
- -
[docs] def close(self): - ''' Closes the underlying socket connection - ''' - self.socket = None
- -
[docs] def _send(self, request): - ''' Sends data on the underlying socket - - :param request: The encoded request to send - :return: The number of bytes written - ''' - if not self.socket: - raise ConnectionException(self.__str__()) - if request: - return self.socket.sendto(request, (self.host, self.port)) - return 0
- -
[docs] def _recv(self, size): - ''' Reads data from the underlying descriptor - - :param size: The number of bytes to read - :return: The bytes read - ''' - if not self.socket: - raise ConnectionException(self.__str__()) - return self.socket.recvfrom(size)[0]
- -
[docs] def __str__(self): - ''' Builds a string representation of the connection - - :returns: The string representation - ''' - return "%s:%s" % (self.host, self.port)
- - -#---------------------------------------------------------------------------# -# Modbus Serial Client Transport Implementation -#---------------------------------------------------------------------------# -
[docs]class ModbusSerialClient(BaseModbusClient): - ''' Implementation of a modbus serial client - ''' - -
[docs] def __init__(self, method='ascii', **kwargs): - ''' Initialize a serial client instance - - The methods to connect are:: - - - ascii - - rtu - - binary - - :param method: The method to use for connection - :param port: The serial port to attach to - :param stopbits: The number of stop bits to use - :param bytesize: The bytesize of the serial messages - :param parity: Which kind of parity to use - :param baudrate: The baud rate to use for the serial device - :param timeout: The timeout between serial requests (default 3s) - ''' - self.method = method - self.socket = None - BaseModbusClient.__init__(self, self.__implementation(method), **kwargs) - - self.port = kwargs.get('port', 0) - self.stopbits = kwargs.get('stopbits', Defaults.Stopbits) - self.bytesize = kwargs.get('bytesize', Defaults.Bytesize) - self.parity = kwargs.get('parity', Defaults.Parity) - self.baudrate = kwargs.get('baudrate', Defaults.Baudrate) - self.timeout = kwargs.get('timeout', Defaults.Timeout) - if self.method == "rtu": - self._last_frame_end = 0.0 - self._silent_interval = 3.5 * (1 + 8 + 2) / self.baudrate
- - @staticmethod - def __implementation(method): - ''' Returns the requested framer - - :method: The serial framer to instantiate - :returns: The requested serial framer - ''' - method = method.lower() - if method == 'ascii': return ModbusAsciiFramer(ClientDecoder()) - elif method == 'rtu': return ModbusRtuFramer(ClientDecoder()) - elif method == 'binary': return ModbusBinaryFramer(ClientDecoder()) - elif method == 'socket': return ModbusSocketFramer(ClientDecoder()) - raise ParameterException("Invalid framer method requested") - -
[docs] def connect(self): - ''' Connect to the modbus serial server - - :returns: True if connection succeeded, False otherwise - ''' - if self.socket: return True - try: - self.socket = serial.Serial(port=self.port, timeout=self.timeout, - bytesize=self.bytesize, stopbits=self.stopbits, - baudrate=self.baudrate, parity=self.parity) - except serial.SerialException as msg: - _logger.error(msg) - self.close() - if self.method == "rtu": - self._last_frame_end = time.time() - return self.socket != None
- -
[docs] def close(self): - ''' Closes the underlying socket connection - ''' - if self.socket: - self.socket.close() - self.socket = None
- -
[docs] def _send(self, request): - ''' Sends data on the underlying socket - - If receive buffer still holds some data then flush it. - - Sleep if last send finished less than 3.5 character - times ago. - - :param request: The encoded request to send - :return: The number of bytes written - ''' - if not self.socket: - raise ConnectionException(self.__str__()) - if request: - ts = time.time() - if self.method == "rtu": - if ts < self._last_frame_end + self._silent_interval: - _logger.debug("will sleep to wait for 3.5 char") - time.sleep(self._last_frame_end + self._silent_interval - ts) - - try: - in_waiting = "in_waiting" if hasattr(self.socket, "in_waiting") else "inWaiting" - if in_waiting == "in_waiting": - waitingbytes = getattr(self.socket, in_waiting) - else: - waitingbytes = getattr(self.socket, in_waiting)() - if waitingbytes: - result = self.socket.read(waitingbytes) - if _logger.isEnabledFor(logging.WARNING): - _logger.warning("cleanup recv buffer before send: " + " ".join([hex(byte2int(x)) for x in result])) - except NotImplementedError: - pass - - size = self.socket.write(request) - if self.method == "rtu": - self._last_frame_end = time.time() - return size - return 0
- -
[docs] def _recv(self, size): - ''' Reads data from the underlying descriptor - - :param size: The number of bytes to read - :return: The bytes read - ''' - if not self.socket: - raise ConnectionException(self.__str__()) - result = self.socket.read(size) - if self.method == "rtu": - self._last_frame_end = time.time() - return result
- -
[docs] def __str__(self): - ''' Builds a string representation of the connection - - :returns: The string representation - ''' - return "%s baud[%s]" % (self.method, self.baudrate)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ModbusTcpClient", "ModbusUdpClient", "ModbusSerialClient" -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/constants.html b/doc/sphinx/html/_modules/pymodbus/constants.html deleted file mode 100644 index adfc5a0b0..000000000 --- a/doc/sphinx/html/_modules/pymodbus/constants.html +++ /dev/null @@ -1,331 +0,0 @@ - - - - - - - - pymodbus.constants — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.constants

-'''
-Constants For Modbus Server/Client
-----------------------------------
-
-This is the single location for storing default
-values for the servers and clients.
-'''
-from pymodbus.interfaces import Singleton
-
-
-
[docs]class Defaults(Singleton): - ''' A collection of modbus default values - - .. attribute:: Port - - The default modbus tcp server port (502) - - .. attribute:: Retries - - The default number of times a client should retry the given - request before failing (3) - - .. attribute:: RetryOnEmpty - - A flag indicating if a transaction should be retried in the - case that an empty response is received. This is useful for - slow clients that may need more time to process a requst. - - .. attribute:: Timeout - - The default amount of time a client should wait for a request - to be processed (3 seconds) - - .. attribute:: Reconnects - - The default number of times a client should attempt to reconnect - before deciding the server is down (0) - - .. attribute:: TransactionId - - The starting transaction identifier number (0) - - .. attribute:: ProtocolId - - The modbus protocol id. Currently this is set to 0 in all - but proprietary implementations. - - .. attribute:: UnitId - - The modbus slave addrss. Currently this is set to 0x00 which - means this request should be broadcast to all the slave devices - (really means that all the devices should respons). - - .. attribute:: Baudrate - - The speed at which the data is transmitted over the serial line. - This defaults to 19200. - - .. attribute:: Parity - - The type of checksum to use to verify data integrity. This can be - on of the following:: - - - (E)ven - 1 0 1 0 | P(0) - - (O)dd - 1 0 1 0 | P(1) - - (N)one - 1 0 1 0 | no parity - - This defaults to (N)one. - - .. attribute:: Bytesize - - The number of bits in a byte of serial data. This can be one of - 5, 6, 7, or 8. This defaults to 8. - - .. attribute:: Stopbits - - The number of bits sent after each character in a message to - indicate the end of the byte. This defaults to 1. - - .. attribute:: ZeroMode - - Indicates if the slave datastore should use indexing at 0 or 1. - More about this can be read in section 4.4 of the modbus specification. - - .. attribute:: IgnoreMissingSlaves - - In case a request is made to a missing slave, this defines if an error - should be returned or simply ignored. This is useful for the case of a - serial server emulater where a request to a non-existant slave on a bus - will never respond. The client in this case will simply timeout. - ''' - Port = 502 - Retries = 3 - RetryOnEmpty = False - Timeout = 3 - Reconnects = 0 - TransactionId = 0 - ProtocolId = 0 - UnitId = 0x00 - Baudrate = 19200 - Parity = 'N' - Bytesize = 8 - Stopbits = 1 - ZeroMode = False - IgnoreMissingSlaves = False
- - -
[docs]class ModbusStatus(Singleton): - ''' - These represent various status codes in the modbus - protocol. - - .. attribute:: Waiting - - This indicates that a modbus device is currently - waiting for a given request to finish some running task. - - .. attribute:: Ready - - This indicates that a modbus device is currently - free to perform the next request task. - - .. attribute:: On - - This indicates that the given modbus entity is on - - .. attribute:: Off - - This indicates that the given modbus entity is off - - .. attribute:: SlaveOn - - This indicates that the given modbus slave is running - - .. attribute:: SlaveOff - - This indicates that the given modbus slave is not running - ''' - Waiting = 0xffff - Ready = 0x0000 - On = 0xff00 - Off = 0x0000 - SlaveOn = 0xff - SlaveOff = 0x00
- - -
[docs]class Endian(Singleton): - ''' An enumeration representing the various byte endianess. - - .. attribute:: Auto - - This indicates that the byte order is chosen by the - current native environment. - - .. attribute:: Big - - This indicates that the bytes are in little endian format - - .. attribute:: Little - - This indicates that the bytes are in big endian format - - .. note:: I am simply borrowing the format strings from the - python struct module for my convenience. - ''' - Auto = '@' - Big = '>' - Little = '<'
- - -
[docs]class ModbusPlusOperation(Singleton): - ''' Represents the type of modbus plus request - - .. attribute:: GetStatistics - - Operation requesting that the current modbus plus statistics - be returned in the response. - - .. attribute:: ClearStatistics - - Operation requesting that the current modbus plus statistics - be cleared and not returned in the response. - ''' - GetStatistics = 0x0003 - ClearStatistics = 0x0004
- - -
[docs]class DeviceInformation(Singleton): - ''' Represents what type of device information to read - - .. attribute:: Basic - - This is the basic (required) device information to be returned. - This includes VendorName, ProductCode, and MajorMinorRevision - code. - - .. attribute:: Regular - - In addition to basic data objects, the device provides additional - and optinoal identification and description data objects. All of - the objects of this category are defined in the standard but their - implementation is optional. - - .. attribute:: Extended - - In addition to regular data objects, the device provides additional - and optional identification and description private data about the - physical device itself. All of these data are device dependent. - - .. attribute:: Specific - - Request to return a single data object. - ''' - Basic = 0x01 - Regular = 0x02 - Extended = 0x03 - Specific = 0x04
- - -
[docs]class MoreData(Singleton): - ''' Represents the more follows condition - - .. attribute:: Nothing - - This indiates that no more objects are going to be returned. - - .. attribute:: KeepReading - - This indicates that there are more objects to be returned. - ''' - Nothing = 0x00 - KeepReading = 0xFF
- -#---------------------------------------------------------------------------# -# Exported Identifiers -#---------------------------------------------------------------------------# -__all__ = [ - "Defaults", "ModbusStatus", "Endian", - "ModbusPlusOperation", - "DeviceInformation", "MoreData", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/datastore/context.html b/doc/sphinx/html/_modules/pymodbus/datastore/context.html deleted file mode 100644 index 306a20e72..000000000 --- a/doc/sphinx/html/_modules/pymodbus/datastore/context.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - pymodbus.datastore.context — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.datastore.context

-from pymodbus.exceptions import ParameterException, NoSuchSlaveException
-from pymodbus.interfaces import IModbusSlaveContext
-from pymodbus.datastore.store import ModbusSequentialDataBlock
-from pymodbus.constants import Defaults
-from pymodbus.compat import iteritems, itervalues
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging;
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Slave Contexts
-#---------------------------------------------------------------------------#
-
[docs]class ModbusSlaveContext(IModbusSlaveContext): - ''' - This creates a modbus data model with each data access - stored in its own personal block - ''' - -
[docs] def __init__(self, *args, **kwargs): - ''' Initializes the datastores, defaults to fully populated - sequential data blocks if none are passed in. - - :param kwargs: Each element is a ModbusDataBlock - - 'di' - Discrete Inputs initializer - 'co' - Coils initializer - 'hr' - Holding Register initializer - 'ir' - Input Registers iniatializer - ''' - self.store = {} - self.store['d'] = kwargs.get('di', ModbusSequentialDataBlock.create()) - self.store['c'] = kwargs.get('co', ModbusSequentialDataBlock.create()) - self.store['i'] = kwargs.get('ir', ModbusSequentialDataBlock.create()) - self.store['h'] = kwargs.get('hr', ModbusSequentialDataBlock.create()) - self.zero_mode = kwargs.get('zero_mode', Defaults.ZeroMode)
- -
[docs] def __str__(self): - ''' Returns a string representation of the context - - :returns: A string representation of the context - ''' - return "Modbus Slave Context"
- -
[docs] def reset(self): - ''' Resets all the datastores to their default values ''' - for datastore in itervalues(self.store): - datastore.reset()
- -
[docs] def validate(self, fx, address, count=1): - ''' Validates the request to make sure it is in range - - :param fx: The function we are working with - :param address: The starting address - :param count: The number of values to test - :returns: True if the request in within range, False otherwise - ''' - if not self.zero_mode: address = address + 1 - _logger.debug("validate[%d] %d:%d" % (fx, address, count)) - return self.store[self.decode(fx)].validate(address, count)
- -
[docs] def getValues(self, fx, address, count=1): - ''' Validates the request to make sure it is in range - - :param fx: The function we are working with - :param address: The starting address - :param count: The number of values to retrieve - :returns: The requested values from a:a+c - ''' - if not self.zero_mode: address = address + 1 - _logger.debug("getValues[%d] %d:%d" % (fx, address, count)) - return self.store[self.decode(fx)].getValues(address, count)
- -
[docs] def setValues(self, fx, address, values): - ''' Sets the datastore with the supplied values - - :param fx: The function we are working with - :param address: The starting address - :param values: The new values to be set - ''' - if not self.zero_mode: address = address + 1 - _logger.debug("setValues[%d] %d:%d" % (fx, address, len(values))) - self.store[self.decode(fx)].setValues(address, values)
- - -
[docs]class ModbusServerContext(object): - ''' This represents a master collection of slave contexts. - If single is set to true, it will be treated as a single - context so every unit-id returns the same context. If single - is set to false, it will be interpreted as a collection of - slave contexts. - ''' - -
[docs] def __init__(self, slaves=None, single=True): - ''' Initializes a new instance of a modbus server context. - - :param slaves: A dictionary of client contexts - :param single: Set to true to treat this as a single context - ''' - self.single = single - self.__slaves = slaves or {} - if self.single: - self.__slaves = {Defaults.UnitId: self.__slaves}
- -
[docs] def __iter__(self): - ''' Iterater over the current collection of slave - contexts. - - :returns: An iterator over the slave contexts - ''' - return iteritems(self.__slaves)
- -
[docs] def __contains__(self, slave): - ''' Check if the given slave is in this list - - :param slave: slave The slave to check for existance - :returns: True if the slave exists, False otherwise - ''' - return slave in self.__slaves
- -
[docs] def __setitem__(self, slave, context): - ''' Used to set a new slave context - - :param slave: The slave context to set - :param context: The new context to set for this slave - ''' - if self.single: slave = Defaults.UnitId - if 0xf7 >= slave >= 0x00: - self.__slaves[slave] = context - else: - raise NoSuchSlaveException('slave index :{} out of range'.format(slave))
- -
[docs] def __delitem__(self, slave): - ''' Wrapper used to access the slave context - - :param slave: The slave context to remove - ''' - if not self.single and (0xf7 >= slave >= 0x00): - del self.__slaves[slave] - else: - raise NoSuchSlaveException('slave index: {} out of range'.format(slave))
- -
[docs] def __getitem__(self, slave): - ''' Used to get access to a slave context - - :param slave: The slave context to get - :returns: The requested slave context - ''' - if self.single: slave = Defaults.UnitId - if slave in self.__slaves: - return self.__slaves.get(slave) - else: - raise NoSuchSlaveException("slave - {} does not exist, or is out of range".format(slave))
-
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/datastore/remote.html b/doc/sphinx/html/_modules/pymodbus/datastore/remote.html deleted file mode 100644 index 05a888254..000000000 --- a/doc/sphinx/html/_modules/pymodbus/datastore/remote.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - pymodbus.datastore.remote — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.datastore.remote

-from pymodbus.exceptions import NotImplementedException
-from pymodbus.interfaces import IModbusSlaveContext
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Context
-#---------------------------------------------------------------------------#
-
[docs]class RemoteSlaveContext(IModbusSlaveContext): - ''' TODO - This creates a modbus data model that connects to - a remote device (depending on the client used) - ''' - -
[docs] def __init__(self, client): - ''' Initializes the datastores - - :param client: The client to retrieve values with - ''' - self._client = client - self.__build_mapping()
- -
[docs] def reset(self): - ''' Resets all the datastores to their default values ''' - raise NotImplementedException()
- -
[docs] def validate(self, fx, address, count=1): - ''' Validates the request to make sure it is in range - - :param fx: The function we are working with - :param address: The starting address - :param count: The number of values to test - :returns: True if the request in within range, False otherwise - ''' - _logger.debug("validate[%d] %d:%d" % (fx, address, count)) - result = self.__get_callbacks[self.decode(fx)](address, count) - return result.function_code < 0x80
- -
[docs] def getValues(self, fx, address, count=1): - ''' Validates the request to make sure it is in range - - :param fx: The function we are working with - :param address: The starting address - :param count: The number of values to retrieve - :returns: The requested values from a:a+c - ''' - # TODO deal with deferreds - _logger.debug("get values[%d] %d:%d" % (fx, address, count)) - result = self.__get_callbacks[self.decode(fx)](address, count) - return self.__extract_result(self.decode(fx), result)
- -
[docs] def setValues(self, fx, address, values): - ''' Sets the datastore with the supplied values - - :param fx: The function we are working with - :param address: The starting address - :param values: The new values to be set - ''' - # TODO deal with deferreds - _logger.debug("set values[%d] %d:%d" % (fx, address, len(values))) - self.__set_callbacks[self.decode(fx)](address, values)
- -
[docs] def __str__(self): - ''' Returns a string representation of the context - - :returns: A string representation of the context - ''' - return "Remote Slave Context(%s)" % self._client
- - def __build_mapping(self): - ''' - A quick helper method to build the function - code mapper. - ''' - self.__get_callbacks = { - 'd': lambda a, c: self._client.read_discrete_inputs(a, c), - 'c': lambda a, c: self._client.read_coils(a, c), - 'h': lambda a, c: self._client.read_holding_registers(a, c), - 'i': lambda a, c: self._client.read_input_registers(a, c), - } - self.__set_callbacks = { - 'd': lambda a, v: self._client.write_coils(a, v), - 'c': lambda a, v: self._client.write_coils(a, v), - 'h': lambda a, v: self._client.write_registers(a, v), - 'i': lambda a, v: self._client.write_registers(a, v), - } - - def __extract_result(self, fx, result): - ''' A helper method to extract the values out of - a response. TODO make this consistent (values?) - ''' - if result.function_code < 0x80: - if fx in ['d', 'c']: return result.bits - if fx in ['h', 'i']: return result.registers - else: return result
-
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/datastore/store.html b/doc/sphinx/html/_modules/pymodbus/datastore/store.html deleted file mode 100644 index 54b6b4f02..000000000 --- a/doc/sphinx/html/_modules/pymodbus/datastore/store.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - - pymodbus.datastore.store — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.datastore.store

-"""
-Modbus Server Datastore
--------------------------
-
-For each server, you will create a ModbusServerContext and pass
-in the default address space for each data access.  The class
-will create and manage the data.
-
-Further modification of said data accesses should be performed
-with [get,set][access]Values(address, count)
-
-Datastore Implementation
--------------------------
-
-There are two ways that the server datastore can be implemented.
-The first is a complete range from 'address' start to 'count'
-number of indecies.  This can be thought of as a straight array::
-
-    data = range(1, 1 + count)
-    [1,2,3,...,count]
-
-The other way that the datastore can be implemented (and how
-many devices implement it) is a associate-array::
-
-    data = {1:'1', 3:'3', ..., count:'count'}
-    [1,3,...,count]
-
-The difference between the two is that the latter will allow
-arbitrary gaps in its datastore while the former will not.
-This is seen quite commonly in some modbus implementations.
-What follows is a clear example from the field:
-
-Say a company makes two devices to monitor power usage on a rack.
-One works with three-phase and the other with a single phase. The
-company will dictate a modbus data mapping such that registers::
-
-    n:      phase 1 power
-    n+1:    phase 2 power
-    n+2:    phase 3 power
-
-Using this, layout, the first device will implement n, n+1, and n+2,
-however, the second device may set the latter two values to 0 or
-will simply not implmented the registers thus causing a single read
-or a range read to fail.
-
-I have both methods implemented, and leave it up to the user to change
-based on their preference.
-"""
-from pymodbus.exceptions import NotImplementedException, ParameterException
-from pymodbus.compat import iteritems, iterkeys, itervalues, get_next
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Datablock Storage
-#---------------------------------------------------------------------------#
-
[docs]class BaseModbusDataBlock(object): - ''' - Base class for a modbus datastore - - Derived classes must create the following fields: - @address The starting address point - @defult_value The default value of the datastore - @values The actual datastore values - - Derived classes must implemented the following methods: - validate(self, address, count=1) - getValues(self, address, count=1) - setValues(self, address, values) - ''' - -
[docs] def default(self, count, value=False): - ''' Used to initialize a store to one value - - :param count: The number of fields to set - :param value: The default value to set to the fields - ''' - self.default_value = value - self.values = [self.default_value] * count - self.address = 0x00
- -
[docs] def reset(self): - ''' Resets the datastore to the initialized default value ''' - self.values = [self.default_value] * len(self.values)
- -
[docs] def validate(self, address, count=1): - ''' Checks to see if the request is in range - - :param address: The starting address - :param count: The number of values to test for - :returns: True if the request in within range, False otherwise - ''' - raise NotImplementedException("Datastore Address Check")
- -
[docs] def getValues(self, address, count=1): - ''' Returns the requested values from the datastore - - :param address: The starting address - :param count: The number of values to retrieve - :returns: The requested values from a:a+c - ''' - raise NotImplementedException("Datastore Value Retrieve")
- -
[docs] def setValues(self, address, values): - ''' Returns the requested values from the datastore - - :param address: The starting address - :param values: The values to store - ''' - raise NotImplementedException("Datastore Value Retrieve")
- -
[docs] def __str__(self): - ''' Build a representation of the datastore - - :returns: A string representation of the datastore - ''' - return "DataStore(%d, %d)" % (len(self.values), self.default_value)
- -
[docs] def __iter__(self): - ''' Iterater over the data block data - - :returns: An iterator of the data block data - ''' - if isinstance(self.values, dict): - return iteritems(self.values) - return enumerate(self.values, self.address)
- - -
[docs]class ModbusSequentialDataBlock(BaseModbusDataBlock): - ''' Creates a sequential modbus datastore ''' - -
[docs] def __init__(self, address, values): - ''' Initializes the datastore - - :param address: The starting address of the datastore - :param values: Either a list or a dictionary of values - ''' - self.address = address - if hasattr(values, '__iter__'): - self.values = list(values) - else: self.values = [values] - self.default_value = self.values[0].__class__()
- - @classmethod -
[docs] def create(klass): - ''' Factory method to create a datastore with the - full address space initialized to 0x00 - - :returns: An initialized datastore - ''' - return klass(0x00, [0x00] * 65536)
- -
[docs] def validate(self, address, count=1): - ''' Checks to see if the request is in range - - :param address: The starting address - :param count: The number of values to test for - :returns: True if the request in within range, False otherwise - ''' - result = (self.address <= address) - result &= ((self.address + len(self.values)) >= (address + count)) - return result
- -
[docs] def getValues(self, address, count=1): - ''' Returns the requested values of the datastore - - :param address: The starting address - :param count: The number of values to retrieve - :returns: The requested values from a:a+c - ''' - start = address - self.address - return self.values[start:start + count]
- -
[docs] def setValues(self, address, values): - ''' Sets the requested values of the datastore - - :param address: The starting address - :param values: The new values to be set - ''' - if not isinstance(values, list): - values = [values] - start = address - self.address - self.values[start:start + len(values)] = values
- - -
[docs]class ModbusSparseDataBlock(BaseModbusDataBlock): - ''' Creates a sparse modbus datastore ''' - -
[docs] def __init__(self, values): - ''' Initializes the datastore - - Using the input values we create the default - datastore value and the starting address - - :param values: Either a list or a dictionary of values - ''' - if isinstance(values, dict): - self.values = values - elif hasattr(values, '__iter__'): - self.values = dict(enumerate(values)) - else: raise ParameterException( - "Values for datastore must be a list or dictionary") - self.default_value = get_next(itervalues(self.values)).__class__() - self.address = get_next(iterkeys(self.values))
- - @classmethod -
[docs] def create(klass): - ''' Factory method to create a datastore with the - full address space initialized to 0x00 - - :returns: An initialized datastore - ''' - return klass([0x00] * 65536)
- -
[docs] def validate(self, address, count=1): - ''' Checks to see if the request is in range - - :param address: The starting address - :param count: The number of values to test for - :returns: True if the request in within range, False otherwise - ''' - if count == 0: return False - handle = set(range(address, address + count)) - return handle.issubset(set(iterkeys(self.values)))
- -
[docs] def getValues(self, address, count=1): - ''' Returns the requested values of the datastore - - :param address: The starting address - :param count: The number of values to retrieve - :returns: The requested values from a:a+c - ''' - return [self.values[i] for i in range(address, address + count)]
- -
[docs] def setValues(self, address, values): - ''' Sets the requested values of the datastore - - :param address: The starting address - :param values: The new values to be set - ''' - if isinstance(values, dict): - for idx, val in iteritems(values): - self.values[idx] = val - else: - if not isinstance(values, list): - values = [values] - for idx, val in enumerate(values): - self.values[address + idx] = val
-
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/device.html b/doc/sphinx/html/_modules/pymodbus/device.html deleted file mode 100644 index ce0d93f53..000000000 --- a/doc/sphinx/html/_modules/pymodbus/device.html +++ /dev/null @@ -1,712 +0,0 @@ - - - - - - - - pymodbus.device — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.device

-"""
-Modbus Device Controller
--------------------------
-
-These are the device management handlers.  They should be
-maintained in the server context and the various methods
-should be inserted in the correct locations.
-"""
-from pymodbus.constants import DeviceInformation
-from pymodbus.interfaces import Singleton
-from pymodbus.utilities import dict_property
-from pymodbus.compat import iteritems, itervalues, izip, int2byte
-
-from collections import OrderedDict
-
-#---------------------------------------------------------------------------#
-# Network Access Control
-#---------------------------------------------------------------------------#
-
[docs]class ModbusAccessControl(Singleton): - ''' - This is a simple implementation of a Network Management System table. - Its purpose is to control access to the server (if it is used). - We assume that if an entry is in the table, it is allowed accesses to - resources. However, if the host does not appear in the table (all - unknown hosts) its connection will simply be closed. - - Since it is a singleton, only one version can possible exist and all - instances pull from here. - ''' - __nmstable = [ - "127.0.0.1", - ] - -
[docs] def __iter__(self): - ''' Iterater over the network access table - - :returns: An iterator of the network access table - ''' - return self.__nmstable.__iter__()
- -
[docs] def __contains__(self, host): - ''' Check if a host is allowed to access resources - - :param host: The host to check - ''' - return host in self.__nmstable
- -
[docs] def add(self, host): - ''' Add allowed host(s) from the NMS table - - :param host: The host to add - ''' - if not isinstance(host, list): - host = [host] - for entry in host: - if entry not in self.__nmstable: - self.__nmstable.append(entry)
- -
[docs] def remove(self, host): - ''' Remove allowed host(s) from the NMS table - - :param host: The host to remove - ''' - if not isinstance(host, list): - host = [host] - for entry in host: - if entry in self.__nmstable: - self.__nmstable.remove(entry)
- -
[docs] def check(self, host): - ''' Check if a host is allowed to access resources - - :param host: The host to check - ''' - return host in self.__nmstable
- - -#---------------------------------------------------------------------------# -# Modbus Plus Statistics -#---------------------------------------------------------------------------# -
[docs]class ModbusPlusStatistics(object): - ''' - This is used to maintain the current modbus plus statistics count. As of - right now this is simply a stub to complete the modbus implementation. - For more information, see the modbus implementation guide page 87. - ''' - - __data = OrderedDict({ - 'node_type_id' : [0x00] * 2, # 00 - 'software_version_number' : [0x00] * 2, # 01 - 'network_address' : [0x00] * 2, # 02 - 'mac_state_variable' : [0x00] * 2, # 03 - 'peer_status_code' : [0x00] * 2, # 04 - 'token_pass_counter' : [0x00] * 2, # 05 - 'token_rotation_time' : [0x00] * 2, # 06 - - 'program_master_token_failed' : [0x00], # 07 hi - 'data_master_token_failed' : [0x00], # 07 lo - 'program_master_token_owner' : [0x00], # 08 hi - 'data_master_token_owner' : [0x00], # 08 lo - 'program_slave_token_owner' : [0x00], # 09 hi - 'data_slave_token_owner' : [0x00], # 09 lo - 'data_slave_command_transfer' : [0x00], # 10 hi - '__unused_10_lowbit' : [0x00], # 10 lo - - 'program_slave_command_transfer' : [0x00], # 11 hi - 'program_master_rsp_transfer' : [0x00], # 11 lo - 'program_slave_auto_logout' : [0x00], # 12 hi - 'program_master_connect_status' : [0x00], # 12 lo - 'receive_buffer_dma_overrun' : [0x00], # 13 hi - 'pretransmit_deferral_error' : [0x00], # 13 lo - 'frame_size_error' : [0x00], # 14 hi - 'repeated_command_received' : [0x00], # 14 lo - 'receiver_alignment_error' : [0x00], # 15 hi - 'receiver_collision_abort_error' : [0x00], # 15 lo - 'bad_packet_length_error' : [0x00], # 16 hi - 'receiver_crc_error' : [0x00], # 16 lo - 'transmit_buffer_dma_underrun' : [0x00], # 17 hi - 'bad_link_address_error' : [0x00], # 17 lo - - 'bad_mac_function_code_error' : [0x00], # 18 hi - 'internal_packet_length_error' : [0x00], # 18 lo - 'communication_failed_error' : [0x00], # 19 hi - 'communication_retries' : [0x00], # 19 lo - 'no_response_error' : [0x00], # 20 hi - 'good_receive_packet' : [0x00], # 20 lo - 'unexpected_path_error' : [0x00], # 21 hi - 'exception_response_error' : [0x00], # 21 lo - 'forgotten_transaction_error' : [0x00], # 22 hi - 'unexpected_response_error' : [0x00], # 22 lo - - 'active_station_bit_map' : [0x00] * 8, # 23-26 - 'token_station_bit_map' : [0x00] * 8, # 27-30 - 'global_data_bit_map' : [0x00] * 8, # 31-34 - 'receive_buffer_use_bit_map' : [0x00] * 8, # 35-37 - 'data_master_output_path' : [0x00] * 8, # 38-41 - 'data_slave_input_path' : [0x00] * 8, # 42-45 - 'program_master_outptu_path' : [0x00] * 8, # 46-49 - 'program_slave_input_path' : [0x00] * 8, # 50-53 - }) - -
[docs] def __init__(self): - ''' - Initialize the modbus plus statistics with the default - information. - ''' - self.reset()
- -
[docs] def __iter__(self): - ''' Iterater over the statistics - - :returns: An iterator of the modbus plus statistics - ''' - return iteritems(self.__data)
- -
[docs] def reset(self): - ''' This clears all of the modbus plus statistics - ''' - for key in self.__data: - self.__data[key] = [0x00] * len(self.__data[key])
- -
[docs] def summary(self): - ''' Returns a summary of the modbus plus statistics - - :returns: 54 16-bit words representing the status - ''' - return itervalues(self.__data)
- -
[docs] def encode(self): - ''' Returns a summary of the modbus plus statistics - - :returns: 54 16-bit words representing the status - ''' - total, values = [], sum(self.__data.values(), []) - for c in range(0, len(values), 2): - total.append((values[c] << 8) | values[c+1]) - return total
- - -#---------------------------------------------------------------------------# -# Device Information Control -#---------------------------------------------------------------------------# -
[docs]class ModbusDeviceIdentification(object): - ''' - This is used to supply the device identification - for the readDeviceIdentification function - - For more information read section 6.21 of the modbus - application protocol. - ''' - __data = { - 0x00: '', # VendorName - 0x01: '', # ProductCode - 0x02: '', # MajorMinorRevision - 0x03: '', # VendorUrl - 0x04: '', # ProductName - 0x05: '', # ModelName - 0x06: '', # UserApplicationName - 0x07: '', # reserved - 0x08: '', # reserved - # 0x80 -> 0xFF are private - } - - __names = [ - 'VendorName', - 'ProductCode', - 'MajorMinorRevision', - 'VendorUrl', - 'ProductName', - 'ModelName', - 'UserApplicationName', - ] - -
[docs] def __init__(self, info=None): - ''' - Initialize the datastore with the elements you need. - (note acceptable range is [0x00-0x06,0x80-0xFF] inclusive) - - :param information: A dictionary of {int:string} of values - ''' - if isinstance(info, dict): - for key in info: - if (0x06 >= key >= 0x00) or (0x80 > key > 0x08): - self.__data[key] = info[key]
- -
[docs] def __iter__(self): - ''' Iterater over the device information - - :returns: An iterator of the device information - ''' - return iteritems(self.__data)
- -
[docs] def summary(self): - ''' Return a summary of the main items - - :returns: An dictionary of the main items - ''' - return dict(zip(self.__names, itervalues(self.__data)))
- -
[docs] def update(self, value): - ''' Update the values of this identity - using another identify as the value - - :param value: The value to copy values from - ''' - self.__data.update(value)
- -
[docs] def __setitem__(self, key, value): - ''' Wrapper used to access the device information - - :param key: The register to set - :param value: The new value for referenced register - ''' - if key not in [0x07, 0x08]: - self.__data[key] = value
- -
[docs] def __getitem__(self, key): - ''' Wrapper used to access the device information - - :param key: The register to read - ''' - return self.__data.setdefault(key, '')
- -
[docs] def __str__(self): - ''' Build a representation of the device - - :returns: A string representation of the device - ''' - return "DeviceIdentity"
- - #-------------------------------------------------------------------------# - # Properties - #-------------------------------------------------------------------------# - VendorName = dict_property(lambda s: s.__data, 0) - ProductCode = dict_property(lambda s: s.__data, 1) - MajorMinorRevision = dict_property(lambda s: s.__data, 2) - VendorUrl = dict_property(lambda s: s.__data, 3) - ProductName = dict_property(lambda s: s.__data, 4) - ModelName = dict_property(lambda s: s.__data, 5) - UserApplicationName = dict_property(lambda s: s.__data, 6)
- - -
[docs]class DeviceInformationFactory(Singleton): - ''' This is a helper factory that really just hides - some of the complexity of processing the device information - requests (function code 0x2b 0x0e). - ''' - - __lookup = { - DeviceInformation.Basic: lambda c,r,i: c.__gets(r, list(range(0x00, 0x03))), - DeviceInformation.Regular: lambda c,r,i: c.__gets(r, list(range(0x00, 0x08))), - DeviceInformation.Extended: lambda c,r,i: c.__gets(r, list(range(0x80, i))), - DeviceInformation.Specific: lambda c,r,i: c.__get(r, i), - } - - @classmethod -
[docs] def get(cls, control, read_code=DeviceInformation.Basic, object_id=0x00): - ''' Get the requested device data from the system - - :param control: The control block to pull data from - :param read_code: The read code to process - :param object_id: The specific object_id to read - :returns: The requested data (id, length, value) - ''' - identity = control.Identity - return cls.__lookup[read_code](cls, identity, object_id)
- - @classmethod - def __get(cls, identity, object_id): - ''' Read a single object_id from the device information - - :param identity: The identity block to pull data from - :param object_id: The specific object id to read - :returns: The requested data (id, length, value) - ''' - return { object_id:identity[object_id] } - - @classmethod - def __gets(cls, identity, object_ids): - ''' Read multiple object_ids from the device information - - :param identity: The identity block to pull data from - :param object_ids: The specific object ids to read - :returns: The requested data (id, length, value) - ''' - return dict((oid, identity[oid]) for oid in object_ids)
- - -#---------------------------------------------------------------------------# -# Counters Handler -#---------------------------------------------------------------------------# -class ModbusCountersHandler(object): - ''' - This is a helper class to simplify the properties for the counters:: - - 0x0B 1 Return Bus Message Count - - Quantity of messages that the remote - device has detected on the communications system since its - last restart, clear counters operation, or power-up. Messages - with bad CRC are not taken into account. - - 0x0C 2 Return Bus Communication Error Count - - Quantity of CRC errors encountered by the remote device since its - last restart, clear counters operation, or power-up. In case of - an error detected on the character level, (overrun, parity error), - or in case of a message length < 3 bytes, the receiving device is - not able to calculate the CRC. In such cases, this counter is - also incremented. - - 0x0D 3 Return Slave Exception Error Count - - Quantity of MODBUS exception error detected by the remote device - since its last restart, clear counters operation, or power-up. It - comprises also the error detected in broadcast messages even if an - exception message is not returned in this case. - Exception errors are described and listed in "MODBUS Application - Protocol Specification" document. - - 0xOE 4 Return Slave Message Count - - Quantity of messages addressed to the remote device, including - broadcast messages, that the remote device has processed since its - last restart, clear counters operation, or power-up. - - 0x0F 5 Return Slave No Response Count - - Quantity of messages received by the remote device for which it - returned no response (neither a normal response nor an exception - response), since its last restart, clear counters operation, or - power-up. Then, this counter counts the number of broadcast - messages it has received. - - 0x10 6 Return Slave NAK Count - - Quantity of messages addressed to the remote device for which it - returned a Negative Acknowledge (NAK) exception response, since - its last restart, clear counters operation, or power-up. Exception - responses are described and listed in "MODBUS Application Protocol - Specification" document. - - 0x11 7 Return Slave Busy Count - - Quantity of messages addressed to the remote device for which it - returned a Slave Device Busy exception response, since its last - restart, clear counters operation, or power-up. Exception - responses are described and listed in "MODBUS Application - Protocol Specification" document. - - 0x12 8 Return Bus Character Overrun Count - - Quantity of messages addressed to the remote device that it could - not handle due to a character overrun condition, since its last - restart, clear counters operation, or power-up. A character - overrun is caused by data characters arriving at the port faster - than they can. - - .. note:: I threw the event counter in here for convinience - ''' - __data = dict([(i, 0x0000) for i in range(9)]) - __names = [ - 'BusMessage', - 'BusCommunicationError', - 'SlaveExceptionError', - 'SlaveMessage', - 'SlaveNoResponse', - 'SlaveNAK', - 'SlaveBusy', - 'BusCharacterOverrun' - 'Event ' - ] - - def __iter__(self): - ''' Iterater over the device counters - - :returns: An iterator of the device counters - ''' - return izip(self.__names, itervalues(self.__data)) - - def update(self, values): - ''' Update the values of this identity - using another identify as the value - - :param values: The value to copy values from - ''' - for k, v in iteritems(values): - v += self.__getattribute__(k) - self.__setattr__(k, v) - - def reset(self): - ''' This clears all of the system counters - ''' - self.__data = dict([(i, 0x0000) for i in range(9)]) - - def summary(self): - ''' Returns a summary of the counters current status - - :returns: A byte with each bit representing each counter - ''' - count, result = 0x01, 0x00 - for i in itervalues(self.__data): - if i != 0x00: result |= count - count <<= 1 - return result - - #-------------------------------------------------------------------------# - # Properties - #-------------------------------------------------------------------------# - BusMessage = dict_property(lambda s: s.__data, 0) - BusCommunicationError = dict_property(lambda s: s.__data, 1) - BusExceptionError = dict_property(lambda s: s.__data, 2) - SlaveMessage = dict_property(lambda s: s.__data, 3) - SlaveNoResponse = dict_property(lambda s: s.__data, 4) - SlaveNAK = dict_property(lambda s: s.__data, 5) - SlaveBusy = dict_property(lambda s: s.__data, 6) - BusCharacterOverrun = dict_property(lambda s: s.__data, 7) - Event = dict_property(lambda s: s.__data, 8) - - -#---------------------------------------------------------------------------# -# Main server controll block -#---------------------------------------------------------------------------# -
[docs]class ModbusControlBlock(Singleton): - ''' - This is a global singleotn that controls all system information - - All activity should be logged here and all diagnostic requests - should come from here. - ''' - - __mode = 'ASCII' - __diagnostic = [False] * 16 - __instance = None - __listen_only = False - __delimiter = '\r' - __counters = ModbusCountersHandler() - __identity = ModbusDeviceIdentification() - __plus = ModbusPlusStatistics() - __events = [] - - #-------------------------------------------------------------------------# - # Magic - #-------------------------------------------------------------------------# -
[docs] def __str__(self): - ''' Build a representation of the control block - - :returns: A string representation of the control block - ''' - return "ModbusControl"
- -
[docs] def __iter__(self): - ''' Iterater over the device counters - - :returns: An iterator of the device counters - ''' - return self.__counters.__iter__()
- - #-------------------------------------------------------------------------# - # Events - #-------------------------------------------------------------------------# -
[docs] def addEvent(self, event): - ''' Adds a new event to the event log - - :param event: A new event to add to the log - ''' - self.__events.insert(0, event) - self.__events = self.__events[0:64] # chomp to 64 entries - self.Counter.Event += 1
- -
[docs] def getEvents(self): - ''' Returns an encoded collection of the event log. - - :returns: The encoded events packet - ''' - events = [event.encode() for event in self.__events] - return b''.join(events)
- -
[docs] def clearEvents(self): - ''' Clears the current list of events - ''' - self.__events = []
- - #-------------------------------------------------------------------------# - # Other Properties - #-------------------------------------------------------------------------# - Identity = property(lambda s: s.__identity) - Counter = property(lambda s: s.__counters) - Events = property(lambda s: s.__events) - Plus = property(lambda s: s.__plus) - -
[docs] def reset(self): - ''' This clears all of the system counters and the - diagnostic register - ''' - self.__events = [] - self.__counters.reset() - self.__diagnostic = [False] * 16
- - #-------------------------------------------------------------------------# - # Listen Properties - #-------------------------------------------------------------------------# -
[docs] def _setListenOnly(self, value): - ''' This toggles the listen only status - - :param value: The value to set the listen status to - ''' - self.__listen_only = bool(value)
- - ListenOnly = property(lambda s: s.__listen_only, _setListenOnly) - - #-------------------------------------------------------------------------# - # Mode Properties - #-------------------------------------------------------------------------# -
[docs] def _setMode(self, mode): - ''' This toggles the current serial mode - - :param mode: The data transfer method in (RTU, ASCII) - ''' - if mode in ['ASCII', 'RTU']: - self.__mode = mode
- - Mode = property(lambda s: s.__mode, _setMode) - - #-------------------------------------------------------------------------# - # Delimiter Properties - #-------------------------------------------------------------------------# -
[docs] def _setDelimiter(self, char): - ''' This changes the serial delimiter character - - :param char: The new serial delimiter character - ''' - if isinstance(char, str): - self.__delimiter = char.encode() - if isinstance(char, bytes): - self.__delimiter = char - elif isinstance(char, int): - self.__delimiter = int2byte(char)
- - Delimiter = property(lambda s: s.__delimiter, _setDelimiter) - - #-------------------------------------------------------------------------# - # Diagnostic Properties - #-------------------------------------------------------------------------# -
[docs] def setDiagnostic(self, mapping): - ''' This sets the value in the diagnostic register - - :param mapping: Dictionary of key:value pairs to set - ''' - for entry in iteritems(mapping): - if entry[0] >= 0 and entry[0] < len(self.__diagnostic): - self.__diagnostic[entry[0]] = (entry[1] != 0)
- -
[docs] def getDiagnostic(self, bit): - ''' This gets the value in the diagnostic register - - :param bit: The bit to get - :returns: The current value of the requested bit - ''' - try: - if bit and bit >= 0 and bit < len(self.__diagnostic): - return self.__diagnostic[bit] - except Exception: - return None
- -
[docs] def getDiagnosticRegister(self): - ''' This gets the entire diagnostic register - - :returns: The diagnostic register collection - ''' - return self.__diagnostic
- -#---------------------------------------------------------------------------# -# Exported Identifiers -#---------------------------------------------------------------------------# -__all__ = [ - "ModbusAccessControl", - "ModbusPlusStatistics", - "ModbusDeviceIdentification", - "DeviceInformationFactory", - "ModbusControlBlock" -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/diag_message.html b/doc/sphinx/html/_modules/pymodbus/diag_message.html deleted file mode 100644 index b706258af..000000000 --- a/doc/sphinx/html/_modules/pymodbus/diag_message.html +++ /dev/null @@ -1,845 +0,0 @@ - - - - - - - - pymodbus.diag_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.diag_message

-'''
-Diagnostic Record Read/Write
-------------------------------
-
-These need to be tied into a the current server context
-or linked to the appropriate data
-'''
-import struct
-
-from pymodbus.constants import ModbusStatus, ModbusPlusOperation
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.device import ModbusControlBlock
-from pymodbus.exceptions import NotImplementedException
-from pymodbus.utilities import pack_bitstring
-
-_MCB = ModbusControlBlock()
-
-
-#---------------------------------------------------------------------------#
-# Diagnostic Function Codes Base Classes
-# diagnostic 08, 00-18,20
-#---------------------------------------------------------------------------#
-# TODO Make sure all the data is decoded from the response
-#---------------------------------------------------------------------------#
-
[docs]class DiagnosticStatusRequest(ModbusRequest): - ''' - This is a base class for all of the diagnostic request functions - ''' - function_code = 0x08 - _rtu_frame_size = 8 - -
[docs] def __init__(self, **kwargs): - ''' - Base initializer for a diagnostic request - ''' - ModbusRequest.__init__(self, **kwargs) - self.message = None
- -
[docs] def encode(self): - ''' - Base encoder for a diagnostic response - we encode the data set in self.message - - :returns: The encoded packet - ''' - packet = struct.pack('>H', self.sub_function_code) - if self.message is not None: - if isinstance(self.message, str): - packet += self.message.encode() - elif isinstance(self.message, bytes): - packet += self.message - elif isinstance(self.message, list): - for piece in self.message: - packet += struct.pack('>H', piece) - elif isinstance(self.message, int): - packet += struct.pack('>H', self.message) - return packet
- -
[docs] def decode(self, data): - ''' Base decoder for a diagnostic request - - :param data: The data to decode into the function code - ''' - self.sub_function_code, self.message = struct.unpack('>HH', data)
- -
[docs] def get_response_pdu_size(self): - """ - Func_code (1 byte) + Sub function code (2 byte) + Data (2 * N bytes) - :return: - """ - if not isinstance(self.message,list): - self.message = [self.message] - return 1 + 2 + 2 * len(self.message)
- - - -
[docs]class DiagnosticStatusResponse(ModbusResponse): - ''' - This is a base class for all of the diagnostic response functions - - It works by performing all of the encoding and decoding of variable - data and lets the higher classes define what extra data to append - and how to execute a request - ''' - function_code = 0x08 - _rtu_frame_size = 8 - -
[docs] def __init__(self, **kwargs): - ''' - Base initializer for a diagnostic response - ''' - ModbusResponse.__init__(self, **kwargs) - self.message = None
- -
[docs] def encode(self): - ''' - Base encoder for a diagnostic response - we encode the data set in self.message - - :returns: The encoded packet - ''' - packet = struct.pack('>H', self.sub_function_code) - if self.message is not None: - if isinstance(self.message, str): - packet += self.message.encode() - elif isinstance(self.message, bytes): - packet += self.message - elif isinstance(self.message, list): - for piece in self.message: - packet += struct.pack('>H', piece) - elif isinstance(self.message, int): - packet += struct.pack('>H', self.message) - return packet
- -
[docs] def decode(self, data): - ''' Base decoder for a diagnostic response - - :param data: The data to decode into the function code - ''' - self.sub_function_code, self.message = struct.unpack('>HH', data)
- - -
[docs]class DiagnosticStatusSimpleRequest(DiagnosticStatusRequest): - ''' - A large majority of the diagnostic functions are simple - status request functions. They work by sending 0x0000 - as data and their function code and they are returned - 2 bytes of data. - - If a function inherits this, they only need to implement - the execute method - ''' - -
[docs] def __init__(self, data=0x0000, **kwargs): - ''' - General initializer for a simple diagnostic request - - The data defaults to 0x0000 if not provided as over half - of the functions require it. - - :param data: The data to send along with the request - ''' - DiagnosticStatusRequest.__init__(self, **kwargs) - self.message = data
- -
[docs] def execute(self, *args): - ''' Base function to raise if not implemented ''' - raise NotImplementedException("Diagnostic Message Has No Execute Method")
- - -
[docs]class DiagnosticStatusSimpleResponse(DiagnosticStatusResponse): - ''' - A large majority of the diagnostic functions are simple - status request functions. They work by sending 0x0000 - as data and their function code and they are returned - 2 bytes of data. - ''' - -
[docs] def __init__(self, data=0x0000, **kwargs): - ''' General initializer for a simple diagnostic response - - :param data: The resulting data to return to the client - ''' - DiagnosticStatusResponse.__init__(self, **kwargs) - self.message = data
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 00 -#---------------------------------------------------------------------------# -
[docs]class ReturnQueryDataRequest(DiagnosticStatusRequest): - ''' - The data passed in the request data field is to be returned (looped back) - in the response. The entire response message should be identical to the - request. - ''' - sub_function_code = 0x0000 - -
[docs] def __init__(self, message=0x0000, **kwargs): - ''' Initializes a new instance of the request - - :param message: The message to send to loopback - ''' - DiagnosticStatusRequest.__init__(self, **kwargs) - if isinstance(message, list): - self.message = message - else: - self.message = [message]
- -
[docs] def execute(self, *args): - ''' Executes the loopback request (builds the response) - - :returns: The populated loopback response message - ''' - return ReturnQueryDataResponse(self.message)
- - -
[docs]class ReturnQueryDataResponse(DiagnosticStatusResponse): - ''' - The data passed in the request data field is to be returned (looped back) - in the response. The entire response message should be identical to the - request. - ''' - sub_function_code = 0x0000 - -
[docs] def __init__(self, message=0x0000, **kwargs): - ''' Initializes a new instance of the response - - :param message: The message to loopback - ''' - DiagnosticStatusResponse.__init__(self, **kwargs) - if isinstance(message, list): - self.message = message - else: self.message = [message]
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 01 -#---------------------------------------------------------------------------# -
[docs]class RestartCommunicationsOptionRequest(DiagnosticStatusRequest): - ''' - The remote device serial line port must be initialized and restarted, and - all of its communications event counters are cleared. If the port is - currently in Listen Only Mode, no response is returned. This function is - the only one that brings the port out of Listen Only Mode. If the port is - not currently in Listen Only Mode, a normal response is returned. This - occurs before the restart is executed. - ''' - sub_function_code = 0x0001 - -
[docs] def __init__(self, toggle=False, **kwargs): - ''' Initializes a new request - - :param toggle: Set to True to toggle, False otherwise - ''' - DiagnosticStatusRequest.__init__(self, **kwargs) - if toggle: - self.message = [ModbusStatus.On] - else: self.message = [ModbusStatus.Off]
- -
[docs] def execute(self, *args): - ''' Clear event log and restart - - :returns: The initialized response message - ''' - #if _MCB.ListenOnly: - return RestartCommunicationsOptionResponse(self.message)
- -
[docs]class RestartCommunicationsOptionResponse(DiagnosticStatusResponse): - ''' - The remote device serial line port must be initialized and restarted, and - all of its communications event counters are cleared. If the port is - currently in Listen Only Mode, no response is returned. This function is - the only one that brings the port out of Listen Only Mode. If the port is - not currently in Listen Only Mode, a normal response is returned. This - occurs before the restart is executed. - ''' - sub_function_code = 0x0001 - -
[docs] def __init__(self, toggle=False, **kwargs): - ''' Initializes a new response - - :param toggle: Set to True if we toggled, False otherwise - ''' - DiagnosticStatusResponse.__init__(self, **kwargs) - if toggle: - self.message = [ModbusStatus.On] - else: self.message = [ModbusStatus.Off]
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 02 -#---------------------------------------------------------------------------# -
[docs]class ReturnDiagnosticRegisterRequest(DiagnosticStatusSimpleRequest): - ''' - The contents of the remote device's 16-bit diagnostic register are - returned in the response - ''' - sub_function_code = 0x0002 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - #if _MCB.isListenOnly(): - register = pack_bitstring(_MCB.getDiagnosticRegister()) - return ReturnDiagnosticRegisterResponse(register)
- - -
[docs]class ReturnDiagnosticRegisterResponse(DiagnosticStatusSimpleResponse): - ''' - The contents of the remote device's 16-bit diagnostic register are - returned in the response - ''' - sub_function_code = 0x0002
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 03 -#---------------------------------------------------------------------------# -
[docs]class ChangeAsciiInputDelimiterRequest(DiagnosticStatusSimpleRequest): - ''' - The character 'CHAR' passed in the request data field becomes the end of - message delimiter for future messages (replacing the default LF - character). This function is useful in cases of a Line Feed is not - required at the end of ASCII messages. - ''' - sub_function_code = 0x0003 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - char = (self.message & 0xff00) >> 8 - _MCB.Delimiter = char - return ChangeAsciiInputDelimiterResponse(self.message)
- - -
[docs]class ChangeAsciiInputDelimiterResponse(DiagnosticStatusSimpleResponse): - ''' - The character 'CHAR' passed in the request data field becomes the end of - message delimiter for future messages (replacing the default LF - character). This function is useful in cases of a Line Feed is not - required at the end of ASCII messages. - ''' - sub_function_code = 0x0003
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 04 -#---------------------------------------------------------------------------# -
[docs]class ForceListenOnlyModeRequest(DiagnosticStatusSimpleRequest): - ''' - Forces the addressed remote device to its Listen Only Mode for MODBUS - communications. This isolates it from the other devices on the network, - allowing them to continue communicating without interruption from the - addressed remote device. No response is returned. - ''' - sub_function_code = 0x0004 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - _MCB.ListenOnly = True - return ForceListenOnlyModeResponse()
- - -
[docs]class ForceListenOnlyModeResponse(DiagnosticStatusResponse): - ''' - Forces the addressed remote device to its Listen Only Mode for MODBUS - communications. This isolates it from the other devices on the network, - allowing them to continue communicating without interruption from the - addressed remote device. No response is returned. - - This does not send a response - ''' - sub_function_code = 0x0004 - should_respond = False - -
[docs] def __init__(self, **kwargs): - ''' Initializer to block a return response - ''' - DiagnosticStatusResponse.__init__(self, **kwargs) - self.message = []
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 10 -#---------------------------------------------------------------------------# -
[docs]class ClearCountersRequest(DiagnosticStatusSimpleRequest): - ''' - The goal is to clear ll counters and the diagnostic register. - Also, counters are cleared upon power-up - ''' - sub_function_code = 0x000A - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - _MCB.reset() - return ClearCountersResponse(self.message)
- - -
[docs]class ClearCountersResponse(DiagnosticStatusSimpleResponse): - ''' - The goal is to clear ll counters and the diagnostic register. - Also, counters are cleared upon power-up - ''' - sub_function_code = 0x000A
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 11 -#---------------------------------------------------------------------------# -
[docs]class ReturnBusMessageCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of messages that the - remote device has detected on the communications systems since its last - restart, clear counters operation, or power-up - ''' - sub_function_code = 0x000B - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.BusMessage - return ReturnBusMessageCountResponse(count)
- - -
[docs]class ReturnBusMessageCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages that the - remote device has detected on the communications systems since its last - restart, clear counters operation, or power-up - ''' - sub_function_code = 0x000B
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 12 -#---------------------------------------------------------------------------# -
[docs]class ReturnBusCommunicationErrorCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of CRC errors encountered - by the remote device since its last restart, clear counter operation, or - power-up - ''' - sub_function_code = 0x000C - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.BusCommunicationError - return ReturnBusCommunicationErrorCountResponse(count)
- - -
[docs]class ReturnBusCommunicationErrorCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of CRC errors encountered - by the remote device since its last restart, clear counter operation, or - power-up - ''' - sub_function_code = 0x000C
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 13 -#---------------------------------------------------------------------------# -
[docs]class ReturnBusExceptionErrorCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of modbus exception - responses returned by the remote device since its last restart, - clear counters operation, or power-up - ''' - sub_function_code = 0x000D - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.BusExceptionError - return ReturnBusExceptionErrorCountResponse(count)
- - -
[docs]class ReturnBusExceptionErrorCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of modbus exception - responses returned by the remote device since its last restart, - clear counters operation, or power-up - ''' - sub_function_code = 0x000D
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 14 -#---------------------------------------------------------------------------# -
[docs]class ReturnSlaveMessageCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of messages addressed to the - remote device, or broadcast, that the remote device has processed since - its last restart, clear counters operation, or power-up - ''' - sub_function_code = 0x000E - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.SlaveMessage - return ReturnSlaveMessageCountResponse(count)
- - -
[docs]class ReturnSlaveMessageCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages addressed to the - remote device, or broadcast, that the remote device has processed since - its last restart, clear counters operation, or power-up - ''' - sub_function_code = 0x000E
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 15 -#---------------------------------------------------------------------------# -
[docs]class ReturnSlaveNoResponseCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of messages addressed to the - remote device, or broadcast, that the remote device has processed since - its last restart, clear counters operation, or power-up - ''' - sub_function_code = 0x000F - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.SlaveNoResponse - return ReturnSlaveNoReponseCountResponse(count)
- - -
[docs]class ReturnSlaveNoReponseCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages addressed to the - remote device, or broadcast, that the remote device has processed since - its last restart, clear counters operation, or power-up - ''' - sub_function_code = 0x000F
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 16 -#---------------------------------------------------------------------------# -
[docs]class ReturnSlaveNAKCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of messages addressed to the - remote device for which it returned a Negative Acknowledge (NAK) exception - response, since its last restart, clear counters operation, or power-up. - Exception responses are described and listed in section 7 . - ''' - sub_function_code = 0x0010 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.SlaveNAK - return ReturnSlaveNAKCountResponse(count)
- - -
[docs]class ReturnSlaveNAKCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages addressed to the - remote device for which it returned a Negative Acknowledge (NAK) exception - response, since its last restart, clear counters operation, or power-up. - Exception responses are described and listed in section 7. - ''' - sub_function_code = 0x0010
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 17 -#---------------------------------------------------------------------------# -
[docs]class ReturnSlaveBusyCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of messages addressed to the - remote device for which it returned a Slave Device Busy exception response, - since its last restart, clear counters operation, or power-up. - ''' - sub_function_code = 0x0011 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.SlaveBusy - return ReturnSlaveBusyCountResponse(count)
- - -
[docs]class ReturnSlaveBusyCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages addressed to the - remote device for which it returned a Slave Device Busy exception response, - since its last restart, clear counters operation, or power-up. - ''' - sub_function_code = 0x0011
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 18 -#---------------------------------------------------------------------------# -
[docs]class ReturnSlaveBusCharacterOverrunCountRequest(DiagnosticStatusSimpleRequest): - ''' - The response data field returns the quantity of messages addressed to the - remote device that it could not handle due to a character overrun condition, - since its last restart, clear counters operation, or power-up. A character - overrun is caused by data characters arriving at the port faster than they - can be stored, or by the loss of a character due to a hardware malfunction. - ''' - sub_function_code = 0x0012 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.BusCharacterOverrun - return ReturnSlaveBusCharacterOverrunCountResponse(count)
- - -
[docs]class ReturnSlaveBusCharacterOverrunCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages addressed to the - remote device that it could not handle due to a character overrun condition, - since its last restart, clear counters operation, or power-up. A character - overrun is caused by data characters arriving at the port faster than they - can be stored, or by the loss of a character due to a hardware malfunction. - ''' - sub_function_code = 0x0012
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 19 -#---------------------------------------------------------------------------# -
[docs]class ReturnIopOverrunCountRequest(DiagnosticStatusSimpleRequest): - ''' - An IOP overrun is caused by data characters arriving at the port - faster than they can be stored, or by the loss of a character due - to a hardware malfunction. This function is specific to the 884. - ''' - sub_function_code = 0x0013 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - count = _MCB.Counter.BusCharacterOverrun - return ReturnIopOverrunCountResponse(count)
- - -
[docs]class ReturnIopOverrunCountResponse(DiagnosticStatusSimpleResponse): - ''' - The response data field returns the quantity of messages - addressed to the slave that it could not handle due to an 884 - IOP overrun condition, since its last restart, clear counters - operation, or power-up. - ''' - sub_function_code = 0x0013
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 20 -#---------------------------------------------------------------------------# -
[docs]class ClearOverrunCountRequest(DiagnosticStatusSimpleRequest): - ''' - Clears the overrun error counter and reset the error flag - - An error flag should be cleared, but nothing else in the - specification mentions is, so it is ignored. - ''' - sub_function_code = 0x0014 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - _MCB.Counter.BusCharacterOverrun = 0x0000 - return ClearOverrunCountResponse(self.message)
- - -
[docs]class ClearOverrunCountResponse(DiagnosticStatusSimpleResponse): - ''' - Clears the overrun error counter and reset the error flag - ''' - sub_function_code = 0x0014
- - -#---------------------------------------------------------------------------# -# Diagnostic Sub Code 21 -#---------------------------------------------------------------------------# -
[docs]class GetClearModbusPlusRequest(DiagnosticStatusSimpleRequest): - ''' - In addition to the Function code (08) and Subfunction code - (00 15 hex) in the query, a two-byte Operation field is used - to specify either a 'Get Statistics' or a 'Clear Statistics' - operation. The two operations are exclusive - the 'Get' - operation cannot clear the statistics, and the 'Clear' - operation does not return statistics prior to clearing - them. Statistics are also cleared on power-up of the slave - device. - ''' - sub_function_code = 0x0015 - -
[docs] def execute(self, *args): - ''' Execute the diagnostic request on the given device - - :returns: The initialized response message - ''' - message = None # the clear operation does not return info - if self.message == ModbusPlusOperation.ClearStatistics: - _MCB.Plus.reset() - else: message = _MCB.Plus.encode() - return GetClearModbusPlusResponse(message)
- - -
[docs]class GetClearModbusPlusResponse(DiagnosticStatusSimpleResponse): - ''' - Returns a series of 54 16-bit words (108 bytes) in the data field - of the response (this function differs from the usual two-byte - length of the data field). The data contains the statistics for - the Modbus Plus peer processor in the slave device. - ''' - sub_function_code = 0x0015
- - -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "DiagnosticStatusRequest", "DiagnosticStatusResponse", - "ReturnQueryDataRequest", "ReturnQueryDataResponse", - "RestartCommunicationsOptionRequest", "RestartCommunicationsOptionResponse", - "ReturnDiagnosticRegisterRequest", "ReturnDiagnosticRegisterResponse", - "ChangeAsciiInputDelimiterRequest", "ChangeAsciiInputDelimiterResponse", - "ForceListenOnlyModeRequest", "ForceListenOnlyModeResponse", - "ClearCountersRequest", "ClearCountersResponse", - "ReturnBusMessageCountRequest", "ReturnBusMessageCountResponse", - "ReturnBusCommunicationErrorCountRequest", "ReturnBusCommunicationErrorCountResponse", - "ReturnBusExceptionErrorCountRequest", "ReturnBusExceptionErrorCountResponse", - "ReturnSlaveMessageCountRequest", "ReturnSlaveMessageCountResponse", - "ReturnSlaveNoResponseCountRequest", "ReturnSlaveNoReponseCountResponse", - "ReturnSlaveNAKCountRequest", "ReturnSlaveNAKCountResponse", - "ReturnSlaveBusyCountRequest", "ReturnSlaveBusyCountResponse", - "ReturnSlaveBusCharacterOverrunCountRequest", "ReturnSlaveBusCharacterOverrunCountResponse", - "ReturnIopOverrunCountRequest", "ReturnIopOverrunCountResponse", - "ClearOverrunCountRequest", "ClearOverrunCountResponse", - "GetClearModbusPlusRequest", "GetClearModbusPlusResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/events.html b/doc/sphinx/html/_modules/pymodbus/events.html deleted file mode 100644 index 1b3a1f593..000000000 --- a/doc/sphinx/html/_modules/pymodbus/events.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - - - pymodbus.events — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.events

-'''
-Modbus Remote Events
-------------------------------------------------------------
-
-An event byte returned by the Get Communications Event Log function
-can be any one of four types. The type is defined by bit 7
-(the high-order bit) in each byte. It may be further defined by bit 6.
-'''
-from pymodbus.exceptions import NotImplementedException
-from pymodbus.exceptions import ParameterException
-from pymodbus.utilities import pack_bitstring, unpack_bitstring
-
-
-
[docs]class ModbusEvent(object): - -
[docs] def encode(self): - ''' Encodes the status bits to an event message - - :returns: The encoded event message - ''' - raise NotImplementedException()
- -
[docs] def decode(self, event): - ''' Decodes the event message to its status bits - - :param event: The event to decode - ''' - raise NotImplementedException()
- - -
[docs]class RemoteReceiveEvent(ModbusEvent): - ''' Remote device MODBUS Receive Event - - The remote device stores this type of event byte when a query message - is received. It is stored before the remote device processes the message. - This event is defined by bit 7 set to logic '1'. The other bits will be - set to a logic '1' if the corresponding condition is TRUE. The bit layout - is:: - - Bit Contents - ---------------------------------- - 0 Not Used - 2 Not Used - 3 Not Used - 4 Character Overrun - 5 Currently in Listen Only Mode - 6 Broadcast Receive - 7 1 - ''' - -
[docs] def __init__(self, **kwargs): - ''' Initialize a new event instance - ''' - self.overrun = kwargs.get('overrun', False) - self.listen = kwargs.get('listen', False) - self.broadcast = kwargs.get('broadcast', False)
- -
[docs] def encode(self): - ''' Encodes the status bits to an event message - - :returns: The encoded event message - ''' - bits = [False] * 3 - bits += [self.overrun, self.listen, self.broadcast, True] - packet = pack_bitstring(bits) - return packet
- -
[docs] def decode(self, event): - ''' Decodes the event message to its status bits - - :param event: The event to decode - ''' - bits = unpack_bitstring(event) - self.overrun = bits[4] - self.listen = bits[5] - self.broadcast = bits[6]
- - -
[docs]class RemoteSendEvent(ModbusEvent): - ''' Remote device MODBUS Send Event - - The remote device stores this type of event byte when it finishes - processing a request message. It is stored if the remote device - returned a normal or exception response, or no response. - - This event is defined by bit 7 set to a logic '0', with bit 6 set to a '1'. - The other bits will be set to a logic '1' if the corresponding - condition is TRUE. The bit layout is:: - - Bit Contents - ----------------------------------------------------------- - 0 Read Exception Sent (Exception Codes 1-3) - 1 Slave Abort Exception Sent (Exception Code 4) - 2 Slave Busy Exception Sent (Exception Codes 5-6) - 3 Slave Program NAK Exception Sent (Exception Code 7) - 4 Write Timeout Error Occurred - 5 Currently in Listen Only Mode - 6 1 - 7 0 - ''' - -
[docs] def __init__(self, **kwargs): - ''' Initialize a new event instance - ''' - self.read = kwargs.get('read', False) - self.slave_abort = kwargs.get('slave_abort', False) - self.slave_busy = kwargs.get('slave_busy', False) - self.slave_nak = kwargs.get('slave_nak', False) - self.write_timeout = kwargs.get('write_timeout', False) - self.listen = kwargs.get('listen', False)
- -
[docs] def encode(self): - ''' Encodes the status bits to an event message - - :returns: The encoded event message - ''' - bits = [self.read, self.slave_abort, self.slave_busy, - self.slave_nak, self.write_timeout, self.listen] - bits += [True, False] - packet = pack_bitstring(bits) - return packet
- -
[docs] def decode(self, event): - ''' Decodes the event message to its status bits - - :param event: The event to decode - ''' - # todo fix the start byte count - bits = unpack_bitstring(event) - self.read = bits[0] - self.slave_abort = bits[1] - self.slave_busy = bits[2] - self.slave_nak = bits[3] - self.write_timeout = bits[4] - self.listen = bits[5]
- - -
[docs]class EnteredListenModeEvent(ModbusEvent): - ''' Remote device Entered Listen Only Mode - - The remote device stores this type of event byte when it enters - the Listen Only Mode. The event is defined by a content of 04 hex. - ''' - - value = 0x04 - __encoded = b'\x04' - -
[docs] def encode(self): - ''' Encodes the status bits to an event message - - :returns: The encoded event message - ''' - return self.__encoded
- -
[docs] def decode(self, event): - ''' Decodes the event message to its status bits - - :param event: The event to decode - ''' - if event != self.__encoded: - raise ParameterException('Invalid decoded value')
- - -
[docs]class CommunicationRestartEvent(ModbusEvent): - ''' Remote device Initiated Communication Restart - - The remote device stores this type of event byte when its communications - port is restarted. The remote device can be restarted by the Diagnostics - function (code 08), with sub-function Restart Communications Option - (code 00 01). - - That function also places the remote device into a 'Continue on Error' - or 'Stop on Error' mode. If the remote device is placed into 'Continue on - Error' mode, the event byte is added to the existing event log. If the - remote device is placed into 'Stop on Error' mode, the byte is added to - the log and the rest of the log is cleared to zeros. - - The event is defined by a content of zero. - ''' - - value = 0x00 - __encoded = b'\x00' - -
[docs] def encode(self): - ''' Encodes the status bits to an event message - - :returns: The encoded event message - ''' - return self.__encoded
- -
[docs] def decode(self, event): - ''' Decodes the event message to its status bits - - :param event: The event to decode - ''' - if event != self.__encoded: - raise ParameterException('Invalid decoded value')
-
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/exceptions.html b/doc/sphinx/html/_modules/pymodbus/exceptions.html deleted file mode 100644 index eafc77a48..000000000 --- a/doc/sphinx/html/_modules/pymodbus/exceptions.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - - - - pymodbus.exceptions — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.exceptions

-'''
-Pymodbus Exceptions
---------------------
-
-Custom exceptions to be used in the Modbus code.
-'''
-
-
-
[docs]class ModbusException(Exception): - ''' Base modbus exception ''' - -
[docs] def __init__(self, string): - ''' Initialize the exception - :param string: The message to append to the error - ''' - self.string = string
- - def __str__(self): - return 'Modbus Error: %s' % self.string
- - -
[docs]class ModbusIOException(ModbusException): - ''' Error resulting from data i/o ''' - -
[docs] def __init__(self, string=""): - ''' Initialize the exception - :param string: The message to append to the error - ''' - message = "[Input/Output] %s" % string - ModbusException.__init__(self, message)
- - -
[docs]class ParameterException(ModbusException): - ''' Error resulting from invalid parameter ''' - -
[docs] def __init__(self, string=""): - ''' Initialize the exception - - :param string: The message to append to the error - ''' - message = "[Invalid Parameter] %s" % string - ModbusException.__init__(self, message)
- - -class NoSuchSlaveException(ModbusException): - ''' Error resulting from making a request to a slave - that does not exist ''' - - def __init__(self, string=""): - ''' Initialize the exception - - :param string: The message to append to the error - ''' - message = "[No Such Slave] %s" % string - ModbusException.__init__(self, message) - - -
[docs]class NotImplementedException(ModbusException): - ''' Error resulting from not implemented function ''' - -
[docs] def __init__(self, string=""): - ''' Initialize the exception - :param string: The message to append to the error - ''' - message = "[Not Implemented] %s" % string - ModbusException.__init__(self, message)
- - -class ConnectionException(ModbusException): - ''' Error resulting from a bad connection ''' - - def __init__(self, string=""): - ''' Initialize the exception - - :param string: The message to append to the error - ''' - message = "[Connection] %s" % string - ModbusException.__init__(self, message) - -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ModbusException", "ModbusIOException", - "ParameterException", "NotImplementedException", - "ConnectionException", "NoSuchSlaveException", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/factory.html b/doc/sphinx/html/_modules/pymodbus/factory.html deleted file mode 100644 index cfffdf5d4..000000000 --- a/doc/sphinx/html/_modules/pymodbus/factory.html +++ /dev/null @@ -1,347 +0,0 @@ - - - - - - - - pymodbus.factory — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.factory

-"""
-Modbus Request/Response Decoder Factories
--------------------------------------------
-
-The following factories make it easy to decode request/response messages.
-To add a new request/response pair to be decodeable by the library, simply
-add them to the respective function lookup table (order doesn't matter, but
-it does help keep things organized).
-
-Regardless of how many functions are added to the lookup, O(1) behavior is
-kept as a result of a pre-computed lookup dictionary.
-"""
-
-from pymodbus.pdu import IllegalFunctionRequest
-from pymodbus.pdu import ExceptionResponse
-from pymodbus.pdu import ModbusExceptions as ecode
-from pymodbus.interfaces import IModbusDecoder
-from pymodbus.exceptions import ModbusException
-from pymodbus.bit_read_message import *
-from pymodbus.bit_write_message import *
-from pymodbus.diag_message import *
-from pymodbus.file_message import *
-from pymodbus.other_message import *
-from pymodbus.mei_message import *
-from pymodbus.register_read_message import *
-from pymodbus.register_write_message import *
-from pymodbus.compat import byte2int
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Server Decoder
-#---------------------------------------------------------------------------#
-
[docs]class ServerDecoder(IModbusDecoder): - ''' Request Message Factory (Server) - - To add more implemented functions, simply add them to the list - ''' - __function_table = [ - ReadHoldingRegistersRequest, - ReadDiscreteInputsRequest, - ReadInputRegistersRequest, - ReadCoilsRequest, - WriteMultipleCoilsRequest, - WriteMultipleRegistersRequest, - WriteSingleRegisterRequest, - WriteSingleCoilRequest, - ReadWriteMultipleRegistersRequest, - - DiagnosticStatusRequest, - - ReadExceptionStatusRequest, - GetCommEventCounterRequest, - GetCommEventLogRequest, - ReportSlaveIdRequest, - - ReadFileRecordRequest, - WriteFileRecordRequest, - MaskWriteRegisterRequest, - ReadFifoQueueRequest, - - ReadDeviceInformationRequest, - ] - __sub_function_table = [ - ReturnQueryDataRequest, - RestartCommunicationsOptionRequest, - ReturnDiagnosticRegisterRequest, - ChangeAsciiInputDelimiterRequest, - ForceListenOnlyModeRequest, - ClearCountersRequest, - ReturnBusMessageCountRequest, - ReturnBusCommunicationErrorCountRequest, - ReturnBusExceptionErrorCountRequest, - ReturnSlaveMessageCountRequest, - ReturnSlaveNoResponseCountRequest, - ReturnSlaveNAKCountRequest, - ReturnSlaveBusyCountRequest, - ReturnSlaveBusCharacterOverrunCountRequest, - ReturnIopOverrunCountRequest, - ClearOverrunCountRequest, - GetClearModbusPlusRequest, - - ReadDeviceInformationRequest, - ] - -
[docs] def __init__(self): - ''' Initializes the client lookup tables - ''' - functions = set(f.function_code for f in self.__function_table) - self.__lookup = dict([(f.function_code, f) for f in self.__function_table]) - self.__sub_lookup = dict((f, {}) for f in functions) - for f in self.__sub_function_table: - self.__sub_lookup[f.function_code][f.sub_function_code] = f
- -
[docs] def decode(self, message): - ''' Wrapper to decode a request packet - - :param message: The raw modbus request packet - :return: The decoded modbus message or None if error - ''' - try: - return self._helper(message) - except ModbusException as er: - _logger.warning("Unable to decode request %s" % er) - return None
- -
[docs] def lookupPduClass(self, function_code): - ''' Use `function_code` to determine the class of the PDU. - - :param function_code: The function code specified in a frame. - :returns: The class of the PDU that has a matching `function_code`. - ''' - return self.__lookup.get(function_code, ExceptionResponse)
- -
[docs] def _helper(self, data): - ''' - This factory is used to generate the correct request object - from a valid request packet. This decodes from a list of the - currently implemented request types. - - :param data: The request packet to decode - :returns: The decoded request or illegal function request object - ''' - function_code = byte2int(data[0]) - _logger.debug("Factory Request[%d]" % function_code) - request = self.__lookup.get(function_code, lambda: None)() - if not request: - request = IllegalFunctionRequest(function_code) - request.decode(data[1:]) - - if hasattr(request, 'sub_function_code'): - lookup = self.__sub_lookup.get(request.function_code, {}) - subtype = lookup.get(request.sub_function_code, None) - if subtype: request.__class__ = subtype - - return request
- - -#---------------------------------------------------------------------------# -# Client Decoder -#---------------------------------------------------------------------------# -
[docs]class ClientDecoder(IModbusDecoder): - ''' Response Message Factory (Client) - - To add more implemented functions, simply add them to the list - ''' - __function_table = [ - ReadHoldingRegistersResponse, - ReadDiscreteInputsResponse, - ReadInputRegistersResponse, - ReadCoilsResponse, - WriteMultipleCoilsResponse, - WriteMultipleRegistersResponse, - WriteSingleRegisterResponse, - WriteSingleCoilResponse, - ReadWriteMultipleRegistersResponse, - - DiagnosticStatusResponse, - - ReadExceptionStatusResponse, - GetCommEventCounterResponse, - GetCommEventLogResponse, - ReportSlaveIdResponse, - - ReadFileRecordResponse, - WriteFileRecordResponse, - MaskWriteRegisterResponse, - ReadFifoQueueResponse, - - ReadDeviceInformationResponse, - ] - __sub_function_table = [ - ReturnQueryDataResponse, - RestartCommunicationsOptionResponse, - ReturnDiagnosticRegisterResponse, - ChangeAsciiInputDelimiterResponse, - ForceListenOnlyModeResponse, - ClearCountersResponse, - ReturnBusMessageCountResponse, - ReturnBusCommunicationErrorCountResponse, - ReturnBusExceptionErrorCountResponse, - ReturnSlaveMessageCountResponse, - ReturnSlaveNoReponseCountResponse, - ReturnSlaveNAKCountResponse, - ReturnSlaveBusyCountResponse, - ReturnSlaveBusCharacterOverrunCountResponse, - ReturnIopOverrunCountResponse, - ClearOverrunCountResponse, - GetClearModbusPlusResponse, - - ReadDeviceInformationResponse, - ] - -
[docs] def __init__(self): - ''' Initializes the client lookup tables - ''' - functions = set(f.function_code for f in self.__function_table) - self.__lookup = dict([(f.function_code, f) for f in self.__function_table]) - self.__sub_lookup = dict((f, {}) for f in functions) - for f in self.__sub_function_table: - self.__sub_lookup[f.function_code][f.sub_function_code] = f
- -
[docs] def lookupPduClass(self, function_code): - ''' Use `function_code` to determine the class of the PDU. - - :param function_code: The function code specified in a frame. - :returns: The class of the PDU that has a matching `function_code`. - ''' - return self.__lookup.get(function_code, ExceptionResponse)
- -
[docs] def decode(self, message): - ''' Wrapper to decode a response packet - - :param message: The raw packet to decode - :return: The decoded modbus message or None if error - ''' - try: - return self._helper(message) - except ModbusException as er: - _logger.error("Unable to decode response %s" % er) - return None
- -
[docs] def _helper(self, data): - ''' - This factory is used to generate the correct response object - from a valid response packet. This decodes from a list of the - currently implemented request types. - - :param data: The response packet to decode - :returns: The decoded request or an exception response object - ''' - function_code = byte2int(data[0]) - _logger.debug("Factory Response[%d]" % function_code) - response = self.__lookup.get(function_code, lambda: None)() - if function_code > 0x80: - code = function_code & 0x7f # strip error portion - response = ExceptionResponse(code, ecode.IllegalFunction) - if not response: - raise ModbusException("Unknown response %d" % function_code) - response.decode(data[1:]) - - if hasattr(response, 'sub_function_code'): - lookup = self.__sub_lookup.get(response.function_code, {}) - subtype = lookup.get(response.sub_function_code, None) - if subtype: response.__class__ = subtype - - return response
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = ['ServerDecoder', 'ClientDecoder'] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/file_message.html b/doc/sphinx/html/_modules/pymodbus/file_message.html deleted file mode 100644 index fcc06fca1..000000000 --- a/doc/sphinx/html/_modules/pymodbus/file_message.html +++ /dev/null @@ -1,576 +0,0 @@ - - - - - - - - pymodbus.file_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.file_message

-'''
-File Record Read/Write Messages
--------------------------------
-
-Currently none of these messages are implemented
-'''
-import struct
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.compat import byte2int
-
-
-#---------------------------------------------------------------------------#
-# File Record Types
-#---------------------------------------------------------------------------#
-
[docs]class FileRecord(object): - ''' Represents a file record and its relevant data. - ''' - -
[docs] def __init__(self, **kwargs): - ''' Initializes a new instance - - :params reference_type: Defaults to 0x06 (must be) - :params file_number: Indicates which file number we are reading - :params record_number: Indicates which record in the file - :params record_data: The actual data of the record - :params record_length: The length in registers of the record - :params response_length: The length in bytes of the record - ''' - self.reference_type = kwargs.get('reference_type', 0x06) - self.file_number = kwargs.get('file_number', 0x00) - self.record_number = kwargs.get('record_number', 0x00) - self.record_data = kwargs.get('record_data', '') - - self.record_length = kwargs.get('record_length', len(self.record_data) // 2) - self.response_length = kwargs.get('response_length', len(self.record_data) + 1)
- -
[docs] def __eq__(self, relf): - ''' Compares the left object to the right - ''' - return self.reference_type == relf.reference_type \ - and self.file_number == relf.file_number \ - and self.record_number == relf.record_number \ - and self.record_length == relf.record_length \ - and self.record_data == relf.record_data
- -
[docs] def __ne__(self, relf): - ''' Compares the left object to the right - ''' - return not self.__eq__(relf)
- -
[docs] def __repr__(self): - ''' Gives a representation of the file record - ''' - params = (self.file_number, self.record_number, self.record_length) - return 'FileRecord(file=%d, record=%d, length=%d)' % params
- - -#---------------------------------------------------------------------------# -# File Requests/Responses -#---------------------------------------------------------------------------# -
[docs]class ReadFileRecordRequest(ModbusRequest): - ''' - This function code is used to perform a file record read. All request - data lengths are provided in terms of number of bytes and all record - lengths are provided in terms of registers. - - A file is an organization of records. Each file contains 10000 records, - addressed 0000 to 9999 decimal or 0x0000 to 0x270f. For example, record - 12 is addressed as 12. The function can read multiple groups of - references. The groups can be separating (non-contiguous), but the - references within each group must be sequential. Each group is defined - in a seperate 'sub-request' field that contains seven bytes:: - - The reference type: 1 byte (must be 0x06) - The file number: 2 bytes - The starting record number within the file: 2 bytes - The length of the record to be read: 2 bytes - - The quantity of registers to be read, combined with all other fields - in the expected response, must not exceed the allowable length of the - MODBUS PDU: 235 bytes. - ''' - function_code = 0x14 - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, records=None, **kwargs): - ''' Initializes a new instance - - :param records: The file record requests to be read - ''' - ModbusRequest.__init__(self, **kwargs) - self.records = records or []
- -
[docs] def encode(self): - ''' Encodes the request packet - - :returns: The byte encoded packet - ''' - packet = struct.pack('B', len(self.records) * 7) - for record in self.records: - packet += struct.pack('>BHHH', 0x06, record.file_number, - record.record_number, record.record_length) - return packet
- -
[docs] def decode(self, data): - ''' Decodes the incoming request - - :param data: The data to decode into the address - ''' - self.records = [] - byte_count = byte2int(data[0]) - for count in range(1, byte_count, 7): - decoded = struct.unpack('>BHHH', data[count:count+7]) - record = FileRecord(file_number=decoded[1], - record_number=decoded[2], record_length=decoded[3]) - if decoded[0] == 0x06: self.records.append(record)
- -
[docs] def execute(self, context): - ''' Run a read exeception status request against the store - - :param context: The datastore to request from - :returns: The populated response - ''' - # TODO do some new context operation here - # if file number, record number, or address + length - # is too big, return an error. - files = [] - return ReadFileRecordResponse(files)
- - -
[docs]class ReadFileRecordResponse(ModbusResponse): - ''' - The normal response is a series of 'sub-responses,' one for each - 'sub-request.' The byte count field is the total combined count of - bytes in all 'sub-responses.' In addition, each 'sub-response' - contains a field that shows its own byte count. - ''' - function_code = 0x14 - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, records=None, **kwargs): - ''' Initializes a new instance - - :param records: The requested file records - ''' - ModbusResponse.__init__(self, **kwargs) - self.records = records or []
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - total = sum(record.response_length + 1 for record in self.records) - packet = struct.pack('B', total) - for record in self.records: - packet += struct.pack('>BB', 0x06, record.record_length) - packet += record.record_data - return packet
- -
[docs] def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - count, self.records = 1, [] - byte_count = byte2int(data[0]) - while count < byte_count: - response_length, reference_type = struct.unpack('>BB', data[count:count+2]) - count += response_length + 1 # the count is not included - record = FileRecord(response_length=response_length, - record_data=data[count - response_length + 1:count]) - if reference_type == 0x06: self.records.append(record)
- - -
[docs]class WriteFileRecordRequest(ModbusRequest): - ''' - This function code is used to perform a file record write. All - request data lengths are provided in terms of number of bytes - and all record lengths are provided in terms of the number of 16 - bit words. - ''' - function_code = 0x15 - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, records=None, **kwargs): - ''' Initializes a new instance - - :param records: The file record requests to be read - ''' - ModbusRequest.__init__(self, **kwargs) - self.records = records or []
- -
[docs] def encode(self): - ''' Encodes the request packet - - :returns: The byte encoded packet - ''' - total_length = sum((record.record_length * 2) + 7 for record in self.records) - packet = struct.pack('B', total_length) - for record in self.records: - packet += struct.pack('>BHHH', 0x06, record.file_number, - record.record_number, record.record_length) - packet += record.record_data - return packet
- -
[docs] def decode(self, data): - ''' Decodes the incoming request - - :param data: The data to decode into the address - ''' - count, self.records = 1, [] - byte_count = byte2int(data[0]) - while count < byte_count: - decoded = struct.unpack('>BHHH', data[count:count+7]) - response_length = decoded[3] * 2 - count += response_length + 7 - record = FileRecord(record_length=decoded[3], - file_number=decoded[1], record_number=decoded[2], - record_data=data[count - response_length:count]) - if decoded[0] == 0x06: self.records.append(record)
- -
[docs] def execute(self, context): - ''' Run the write file record request against the context - - :param context: The datastore to request from - :returns: The populated response - ''' - # TODO do some new context operation here - # if file number, record number, or address + length - # is too big, return an error. - return WriteFileRecordResponse(self.records)
- - -
[docs]class WriteFileRecordResponse(ModbusResponse): - ''' - The normal response is an echo of the request. - ''' - function_code = 0x15 - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, records=None, **kwargs): - ''' Initializes a new instance - - :param records: The file record requests to be read - ''' - ModbusResponse.__init__(self, **kwargs) - self.records = records or []
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - total_length = sum((record.record_length * 2) + 7 for record in self.records) - packet = struct.pack('B', total_length) - for record in self.records: - packet += struct.pack('>BHHH', 0x06, record.file_number, - record.record_number, record.record_length) - packet += record.record_data - return packet
- -
[docs] def decode(self, data): - ''' Decodes the incoming request - - :param data: The data to decode into the address - ''' - count, self.records = 1, [] - byte_count = byte2int(data[0]) - while count < byte_count: - decoded = struct.unpack('>BHHH', data[count:count+7]) - response_length = decoded[3] * 2 - count += response_length + 7 - record = FileRecord(record_length=decoded[3], - file_number=decoded[1], record_number=decoded[2], - record_data=data[count - response_length:count]) - if decoded[0] == 0x06: self.records.append(record)
- - -class MaskWriteRegisterRequest(ModbusRequest): - ''' - This function code is used to modify the contents of a specified holding - register using a combination of an AND mask, an OR mask, and the - register's current contents. The function can be used to set or clear - individual bits in the register. - ''' - function_code = 0x16 - _rtu_frame_size = 10 - - - def __init__(self, address=0x0000, and_mask=0xffff, or_mask=0x0000, **kwargs): - ''' Initializes a new instance - - :param address: The mask pointer address (0x0000 to 0xffff) - :param and_mask: The and bitmask to apply to the register address - :param or_mask: The or bitmask to apply to the register address - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - self.and_mask = and_mask - self.or_mask = or_mask - - def encode(self): - ''' Encodes the request packet - - :returns: The byte encoded packet - ''' - return struct.pack('>HHH', self.address, self.and_mask, self.or_mask) - - def decode(self, data): - ''' Decodes the incoming request - - :param data: The data to decode into the address - ''' - self.address, self.and_mask, self.or_mask = struct.unpack('>HHH', data) - - def execute(self, context): - ''' Run a mask write register request against the store - - :param context: The datastore to request from - :returns: The populated response - ''' - if not (0x0000 <= self.and_mask <= 0xffff): - return self.doException(merror.IllegalValue) - if not (0x0000 <= self.or_mask <= 0xffff): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, 1): - return self.doException(merror.IllegalAddress) - values = context.getValues(self.function_code, self.address, 1)[0] - values = ((values & self.and_mask) | self.or_mask) - context.setValues(self.function_code, self.address, [values]) - return MaskWriteRegisterResponse(self.address, self.and_mask, self.or_mask) - - -class MaskWriteRegisterResponse(ModbusResponse): - ''' - The normal response is an echo of the request. The response is returned - after the register has been written. - ''' - function_code = 0x16 - _rtu_frame_size = 10 - - def __init__(self, address=0x0000, and_mask=0xffff, or_mask=0x0000, **kwargs): - ''' Initializes a new instance - - :param address: The mask pointer address (0x0000 to 0xffff) - :param and_mask: The and bitmask applied to the register address - :param or_mask: The or bitmask applied to the register address - ''' - ModbusResponse.__init__(self, **kwargs) - self.address = address - self.and_mask = and_mask - self.or_mask = or_mask - - def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - return struct.pack('>HHH', self.address, self.and_mask, self.or_mask) - - def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - self.address, self.and_mask, self.or_mask = struct.unpack('>HHH', data) - - -
[docs]class ReadFifoQueueRequest(ModbusRequest): - ''' - This function code allows to read the contents of a First-In-First-Out - (FIFO) queue of register in a remote device. The function returns a - count of the registers in the queue, followed by the queued data. - Up to 32 registers can be read: the count, plus up to 31 queued data - registers. - - The queue count register is returned first, followed by the queued data - registers. The function reads the queue contents, but does not clear - them. - ''' - function_code = 0x18 - _rtu_frame_size = 6 - -
[docs] def __init__(self, address=0x0000, **kwargs): - ''' Initializes a new instance - - :param address: The fifo pointer address (0x0000 to 0xffff) - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - self.values = [] # this should be added to the context
- -
[docs] def encode(self): - ''' Encodes the request packet - - :returns: The byte encoded packet - ''' - return struct.pack('>H', self.address)
- -
[docs] def decode(self, data): - ''' Decodes the incoming request - - :param data: The data to decode into the address - ''' - self.address = struct.unpack('>H', data)[0]
- -
[docs] def execute(self, context): - ''' Run a read exeception status request against the store - - :param context: The datastore to request from - :returns: The populated response - ''' - if not (0x0000 <= self.address <= 0xffff): - return self.doException(merror.IllegalValue) - if len(self.values) > 31: - return self.doException(merror.IllegalValue) - # TODO pull the values from some context - return ReadFifoQueueResponse(self.values)
- - -
[docs]class ReadFifoQueueResponse(ModbusResponse): - ''' - In a normal response, the byte count shows the quantity of bytes to - follow, including the queue count bytes and value register bytes - (but not including the error check field). The queue count is the - quantity of data registers in the queue (not including the count register). - - If the queue count exceeds 31, an exception response is returned with an - error code of 03 (Illegal Data Value). - ''' - function_code = 0x18 - - @classmethod -
[docs] def calculateRtuFrameSize(cls, buffer): - ''' Calculates the size of the message - - :param buffer: A buffer containing the data that have been received. - :returns: The number of bytes in the response. - ''' - hi_byte = byte2int(buffer[2]) - lo_byte = byte2int(buffer[3]) - return (hi_byte << 16) + lo_byte + 6
- -
[docs] def __init__(self, values=None, **kwargs): - ''' Initializes a new instance - - :param values: The list of values of the fifo to return - ''' - ModbusResponse.__init__(self, **kwargs) - self.values = values or []
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - length = len(self.values) * 2 - packet = struct.pack('>HH', 2 + length, length) - for value in self.values: - packet += struct.pack('>H', value) - return packet
- -
[docs] def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - self.values = [] - _, count = struct.unpack('>HH', data[0:4]) - for index in range(0, count - 4): - idx = 4 + index * 2 - self.values.append(struct.unpack('>H', data[idx:idx + 2])[0])
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "FileRecord", - "ReadFileRecordRequest", "ReadFileRecordResponse", - "WriteFileRecordRequest", "WriteFileRecordResponse", - "MaskWriteRegisterRequest", "MaskWriteRegisterResponse", - "ReadFifoQueueRequest", "ReadFifoQueueResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/interfaces.html b/doc/sphinx/html/_modules/pymodbus/interfaces.html deleted file mode 100644 index 46190819f..000000000 --- a/doc/sphinx/html/_modules/pymodbus/interfaces.html +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - - - pymodbus.interfaces — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.interfaces

-'''
-Pymodbus Interfaces
----------------------
-
-A collection of base classes that are used throughout
-the pymodbus library.
-'''
-from pymodbus.exceptions import NotImplementedException
-
-
-#---------------------------------------------------------------------------#
-# Generic
-#---------------------------------------------------------------------------#
-
[docs]class Singleton(object): - ''' - Singleton base class - http://mail.python.org/pipermail/python-list/2007-July/450681.html - ''' -
[docs] def __new__(cls, *args, **kwargs): - ''' Create a new instance - ''' - if '_inst' not in vars(cls): - cls._inst = object.__new__(cls) - return cls._inst
- - -#---------------------------------------------------------------------------# -# Project Specific -#---------------------------------------------------------------------------# -
[docs]class IModbusDecoder(object): - ''' Modbus Decoder Base Class - - This interface must be implemented by a modbus message - decoder factory. These factories are responsible for - abstracting away converting a raw packet into a request / response - message object. - ''' - -
[docs] def decode(self, message): - ''' Wrapper to decode a given packet - - :param message: The raw modbus request packet - :return: The decoded modbus message or None if error - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def lookupPduClass(self, function_code): - ''' Use `function_code` to determine the class of the PDU. - - :param function_code: The function code specified in a frame. - :returns: The class of the PDU that has a matching `function_code`. - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- - -
[docs]class IModbusFramer(object): - ''' - A framer strategy interface. The idea is that we abstract away all the - detail about how to detect if a current message frame exists, decoding - it, sending it, etc so that we can plug in a new Framer object (tcp, - rtu, ascii). - ''' - -
[docs] def checkFrame(self): - ''' Check and decode the next frame - - :returns: True if we successful, False otherwise - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def advanceFrame(self): - ''' Skip over the current framed message - This allows us to skip over the current message after we have processed - it or determined that it contains an error. It also has to reset the - current frame header handle - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def addToFrame(self, message): - ''' Add the next message to the frame buffer - - This should be used before the decoding while loop to add the received - data to the buffer handle. - - :param message: The most recent packet - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def isFrameReady(self): - ''' Check if we should continue decode logic - - This is meant to be used in a while loop in the decoding phase to let - the decoder know that there is still data in the buffer. - - :returns: True if ready, False otherwise - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def getFrame(self): - ''' Get the next frame from the buffer - - :returns: The frame data or '' - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def populateResult(self, result): - ''' Populates the modbus result with current frame header - - We basically copy the data back over from the current header - to the result header. This may not be needed for serial messages. - - :param result: The response packet - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def processIncomingPacket(self, data, callback): - ''' The new packet processing pattern - - This takes in a new request packet, adds it to the current - packet stream, and performs framing on it. That is, checks - for complete messages, and once found, will process all that - exist. This handles the case when we read N + 1 or 1 / N - messages at a time instead of 1. - - The processed and decoded messages are pushed to the callback - function to process and send. - - :param data: The new packet data - :param callback: The function to send results to - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- -
[docs] def buildPacket(self, message): - ''' Creates a ready to send modbus packet - - The raw packet is built off of a fully populated modbus - request / response message. - - :param message: The request/response to send - :returns: The built packet - ''' - raise NotImplementedException( - "Method not implemented by derived class")
- - -
[docs]class IModbusSlaveContext(object): - ''' - Interface for a modbus slave data context - - Derived classes must implemented the following methods: - reset(self) - validate(self, fx, address, count=1) - getValues(self, fx, address, count=1) - setValues(self, fx, address, values) - ''' - __fx_mapper = {2: 'd', 4: 'i'} - __fx_mapper.update([(i, 'h') for i in [3, 6, 16, 22, 23]]) - __fx_mapper.update([(i, 'c') for i in [1, 5, 15]]) - -
[docs] def decode(self, fx): - ''' Converts the function code to the datastore to - - :param fx: The function we are working with - :returns: one of [d(iscretes),i(inputs),h(oliding),c(oils) - ''' - return self.__fx_mapper[fx]
- -
[docs] def reset(self): - ''' Resets all the datastores to their default values - ''' - raise NotImplementedException("Context Reset")
- -
[docs] def validate(self, fx, address, count=1): - ''' Validates the request to make sure it is in range - - :param fx: The function we are working with - :param address: The starting address - :param count: The number of values to test - :returns: True if the request in within range, False otherwise - ''' - raise NotImplementedException("validate context values")
- -
[docs] def getValues(self, fx, address, count=1): - ''' Validates the request to make sure it is in range - - :param fx: The function we are working with - :param address: The starting address - :param count: The number of values to retrieve - :returns: The requested values from a:a+c - ''' - raise NotImplementedException("get context values")
- -
[docs] def setValues(self, fx, address, values): - ''' Sets the datastore with the supplied values - - :param fx: The function we are working with - :param address: The starting address - :param values: The new values to be set - ''' - raise NotImplementedException("set context values")
- - -
[docs]class IPayloadBuilder(object): - ''' - This is an interface to a class that can build a payload - for a modbus register write command. It should abstract - the codec for encoding data to the required format - (bcd, binary, char, etc). - ''' - -
[docs] def build(self): - ''' Return the payload buffer as a list - - This list is two bytes per element and can - thus be treated as a list of registers. - - :returns: The payload buffer as a list - ''' - raise NotImplementedException("set context values")
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - 'Singleton', - 'IModbusDecoder', 'IModbusFramer', 'IModbusSlaveContext', - 'IPayloadBuilder', -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/mei_message.html b/doc/sphinx/html/_modules/pymodbus/mei_message.html deleted file mode 100644 index 0e3336359..000000000 --- a/doc/sphinx/html/_modules/pymodbus/mei_message.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - - pymodbus.mei_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.mei_message

-'''
-Encapsulated Interface (MEI) Transport Messages
------------------------------------------------
-
-'''
-import struct
-from pymodbus.constants import DeviceInformation, MoreData
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.device import ModbusControlBlock
-from pymodbus.device import DeviceInformationFactory
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.compat import iteritems, byte2int
-
-_MCB = ModbusControlBlock()
-
-
-#---------------------------------------------------------------------------#
-# Read Device Information
-#---------------------------------------------------------------------------#
-
[docs]class ReadDeviceInformationRequest(ModbusRequest): - ''' - This function code allows reading the identification and additional - information relative to the physical and functional description of a - remote device, only. - - The Read Device Identification interface is modeled as an address space - composed of a set of addressable data elements. The data elements are - called objects and an object Id identifies them. - ''' - function_code = 0x2b - sub_function_code = 0x0e - _rtu_frame_size = 7 - -
[docs] def __init__(self, read_code=None, object_id=0x00, **kwargs): - ''' Initializes a new instance - - :param read_code: The device information read code - :param object_id: The object to read from - ''' - ModbusRequest.__init__(self, **kwargs) - self.read_code = read_code or DeviceInformation.Basic - self.object_id = object_id
- -
[docs] def encode(self): - ''' Encodes the request packet - - :returns: The byte encoded packet - ''' - packet = struct.pack('>BBB', self.sub_function_code, - self.read_code, self.object_id) - return packet
- -
[docs] def decode(self, data): - ''' Decodes data part of the message. - - :param data: The incoming data - ''' - params = struct.unpack('>BBB', data) - self.sub_function_code, self.read_code, self.object_id = params
- -
[docs] def execute(self, context): - ''' Run a read exeception status request against the store - - :param context: The datastore to request from - :returns: The populated response - ''' - if not (0x00 <= self.object_id <= 0xff): - return self.doException(merror.IllegalValue) - if not (0x00 <= self.read_code <= 0x04): - return self.doException(merror.IllegalValue) - - information = DeviceInformationFactory.get(_MCB, - self.read_code, self.object_id) - return ReadDeviceInformationResponse(self.read_code, information)
- -
[docs] def __str__(self): - ''' Builds a representation of the request - - :returns: The string representation of the request - ''' - params = (self.read_code, self.object_id) - return "ReadDeviceInformationRequest(%d,%d)" % params
- - -
[docs]class ReadDeviceInformationResponse(ModbusResponse): - ''' - ''' - function_code = 0x2b - sub_function_code = 0x0e - - @classmethod -
[docs] def calculateRtuFrameSize(cls, buffer): - ''' Calculates the size of the message - - :param buffer: A buffer containing the data that have been received. - :returns: The number of bytes in the response. - ''' - size = 8 # skip the header information - count = byte2int(buffer[7]) - - while count > 0: - _, object_length = struct.unpack('>BB', buffer[size:size+2]) - size += object_length + 2 - count -= 1 - return size + 2
- -
[docs] def __init__(self, read_code=None, information=None, **kwargs): - ''' Initializes a new instance - - :param read_code: The device information read code - :param information: The requested information request - ''' - ModbusResponse.__init__(self, **kwargs) - self.read_code = read_code or DeviceInformation.Basic - self.information = information or {} - self.number_of_objects = len(self.information) - self.conformity = 0x83 # I support everything right now - - # TODO calculate - self.next_object_id = 0x00 # self.information[-1](0) - self.more_follows = MoreData.Nothing
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - packet = struct.pack('>BBBBBB', self.sub_function_code, - self.read_code, self.conformity, self.more_follows, - self.next_object_id, self.number_of_objects) - - for (object_id, data) in iteritems(self.information): - packet += struct.pack('>BB', object_id, len(data)) - packet += data.encode() - return packet
- -
[docs] def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - params = struct.unpack('>BBBBBB', data[0:6]) - self.sub_function_code, self.read_code = params[0:2] - self.conformity, self.more_follows = params[2:4] - self.next_object_id, self.number_of_objects = params[4:6] - self.information, count = {}, 6 # skip the header information - - while count < len(data): - object_id, object_length = struct.unpack('>BB', data[count:count+2]) - count += object_length + 2 - self.information[object_id] = data[count-object_length:count]
- -
[docs] def __str__(self): - ''' Builds a representation of the response - - :returns: The string representation of the response - ''' - return "ReadDeviceInformationResponse(%d)" % self.read_code
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ReadDeviceInformationRequest", "ReadDeviceInformationResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/other_message.html b/doc/sphinx/html/_modules/pymodbus/other_message.html deleted file mode 100644 index cf1081c62..000000000 --- a/doc/sphinx/html/_modules/pymodbus/other_message.html +++ /dev/null @@ -1,533 +0,0 @@ - - - - - - - - pymodbus.other_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.other_message

-'''
-Diagnostic record read/write
-
-Currently not all implemented
-'''
-import struct
-from pymodbus.constants import ModbusStatus
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.device import ModbusControlBlock
-from pymodbus.compat import byte2int, int2byte
-
-_MCB = ModbusControlBlock()
-
-
-#---------------------------------------------------------------------------#
-# TODO Make these only work on serial
-#---------------------------------------------------------------------------#
-
[docs]class ReadExceptionStatusRequest(ModbusRequest): - ''' - This function code is used to read the contents of eight Exception Status - outputs in a remote device. The function provides a simple method for - accessing this information, because the Exception Output references are - known (no output reference is needed in the function). - ''' - function_code = 0x07 - _rtu_frame_size = 4 - -
[docs] def __init__(self, **kwargs): - ''' Initializes a new instance - ''' - ModbusRequest.__init__(self, **kwargs)
- -
[docs] def encode(self): - ''' Encodes the message - ''' - return b''
- -
[docs] def decode(self, data): - ''' Decodes data part of the message. - - :param data: The incoming data - ''' - pass
- -
[docs] def execute(self): - ''' Run a read exeception status request against the store - - :returns: The populated response - ''' - status = _MCB.Counter.summary() - return ReadExceptionStatusResponse(status)
- -
[docs] def __str__(self): - ''' Builds a representation of the request - - :returns: The string representation of the request - ''' - return "ReadExceptionStatusRequest(%d)" % (self.function_code)
- - -
[docs]class ReadExceptionStatusResponse(ModbusResponse): - ''' - The normal response contains the status of the eight Exception Status - outputs. The outputs are packed into one data byte, with one bit - per output. The status of the lowest output reference is contained - in the least significant bit of the byte. The contents of the eight - Exception Status outputs are device specific. - ''' - function_code = 0x07 - _rtu_frame_size = 5 - -
[docs] def __init__(self, status=0x00, **kwargs): - ''' Initializes a new instance - - :param status: The status response to report - ''' - ModbusResponse.__init__(self, **kwargs) - self.status = status
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - return struct.pack('>B', self.status)
- -
[docs] def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - self.status = byte2int(data[0])
- -
[docs] def __str__(self): - ''' Builds a representation of the response - - :returns: The string representation of the response - ''' - arguments = (self.function_code, self.status) - return "ReadExceptionStatusResponse(%d, %s)" % arguments
- -# Encapsulate interface transport 43, 14 -# CANopen general reference 43, 13 - - -#---------------------------------------------------------------------------# -# TODO Make these only work on serial -#---------------------------------------------------------------------------# -
[docs]class GetCommEventCounterRequest(ModbusRequest): - ''' - This function code is used to get a status word and an event count from - the remote device's communication event counter. - - By fetching the current count before and after a series of messages, a - client can determine whether the messages were handled normally by the - remote device. - - The device's event counter is incremented once for each successful - message completion. It is not incremented for exception responses, - poll commands, or fetch event counter commands. - - The event counter can be reset by means of the Diagnostics function - (code 08), with a subfunction of Restart Communications Option - (code 00 01) or Clear Counters and Diagnostic Register (code 00 0A). - ''' - function_code = 0x0b - _rtu_frame_size = 4 - -
[docs] def __init__(self, **kwargs): - ''' Initializes a new instance - ''' - ModbusRequest.__init__(self, **kwargs)
- -
[docs] def encode(self): - ''' Encodes the message - ''' - return b''
- -
[docs] def decode(self, data): - ''' Decodes data part of the message. - - :param data: The incoming data - ''' - pass
- -
[docs] def execute(self): - ''' Run a read exeception status request against the store - - :returns: The populated response - ''' - status = _MCB.Counter.Event - return GetCommEventCounterResponse(status)
- -
[docs] def __str__(self): - ''' Builds a representation of the request - - :returns: The string representation of the request - ''' - return "GetCommEventCounterRequest(%d)" % (self.function_code)
- - -
[docs]class GetCommEventCounterResponse(ModbusResponse): - ''' - The normal response contains a two-byte status word, and a two-byte - event count. The status word will be all ones (FF FF hex) if a - previously-issued program command is still being processed by the - remote device (a busy condition exists). Otherwise, the status word - will be all zeros. - ''' - function_code = 0x0b - _rtu_frame_size = 8 - -
[docs] def __init__(self, count=0x0000, **kwargs): - ''' Initializes a new instance - - :param count: The current event counter value - ''' - ModbusResponse.__init__(self, **kwargs) - self.count = count - self.status = True # this means we are ready, not waiting
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - if self.status: ready = ModbusStatus.Ready - else: ready = ModbusStatus.Waiting - return struct.pack('>HH', ready, self.count)
- -
[docs] def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - ready, self.count = struct.unpack('>HH', data) - self.status = (ready == ModbusStatus.Ready)
- -
[docs] def __str__(self): - ''' Builds a representation of the response - - :returns: The string representation of the response - ''' - arguments = (self.function_code, self.count, self.status) - return "GetCommEventCounterResponse(%d, %d, %d)" % arguments
- - -#---------------------------------------------------------------------------# -# TODO Make these only work on serial -#---------------------------------------------------------------------------# -class GetCommEventLogRequest(ModbusRequest): - ''' - This function code is used to get a status word, event count, message - count, and a field of event bytes from the remote device. - - The status word and event counts are identical to that returned by - the Get Communications Event Counter function (11, 0B hex). - - The message counter contains the quantity of messages processed by the - remote device since its last restart, clear counters operation, or - power-up. This count is identical to that returned by the Diagnostic - function (code 08), sub-function Return Bus Message Count (code 11, - 0B hex). - - The event bytes field contains 0-64 bytes, with each byte corresponding - to the status of one MODBUS send or receive operation for the remote - device. The remote device enters the events into the field in - chronological order. Byte 0 is the most recent event. Each new byte - flushes the oldest byte from the field. - ''' - function_code = 0x0c - _rtu_frame_size = 4 - - def __init__(self, **kwargs): - ''' Initializes a new instance - ''' - ModbusRequest.__init__(self, **kwargs) - - def encode(self): - ''' Encodes the message - ''' - return b'' - - def decode(self, data): - ''' Decodes data part of the message. - - :param data: The incoming data - ''' - pass - - def execute(self): - ''' Run a read exeception status request against the store - - :returns: The populated response - ''' - results = { - 'status' : True, - 'message_count' : _MCB.Counter.BusMessage, - 'event_count' : _MCB.Counter.Event, - 'events' : _MCB.getEvents(), - } - return GetCommEventLogResponse(**results) - - def __str__(self): - ''' Builds a representation of the request - - :returns: The string representation of the request - ''' - return "GetCommEventLogRequest(%d)" % self.function_code - - -class GetCommEventLogResponse(ModbusResponse): - ''' - The normal response contains a two-byte status word field, - a two-byte event count field, a two-byte message count field, - and a field containing 0-64 bytes of events. A byte count - field defines the total length of the data in these four field - ''' - function_code = 0x0c - _rtu_byte_count_pos = 3 - - def __init__(self, **kwargs): - ''' Initializes a new instance - - :param status: The status response to report - :param message_count: The current message count - :param event_count: The current event count - :param events: The collection of events to send - ''' - ModbusResponse.__init__(self, **kwargs) - self.status = kwargs.get('status', True) - self.message_count = kwargs.get('message_count', 0) - self.event_count = kwargs.get('event_count', 0) - self.events = kwargs.get('events', []) - - def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - if self.status: ready = ModbusStatus.Ready - else: ready = ModbusStatus.Waiting - packet = struct.pack('>B', 6 + len(self.events)) - packet += struct.pack('>H', ready) - packet += struct.pack('>HH', self.event_count, self.message_count) - packet += b''.join(struct.pack('>B', e) for e in self.events) - return packet - - def decode(self, data): - ''' Decodes a the response - - :param data: The packet data to decode - ''' - length = byte2int(data[0]) - status = struct.unpack('>H', data[1:3])[0] - self.status = (status == ModbusStatus.Ready) - self.event_count = struct.unpack('>H', data[3:5])[0] - self.message_count = struct.unpack('>H', data[5:7])[0] - - self.events = [] - for e in range(7, length + 1): - self.events.append(byte2int(data[e])) - - def __str__(self): - ''' Builds a representation of the response - - :returns: The string representation of the response - ''' - arguments = (self.function_code, self.status, self.message_count, self.event_count) - return "GetCommEventLogResponse(%d, %d, %d, %d)" % arguments - - -#---------------------------------------------------------------------------# -# TODO Make these only work on serial -#---------------------------------------------------------------------------# -
[docs]class ReportSlaveIdRequest(ModbusRequest): - ''' - This function code is used to read the description of the type, the - current status, and other information specific to a remote device. - ''' - function_code = 0x11 - _rtu_frame_size = 4 - -
[docs] def __init__(self, **kwargs): - ''' Initializes a new instance - ''' - ModbusRequest.__init__(self, **kwargs)
- -
[docs] def encode(self): - ''' Encodes the message - ''' - return b''
- -
[docs] def decode(self, data): - ''' Decodes data part of the message. - - :param data: The incoming data - ''' - pass
- -
[docs] def execute(self): - ''' Run a read exeception status request against the store - - :returns: The populated response - ''' - identifier = b'\x70\x79\x6d\x6f\x64\x62\x75\x73' - return ReportSlaveIdResponse(identifier)
- -
[docs] def __str__(self): - ''' Builds a representation of the request - - :returns: The string representation of the request - ''' - return "ResportSlaveIdRequest(%d)" % self.function_code
- - -
[docs]class ReportSlaveIdResponse(ModbusResponse): - ''' - The format of a normal response is shown in the following example. - The data contents are specific to each type of device. - ''' - function_code = 0x11 - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, identifier=b'\x00', status=True, **kwargs): - ''' Initializes a new instance - - :param identifier: The identifier of the slave - :param status: The status response to report - ''' - ModbusResponse.__init__(self, **kwargs) - self.identifier = identifier - self.status = status
- -
[docs] def encode(self): - ''' Encodes the response - - :returns: The byte encoded message - ''' - if self.status: status = ModbusStatus.SlaveOn - else: status = ModbusStatus.SlaveOff - length = len(self.identifier) + 2 - packet = int2byte(length) - packet += self.identifier # we assume it is already encoded - packet += int2byte(status) - return packet
- -
[docs] def decode(self, data): - ''' Decodes a the response - - Since the identifier is device dependent, we just return the - raw value that a user can decode to whatever it should be. - - :param data: The packet data to decode - ''' - length = byte2int(data[0]) - self.identifier = data[1:length + 1] - status = byte2int(data[-1]) - self.status = status == ModbusStatus.SlaveOn
- -
[docs] def __str__(self): - ''' Builds a representation of the response - - :returns: The string representation of the response - ''' - arguments = (self.function_code, self.identifier, self.status) - return "ResportSlaveIdResponse(%d, %d, %d)" % arguments
- -#---------------------------------------------------------------------------# -# TODO Make these only work on serial -#---------------------------------------------------------------------------# -# report device identification 43, 14 - -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ReadExceptionStatusRequest", "ReadExceptionStatusResponse", - "GetCommEventCounterRequest", "GetCommEventCounterResponse", - "GetCommEventLogRequest", "GetCommEventLogResponse", - "ReportSlaveIdRequest", "ReportSlaveIdResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/payload.html b/doc/sphinx/html/_modules/pymodbus/payload.html deleted file mode 100644 index 67fb0efeb..000000000 --- a/doc/sphinx/html/_modules/pymodbus/payload.html +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - pymodbus.payload — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.payload

-'''
-Modbus Payload Builders
-------------------------
-
-A collection of utilities for building and decoding
-modbus messages payloads.
-'''
-from struct import pack, unpack
-from pymodbus.interfaces import IPayloadBuilder
-from pymodbus.constants import Endian
-from pymodbus.utilities import pack_bitstring
-from pymodbus.utilities import unpack_bitstring
-from pymodbus.exceptions import ParameterException
-
-
-
[docs]class BinaryPayloadBuilder(IPayloadBuilder): - ''' - A utility that helps build payload messages to be - written with the various modbus messages. It really is just - a simple wrapper around the struct module, however it saves - time looking up the format strings. What follows is a simple - example:: - - builder = BinaryPayloadBuilder(endian=Endian.Little) - builder.add_8bit_uint(1) - builder.add_16bit_uint(2) - payload = builder.build() - ''' - -
[docs] def __init__(self, payload=None, endian=Endian.Little): - ''' Initialize a new instance of the payload builder - - :param payload: Raw payload data to initialize with - :param endian: The endianess of the payload - ''' - self._payload = payload or [] - self._endian = endian
- -
[docs] def to_string(self): - ''' Return the payload buffer as a string - - :returns: The payload buffer as a string - ''' - return b''.join(self._payload)
- -
[docs] def __str__(self): - ''' Return the payload buffer as a string - - :returns: The payload buffer as a string - ''' - return self.to_string().decode('utf-8')
- -
[docs] def reset(self): - ''' Reset the payload buffer - ''' - self._payload = []
- -
[docs] def to_registers(self): - ''' Convert the payload buffer into a register - layout that can be used as a context block. - - :returns: The register layout to use as a block - ''' - fstring = self._endian + 'H' - payload = self.build() - return [unpack(fstring, value)[0] for value in payload]
- -
[docs] def build(self): - ''' Return the payload buffer as a list - - This list is two bytes per element and can - thus be treated as a list of registers. - - :returns: The payload buffer as a list - ''' - string = self.to_string() - length = len(string) - string = string + (b'\x00' * (length % 2)) - return [string[i:i+2] for i in range(0, length, 2)]
- -
[docs] def add_bits(self, values): - ''' Adds a collection of bits to be encoded - - If these are less than a multiple of eight, - they will be left padded with 0 bits to make - it so. - - :param value: The value to add to the buffer - ''' - value = pack_bitstring(values) - self._payload.append(value)
- -
[docs] def add_8bit_uint(self, value): - ''' Adds a 8 bit unsigned int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'B' - self._payload.append(pack(fstring, value))
- -
[docs] def add_16bit_uint(self, value): - ''' Adds a 16 bit unsigned int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'H' - self._payload.append(pack(fstring, value))
- -
[docs] def add_32bit_uint(self, value): - ''' Adds a 32 bit unsigned int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'I' - self._payload.append(pack(fstring, value))
- -
[docs] def add_64bit_uint(self, value): - ''' Adds a 64 bit unsigned int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'Q' - self._payload.append(pack(fstring, value))
- -
[docs] def add_8bit_int(self, value): - ''' Adds a 8 bit signed int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'b' - self._payload.append(pack(fstring, value))
- -
[docs] def add_16bit_int(self, value): - ''' Adds a 16 bit signed int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'h' - self._payload.append(pack(fstring, value))
- -
[docs] def add_32bit_int(self, value): - ''' Adds a 32 bit signed int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'i' - self._payload.append(pack(fstring, value))
- -
[docs] def add_64bit_int(self, value): - ''' Adds a 64 bit signed int to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'q' - self._payload.append(pack(fstring, value))
- -
[docs] def add_32bit_float(self, value): - ''' Adds a 32 bit float to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'f' - self._payload.append(pack(fstring, value))
- -
[docs] def add_64bit_float(self, value): - ''' Adds a 64 bit float(double) to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + 'd' - self._payload.append(pack(fstring, value))
- -
[docs] def add_string(self, value): - ''' Adds a string to the buffer - - :param value: The value to add to the buffer - ''' - fstring = self._endian + str(len(value)) + 's' - self._payload.append(pack(fstring, value))
- - -
[docs]class BinaryPayloadDecoder(object): - ''' - A utility that helps decode payload messages from a modbus - reponse message. It really is just a simple wrapper around - the struct module, however it saves time looking up the format - strings. What follows is a simple example:: - - decoder = BinaryPayloadDecoder(payload) - first = decoder.decode_8bit_uint() - second = decoder.decode_16bit_uint() - ''' - -
[docs] def __init__(self, payload, endian=Endian.Little): - ''' Initialize a new payload decoder - - :param payload: The payload to decode with - :param endian: The endianess of the payload - ''' - self._payload = payload - self._pointer = 0x00 - self._endian = endian
- - @classmethod -
[docs] def fromRegisters(klass, registers, endian=Endian.Little): - ''' Initialize a payload decoder with the result of - reading a collection of registers from a modbus device. - - The registers are treated as a list of 2 byte values. - We have to do this because of how the data has already - been decoded by the rest of the library. - - :param registers: The register results to initialize with - :param endian: The endianess of the payload - :returns: An initialized PayloadDecoder - ''' - if isinstance(registers, list): # repack into flat binary - payload = b''.join(pack(endian + 'H', x) for x in registers) - return klass(payload, endian) - raise ParameterException('Invalid collection of registers supplied')
- - @classmethod -
[docs] def fromCoils(klass, coils, endian=Endian.Little): - ''' Initialize a payload decoder with the result of - reading a collection of coils from a modbus device. - - The coils are treated as a list of bit(boolean) values. - - :param coils: The coil results to initialize with - :param endian: The endianess of the payload - :returns: An initialized PayloadDecoder - ''' - if isinstance(coils, list): - payload = pack_bitstring(coils) - return klass(payload, endian) - raise ParameterException('Invalid collection of coils supplied')
- -
[docs] def reset(self): - ''' Reset the decoder pointer back to the start - ''' - self._pointer = 0x00
- -
[docs] def decode_8bit_uint(self): - ''' Decodes a 8 bit unsigned int from the buffer - ''' - self._pointer += 1 - fstring = self._endian + 'B' - handle = self._payload[self._pointer - 1:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_bits(self): - ''' Decodes a byte worth of bits from the buffer - ''' - self._pointer += 1 - fstring = self._endian + 'B' - handle = self._payload[self._pointer - 1:self._pointer] - return unpack_bitstring(handle)
- -
[docs] def decode_16bit_uint(self): - ''' Decodes a 16 bit unsigned int from the buffer - ''' - self._pointer += 2 - fstring = self._endian + 'H' - handle = self._payload[self._pointer - 2:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_32bit_uint(self): - ''' Decodes a 32 bit unsigned int from the buffer - ''' - self._pointer += 4 - fstring = self._endian + 'I' - handle = self._payload[self._pointer - 4:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_64bit_uint(self): - ''' Decodes a 64 bit unsigned int from the buffer - ''' - self._pointer += 8 - fstring = self._endian + 'Q' - handle = self._payload[self._pointer - 8:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_8bit_int(self): - ''' Decodes a 8 bit signed int from the buffer - ''' - self._pointer += 1 - fstring = self._endian + 'b' - handle = self._payload[self._pointer - 1:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_16bit_int(self): - ''' Decodes a 16 bit signed int from the buffer - ''' - self._pointer += 2 - fstring = self._endian + 'h' - handle = self._payload[self._pointer - 2:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_32bit_int(self): - ''' Decodes a 32 bit signed int from the buffer - ''' - self._pointer += 4 - fstring = self._endian + 'i' - handle = self._payload[self._pointer - 4:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_64bit_int(self): - ''' Decodes a 64 bit signed int from the buffer - ''' - self._pointer += 8 - fstring = self._endian + 'q' - handle = self._payload[self._pointer - 8:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_32bit_float(self): - ''' Decodes a 32 bit float from the buffer - ''' - self._pointer += 4 - fstring = self._endian + 'f' - handle = self._payload[self._pointer - 4:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_64bit_float(self): - ''' Decodes a 64 bit float(double) from the buffer - ''' - self._pointer += 8 - fstring = self._endian + 'd' - handle = self._payload[self._pointer - 8:self._pointer] - return unpack(fstring, handle)[0]
- -
[docs] def decode_string(self, size=1): - ''' Decodes a string from the buffer - - :param size: The size of the string to decode - ''' - self._pointer += size - return self._payload[self._pointer - size:self._pointer]
- -#---------------------------------------------------------------------------# -# Exported Identifiers -#---------------------------------------------------------------------------# -__all__ = ["BinaryPayloadBuilder", "BinaryPayloadDecoder"] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/pdu.html b/doc/sphinx/html/_modules/pymodbus/pdu.html deleted file mode 100644 index afcda7a14..000000000 --- a/doc/sphinx/html/_modules/pymodbus/pdu.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - pymodbus.pdu — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.pdu

-'''
-Contains base classes for modbus request/response/error packets
-'''
-from pymodbus.interfaces import Singleton
-from pymodbus.exceptions import NotImplementedException
-from pymodbus.constants import Defaults
-from pymodbus.utilities import rtuFrameSize
-from pymodbus.compat import iteritems, int2byte, byte2int
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Base PDU's
-#---------------------------------------------------------------------------#
-
[docs]class ModbusPDU(object): - ''' - Base class for all Modbus mesages - - .. attribute:: transaction_id - - This value is used to uniquely identify a request - response pair. It can be implemented as a simple counter - - .. attribute:: protocol_id - - This is a constant set at 0 to indicate Modbus. It is - put here for ease of expansion. - - .. attribute:: unit_id - - This is used to route the request to the correct child. In - the TCP modbus, it is used for routing (or not used at all. However, - for the serial versions, it is used to specify which child to perform - the requests against. The value 0x00 represents the broadcast address - (also 0xff). - - .. attribute:: check - - This is used for LRC/CRC in the serial modbus protocols - - .. attribute:: skip_encode - - This is used when the message payload has already been encoded. - Generally this will occur when the PayloadBuilder is being used - to create a complicated message. By setting this to True, the - request will pass the currently encoded message through instead - of encoding it again. - ''' - -
[docs] def __init__(self, **kwargs): - ''' Initializes the base data for a modbus request ''' - self.transaction_id = kwargs.get('transaction', Defaults.TransactionId) - self.protocol_id = kwargs.get('protocol', Defaults.ProtocolId) - self.unit_id = kwargs.get('unit', Defaults.UnitId) - self.skip_encode = kwargs.get('skip_encode', False) - self.check = 0x0000
- -
[docs] def encode(self): - ''' Encodes the message - - :raises: A not implemented exception - ''' - raise NotImplementedException()
- -
[docs] def decode(self, data): - ''' Decodes data part of the message. - - :param data: is a string object - :raises: A not implemented exception - ''' - raise NotImplementedException()
- - @classmethod -
[docs] def calculateRtuFrameSize(cls, buffer): - ''' Calculates the size of a PDU. - - :param buffer: A buffer containing the data that have been received. - :returns: The number of bytes in the PDU. - ''' - if hasattr(cls, '_rtu_frame_size'): - return cls._rtu_frame_size - elif hasattr(cls, '_rtu_byte_count_pos'): - return rtuFrameSize(buffer, cls._rtu_byte_count_pos) - else: raise NotImplementedException( - "Cannot determine RTU frame size for %s" % cls.__name__)
- - -
[docs]class ModbusRequest(ModbusPDU): - ''' Base class for a modbus request PDU ''' - -
[docs] def __init__(self, **kwargs): - ''' Proxy to the lower level initializer ''' - ModbusPDU.__init__(self, **kwargs)
- -
[docs] def doException(self, exception): - ''' Builds an error response based on the function - - :param exception: The exception to return - :raises: An exception response - ''' - _logger.error("Exception Response F(%d) E(%d)" % - (self.function_code, exception)) - return ExceptionResponse(self.function_code, exception)
- - -
[docs]class ModbusResponse(ModbusPDU): - ''' Base class for a modbus response PDU - - .. attribute:: should_respond - - A flag that indicates if this response returns a result back - to the client issuing the request - - .. attribute:: _rtu_frame_size - - Indicates the size of the modbus rtu response used for - calculating how much to read. - ''' - - should_respond = True - -
[docs] def __init__(self, **kwargs): - ''' Proxy to the lower level initializer ''' - ModbusPDU.__init__(self, **kwargs)
- - -#---------------------------------------------------------------------------# -# Exception PDU's -#---------------------------------------------------------------------------# -
[docs]class ModbusExceptions(Singleton): - ''' - An enumeration of the valid modbus exceptions - ''' - IllegalFunction = 0x01 - IllegalAddress = 0x02 - IllegalValue = 0x03 - SlaveFailure = 0x04 - Acknowledge = 0x05 - SlaveBusy = 0x06 - MemoryParityError = 0x08 - GatewayPathUnavailable = 0x0A - GatewayNoResponse = 0x0B - - @classmethod -
[docs] def decode(cls, code): - ''' Given an error code, translate it to a - string error name. - - :param code: The code number to translate - ''' - values = dict((v, k) for k, v in iteritems(cls.__dict__) - if not k.startswith('__') and not callable(v)) - return values.get(code, None)
- - -
[docs]class ExceptionResponse(ModbusResponse): - ''' Base class for a modbus exception PDU ''' - ExceptionOffset = 0x80 - _rtu_frame_size = 5 - -
[docs] def __init__(self, function_code, exception_code=None, **kwargs): - ''' Initializes the modbus exception response - - :param function_code: The function to build an exception response for - :param exception_code: The specific modbus exception to return - ''' - ModbusResponse.__init__(self, **kwargs) - self.original_code = function_code - self.function_code = function_code | self.ExceptionOffset - self.exception_code = exception_code
- -
[docs] def encode(self): - ''' Encodes a modbus exception response - - :returns: The encoded exception packet - ''' - return int2byte(self.exception_code)
- -
[docs] def decode(self, data): - ''' Decodes a modbus exception response - - :param data: The packet data to decode - ''' - self.exception_code = byte2int(data[0])
- -
[docs] def __str__(self): - ''' Builds a representation of an exception response - - :returns: The string representation of an exception response - ''' - message = ModbusExceptions.decode(self.exception_code) - parameters = (self.function_code, self.original_code, message) - return "Exception Response(%d, %d, %s)" % parameters
- - -
[docs]class IllegalFunctionRequest(ModbusRequest): - ''' - Defines the Modbus slave exception type 'Illegal Function' - This exception code is returned if the slave:: - - - does not implement the function code **or** - - is not in a state that allows it to process the function - ''' - ErrorCode = 1 - -
[docs] def __init__(self, function_code, **kwargs): - ''' Initializes a IllegalFunctionRequest - - :param function_code: The function we are erroring on - ''' - ModbusRequest.__init__(self, **kwargs) - self.function_code = function_code
- -
[docs] def decode(self, data): - ''' This is here so this failure will run correctly - - :param data: Not used - ''' - pass
- -
[docs] def execute(self, context): - ''' Builds an illegal function request error response - - :param context: The current context for the message - :returns: The error response packet - ''' - return ExceptionResponse(self.function_code, self.ErrorCode)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - 'ModbusRequest', 'ModbusResponse', 'ModbusExceptions', - 'ExceptionResponse', 'IllegalFunctionRequest', -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/register_read_message.html b/doc/sphinx/html/_modules/pymodbus/register_read_message.html deleted file mode 100644 index 5ecb331d7..000000000 --- a/doc/sphinx/html/_modules/pymodbus/register_read_message.html +++ /dev/null @@ -1,449 +0,0 @@ - - - - - - - - pymodbus.register_read_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.register_read_message

-'''
-Register Reading Request/Response
----------------------------------
-'''
-import struct
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.compat import int2byte, byte2int
-
-
-
[docs]class ReadRegistersRequestBase(ModbusRequest): - ''' - Base class for reading a modbus register - ''' - _rtu_frame_size = 8 - -
[docs] def __init__(self, address, count, **kwargs): - ''' Initializes a new instance - - :param address: The address to start the read from - :param count: The number of registers to read - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - self.count = count
- -
[docs] def encode(self): - ''' Encodes the request packet - - :return: The encoded packet - ''' - return struct.pack('>HH', self.address, self.count)
- -
[docs] def decode(self, data): - ''' Decode a register request packet - - :param data: The request to decode - ''' - self.address, self.count = struct.unpack('>HH', data)
- -
[docs] def get_response_pdu_size(self): - """ - Func_code (1 byte) + Byte Count(1 byte) + 2 * Quantity of Coils (n Bytes) - :return: - """ - return 1 + 1 + 2 * self.count
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "ReadRegisterRequest (%d,%d)" % (self.address, self.count)
- - -
[docs]class ReadRegistersResponseBase(ModbusResponse): - ''' - Base class for responsing to a modbus register read - ''' - - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, values, **kwargs): - ''' Initializes a new instance - - :param values: The values to write to - ''' - ModbusResponse.__init__(self, **kwargs) - self.registers = values or []
- -
[docs] def encode(self): - ''' Encodes the response packet - - :returns: The encoded packet - ''' - result = int2byte(len(self.registers) * 2) - for register in self.registers: - result += struct.pack('>H', register) - return result
- -
[docs] def decode(self, data): - ''' Decode a register response packet - - :param data: The request to decode - ''' - byte_count = byte2int(data[0]) - self.registers = [] - for i in range(1, byte_count + 1, 2): - self.registers.append(struct.unpack('>H', data[i:i + 2])[0])
- -
[docs] def getRegister(self, index): - ''' Get the requested register - - :param index: The indexed register to retrieve - :returns: The request register - ''' - return self.registers[index]
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "ReadRegisterResponse (%d)" % len(self.registers)
- - -
[docs]class ReadHoldingRegistersRequest(ReadRegistersRequestBase): - ''' - This function code is used to read the contents of a contiguous block - of holding registers in a remote device. The Request PDU specifies the - starting register address and the number of registers. In the PDU - Registers are addressed starting at zero. Therefore registers numbered - 1-16 are addressed as 0-15. - ''' - function_code = 3 - -
[docs] def __init__(self, address=None, count=None, **kwargs): - ''' Initializes a new instance of the request - - :param address: The starting address to read from - :param count: The number of registers to read from address - ''' - ReadRegistersRequestBase.__init__(self, address, count, **kwargs)
- -
[docs] def execute(self, context): - ''' Run a read holding request against a datastore - - :param context: The datastore to request from - :returns: An initialized response, exception message otherwise - ''' - if not (1 <= self.count <= 0x7d): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, self.count): - return self.doException(merror.IllegalAddress) - values = context.getValues(self.function_code, self.address, self.count) - return ReadHoldingRegistersResponse(values)
- - -
[docs]class ReadHoldingRegistersResponse(ReadRegistersResponseBase): - ''' - This function code is used to read the contents of a contiguous block - of holding registers in a remote device. The Request PDU specifies the - starting register address and the number of registers. In the PDU - Registers are addressed starting at zero. Therefore registers numbered - 1-16 are addressed as 0-15. - ''' - function_code = 3 - -
[docs] def __init__(self, values=None, **kwargs): - ''' Initializes a new response instance - - :param values: The resulting register values - ''' - ReadRegistersResponseBase.__init__(self, values, **kwargs)
- - -
[docs]class ReadInputRegistersRequest(ReadRegistersRequestBase): - ''' - This function code is used to read from 1 to approx. 125 contiguous - input registers in a remote device. The Request PDU specifies the - starting register address and the number of registers. In the PDU - Registers are addressed starting at zero. Therefore input registers - numbered 1-16 are addressed as 0-15. - ''' - function_code = 4 - -
[docs] def __init__(self, address=None, count=None, **kwargs): - ''' Initializes a new instance of the request - - :param address: The starting address to read from - :param count: The number of registers to read from address - ''' - ReadRegistersRequestBase.__init__(self, address, count, **kwargs)
- -
[docs] def execute(self, context): - ''' Run a read input request against a datastore - - :param context: The datastore to request from - :returns: An initialized response, exception message otherwise - ''' - if not (1 <= self.count <= 0x7d): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, self.count): - return self.doException(merror.IllegalAddress) - values = context.getValues(self.function_code, self.address, self.count) - return ReadInputRegistersResponse(values)
- - -
[docs]class ReadInputRegistersResponse(ReadRegistersResponseBase): - ''' - This function code is used to read from 1 to approx. 125 contiguous - input registers in a remote device. The Request PDU specifies the - starting register address and the number of registers. In the PDU - Registers are addressed starting at zero. Therefore input registers - numbered 1-16 are addressed as 0-15. - ''' - function_code = 4 - -
[docs] def __init__(self, values=None, **kwargs): - ''' Initializes a new response instance - - :param values: The resulting register values - ''' - ReadRegistersResponseBase.__init__(self, values, **kwargs)
- - -
[docs]class ReadWriteMultipleRegistersRequest(ModbusRequest): - ''' - This function code performs a combination of one read operation and one - write operation in a single MODBUS transaction. The write - operation is performed before the read. - - Holding registers are addressed starting at zero. Therefore holding - registers 1-16 are addressed in the PDU as 0-15. - - The request specifies the starting address and number of holding - registers to be read as well as the starting address, number of holding - registers, and the data to be written. The byte count specifies the - number of bytes to follow in the write data field." - ''' - function_code = 23 - _rtu_byte_count_pos = 10 - -
[docs] def __init__(self, **kwargs): - ''' Initializes a new request message - - :param read_address: The address to start reading from - :param read_count: The number of registers to read from address - :param write_address: The address to start writing to - :param write_registers: The registers to write to the specified address - ''' - ModbusRequest.__init__(self, **kwargs) - self.read_address = kwargs.get('read_address', 0x00) - self.read_count = kwargs.get('read_count', 0) - self.write_address = kwargs.get('write_address', 0x00) - self.write_registers = kwargs.get('write_registers', None) - if not hasattr(self.write_registers, '__iter__'): - self.write_registers = [self.write_registers] - self.write_count = len(self.write_registers) - self.write_byte_count = self.write_count * 2
- -
[docs] def encode(self): - ''' Encodes the request packet - - :returns: The encoded packet - ''' - result = struct.pack('>HHHHB', - self.read_address, self.read_count, \ - self.write_address, self.write_count, self.write_byte_count) - for register in self.write_registers: - result += struct.pack('>H', register) - return result
- -
[docs] def decode(self, data): - ''' Decode the register request packet - - :param data: The request to decode - ''' - self.read_address, self.read_count, \ - self.write_address, self.write_count, \ - self.write_byte_count = struct.unpack('>HHHHB', data[:9]) - self.write_registers = [] - for i in range(9, self.write_byte_count + 9, 2): - register = struct.unpack('>H', data[i:i + 2])[0] - self.write_registers.append(register)
- -
[docs] def execute(self, context): - ''' Run a write single register request against a datastore - - :param context: The datastore to request from - :returns: An initialized response, exception message otherwise - ''' - if not (1 <= self.read_count <= 0x07d): - return self.doException(merror.IllegalValue) - if not (1 <= self.write_count <= 0x079): - return self.doException(merror.IllegalValue) - if (self.write_byte_count != self.write_count * 2): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.write_address, - self.write_count): - return self.doException(merror.IllegalAddress) - if not context.validate(self.function_code, self.read_address, - self.read_count): - return self.doException(merror.IllegalAddress) - context.setValues(self.function_code, self.write_address, - self.write_registers) - registers = context.getValues(self.function_code, self.read_address, - self.read_count) - return ReadWriteMultipleRegistersResponse(registers)
- -
[docs] def get_response_pdu_size(self): - """ - Func_code (1 byte) + Byte Count(1 byte) + 2 * Quantity of Coils (n Bytes) - :return: - """ - return 1 + 1 + 2 * self.read_count
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - params = (self.read_address, self.read_count, self.write_address, - self.write_count) - return "ReadWriteNRegisterRequest R(%d,%d) W(%d,%d)" % params
- - -
[docs]class ReadWriteMultipleRegistersResponse(ModbusResponse): - ''' - The normal response contains the data from the group of registers that - were read. The byte count field specifies the quantity of bytes to - follow in the read data field. - ''' - function_code = 23 - _rtu_byte_count_pos = 2 - -
[docs] def __init__(self, values=None, **kwargs): - ''' Initializes a new instance - - :param values: The register values to write - ''' - ModbusResponse.__init__(self, **kwargs) - self.registers = values or []
- -
[docs] def encode(self): - ''' Encodes the response packet - - :returns: The encoded packet - ''' - result = int2byte(len(self.registers) * 2) - for register in self.registers: - result += struct.pack('>H', register) - return result
- -
[docs] def decode(self, data): - ''' Decode the register response packet - - :param data: The response to decode - ''' - bytecount = byte2int(data[0]) - for i in range(1, bytecount, 2): - self.registers.append(struct.unpack('>H', data[i:i + 2])[0])
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "ReadWriteNRegisterResponse (%d)" % len(self.registers)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "ReadHoldingRegistersRequest", "ReadHoldingRegistersResponse", - "ReadInputRegistersRequest", "ReadInputRegistersResponse", - "ReadWriteMultipleRegistersRequest", "ReadWriteMultipleRegistersResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/register_write_message.html b/doc/sphinx/html/_modules/pymodbus/register_write_message.html deleted file mode 100644 index f2990db88..000000000 --- a/doc/sphinx/html/_modules/pymodbus/register_write_message.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - pymodbus.register_write_message — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.register_write_message

-'''
-Register Writing Request/Response Messages
--------------------------------------------
-'''
-import struct
-from pymodbus.pdu import ModbusRequest
-from pymodbus.pdu import ModbusResponse
-from pymodbus.pdu import ModbusExceptions as merror
-
-
-
[docs]class WriteSingleRegisterRequest(ModbusRequest): - ''' - This function code is used to write a single holding register in a - remote device. - - The Request PDU specifies the address of the register to - be written. Registers are addressed starting at zero. Therefore register - numbered 1 is addressed as 0. - ''' - function_code = 6 - _rtu_frame_size = 8 - -
[docs] def __init__(self, address=None, value=None, **kwargs): - ''' Initializes a new instance - - :param address: The address to start writing add - :param value: The values to write - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - self.value = value
- -
[docs] def encode(self): - ''' Encode a write single register packet packet request - - :returns: The encoded packet - ''' - if self.skip_encode: - return self.value - return struct.pack('>HH', self.address, self.value)
- -
[docs] def decode(self, data): - ''' Decode a write single register packet packet request - - :param data: The request to decode - ''' - self.address, self.value = struct.unpack('>HH', data)
- -
[docs] def execute(self, context): - ''' Run a write single register request against a datastore - - :param context: The datastore to request from - :returns: An initialized response, exception message otherwise - ''' - if not (0 <= self.value <= 0xffff): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, 1): - return self.doException(merror.IllegalAddress) - - context.setValues(self.function_code, self.address, [self.value]) - values = context.getValues(self.function_code, self.address, 1) - return WriteSingleRegisterResponse(self.address, values[0])
- -
[docs] def get_response_pdu_size(self): - """ - Func_code (1 byte) + Register Address(2 byte) + Register Value (2 bytes) - :return: - """ - return 1 + 2 + 2
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - return "WriteRegisterRequest %d => %d" % (self.address, self.value)
- - -
[docs]class WriteSingleRegisterResponse(ModbusResponse): - ''' - The normal response is an echo of the request, returned after the - register contents have been written. - ''' - function_code = 6 - _rtu_frame_size = 8 - -
[docs] def __init__(self, address=None, value=None, **kwargs): - ''' Initializes a new instance - - :param address: The address to start writing add - :param value: The values to write - ''' - ModbusResponse.__init__(self, **kwargs) - self.address = address - self.value = value
- -
[docs] def encode(self): - ''' Encode a write single register packet packet request - - :returns: The encoded packet - ''' - return struct.pack('>HH', self.address, self.value)
- -
[docs] def decode(self, data): - ''' Decode a write single register packet packet request - - :param data: The request to decode - ''' - self.address, self.value = struct.unpack('>HH', data)
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - params = (self.address, self.value) - return "WriteRegisterResponse %d => %d" % params
- - -#---------------------------------------------------------------------------# -# Write Multiple Registers -#---------------------------------------------------------------------------# -
[docs]class WriteMultipleRegistersRequest(ModbusRequest): - ''' - This function code is used to write a block of contiguous registers (1 - to approx. 120 registers) in a remote device. - - The requested written values are specified in the request data field. - Data is packed as two bytes per register. - ''' - function_code = 16 - _rtu_byte_count_pos = 6 - _pdu_length = 5 #func + adress1 + adress2 + outputQuant1 + outputQuant2 - -
[docs] def __init__(self, address=None, values=None, **kwargs): - ''' Initializes a new instance - - :param address: The address to start writing to - :param values: The values to write - ''' - ModbusRequest.__init__(self, **kwargs) - self.address = address - if values is None: - values = [] - elif not hasattr(values, '__iter__'): - values = [values] - self.values = values - self.count = len(self.values) - self.byte_count = self.count * 2
- -
[docs] def encode(self): - ''' Encode a write single register packet packet request - - :returns: The encoded packet - ''' - packet = struct.pack('>HHB', self.address, self.count, self.byte_count) - if self.skip_encode: - return packet + b''.join(self.values) - - for value in self.values: - packet += struct.pack('>H', value) - - return packet
- -
[docs] def decode(self, data): - ''' Decode a write single register packet packet request - - :param data: The request to decode - ''' - self.address, self.count, \ - self.byte_count = struct.unpack('>HHB', data[:5]) - self.values = [] # reset - for idx in range(5, (self.count * 2) + 5, 2): - self.values.append(struct.unpack('>H', data[idx:idx + 2])[0])
- -
[docs] def execute(self, context): - ''' Run a write single register request against a datastore - - :param context: The datastore to request from - :returns: An initialized response, exception message otherwise - ''' - if not (1 <= self.count <= 0x07b): - return self.doException(merror.IllegalValue) - if (self.byte_count != self.count * 2): - return self.doException(merror.IllegalValue) - if not context.validate(self.function_code, self.address, self.count): - return self.doException(merror.IllegalAddress) - - context.setValues(self.function_code, self.address, self.values) - return WriteMultipleRegistersResponse(self.address, self.count)
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - params = (self.address, self.count) - return "WriteMultipleRegisterRequest %d => %d" % params
- - -
[docs]class WriteMultipleRegistersResponse(ModbusResponse): - ''' - "The normal response returns the function code, starting address, and - quantity of registers written. - ''' - function_code = 16 - _rtu_frame_size = 8 - -
[docs] def __init__(self, address=None, count=None, **kwargs): - ''' Initializes a new instance - - :param address: The address to start writing to - :param count: The number of registers to write to - ''' - ModbusResponse.__init__(self, **kwargs) - self.address = address - self.count = count
- -
[docs] def encode(self): - ''' Encode a write single register packet packet request - - :returns: The encoded packet - ''' - return struct.pack('>HH', self.address, self.count)
- -
[docs] def decode(self, data): - ''' Decode a write single register packet packet request - - :param data: The request to decode - ''' - self.address, self.count = struct.unpack('>HH', data)
- -
[docs] def __str__(self): - ''' Returns a string representation of the instance - - :returns: A string representation of the instance - ''' - params = (self.address, self.count) - return "WriteMultipleRegisterResponse (%d,%d)" % params
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "WriteSingleRegisterRequest", "WriteSingleRegisterResponse", - "WriteMultipleRegistersRequest", "WriteMultipleRegistersResponse", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/server/async.html b/doc/sphinx/html/_modules/pymodbus/server/async.html deleted file mode 100644 index dbbe5cea1..000000000 --- a/doc/sphinx/html/_modules/pymodbus/server/async.html +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - - - pymodbus.server.async — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.server.async

-'''
-Implementation of a Twisted Modbus Server
-------------------------------------------
-
-'''
-from binascii import b2a_hex
-from twisted.internet import protocol
-from twisted.internet.protocol import ServerFactory
-
-from pymodbus.constants import Defaults
-from pymodbus.factory import ServerDecoder
-from pymodbus.datastore import ModbusServerContext
-from pymodbus.device import ModbusControlBlock
-from pymodbus.device import ModbusAccessControl
-from pymodbus.device import ModbusDeviceIdentification
-from pymodbus.exceptions import NoSuchSlaveException
-from pymodbus.transaction import ModbusSocketFramer, ModbusAsciiFramer
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.internal.ptwisted import InstallManagementConsole
-from pymodbus.compat import byte2int
-from twisted.internet import reactor
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Modbus TCP Server
-#---------------------------------------------------------------------------#
-
[docs]class ModbusTcpProtocol(protocol.Protocol): - ''' Implements a modbus server in twisted ''' - -
[docs] def connectionMade(self): - ''' Callback for when a client connects - - ..note:: since the protocol factory cannot be accessed from the - protocol __init__, the client connection made is essentially - our __init__ method. - ''' - _logger.debug("Client Connected [%s]" % self.transport.getHost()) - self.framer = self.factory.framer(decoder=self.factory.decoder)
- -
[docs] def connectionLost(self, reason): - ''' Callback for when a client disconnects - - :param reason: The client's reason for disconnecting - ''' - _logger.debug("Client Disconnected: %s" % reason)
- -
[docs] def dataReceived(self, data): - ''' Callback when we receive any data - - :param data: The data sent by the client - ''' - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug(' '.join([hex(byte2int(x)) for x in data])) - if not self.factory.control.ListenOnly: - self.framer.processIncomingPacket(data, self._execute)
- -
[docs] def _execute(self, request): - ''' Executes the request and returns the result - - :param request: The decoded request message - ''' - try: - context = self.factory.store[request.unit_id] - response = request.execute(context) - except NoSuchSlaveException as ex: - _logger.debug("requested slave does not exist: %s" % request.unit_id ) - if self.factory.ignore_missing_slaves: - return # the client will simply timeout waiting for a response - response = request.doException(merror.GatewayNoResponse) - except Exception as ex: - _logger.debug("Datastore unable to fulfill request: %s" % ex) - response = request.doException(merror.SlaveFailure) - #self.framer.populateResult(response) - response.transaction_id = request.transaction_id - response.unit_id = request.unit_id - self._send(response)
- -
[docs] def _send(self, message): - ''' Send a request (string) to the network - - :param message: The unencoded modbus response - ''' - if message.should_respond: - self.factory.control.Counter.BusMessage += 1 - pdu = self.framer.buildPacket(message) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug('send: %s' % b2a_hex(pdu)) - return self.transport.write(pdu)
- - -
[docs]class ModbusServerFactory(ServerFactory): - ''' - Builder class for a modbus server - - This also holds the server datastore so that it is - persisted between connections - ''' - - protocol = ModbusTcpProtocol - -
[docs] def __init__(self, store, framer=None, identity=None, **kwargs): - ''' Overloaded initializer for the modbus factory - - If the identify structure is not passed in, the ModbusControlBlock - uses its own empty structure. - - :param store: The ModbusServerContext datastore - :param framer: The framer strategy to use - :param identity: An optional identify structure - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - self.decoder = ServerDecoder() - self.framer = framer or ModbusSocketFramer - self.store = store or ModbusServerContext() - self.control = ModbusControlBlock() - self.access = ModbusAccessControl() - self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) - - if isinstance(identity, ModbusDeviceIdentification): - self.control.Identity.update(identity)
- - -#---------------------------------------------------------------------------# -# Modbus UDP Server -#---------------------------------------------------------------------------# -
[docs]class ModbusUdpProtocol(protocol.DatagramProtocol): - ''' Implements a modbus udp server in twisted ''' - -
[docs] def __init__(self, store, framer=None, identity=None, **kwargs): - ''' Overloaded initializer for the modbus factory - - If the identify structure is not passed in, the ModbusControlBlock - uses its own empty structure. - - :param store: The ModbusServerContext datastore - :param framer: The framer strategy to use - :param identity: An optional identify structure - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - framer = framer or ModbusSocketFramer - self.framer = framer(decoder=ServerDecoder()) - self.store = store or ModbusServerContext() - self.control = ModbusControlBlock() - self.access = ModbusAccessControl() - self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) - - if isinstance(identity, ModbusDeviceIdentification): - self.control.Identity.update(identity)
- -
[docs] def datagramReceived(self, data, addr): - ''' Callback when we receive any data - - :param data: The data sent by the client - ''' - _logger.debug("Client Connected [%s:%s]" % addr) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug(" ".join([hex(byte2int(x)) for x in data])) - if not self.control.ListenOnly: - continuation = lambda request: self._execute(request, addr) - self.framer.processIncomingPacket(data, continuation)
- -
[docs] def _execute(self, request, addr): - ''' Executes the request and returns the result - - :param request: The decoded request message - ''' - try: - context = self.store[request.unit_id] - response = request.execute(context) - except NoSuchSlaveException as ex: - _logger.debug("requested slave does not exist: %s" % request.unit_id ) - if self.ignore_missing_slaves: - return # the client will simply timeout waiting for a response - response = request.doException(merror.GatewayNoResponse) - except Exception as ex: - _logger.debug("Datastore unable to fulfill request: %s" % ex) - response = request.doException(merror.SlaveFailure) - #self.framer.populateResult(response) - response.transaction_id = request.transaction_id - response.unit_id = request.unit_id - self._send(response, addr)
- -
[docs] def _send(self, message, addr): - ''' Send a request (string) to the network - - :param message: The unencoded modbus response - :param addr: The (host, port) to send the message to - ''' - self.control.Counter.BusMessage += 1 - pdu = self.framer.buildPacket(message) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug('send: %s' % b2a_hex(pdu)) - return self.transport.write(pdu, addr)
- - -#---------------------------------------------------------------------------# -# Starting Factories -#---------------------------------------------------------------------------# -
[docs]def StartTcpServer(context, identity=None, address=None, console=False, **kwargs): - ''' Helper method to start the Modbus Async TCP server - - :param context: The server data context - :param identify: The server identity to use (default empty) - :param address: An optional (interface, port) to bind to. - :param console: A flag indicating if you want the debug console - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - from twisted.internet import reactor - - address = address or ("", Defaults.Port) - framer = ModbusSocketFramer - factory = ModbusServerFactory(context, framer, identity, **kwargs) - if console: - InstallManagementConsole({'factory': factory}) - - _logger.info("Starting Modbus TCP Server on %s:%s" % address) - reactor.listenTCP(address[1], factory, interface=address[0]) - reactor.run()
- - -
[docs]def StartUdpServer(context, identity=None, address=None, **kwargs): - ''' Helper method to start the Modbus Async Udp server - - :param context: The server data context - :param identify: The server identity to use (default empty) - :param address: An optional (interface, port) to bind to. - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - from twisted.internet import reactor - - address = address or ("", Defaults.Port) - framer = ModbusSocketFramer - server = ModbusUdpProtocol(context, framer, identity, **kwargs) - - _logger.info("Starting Modbus UDP Server on %s:%s" % address) - reactor.listenUDP(address[1], server, interface=address[0]) - reactor.run()
- - -
[docs]def StartSerialServer(context, identity=None, - framer=ModbusAsciiFramer, **kwargs): - ''' Helper method to start the Modbus Async Serial server - - :param context: The server data context - :param identify: The server identity to use (default empty) - :param framer: The framer to use (default ModbusAsciiFramer) - :param port: The serial port to attach to - :param baudrate: The baud rate to use for the serial device - :param console: A flag indicating if you want the debug console - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - from twisted.internet import reactor - from twisted.internet.serialport import SerialPort - - port = kwargs.get('port', '/dev/ttyS0') - baudrate = kwargs.get('baudrate', Defaults.Baudrate) - console = kwargs.get('console', False) - - _logger.info("Starting Modbus Serial Server on %s" % port) - factory = ModbusServerFactory(context, framer, identity, **kwargs) - if console: - InstallManagementConsole({'factory': factory}) - - protocol = factory.buildProtocol(None) - SerialPort.getHost = lambda self: port # hack for logging - SerialPort(protocol, port, reactor, baudrate) - reactor.run()
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "StartTcpServer", "StartUdpServer", "StartSerialServer", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/server/sync.html b/doc/sphinx/html/_modules/pymodbus/server/sync.html deleted file mode 100644 index cd97b92e7..000000000 --- a/doc/sphinx/html/_modules/pymodbus/server/sync.html +++ /dev/null @@ -1,597 +0,0 @@ - - - - - - - - pymodbus.server.sync — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.server.sync

-'''
-Implementation of a Threaded Modbus Server
-------------------------------------------
-
-'''
-from binascii import b2a_hex
-import serial
-import socket
-import traceback
-
-from pymodbus.constants import Defaults
-from pymodbus.factory import ServerDecoder
-from pymodbus.datastore import ModbusServerContext
-from pymodbus.device import ModbusControlBlock
-from pymodbus.device import ModbusDeviceIdentification
-from pymodbus.transaction import *
-from pymodbus.exceptions import NotImplementedException, NoSuchSlaveException
-from pymodbus.pdu import ModbusExceptions as merror
-from pymodbus.compat import socketserver, byte2int
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# Protocol Handlers
-#---------------------------------------------------------------------------#
-
[docs]class ModbusBaseRequestHandler(socketserver.BaseRequestHandler): - ''' Implements the modbus server protocol - - This uses the socketserver.BaseRequestHandler to implement - the client handler. - ''' - -
[docs] def setup(self): - ''' Callback for when a client connects - ''' - _logger.debug("Client Connected [%s:%s]" % self.client_address) - self.running = True - self.framer = self.server.framer(self.server.decoder) - self.server.threads.append(self)
- -
[docs] def finish(self): - ''' Callback for when a client disconnects - ''' - _logger.debug("Client Disconnected [%s:%s]" % self.client_address) - self.server.threads.remove(self)
- -
[docs] def execute(self, request): - ''' The callback to call with the resulting message - - :param request: The decoded request message - ''' - try: - context = self.server.context[request.unit_id] - response = request.execute(context) - except NoSuchSlaveException as ex: - _logger.debug("requested slave does not exist: %s" % request.unit_id ) - if self.server.ignore_missing_slaves: - return # the client will simply timeout waiting for a response - response = request.doException(merror.GatewayNoResponse) - except Exception as ex: - _logger.debug("Datastore unable to fulfill request: %s; %s", ex, traceback.format_exc() ) - response = request.doException(merror.SlaveFailure) - response.transaction_id = request.transaction_id - response.unit_id = request.unit_id - self.send(response)
- - #---------------------------------------------------------------------------# - # Base class implementations - #---------------------------------------------------------------------------# -
[docs] def handle(self): - ''' Callback when we receive any data - ''' - raise NotImplementedException("Method not implemented by derived class")
- -
[docs] def send(self, message): - ''' Send a request (string) to the network - - :param message: The unencoded modbus response - ''' - raise NotImplementedException("Method not implemented by derived class")
- - -# class ModbusSingleRequestHandler(ModbusBaseRequestHandler): -# ''' Implements the modbus server protocol -# -# This uses the socketserver.BaseRequestHandler to implement -# the client handler for a single client(serial clients) -# ''' -# -# def handle(self): -# ''' Callback when we receive any data -# ''' -# while self.running: -# try: -# data = self.request.recv(1024) -# if data: -# if _logger.isEnabledFor(logging.DEBUG): -# _logger.debug(' '.join([hex(byte2int(x)) for x in data])) -# self.framer.processIncomingPacket(data, self.execute) -# except Exception as msg: -# # since we only have a single socket, we cannot exit -# _logger.error("Socket error occurred %s" % msg) -# -# def send(self, message): -# ''' Send a request (string) to the network -# -# :param message: The unencoded modbus response -# ''' - - -
[docs]class ModbusSingleRequestHandler(ModbusBaseRequestHandler): - ''' Implements the modbus server protocol - - This uses the socketserver.BaseRequestHandler to implement - the client handler for a single client(serial clients) - ''' - -
[docs] def handle(self): - ''' Callback when we receive any data - ''' - while self.running: - try: - data = self.request.recv(1024) - if data: - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug(" ".join([hex(byte2int(x)) for x in data])) - self.framer.processIncomingPacket(data, self.execute) - except Exception as msg: - # since we only have a single socket, we cannot exit - _logger.error("Socket error occurred %s" % msg)
- -
[docs] def send(self, message): - ''' Send a request (string) to the network - - :param message: The unencoded modbus response - ''' - if message.should_respond: - #self.server.control.Counter.BusMessage += 1 - pdu = self.framer.buildPacket(message) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug('send: %s' % b2a_hex(pdu)) - return self.request.send(pdu)
- - -
[docs]class ModbusConnectedRequestHandler(ModbusBaseRequestHandler): - ''' Implements the modbus server protocol - - This uses the socketserver.BaseRequestHandler to implement - the client handler for a connected protocol (TCP). - ''' - -
[docs] def handle(self): - '''Callback when we receive any data, until self.running becomes not True. Blocks indefinitely - awaiting data. If shutdown is required, then the global socket.settimeout(<seconds>) may be - used, to allow timely checking of self.running. However, since this also affects socket - connects, if there are outgoing socket connections used in the same program, then these will - be prevented, if the specfied timeout is too short. Hence, this is unreliable. - - To respond to Modbus...Server.server_close() (which clears each handler's self.running), - derive from this class to provide an alternative handler that awakens from time to time when - no input is available and checks self.running. Use Modbus...Server( handler=... ) keyword - to supply the alternative request handler class. - - ''' - while self.running: - try: - data = self.request.recv(1024) - if not data: self.running = False - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug(' '.join([hex(byte2int(x)) for x in data])) - # if not self.server.control.ListenOnly: - self.framer.processIncomingPacket(data, self.execute) - except socket.timeout as msg: - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug("Socket timeout occurred %s", msg) - pass - except socket.error as msg: - _logger.error("Socket error occurred %s" % msg) - self.running = False - except: - _logger.error("Socket exception occurred %s" % traceback.format_exc() ) - self.running = False
- -
[docs] def send(self, message): - ''' Send a request (string) to the network - - :param message: The unencoded modbus response - ''' - if message.should_respond: - #self.server.control.Counter.BusMessage += 1 - pdu = self.framer.buildPacket(message) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug('send: %s' % b2a_hex(pdu)) - return self.request.send(pdu)
- - -
[docs]class ModbusDisconnectedRequestHandler(ModbusBaseRequestHandler): - ''' Implements the modbus server protocol - - This uses the socketserver.BaseRequestHandler to implement - the client handler for a disconnected protocol (UDP). The - only difference is that we have to specify who to send the - resulting packet data to. - ''' - -
[docs] def handle(self): - ''' Callback when we receive any data - ''' - while self.running: - try: - data, self.request = self.request - if not data: self.running = False - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug(' '.join([hex(byte2int(x)) for x in data])) - # if not self.server.control.ListenOnly: - self.framer.processIncomingPacket(data, self.execute) - except socket.timeout: pass - except socket.error as msg: - _logger.error("Socket error occurred %s" % msg) - self.running = False - except: self.running = False
- -
[docs] def send(self, message): - ''' Send a request (string) to the network - - :param message: The unencoded modbus response - ''' - if message.should_respond: - #self.server.control.Counter.BusMessage += 1 - pdu = self.framer.buildPacket(message) - if _logger.isEnabledFor(logging.DEBUG): - _logger.debug('send: %s' % b2a_hex(pdu)) - return self.request.sendto(pdu, self.client_address)
- - -#---------------------------------------------------------------------------# -# Server Implementations -#---------------------------------------------------------------------------# -
[docs]class ModbusTcpServer(socketserver.ThreadingTCPServer): - ''' - A modbus threaded tcp socket server - - We inherit and overload the socket server so that we - can control the client threads as well as have a single - server context instance. - ''' - -
[docs] def __init__(self, context, framer=None, identity=None, address=None, handler=None, **kwargs): - ''' Overloaded initializer for the socket server - - If the identify structure is not passed in, the ModbusControlBlock - uses its own empty structure. - - :param context: The ModbusServerContext datastore - :param framer: The framer strategy to use - :param identity: An optional identify structure - :param address: An optional (interface, port) to bind to. - :param handler: A handler for each client session; default is ModbusConnectedRequestHandler - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - self.threads = [] - self.decoder = ServerDecoder() - self.framer = framer or ModbusSocketFramer - self.context = context or ModbusServerContext() - self.control = ModbusControlBlock() - self.address = address or ("", Defaults.Port) - self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) - - if isinstance(identity, ModbusDeviceIdentification): - self.control.Identity.update(identity) - - socketserver.ThreadingTCPServer.__init__(self, - self.address, ModbusConnectedRequestHandler)
- -
[docs] def process_request(self, request, client): - ''' Callback for connecting a new client thread - - :param request: The request to handle - :param client: The address of the client - ''' - _logger.debug("Started thread to serve client at " + str(client)) - socketserver.ThreadingTCPServer.process_request(self, request, client)
- -
[docs] def shutdown(self): - ''' Stops the serve_forever loop. - - Overridden to signal handlers to stop. - ''' - for thread in self.threads: - thread.running = False - socketserver.ThreadingTCPServer.shutdown(self)
- -
[docs] def server_close(self): - ''' Callback for stopping the running server - ''' - _logger.debug("Modbus server stopped") - self.socket.close() - for thread in self.threads: - thread.running = False
- - -
[docs]class ModbusUdpServer(socketserver.ThreadingUDPServer): - ''' - A modbus threaded udp socket server - - We inherit and overload the socket server so that we - can control the client threads as well as have a single - server context instance. - ''' - -
[docs] def __init__(self, context, framer=None, identity=None, address=None, handler=None, **kwargs): - ''' Overloaded initializer for the socket server - - If the identify structure is not passed in, the ModbusControlBlock - uses its own empty structure. - - :param context: The ModbusServerContext datastore - :param framer: The framer strategy to use - :param identity: An optional identify structure - :param address: An optional (interface, port) to bind to. - :param handler: A handler for each client session; default is ModbusDisonnectedRequestHandler - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - self.threads = [] - self.decoder = ServerDecoder() - self.framer = framer or ModbusSocketFramer - self.context = context or ModbusServerContext() - self.control = ModbusControlBlock() - self.address = address or ("", Defaults.Port) - self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) - - if isinstance(identity, ModbusDeviceIdentification): - self.control.Identity.update(identity) - - socketserver.ThreadingUDPServer.__init__(self, - self.address, ModbusDisconnectedRequestHandler)
- -
[docs] def process_request(self, request, client): - ''' Callback for connecting a new client thread - - :param request: The request to handle - :param client: The address of the client - ''' - packet, socket = request # TODO I might have to rewrite - _logger.debug("Started thread to serve client at " + str(client)) - socketserver.ThreadingUDPServer.process_request(self, request, client)
- -
[docs] def server_close(self): - ''' Callback for stopping the running server - ''' - _logger.debug("Modbus server stopped") - self.socket.close() - for thread in self.threads: - thread.running = False
- - -
[docs]class ModbusSerialServer(object): - ''' - A modbus threaded serial socket server - - We inherit and overload the socket server so that we - can control the client threads as well as have a single - server context instance. - ''' - -
[docs] def __init__(self, context, framer=None, identity=None, **kwargs): - ''' Overloaded initializer for the socket server - - If the identify structure is not passed in, the ModbusControlBlock - uses its own empty structure. - - :param context: The ModbusServerContext datastore - :param framer: The framer strategy to use - :param identity: An optional identify structure - :param port: The serial port to attach to - :param stopbits: The number of stop bits to use - :param bytesize: The bytesize of the serial messages - :param parity: Which kind of parity to use - :param baudrate: The baud rate to use for the serial device - :param timeout: The timeout to use for the serial device - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - self.threads = [] - self.decoder = ServerDecoder() - self.framer = framer or ModbusAsciiFramer - self.context = context or ModbusServerContext() - self.control = ModbusControlBlock() - - if isinstance(identity, ModbusDeviceIdentification): - self.control.Identity.update(identity) - - self.device = kwargs.get('port', 0) - self.stopbits = kwargs.get('stopbits', Defaults.Stopbits) - self.bytesize = kwargs.get('bytesize', Defaults.Bytesize) - self.parity = kwargs.get('parity', Defaults.Parity) - self.baudrate = kwargs.get('baudrate', Defaults.Baudrate) - self.timeout = kwargs.get('timeout', Defaults.Timeout) - self.ignore_missing_slaves = kwargs.get('ignore_missing_slaves', Defaults.IgnoreMissingSlaves) - self.socket = None - self._connect() - self.is_running = True
- -
[docs] def _connect(self): - ''' Connect to the serial server - - :returns: True if connection succeeded, False otherwise - ''' - if self.socket: return True - try: - self.socket = serial.Serial(port=self.device, timeout=self.timeout, - bytesize=self.bytesize, stopbits=self.stopbits, - baudrate=self.baudrate, parity=self.parity) - except serial.SerialException as msg: - _logger.error(msg) - return self.socket != None
- -
[docs] def _build_handler(self): - ''' A helper method to create and monkeypatch - a serial handler. - - :returns: A patched handler - ''' - request = self.socket - request.send = request.write - request.recv = request.read - handler = ModbusSingleRequestHandler(request, - (self.device, self.device), self) - return handler
- -
[docs] def serve_forever(self): - ''' Callback for connecting a new client thread - - :param request: The request to handle - :param client: The address of the client - ''' - _logger.debug("Started thread to serve client") - handler = self._build_handler() - while self.is_running: - handler.handle()
- -
[docs] def server_close(self): - ''' Callback for stopping the running server - ''' - _logger.debug("Modbus server stopped") - self.is_running = False - self.socket.close()
- - -#---------------------------------------------------------------------------# -# Creation Factories -#---------------------------------------------------------------------------# -
[docs]def StartTcpServer(context=None, identity=None, address=None, **kwargs): - ''' A factory to start and run a tcp modbus server - - :param context: The ModbusServerContext datastore - :param identity: An optional identify structure - :param address: An optional (interface, port) to bind to. - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - framer = ModbusSocketFramer - server = ModbusTcpServer(context, framer, identity, address, **kwargs) - server.serve_forever()
- - -
[docs]def StartUdpServer(context=None, identity=None, address=None, **kwargs): - ''' A factory to start and run a udp modbus server - - :param context: The ModbusServerContext datastore - :param identity: An optional identify structure - :param address: An optional (interface, port) to bind to. - :param framer: The framer to operate with (default ModbusSocketFramer) - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - framer = kwargs.pop('framer', ModbusSocketFramer) - server = ModbusUdpServer(context, framer, identity, address, **kwargs) - server.serve_forever()
- - -
[docs]def StartSerialServer(context=None, identity=None, **kwargs): - ''' A factory to start and run a serial modbus server - - :param context: The ModbusServerContext datastore - :param identity: An optional identify structure - :param framer: The framer to operate with (default ModbusAsciiFramer) - :param port: The serial port to attach to - :param stopbits: The number of stop bits to use - :param bytesize: The bytesize of the serial messages - :param parity: Which kind of parity to use - :param baudrate: The baud rate to use for the serial device - :param timeout: The timeout to use for the serial device - :param ignore_missing_slaves: True to not send errors on a request to a missing slave - ''' - framer = kwargs.pop('framer', ModbusAsciiFramer) - server = ModbusSerialServer(context, framer, identity, **kwargs) - server.serve_forever()
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "StartTcpServer", "StartUdpServer", "StartSerialServer" -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/transaction.html b/doc/sphinx/html/_modules/pymodbus/transaction.html deleted file mode 100644 index c7d53ea22..000000000 --- a/doc/sphinx/html/_modules/pymodbus/transaction.html +++ /dev/null @@ -1,1064 +0,0 @@ - - - - - - - - pymodbus.transaction — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.transaction

-'''
-Collection of transaction based abstractions
-'''
-import sys
-import struct
-import socket
-from binascii import b2a_hex, a2b_hex
-
-from pymodbus.exceptions import ModbusIOException, NotImplementedException
-from pymodbus.constants  import Defaults
-from pymodbus.interfaces import IModbusFramer
-from pymodbus.utilities  import checkCRC, computeCRC
-from pymodbus.utilities  import checkLRC, computeLRC
-from pymodbus.compat import iterkeys, imap, byte2int
-
-#---------------------------------------------------------------------------#
-# Logging
-#---------------------------------------------------------------------------#
-import logging
-_logger = logging.getLogger(__name__)
-
-
-#---------------------------------------------------------------------------#
-# The Global Transaction Manager
-#---------------------------------------------------------------------------#
-class ModbusTransactionManager(object):
-    ''' Impelements a transaction for a manager
-
-    The transaction protocol can be represented by the following pseudo code::
-
-        count = 0
-        do
-          result = send(message)
-          if (timeout or result == bad)
-             count++
-          else break
-        while (count < 3)
-
-    This module helps to abstract this away from the framer and protocol.
-    '''
-
-    def __init__(self, client, **kwargs):
-        ''' Initializes an instance of the ModbusTransactionManager
-
-        :param client: The client socket wrapper
-        :param retry_on_empty: Should the client retry on empty
-        :param retries: The number of retries to allow
-        '''
-        self.tid = Defaults.TransactionId
-        self.client = client
-        self.retry_on_empty = kwargs.get('retry_on_empty', Defaults.RetryOnEmpty)
-        self.retries = kwargs.get('retries', Defaults.Retries)
-        if client:
-            self._set_adu_size()
-
-    def _set_adu_size(self):
-        # base ADU size of modbus frame in bytes
-        if isinstance(self.client.framer, ModbusSocketFramer):
-            self.base_adu_size = 7 # tid(2), pid(2), length(2), uid(1)
-        elif isinstance(self.client.framer, ModbusRtuFramer):
-            self.base_adu_size = 3 # address(1), CRC(2)
-        elif isinstance(self.client.framer, ModbusAsciiFramer):
-            self.base_adu_size = 4 # Address(2), LRC(2)
-        elif isinstance(self.client.framer, ModbusBinaryFramer):
-            self.base_adu_size = 3 #, Address(1), CRC(2)
-        else:
-            self.base_adu_size = -1
-
-    def _calculate_response_length(self, expected_pdu_size):
-        if self.base_adu_size == -1:
-            return 1024
-        else:
-            return self.base_adu_size + expected_pdu_size
-
-    def execute(self, request):
-        ''' Starts the producer to send the next request to
-        consumer.write(Frame(request))
-        '''
-        retries = self.retries
-        request.transaction_id = self.getNextTID()
-        _logger.debug("Running transaction %d" % request.transaction_id)
-        if hasattr(request, "get_response_pdu_size"):
-            response_pdu_size = request.get_response_pdu_size()
-            expected_response_length = self._calculate_response_length(response_pdu_size)
-        else:
-            expected_response_length = 1024
-
-        while retries > 0:
-            try:
-                self.client.connect()
-                self.client._send(self.client.framer.buildPacket(request))
-                result = self.client._recv(expected_response_length)
-
-                if not result and self.retry_on_empty:
-                    retries -= 1
-                    continue
-                if _logger.isEnabledFor(logging.DEBUG):
-                    _logger.debug("recv: " + " ".join([hex(byte2int(x)) for x in result]))
-                self.client.framer.processIncomingPacket(result, self.addTransaction)
-                break;
-            except socket.error as msg:
-                self.client.close()
-                _logger.debug("Transaction failed. (%s) " % msg)
-                retries -= 1
-        return self.getTransaction(request.transaction_id)
-
-
-    def addTransaction(self, request, tid=None):
-        ''' Adds a transaction to the handler
-
-        This holds the requets in case it needs to be resent.
-        After being sent, the request is removed.
-
-        :param request: The request to hold on to
-        :param tid: The overloaded transaction id to use
-        '''
-        raise NotImplementedException("addTransaction")
-
-    def getTransaction(self, tid):
-        ''' Returns a transaction matching the referenced tid
-
-        If the transaction does not exist, None is returned
-
-        :param tid: The transaction to retrieve
-        '''
-        raise NotImplementedException("getTransaction")
-
-    def delTransaction(self, tid):
-        ''' Removes a transaction matching the referenced tid
-
-        :param tid: The transaction to remove
-        '''
-        raise NotImplementedException("delTransaction")
-
-    def getNextTID(self):
-        ''' Retrieve the next unique transaction identifier
-
-        This handles incrementing the identifier after
-        retrieval
-
-        :returns: The next unique transaction identifier
-        '''
-        self.tid = (self.tid + 1) & 0xffff
-        return self.tid
-
-    def reset(self):
-        ''' Resets the transaction identifier '''
-        self.tid = Defaults.TransactionId
-        self.transactions = type(self.transactions)()
-
-
-
[docs]class DictTransactionManager(ModbusTransactionManager): - ''' Impelements a transaction for a manager where the - results are keyed based on the supplied transaction id. - ''' - -
[docs] def __init__(self, client, **kwargs): - ''' Initializes an instance of the ModbusTransactionManager - - :param client: The client socket wrapper - ''' - self.transactions = {} - super(DictTransactionManager, self).__init__(client, **kwargs)
- -
[docs] def __iter__(self): - ''' Iterater over the current managed transactions - - :returns: An iterator of the managed transactions - ''' - return iterkeys(self.transactions)
- -
[docs] def addTransaction(self, request, tid=None): - ''' Adds a transaction to the handler - - This holds the requets in case it needs to be resent. - After being sent, the request is removed. - - :param request: The request to hold on to - :param tid: The overloaded transaction id to use - ''' - tid = tid if tid != None else request.transaction_id - _logger.debug("adding transaction %d" % tid) - self.transactions[tid] = request
- -
[docs] def getTransaction(self, tid): - ''' Returns a transaction matching the referenced tid - - If the transaction does not exist, None is returned - - :param tid: The transaction to retrieve - ''' - _logger.debug("getting transaction %d" % tid) - return self.transactions.pop(tid, None)
- -
[docs] def delTransaction(self, tid): - ''' Removes a transaction matching the referenced tid - - :param tid: The transaction to remove - ''' - _logger.debug("deleting transaction %d" % tid) - self.transactions.pop(tid, None)
- - -
[docs]class FifoTransactionManager(ModbusTransactionManager): - ''' Impelements a transaction for a manager where the - results are returned in a FIFO manner. - ''' - -
[docs] def __init__(self, client, **kwargs): - ''' Initializes an instance of the ModbusTransactionManager - - :param client: The client socket wrapper - ''' - super(FifoTransactionManager, self).__init__(client, **kwargs) - self.transactions = []
- -
[docs] def __iter__(self): - ''' Iterater over the current managed transactions - - :returns: An iterator of the managed transactions - ''' - return iter(self.transactions)
- -
[docs] def addTransaction(self, request, tid=None): - ''' Adds a transaction to the handler - - This holds the requets in case it needs to be resent. - After being sent, the request is removed. - - :param request: The request to hold on to - :param tid: The overloaded transaction id to use - ''' - tid = tid if tid != None else request.transaction_id - _logger.debug("adding transaction %d" % tid) - self.transactions.append(request)
- -
[docs] def getTransaction(self, tid): - ''' Returns a transaction matching the referenced tid - - If the transaction does not exist, None is returned - - :param tid: The transaction to retrieve - ''' - _logger.debug("getting transaction %s" % str(tid)) - return self.transactions.pop(0) if self.transactions else None
- -
[docs] def delTransaction(self, tid): - ''' Removes a transaction matching the referenced tid - - :param tid: The transaction to remove - ''' - _logger.debug("deleting transaction %d" % tid) - if self.transactions: self.transactions.pop(0)
- - -#---------------------------------------------------------------------------# -# Modbus TCP Message -#---------------------------------------------------------------------------# -
[docs]class ModbusSocketFramer(IModbusFramer): - ''' Modbus Socket Frame controller - - Before each modbus TCP message is an MBAP header which is used as a - message frame. It allows us to easily separate messages as follows:: - - [ MBAP Header ] [ Function Code] [ Data ] - [ tid ][ pid ][ length ][ uid ] - 2b 2b 2b 1b 1b Nb - - while len(message) > 0: - tid, pid, length`, uid = struct.unpack(">HHHB", message) - request = message[0:7 + length - 1`] - message = [7 + length - 1:] - - * length = uid + function code + data - * The -1 is to account for the uid byte - ''' - -
[docs] def __init__(self, decoder): - ''' Initializes a new instance of the framer - - :param decoder: The decoder factory implementation to use - ''' - self.__buffer = b'' - self.__header = {'tid':0, 'pid':0, 'len':0, 'uid':0} - self.__hsize = 0x07 - self.decoder = decoder
- - #-----------------------------------------------------------------------# - # Private Helper Functions - #-----------------------------------------------------------------------# -
[docs] def checkFrame(self): - ''' - Check and decode the next frame Return true if we were successful - ''' - if len(self.__buffer) > self.__hsize: - self.__header['tid'], self.__header['pid'], \ - self.__header['len'], self.__header['uid'] = struct.unpack( - '>HHHB', self.__buffer[0:self.__hsize]) - - # someone sent us an error? ignore it - if self.__header['len'] < 2: - self.advanceFrame() - # we have at least a complete message, continue - elif len(self.__buffer) - self.__hsize + 1 >= self.__header['len']: - return True - # we don't have enough of a message yet, wait - return False
- -
[docs] def advanceFrame(self): - ''' Skip over the current framed message - This allows us to skip over the current message after we have processed - it or determined that it contains an error. It also has to reset the - current frame header handle - ''' - length = self.__hsize + self.__header['len'] - 1 - self.__buffer = self.__buffer[length:] - self.__header = {'tid':0, 'pid':0, 'len':0, 'uid':0}
- -
[docs] def isFrameReady(self): - ''' Check if we should continue decode logic - This is meant to be used in a while loop in the decoding phase to let - the decoder factory know that there is still data in the buffer. - - :returns: True if ready, False otherwise - ''' - return len(self.__buffer) > self.__hsize
- -
[docs] def addToFrame(self, message): - ''' Adds new packet data to the current frame buffer - - :param message: The most recent packet - ''' - self.__buffer += message
- -
[docs] def getFrame(self): - ''' Return the next frame from the buffered data - - :returns: The next full frame buffer - ''' - length = self.__hsize + self.__header['len'] - 1 - return self.__buffer[self.__hsize:length]
- -
[docs] def populateResult(self, result): - ''' - Populates the modbus result with the transport specific header - information (pid, tid, uid, checksum, etc) - - :param result: The response packet - ''' - result.transaction_id = self.__header['tid'] - result.protocol_id = self.__header['pid'] - result.unit_id = self.__header['uid']
- - #-----------------------------------------------------------------------# - # Public Member Functions - #-----------------------------------------------------------------------# -
[docs] def processIncomingPacket(self, data, callback): - ''' The new packet processing pattern - - This takes in a new request packet, adds it to the current - packet stream, and performs framing on it. That is, checks - for complete messages, and once found, will process all that - exist. This handles the case when we read N + 1 or 1 / N - messages at a time instead of 1. - - The processed and decoded messages are pushed to the callback - function to process and send. - - :param data: The new packet data - :param callback: The function to send results to - ''' - _logger.debug(' '.join([hex(byte2int(x)) for x in data])) - self.addToFrame(data) - while True: - if self.isFrameReady(): - if self.checkFrame(): - self._process(callback) - else: self.resetFrame() - else: - if len(self.__buffer): - # Possible error ??? - if self.__header['len'] < 2: - self._process(callback, error=True) - break
- -
[docs] def _process(self, callback, error=False): - """ - Process incoming packets irrespective error condition - """ - data = self.getRawFrame() if error else self.getFrame() - result = self.decoder.decode(data) - if result is None: - raise ModbusIOException("Unable to decode request") - self.populateResult(result) - self.advanceFrame() - callback(result) # defer or push to a thread?
- -
[docs] def resetFrame(self): - ''' Reset the entire message frame. - This allows us to skip ovver errors that may be in the stream. - It is hard to know if we are simply out of sync or if there is - an error in the stream as we have no way to check the start or - end of the message (python just doesn't have the resolution to - check for millisecond delays). - ''' - self.__buffer = '' - self.__header = {}
- -
[docs] def getRawFrame(self): - """ - Returns the complete buffer - """ - return self.__buffer
- -
[docs] def buildPacket(self, message): - ''' Creates a ready to send modbus packet - - :param message: The populated request/response to send - ''' - data = message.encode() - packet = struct.pack('>HHHBB', - message.transaction_id, - message.protocol_id, - len(data) + 2, - message.unit_id, - message.function_code) + data - return packet
- - -#---------------------------------------------------------------------------# -# Modbus RTU Message -#---------------------------------------------------------------------------# -
[docs]class ModbusRtuFramer(IModbusFramer): - ''' - Modbus RTU Frame controller:: - - [ Start Wait ] [Address ][ Function Code] [ Data ][ CRC ][ End Wait ] - 3.5 chars 1b 1b Nb 2b 3.5 chars - - Wait refers to the amount of time required to transmist at least x many - characters. In this case it is 3.5 characters. Also, if we recieve a - wait of 1.5 characters at any point, we must trigger an error message. - Also, it appears as though this message is little endian. The logic is - simplified as the following:: - - block-on-read: - read until 3.5 delay - check for errors - decode - - The following table is a listing of the baud wait times for the specified - baud rates:: - - ------------------------------------------------------------------ - Baud 1.5c (18 bits) 3.5c (38 bits) - ------------------------------------------------------------------ - 1200 13333.3 us 31666.7 us - 4800 3333.3 us 7916.7 us - 9600 1666.7 us 3958.3 us - 19200 833.3 us 1979.2 us - 38400 416.7 us 989.6 us - ------------------------------------------------------------------ - 1 Byte = start + 8 bits + parity + stop = 11 bits - (1/Baud)(bits) = delay seconds - ''' - -
[docs] def __init__(self, decoder): - ''' Initializes a new instance of the framer - - :param decoder: The decoder factory implementation to use - ''' - self.__buffer = b'' - self.__header = {} - self.__hsize = 0x01 - self.__end = b'\x0d\x0a' - self.__min_frame_size = 4 - self.decoder = decoder
- - #-----------------------------------------------------------------------# - # Private Helper Functions - #-----------------------------------------------------------------------# -
[docs] def checkFrame(self): - ''' - Check if the next frame is available. Return True if we were - successful. - ''' - try: - self.populateHeader() - frame_size = self.__header['len'] - data = self.__buffer[:frame_size - 2] - crc = self.__buffer[frame_size - 2:frame_size] - crc_val = (byte2int(crc[0]) << 8) + byte2int(crc[1]) - return checkCRC(data, crc_val) - except (IndexError, KeyError): - return False
- -
[docs] def advanceFrame(self): - ''' Skip over the current framed message - This allows us to skip over the current message after we have processed - it or determined that it contains an error. It also has to reset the - current frame header handle - ''' - try: - self.__buffer = self.__buffer[self.__header['len']:] - except KeyError: - # Error response, no header len found - self.resetFrame() - self.__header = {}
- -
[docs] def resetFrame(self): - ''' Reset the entire message frame. - This allows us to skip ovver errors that may be in the stream. - It is hard to know if we are simply out of sync or if there is - an error in the stream as we have no way to check the start or - end of the message (python just doesn't have the resolution to - check for millisecond delays). - ''' - self.__buffer = b'' - self.__header = {}
- -
[docs] def isFrameReady(self): - ''' Check if we should continue decode logic - This is meant to be used in a while loop in the decoding phase to let - the decoder know that there is still data in the buffer. - - :returns: True if ready, False otherwise - ''' - return len(self.__buffer) > self.__hsize
- -
[docs] def populateHeader(self): - ''' Try to set the headers `uid`, `len` and `crc`. - - This method examines `self.__buffer` and writes meta - information into `self.__header`. It calculates only the - values for headers that are not already in the dictionary. - - Beware that this method will raise an IndexError if - `self.__buffer` is not yet long enough. - ''' - self.__header['uid'] = byte2int(self.__buffer[0]) - func_code = byte2int(self.__buffer[1]) - pdu_class = self.decoder.lookupPduClass(func_code) - size = pdu_class.calculateRtuFrameSize(self.__buffer) - self.__header['len'] = size - self.__header['crc'] = self.__buffer[size - 2:size]
- -
[docs] def addToFrame(self, message): - ''' - This should be used before the decoding while loop to add the received - data to the buffer handle. - - :param message: The most recent packet - ''' - self.__buffer += message
- -
[docs] def getFrame(self): - ''' Get the next frame from the buffer - - :returns: The frame data or '' - ''' - start = self.__hsize - end = self.__header['len'] - 2 - buffer = self.__buffer[start:end] - if end > 0: return buffer - return ''
- -
[docs] def populateResult(self, result): - ''' Populates the modbus result header - - The serial packets do not have any header information - that is copied. - - :param result: The response packet - ''' - result.unit_id = self.__header['uid']
- - #-----------------------------------------------------------------------# - # Public Member Functions - #-----------------------------------------------------------------------# -
[docs] def processIncomingPacket(self, data, callback): - ''' The new packet processing pattern - - This takes in a new request packet, adds it to the current - packet stream, and performs framing on it. That is, checks - for complete messages, and once found, will process all that - exist. This handles the case when we read N + 1 or 1 / N - messages at a time instead of 1. - - The processed and decoded messages are pushed to the callback - function to process and send. - - :param data: The new packet data - :param callback: The function to send results to - ''' - self.addToFrame(data) - while True: - if self.isFrameReady(): - if self.checkFrame(): - self._process(callback) - else: - # Could be an error response - if len(self.__buffer): - # Possible error ??? - self._process(callback, error=True) - else: - if len(self.__buffer): - # Possible error ??? - if self.__header.get('len', 0) < 2: - self._process(callback, error=True) - break
- -
[docs] def buildPacket(self, message): - ''' Creates a ready to send modbus packet - - :param message: The populated request/response to send - ''' - data = message.encode() - packet = struct.pack('>BB', - message.unit_id, - message.function_code) + data - packet += struct.pack(">H", computeCRC(packet)) - return packet
- -
[docs] def _process(self, callback, error=False): - """ - Process incoming packets irrespective error condition - """ - data = self.getRawFrame() if error else self.getFrame() - result = self.decoder.decode(data) - if result is None: - raise ModbusIOException("Unable to decode request") - self.populateResult(result) - self.advanceFrame() - callback(result) # defer or push to a thread?
- -
[docs] def getRawFrame(self): - """ - Returns the complete buffer - """ - return self.__buffer
- - - -#---------------------------------------------------------------------------# -# Modbus ASCII Message -#---------------------------------------------------------------------------# -
[docs]class ModbusAsciiFramer(IModbusFramer): - ''' - Modbus ASCII Frame Controller:: - - [ Start ][Address ][ Function ][ Data ][ LRC ][ End ] - 1c 2c 2c Nc 2c 2c - - * data can be 0 - 2x252 chars - * end is '\\r\\n' (Carriage return line feed), however the line feed - character can be changed via a special command - * start is ':' - - This framer is used for serial transmission. Unlike the RTU protocol, - the data in this framer is transferred in plain text ascii. - ''' - -
[docs] def __init__(self, decoder): - ''' Initializes a new instance of the framer - - :param decoder: The decoder implementation to use - ''' - self.__buffer = b'' - self.__header = {'lrc':'0000', 'len':0, 'uid':0x00} - self.__hsize = 0x02 - self.__start = b':' - self.__end = b"\r\n" - self.decoder = decoder
- - #-----------------------------------------------------------------------# - # Private Helper Functions - #-----------------------------------------------------------------------# -
[docs] def checkFrame(self): - ''' Check and decode the next frame - - :returns: True if we successful, False otherwise - ''' - start = self.__buffer.find(self.__start) - if start == -1: return False - if start > 0 : # go ahead and skip old bad data - self.__buffer = self.__buffer[start:] - start = 0 - - end = self.__buffer.find(self.__end) - if (end != -1): - self.__header['len'] = end - self.__header['uid'] = int(self.__buffer[1:3], 16) - self.__header['lrc'] = int(self.__buffer[end - 2:end], 16) - data = a2b_hex(self.__buffer[start + 1:end - 2]) - return checkLRC(data, self.__header['lrc']) - return False
- -
[docs] def advanceFrame(self): - ''' Skip over the current framed message - This allows us to skip over the current message after we have processed - it or determined that it contains an error. It also has to reset the - current frame header handle - ''' - self.__buffer = self.__buffer[self.__header['len'] + 2:] - self.__header = {'lrc':'0000', 'len':0, 'uid':0x00}
- -
[docs] def isFrameReady(self): - ''' Check if we should continue decode logic - This is meant to be used in a while loop in the decoding phase to let - the decoder know that there is still data in the buffer. - - :returns: True if ready, False otherwise - ''' - return len(self.__buffer) > 1
- -
[docs] def addToFrame(self, message): - ''' Add the next message to the frame buffer - This should be used before the decoding while loop to add the received - data to the buffer handle. - - :param message: The most recent packet - ''' - self.__buffer += message
- -
[docs] def getFrame(self): - ''' Get the next frame from the buffer - - :returns: The frame data or '' - ''' - start = self.__hsize + 1 - end = self.__header['len'] - 2 - buffer = self.__buffer[start:end] - if end > 0: return a2b_hex(buffer) - return b''
- -
[docs] def populateResult(self, result): - ''' Populates the modbus result header - - The serial packets do not have any header information - that is copied. - - :param result: The response packet - ''' - result.unit_id = self.__header['uid']
- - #-----------------------------------------------------------------------# - # Public Member Functions - #-----------------------------------------------------------------------# -
[docs] def processIncomingPacket(self, data, callback): - ''' The new packet processing pattern - - This takes in a new request packet, adds it to the current - packet stream, and performs framing on it. That is, checks - for complete messages, and once found, will process all that - exist. This handles the case when we read N + 1 or 1 / N - messages at a time instead of 1. - - The processed and decoded messages are pushed to the callback - function to process and send. - - :param data: The new packet data - :param callback: The function to send results to - ''' - self.addToFrame(data) - while self.isFrameReady(): - if self.checkFrame(): - result = self.decoder.decode(self.getFrame()) - if result is None: - raise ModbusIOException("Unable to decode response") - self.populateResult(result) - self.advanceFrame() - callback(result) # defer this - else: break
- -
[docs] def buildPacket(self, message): - ''' Creates a ready to send modbus packet - Built off of a modbus request/response - - :param message: The request/response to send - :return: The encoded packet - ''' - encoded = message.encode() - buffer = struct.pack('>BB', message.unit_id, message.function_code) - checksum = computeLRC(encoded + buffer) - - packet = bytearray() - params = (message.unit_id, message.function_code) - packet.extend(self.__start) - packet.extend(('%02x%02x' % params).encode()) - packet.extend(b2a_hex(encoded)) - packet.extend(('%02x' % checksum).encode()) - packet.extend(self.__end) - return bytes(packet).upper()
- - -#---------------------------------------------------------------------------# -# Modbus Binary Message -#---------------------------------------------------------------------------# -
[docs]class ModbusBinaryFramer(IModbusFramer): - ''' - Modbus Binary Frame Controller:: - - [ Start ][Address ][ Function ][ Data ][ CRC ][ End ] - 1b 1b 1b Nb 2b 1b - - * data can be 0 - 2x252 chars - * end is '}' - * start is '{' - - The idea here is that we implement the RTU protocol, however, - instead of using timing for message delimiting, we use start - and end of message characters (in this case { and }). Basically, - this is a binary framer. - - The only case we have to watch out for is when a message contains - the { or } characters. If we encounter these characters, we - simply duplicate them. Hopefully we will not encounter those - characters that often and will save a little bit of bandwitch - without a real-time system. - - Protocol defined by jamod.sourceforge.net. - ''' - -
[docs] def __init__(self, decoder): - ''' Initializes a new instance of the framer - - :param decoder: The decoder implementation to use - ''' - self.__buffer = b'' - self.__header = {'crc':0x0000, 'len':0, 'uid':0x00} - self.__hsize = 0x02 - self.__start = b'\x7b' # { - self.__end = b'\x7d' # } - self.__repeat = [b'}'[0], b'{'[0]] # python3 hack - self.decoder = decoder
- - #-----------------------------------------------------------------------# - # Private Helper Functions - #-----------------------------------------------------------------------# -
[docs] def checkFrame(self): - ''' Check and decode the next frame - - :returns: True if we are successful, False otherwise - ''' - start = self.__buffer.find(self.__start) - if start == -1: return False - if start > 0 : # go ahead and skip old bad data - self.__buffer = self.__buffer[start:] - - end = self.__buffer.find(self.__end) - if (end != -1): - self.__header['len'] = end - self.__header['uid'] = struct.unpack('>B', self.__buffer[1:2]) - self.__header['crc'] = struct.unpack('>H', self.__buffer[end - 2:end])[0] - data = self.__buffer[start + 1:end - 2] - return checkCRC(data, self.__header['crc']) - return False
- -
[docs] def advanceFrame(self): - ''' Skip over the current framed message - This allows us to skip over the current message after we have processed - it or determined that it contains an error. It also has to reset the - current frame header handle - ''' - self.__buffer = self.__buffer[self.__header['len'] + 2:] - self.__header = {'crc':0x0000, 'len':0, 'uid':0x00}
- -
[docs] def isFrameReady(self): - ''' Check if we should continue decode logic - This is meant to be used in a while loop in the decoding phase to let - the decoder know that there is still data in the buffer. - - :returns: True if ready, False otherwise - ''' - return len(self.__buffer) > 1
- -
[docs] def addToFrame(self, message): - ''' Add the next message to the frame buffer - This should be used before the decoding while loop to add the received - data to the buffer handle. - - :param message: The most recent packet - ''' - self.__buffer += message
- -
[docs] def getFrame(self): - ''' Get the next frame from the buffer - - :returns: The frame data or '' - ''' - start = self.__hsize + 1 - end = self.__header['len'] - 2 - buffer = self.__buffer[start:end] - if end > 0: return buffer - return b''
- -
[docs] def populateResult(self, result): - ''' Populates the modbus result header - - The serial packets do not have any header information - that is copied. - - :param result: The response packet - ''' - result.unit_id = self.__header['uid']
- - #-----------------------------------------------------------------------# - # Public Member Functions - #-----------------------------------------------------------------------# -
[docs] def processIncomingPacket(self, data, callback): - ''' The new packet processing pattern - - This takes in a new request packet, adds it to the current - packet stream, and performs framing on it. That is, checks - for complete messages, and once found, will process all that - exist. This handles the case when we read N + 1 or 1 / N - messages at a time instead of 1. - - The processed and decoded messages are pushed to the callback - function to process and send. - - :param data: The new packet data - :param callback: The function to send results to - ''' - self.addToFrame(data) - while self.isFrameReady(): - if self.checkFrame(): - result = self.decoder.decode(self.getFrame()) - if result is None: - raise ModbusIOException("Unable to decode response") - self.populateResult(result) - self.advanceFrame() - callback(result) # defer or push to a thread? - else: break
- -
[docs] def buildPacket(self, message): - ''' Creates a ready to send modbus packet - - :param message: The request/response to send - :returns: The encoded packet - ''' - data = self._preflight(message.encode()) - packet = struct.pack('>BB', - message.unit_id, - message.function_code) + data - packet += struct.pack(">H", computeCRC(packet)) - packet = self.__start + packet + self.__end - return packet
- -
[docs] def _preflight(self, data): - ''' Preflight buffer test - - This basically scans the buffer for start and end - tags and if found, escapes them. - - :param data: The message to escape - :returns: the escaped packet - ''' - array = bytearray() - for d in data: - if d in self.__repeat: - array.append(d) - array.append(d) - return bytes(array)
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - "FifoTransactionManager", - "DictTransactionManager", - "ModbusSocketFramer", "ModbusRtuFramer", - "ModbusAsciiFramer", "ModbusBinaryFramer", -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_modules/pymodbus/utilities.html b/doc/sphinx/html/_modules/pymodbus/utilities.html deleted file mode 100644 index a81af94bf..000000000 --- a/doc/sphinx/html/_modules/pymodbus/utilities.html +++ /dev/null @@ -1,290 +0,0 @@ - - - - - - - - pymodbus.utilities — pymodbus 1.3.0.rc2 documentation - - - - - - - - - - - - - - -
-
-
-
- -

Source code for pymodbus.utilities

-'''
-Modbus Utilities
------------------
-
-A collection of utilities for packing data, unpacking
-data computing checksums, and decode checksums.
-'''
-from pymodbus.compat import int2byte, byte2int
-
-
-#---------------------------------------------------------------------------#
-# Helpers
-#---------------------------------------------------------------------------#
-
[docs]def default(value): - ''' - Given a python object, return the default value - of that object. - - :param value: The value to get the default of - :returns: The default value - ''' - return type(value)()
- - -
[docs]def dict_property(store, index): - ''' Helper to create class properties from a dictionary. - Basically this allows you to remove a lot of possible - boilerplate code. - - :param store: The store store to pull from - :param index: The index into the store to close over - :returns: An initialized property set - ''' - if hasattr(store, '__call__'): - getter = lambda self: store(self)[index] - setter = lambda self, value: store(self).__setitem__(index, value) - elif isinstance(store, str): - getter = lambda self: self.__getattribute__(store)[index] - setter = lambda self, value: self.__getattribute__(store).__setitem__( - index, value) - else: - getter = lambda self: store[index] - setter = lambda self, value: store.__setitem__(index, value) - - return property(getter, setter)
- - -#---------------------------------------------------------------------------# -# Bit packing functions -#---------------------------------------------------------------------------# -
[docs]def pack_bitstring(bits): - ''' Creates a string out of an array of bits - - :param bits: A bit array - - example:: - - bits = [False, True, False, True] - result = pack_bitstring(bits) - ''' - ret = b'' - i = packed = 0 - for bit in bits: - if bit: packed += 128 - i += 1 - if i == 8: - ret += int2byte(packed) - i = packed = 0 - else: packed >>= 1 - if i > 0 and i < 8: - packed >>= (7 - i) - ret += int2byte(packed) - return ret
- - -
[docs]def unpack_bitstring(string): - ''' Creates bit array out of a string - - :param string: The modbus data packet to decode - - example:: - - bytes = 'bytes to decode' - result = unpack_bitstring(bytes) - ''' - byte_count = len(string) - bits = [] - for byte in range(byte_count): - value = byte2int(string[byte]) - for _ in range(8): - bits.append((value & 1) == 1) - value >>= 1 - return bits
- - -#---------------------------------------------------------------------------# -# Error Detection Functions -#---------------------------------------------------------------------------# -
[docs]def __generate_crc16_table(): - ''' Generates a crc16 lookup table - - .. note:: This will only be generated once - ''' - result = [] - for byte in range(256): - crc = 0x0000 - for _ in range(8): - if (byte ^ crc) & 0x0001: - crc = (crc >> 1) ^ 0xa001 - else: crc >>= 1 - byte >>= 1 - result.append(crc) - return result
- -__crc16_table = __generate_crc16_table() - - -
[docs]def computeCRC(data): - ''' Computes a crc16 on the passed in string. For modbus, - this is only used on the binary serial protocols (in this - case RTU). - - The difference between modbus's crc16 and a normal crc16 - is that modbus starts the crc value out at 0xffff. - - :param data: The data to create a crc16 of - :returns: The calculated CRC - ''' - crc = 0xffff - for a in data: - idx = __crc16_table[(crc ^ byte2int(a)) & 0xff]; - crc = ((crc >> 8) & 0xff) ^ idx - swapped = ((crc << 8) & 0xff00) | ((crc >> 8) & 0x00ff) - return swapped
- - -
[docs]def checkCRC(data, check): - ''' Checks if the data matches the passed in CRC - - :param data: The data to create a crc16 of - :param check: The CRC to validate - :returns: True if matched, False otherwise - ''' - return computeCRC(data) == check
- - -
[docs]def computeLRC(data): - ''' Used to compute the longitudinal redundancy check - against a string. This is only used on the serial ASCII - modbus protocol. A full description of this implementation - can be found in appendex B of the serial line modbus description. - - :param data: The data to apply a lrc to - :returns: The calculated LRC - - ''' - lrc = sum(byte2int(a) for a in data) & 0xff - lrc = (lrc ^ 0xff) + 1 - return lrc & 0xff
- - -
[docs]def checkLRC(data, check): - ''' Checks if the passed in data matches the LRC - - :param data: The data to calculate - :param check: The LRC to validate - :returns: True if matched, False otherwise - ''' - return computeLRC(data) == check
- - -
[docs]def rtuFrameSize(data, byte_count_pos): - ''' Calculates the size of the frame based on the byte count. - - :param data: The buffer containing the frame. - :param byte_count_pos: The index of the byte count in the buffer. - :returns: The size of the frame. - - The structure of frames with a byte count field is always the - same: - - - first, there are some header fields - - then the byte count field - - then as many data bytes as indicated by the byte count, - - finally the CRC (two bytes). - - To calculate the frame size, it is therefore sufficient to extract - the contents of the byte count field, add the position of this - field, and finally increment the sum by three (one byte for the - byte count field, two for the CRC). - ''' - return byte2int(data[byte_count_pos]) + byte_count_pos + 3
- -#---------------------------------------------------------------------------# -# Exported symbols -#---------------------------------------------------------------------------# -__all__ = [ - 'pack_bitstring', 'unpack_bitstring', 'default', - 'computeCRC', 'checkCRC', 'computeLRC', 'checkLRC', 'rtuFrameSize' -] -
- -
-
-
- -
-
- - - - \ No newline at end of file diff --git a/doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt b/doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt deleted file mode 100644 index 7f5b7d3c3..000000000 --- a/doc/sphinx/html/_sources/examples/asynchronous-client.rst.txt +++ /dev/null @@ -1,16 +0,0 @@ -================================================== -Asynchronous Client Example -================================================== - -The asynchronous client functions in the same way as the synchronous -client, however, the asynchronous client uses twisted to return deferreds -for the response result. Just like the synchronous version, it works against -TCP, UDP, serial ASCII, and serial RTU devices. - -Below an asynchronous tcp client is demonstrated running against a -reference server. If you do not have a device to test with, feel free -to run a pymodbus server instance or start the reference tester in -the tools directory. - -.. literalinclude:: ../../../examples/common/asynchronous-client.py - diff --git a/doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt b/doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt deleted file mode 100644 index 4afd8504e..000000000 --- a/doc/sphinx/html/_sources/examples/asynchronous-processor.rst.txt +++ /dev/null @@ -1,15 +0,0 @@ -================================================== -Asynchronous Processor Example -================================================== - -Below is a simplified asynchronous client skeleton that was -submitted by a user of the library. It can be used as a guide -for implementing more complex pollers or state machines. - -Feel free to test it against whatever device you currently have -available. If you do not have a device to test with, feel free -to run a pymodbus server instance or start the reference tester in -the tools directory. - -.. literalinclude:: ../../../examples/common/asynchronous-processor.py - diff --git a/doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt b/doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt deleted file mode 100644 index 14aeef298..000000000 --- a/doc/sphinx/html/_sources/examples/asynchronous-server.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Asynchronous Server Example -================================================== - -.. literalinclude:: ../../../examples/common/asynchronous-server.py - diff --git a/doc/sphinx/html/_sources/examples/bcd-payload.rst.txt b/doc/sphinx/html/_sources/examples/bcd-payload.rst.txt deleted file mode 100644 index a95c5e7a6..000000000 --- a/doc/sphinx/html/_sources/examples/bcd-payload.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Binary Coded Decimal Example -================================================== - -.. literalinclude:: ../../../examples/contrib/bcd-payload.py - diff --git a/doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt b/doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt deleted file mode 100644 index 95507c5a8..000000000 --- a/doc/sphinx/html/_sources/examples/bottle-frontend.rst.txt +++ /dev/null @@ -1,22 +0,0 @@ -================================================== -Bottle Web Frontend Example -================================================== - --------------------------------------------------- -Summary --------------------------------------------------- - -This is a simple example of adding a live REST api -on top of a running pymodbus server. This uses the -bottle microframework to achieve this. - -The example can be hosted under twisted as well as -the bottle internal server and can furthermore be -run behind gunicorn, cherrypi, etc wsgi containers. - --------------------------------------------------- -Main Program --------------------------------------------------- - -.. literalinclude:: ../../../examples/gui/bottle/frontend.py - diff --git a/doc/sphinx/html/_sources/examples/callback-server.rst.txt b/doc/sphinx/html/_sources/examples/callback-server.rst.txt deleted file mode 100644 index e57475216..000000000 --- a/doc/sphinx/html/_sources/examples/callback-server.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Callback Server Example -================================================== - -.. literalinclude:: ../../../examples/common/callback-server.py - diff --git a/doc/sphinx/html/_sources/examples/changing-framers.rst.txt b/doc/sphinx/html/_sources/examples/changing-framers.rst.txt deleted file mode 100644 index 3679aa43f..000000000 --- a/doc/sphinx/html/_sources/examples/changing-framers.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Changing Default Framers -================================================== - -.. literalinclude:: ../../../examples/common/changing-framers.py - diff --git a/doc/sphinx/html/_sources/examples/concurrent-client.rst.txt b/doc/sphinx/html/_sources/examples/concurrent-client.rst.txt deleted file mode 100644 index 1a3799ac9..000000000 --- a/doc/sphinx/html/_sources/examples/concurrent-client.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Concurrent Client Example -================================================== - -.. literalinclude:: ../../../examples/contrib/concurrent-client.py - diff --git a/doc/sphinx/html/_sources/examples/custom-datablock.rst.txt b/doc/sphinx/html/_sources/examples/custom-datablock.rst.txt deleted file mode 100644 index 7139c0f08..000000000 --- a/doc/sphinx/html/_sources/examples/custom-datablock.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Custom Datablock Example -================================================== - -.. literalinclude:: ../../../examples/common/custom-datablock.py - diff --git a/doc/sphinx/html/_sources/examples/custom-message.rst.txt b/doc/sphinx/html/_sources/examples/custom-message.rst.txt deleted file mode 100644 index 2ced10cbc..000000000 --- a/doc/sphinx/html/_sources/examples/custom-message.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Custom Message Example -================================================== - -.. literalinclude:: ../../../examples/common/custom-message.py - diff --git a/doc/sphinx/html/_sources/examples/database-datastore.rst.txt b/doc/sphinx/html/_sources/examples/database-datastore.rst.txt deleted file mode 100644 index 9186be812..000000000 --- a/doc/sphinx/html/_sources/examples/database-datastore.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Database Datastore Example -================================================== - -.. literalinclude:: ../../../examples/contrib/database-datastore.py - diff --git a/doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt b/doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt deleted file mode 100644 index 3efc72644..000000000 --- a/doc/sphinx/html/_sources/examples/gtk-frontend.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -================================================== -Glade/GTK Frontend Example -================================================== - -Main Program --------------------------------------------------- - -This is an example simulator that is written using the pygtk -bindings. Although it currently does not have a frontend for -modifying the context values, it does allow one to expose N -virtual modbus devices to a network which is useful for testing -data center monitoring tools. - -.. note:: The virtual networking code will only work on linux - -.. literalinclude:: ../../../examples/gui/gtk/simulator.py - :language: python - -Glade Layout File --------------------------------------------------- - -The following is the glade layout file that is used by this script: - -.. literalinclude:: ../../../examples/gui/gtk/simulator.glade - :language: xml - diff --git a/doc/sphinx/html/_sources/examples/index.rst.txt b/doc/sphinx/html/_sources/examples/index.rst.txt deleted file mode 100644 index a41f01129..000000000 --- a/doc/sphinx/html/_sources/examples/index.rst.txt +++ /dev/null @@ -1,60 +0,0 @@ - -Pymodbus Library Examples -==================================== - -*What follows is a collection of examples using the pymodbus -library in various ways* - -Example Library Code --------------------------------------------------- - -.. toctree:: - :maxdepth: 2 - - asynchronous-client - asynchronous-server - asynchronous-processor - custom-message - custom-datablock - modbus-logging - modbus-payload - modbus-payload-server - synchronous-client - synchronous-client-ext - synchronous-server - performance - updating-server - callback-server - changing-framers - thread-safe-datastore - -Custom Pymodbus Code --------------------------------------------------- - -.. toctree:: - :maxdepth: 2 - - redis-datastore - database-datastore - bcd-payload - modicon-payload - message-generator - message-parser - serial-forwarder - modbus-scraper - modbus-simulator - concurrent-client - libmodbus-client - remote-server-context - -Example Frontend Code --------------------------------------------------- - -.. toctree:: - :maxdepth: 2 - - gtk-frontend - tk-frontend - wx-frontend - bottle-frontend - diff --git a/doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt b/doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt deleted file mode 100644 index 17ac8e2cf..000000000 --- a/doc/sphinx/html/_sources/examples/libmodbus-client.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Libmodbus Client Facade -================================================== - -.. literalinclude:: ../../../examples/contrib/libmodbus-client.py - diff --git a/doc/sphinx/html/_sources/examples/message-generator.rst.txt b/doc/sphinx/html/_sources/examples/message-generator.rst.txt deleted file mode 100644 index 605554c45..000000000 --- a/doc/sphinx/html/_sources/examples/message-generator.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -================================================== -Modbus Message Generator Example -================================================== - -This is an example of a utility that will build -examples of modbus messages in all the available -formats in the pymodbus package. - --------------------------------------------------- -Program Source --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/message-generator.py - --------------------------------------------------- -Example Request Messages --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/tx-messages - --------------------------------------------------- -Example Response Messages --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/rx-messages - diff --git a/doc/sphinx/html/_sources/examples/message-parser.rst.txt b/doc/sphinx/html/_sources/examples/message-parser.rst.txt deleted file mode 100644 index 0bbaee9fc..000000000 --- a/doc/sphinx/html/_sources/examples/message-parser.rst.txt +++ /dev/null @@ -1,55 +0,0 @@ -================================================== -Modbus Message Parsing Example -================================================== - -This is an example of a parser to decode raw messages -to a readable description. It will attempt to decode -a message to the request and response version of a -message if possible. Here is an example output:: - - $./message-parser.py -b -m 000112340006ff076d - ================================================================================ - Decoding Message 000112340006ff076d - ================================================================================ - ServerDecoder - -------------------------------------------------------------------------------- - name = ReadExceptionStatusRequest - check = 0x0 - unit_id = 0xff - transaction_id = 0x1 - protocol_id = 0x1234 - documentation = - This function code is used to read the contents of eight Exception Status - outputs in a remote device. The function provides a simple method for - accessing this information, because the Exception Output references are - known (no output reference is needed in the function). - - ClientDecoder - -------------------------------------------------------------------------------- - name = ReadExceptionStatusResponse - check = 0x0 - status = 0x6d - unit_id = 0xff - transaction_id = 0x1 - protocol_id = 0x1234 - documentation = - The normal response contains the status of the eight Exception Status - outputs. The outputs are packed into one data byte, with one bit - per output. The status of the lowest output reference is contained - in the least significant bit of the byte. The contents of the eight - Exception Status outputs are device specific. - --------------------------------------------------- -Program Source --------------------------------------------------- - -.. literalinclude:: ../../../examples/contrib/message-parser.py - --------------------------------------------------- -Example Messages --------------------------------------------------- - -See the documentation for the message generator -for a collection of messages that can be parsed -by this utility. - diff --git a/doc/sphinx/html/_sources/examples/modbus-logging.rst.txt b/doc/sphinx/html/_sources/examples/modbus-logging.rst.txt deleted file mode 100644 index 710e5bd4d..000000000 --- a/doc/sphinx/html/_sources/examples/modbus-logging.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Logging Example -================================================== - -.. literalinclude:: ../../../examples/common/modbus-logging.py - diff --git a/doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt b/doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt deleted file mode 100644 index 9144f0f53..000000000 --- a/doc/sphinx/html/_sources/examples/modbus-payload-server.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Payload Server Context Building Example -================================================== - -.. literalinclude:: ../../../examples/common/modbus-payload-server.py - diff --git a/doc/sphinx/html/_sources/examples/modbus-payload.rst.txt b/doc/sphinx/html/_sources/examples/modbus-payload.rst.txt deleted file mode 100644 index 79e46dfdb..000000000 --- a/doc/sphinx/html/_sources/examples/modbus-payload.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Payload Building/Decoding Example -================================================== - -.. literalinclude:: ../../../examples/common/modbus-payload.py - diff --git a/doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt b/doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt deleted file mode 100644 index 9931c4a62..000000000 --- a/doc/sphinx/html/_sources/examples/modbus-scraper.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modbus Scraper Example -================================================== - -.. literalinclude:: ../../../examples/contrib/modbus-scraper.py - diff --git a/doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt b/doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt deleted file mode 100644 index 5adcee5ee..000000000 --- a/doc/sphinx/html/_sources/examples/modbus-simulator.rst.txt +++ /dev/null @@ -1,5 +0,0 @@ -================================================== -Modbus Simulator Example -================================================== - -.. literalinclude:: ../../../examples/contrib/modbus-simulator.py diff --git a/doc/sphinx/html/_sources/examples/modicon-payload.rst.txt b/doc/sphinx/html/_sources/examples/modicon-payload.rst.txt deleted file mode 100644 index 997a12f50..000000000 --- a/doc/sphinx/html/_sources/examples/modicon-payload.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Modicon Encoded Example -================================================== - -.. literalinclude:: ../../../examples/contrib/modicon-payload.py - diff --git a/doc/sphinx/html/_sources/examples/performance.rst.txt b/doc/sphinx/html/_sources/examples/performance.rst.txt deleted file mode 100644 index 93185bdea..000000000 --- a/doc/sphinx/html/_sources/examples/performance.rst.txt +++ /dev/null @@ -1,11 +0,0 @@ -================================================== -Synchronous Client Performance Check -================================================== - -Below is a quick example of how to test the performance of a tcp modbus -device using the synchronous tcp client. If you do not have a device -to test with, feel free to run a pymodbus server instance or start -the reference tester in the tools directory. - -.. literalinclude:: ../../../examples/common/performance.py - diff --git a/doc/sphinx/html/_sources/examples/redis-datastore.rst.txt b/doc/sphinx/html/_sources/examples/redis-datastore.rst.txt deleted file mode 100644 index bb5554e04..000000000 --- a/doc/sphinx/html/_sources/examples/redis-datastore.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Redis Datastore Example -================================================== - -.. literalinclude:: ../../../examples/contrib/redis-datastore.py - diff --git a/doc/sphinx/html/_sources/examples/remote-server-context.rst.txt b/doc/sphinx/html/_sources/examples/remote-server-context.rst.txt deleted file mode 100644 index 2a2ac3c05..000000000 --- a/doc/sphinx/html/_sources/examples/remote-server-context.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Remote Single Server Context -================================================== - -.. literalinclude:: ../../../examples/contrib/remote_server_context.py - diff --git a/doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt b/doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt deleted file mode 100644 index 87f6e0a0c..000000000 --- a/doc/sphinx/html/_sources/examples/serial-forwarder.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Synchronous Serial Forwarder -================================================== - -.. literalinclude:: ../../../examples/contrib/serial-forwarder.py - diff --git a/doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt b/doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt deleted file mode 100644 index 5012ec8b0..000000000 --- a/doc/sphinx/html/_sources/examples/synchronous-client-ext.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Synchronous Client Extended Example -================================================== - -.. literalinclude:: ../../../examples/common/synchronous-client-ext.py - diff --git a/doc/sphinx/html/_sources/examples/synchronous-client.rst.txt b/doc/sphinx/html/_sources/examples/synchronous-client.rst.txt deleted file mode 100644 index b90563402..000000000 --- a/doc/sphinx/html/_sources/examples/synchronous-client.rst.txt +++ /dev/null @@ -1,19 +0,0 @@ -================================================== -Synchronous Client Example -================================================== - -It should be noted that each request will block waiting for the result. If asynchronous -behaviour is required, please use the asynchronous client implementations. -The synchronous client, works against TCP, UDP, serial ASCII, and serial RTU devices. - -The synchronous client exposes the most popular methods of the modbus protocol, -however, if you want to execute other methods against the device, -simple create a request instance and pass it to the execute method. - -Below an synchronous tcp client is demonstrated running against a -reference server. If you do not have a device to test with, feel free -to run a pymodbus server instance or start the reference tester in -the tools directory. - -.. literalinclude:: ../../../examples/common/synchronous-client.py - diff --git a/doc/sphinx/html/_sources/examples/synchronous-server.rst.txt b/doc/sphinx/html/_sources/examples/synchronous-server.rst.txt deleted file mode 100644 index 1db715d7f..000000000 --- a/doc/sphinx/html/_sources/examples/synchronous-server.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Synchronous Server Example -================================================== - -.. literalinclude:: ../../../examples/common/synchronous-server.py - diff --git a/doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt b/doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt deleted file mode 100644 index 7a965a3f4..000000000 --- a/doc/sphinx/html/_sources/examples/thread-safe-datastore.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Thread Safe Datastore Example -================================================== - -.. literalinclude:: ../../../examples/contrib/thread_safe_datastore.py - diff --git a/doc/sphinx/html/_sources/examples/tk-frontend.rst.txt b/doc/sphinx/html/_sources/examples/tk-frontend.rst.txt deleted file mode 100644 index 1849d0abc..000000000 --- a/doc/sphinx/html/_sources/examples/tk-frontend.rst.txt +++ /dev/null @@ -1,17 +0,0 @@ -================================================== -TK Frontend Example -================================================== - -Main Program --------------------------------------------------- - -This is an example simulator that is written using the native tk -toolkit. Although it currently does not have a frontend for -modifying the context values, it does allow one to expose N -virtual modbus devices to a network which is useful for testing -data center monitoring tools. - -.. note:: The virtual networking code will only work on linux - -.. literalinclude:: ../../../examples/gui/tk/simulator.py - diff --git a/doc/sphinx/html/_sources/examples/updating-server.rst.txt b/doc/sphinx/html/_sources/examples/updating-server.rst.txt deleted file mode 100644 index 07d1baac0..000000000 --- a/doc/sphinx/html/_sources/examples/updating-server.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -================================================== -Updating Server Example -================================================== - -.. literalinclude:: ../../../examples/common/updating-server.py - diff --git a/doc/sphinx/html/_sources/examples/wx-frontend.rst.txt b/doc/sphinx/html/_sources/examples/wx-frontend.rst.txt deleted file mode 100644 index 5d68142c0..000000000 --- a/doc/sphinx/html/_sources/examples/wx-frontend.rst.txt +++ /dev/null @@ -1,17 +0,0 @@ -================================================== -WX Frontend Example -================================================== - -Main Program --------------------------------------------------- - -This is an example simulator that is written using the python wx -bindings. Although it currently does not have a frontend for -modifying the context values, it does allow one to expose N -virtual modbus devices to a network which is useful for testing -data center monitoring tools. - -.. note:: The virtual networking code will only work on linux - -.. literalinclude:: ../../../examples/gui/wx/simulator.py - diff --git a/doc/sphinx/html/_sources/index.rst.txt b/doc/sphinx/html/_sources/index.rst.txt deleted file mode 100644 index 7017018f2..000000000 --- a/doc/sphinx/html/_sources/index.rst.txt +++ /dev/null @@ -1,23 +0,0 @@ -.. PyModbus documentation master file, created by - sphinx-quickstart on Tue Apr 14 19:11:16 2009. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to PyModbus's documentation! -==================================== - -Contents: - -.. toctree:: - :maxdepth: 2 - - examples/index.rst - library/index.rst - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/doc/sphinx/html/_sources/library/async-client.rst.txt b/doc/sphinx/html/_sources/library/async-client.rst.txt deleted file mode 100644 index c325706dc..000000000 --- a/doc/sphinx/html/_sources/library/async-client.rst.txt +++ /dev/null @@ -1,19 +0,0 @@ -:mod:`client.async` --- Twisted Async Modbus Client -==================================================== - -.. module:: client.async - :synopsis: Twisted Asynchronous Modbus Client - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation ------------------- - -.. automodule:: pymodbus.client.async - -.. autoclass:: ModbusClientProtocol - :members: - -.. autoclass:: ModbusClientFactory - :members: diff --git a/doc/sphinx/html/_sources/library/async-server.rst.txt b/doc/sphinx/html/_sources/library/async-server.rst.txt deleted file mode 100644 index 8f2dcdb7b..000000000 --- a/doc/sphinx/html/_sources/library/async-server.rst.txt +++ /dev/null @@ -1,29 +0,0 @@ -:mod:`server.async` --- Twisted Asynchronous Modbus Server -============================================================ - -.. module:: server.async - :synopsis: Twisted Asynchronous Modbus Server - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.server.async - -.. autoclass:: ModbusTcpProtocol - :members: - -.. autoclass:: ModbusUdpProtocol - :members: - -.. autoclass:: ModbusServerFactory - :members: - -.. autofunction:: StartTcpServer - -.. autofunction:: StartUdpServer - -.. autofunction:: StartSerialServer - diff --git a/doc/sphinx/html/_sources/library/bit-read-message.rst.txt b/doc/sphinx/html/_sources/library/bit-read-message.rst.txt deleted file mode 100644 index 9ea4b0cfa..000000000 --- a/doc/sphinx/html/_sources/library/bit-read-message.rst.txt +++ /dev/null @@ -1,32 +0,0 @@ -:mod:`bit_read_message` --- Bit Read Modbus Messages -============================================================ - -.. module:: bit_read_message - :synopsis: Bit Read Modbus Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.bit_read_message - -.. autoclass:: ReadBitsRequestBase - :members: - -.. autoclass:: ReadBitsResponseBase - :members: - -.. autoclass:: ReadCoilsRequest - :members: - -.. autoclass:: ReadCoilsResponse - :members: - -.. autoclass:: ReadDiscreteInputsRequest - :members: - -.. autoclass:: ReadDiscreteInputsResponse - :members: - diff --git a/doc/sphinx/html/_sources/library/bit-write-message.rst.txt b/doc/sphinx/html/_sources/library/bit-write-message.rst.txt deleted file mode 100644 index 6a73f9a46..000000000 --- a/doc/sphinx/html/_sources/library/bit-write-message.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -:mod:`bit_write_message` --- Bit Write Modbus Messages -============================================================ - -.. module:: bit_write_message - :synopsis: Bit Write Modbus Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.bit_write_message - -.. autoclass:: WriteSingleCoilRequest - :members: - -.. autoclass:: WriteSingleCoilResponse - :members: - -.. autoclass:: WriteMultipleCoilsRequest - :members: - -.. autoclass:: WriteMultipleCoilsResponse - :members: - diff --git a/doc/sphinx/html/_sources/library/client-common.rst.txt b/doc/sphinx/html/_sources/library/client-common.rst.txt deleted file mode 100644 index 5cca7ada3..000000000 --- a/doc/sphinx/html/_sources/library/client-common.rst.txt +++ /dev/null @@ -1,16 +0,0 @@ -:mod:`client.common` --- Twisted Async Modbus Client -==================================================== - -.. module:: client.common - :synopsis: Modbus common client clode - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation ------------------- - -.. automodule:: pymodbus.client.common - -.. autoclass:: ModbusClientMixin - :members: diff --git a/doc/sphinx/html/_sources/library/constants.rst.txt b/doc/sphinx/html/_sources/library/constants.rst.txt deleted file mode 100644 index a99e207c6..000000000 --- a/doc/sphinx/html/_sources/library/constants.rst.txt +++ /dev/null @@ -1,31 +0,0 @@ -:mod:`constants` --- Modbus Default Values -============================================================ - -.. module:: constants - :synopsis: Modbus Default Values - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.constants - -.. autoclass:: Defaults - :members: - -.. autoclass:: ModbusStatus - :members: - -.. autoclass:: Endian - :members: - -.. autoclass:: ModbusPlusOperation - :members: - -.. autoclass:: DeviceInformation - :members: - -.. autoclass:: MoreData - :members: diff --git a/doc/sphinx/html/_sources/library/datastore/context.rst.txt b/doc/sphinx/html/_sources/library/datastore/context.rst.txt deleted file mode 100644 index 16a62e2e1..000000000 --- a/doc/sphinx/html/_sources/library/datastore/context.rst.txt +++ /dev/null @@ -1,20 +0,0 @@ -:mod:`context` --- Modbus Server Contexts -============================================================ - -.. module:: context - :synopsis: Modbus Server Contexts - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.datastore.context - -.. autoclass:: ModbusSlaveContext - :members: - -.. autoclass:: ModbusServerContext - :members: - diff --git a/doc/sphinx/html/_sources/library/datastore/index.rst.txt b/doc/sphinx/html/_sources/library/datastore/index.rst.txt deleted file mode 100644 index 6ea14b24e..000000000 --- a/doc/sphinx/html/_sources/library/datastore/index.rst.txt +++ /dev/null @@ -1,13 +0,0 @@ - -Server Datastores and Contexts -==================================== - -*The following are the API documentation strings taken -from the sourcecode* - -.. toctree:: - :maxdepth: 2 - - store.rst - context.rst - remote.rst diff --git a/doc/sphinx/html/_sources/library/datastore/remote.rst.txt b/doc/sphinx/html/_sources/library/datastore/remote.rst.txt deleted file mode 100644 index 551f0b17b..000000000 --- a/doc/sphinx/html/_sources/library/datastore/remote.rst.txt +++ /dev/null @@ -1,16 +0,0 @@ -:mod:`remote` --- Remote Slave Context -============================================================ - -.. module:: remote - :synopsis: Remote Slave Context - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.datastore.remote - -.. autoclass:: RemoteSlaveContext - :members: diff --git a/doc/sphinx/html/_sources/library/datastore/store.rst.txt b/doc/sphinx/html/_sources/library/datastore/store.rst.txt deleted file mode 100644 index 1a5ff2d67..000000000 --- a/doc/sphinx/html/_sources/library/datastore/store.rst.txt +++ /dev/null @@ -1,23 +0,0 @@ -:mod:`store` --- Datastore for Modbus Server Context -============================================================ - -.. module:: store - :synopsis: Datastore for Modbus Server Context - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.datastore.store - -.. autoclass:: BaseModbusDataBlock - :members: - -.. autoclass:: ModbusSequentialDataBlock - :members: - -.. autoclass:: ModbusSparseDataBlock - :members: - diff --git a/doc/sphinx/html/_sources/library/device.rst.txt b/doc/sphinx/html/_sources/library/device.rst.txt deleted file mode 100644 index 59b996de4..000000000 --- a/doc/sphinx/html/_sources/library/device.rst.txt +++ /dev/null @@ -1,28 +0,0 @@ -:mod:`device` --- Modbus Device Representation -============================================================ - -.. module:: device - :synopsis: Modbus Device Representation - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.device - -.. autoclass:: ModbusAccessControl - :members: - -.. autoclass:: ModbusPlusStatistics - :members: - -.. autoclass:: ModbusDeviceIdentification - :members: - -.. autoclass:: DeviceInformationFactory - :members: - -.. autoclass:: ModbusControlBlock - :members: diff --git a/doc/sphinx/html/_sources/library/diag-message.rst.txt b/doc/sphinx/html/_sources/library/diag-message.rst.txt deleted file mode 100644 index 5500a1cbc..000000000 --- a/doc/sphinx/html/_sources/library/diag-message.rst.txt +++ /dev/null @@ -1,128 +0,0 @@ -:mod:`diag_message` --- Diagnostic Modbus Messages -============================================================ - -.. module:: diag_message - :synopsis: Diagnostic Modbus Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.diag_message - -.. autoclass:: DiagnosticStatusRequest - :members: - -.. autoclass:: DiagnosticStatusResponse - :members: - -.. autoclass:: DiagnosticStatusSimpleRequest - :members: - -.. autoclass:: DiagnosticStatusSimpleResponse - :members: - -.. autoclass:: ReturnQueryDataRequest - :members: - -.. autoclass:: ReturnQueryDataResponse - :members: - -.. autoclass:: RestartCommunicationsOptionRequest - :members: - -.. autoclass:: RestartCommunicationsOptionResponse - :members: - -.. autoclass:: ReturnDiagnosticRegisterRequest - :members: - -.. autoclass:: ReturnDiagnosticRegisterResponse - :members: - -.. autoclass:: ChangeAsciiInputDelimiterRequest - :members: - -.. autoclass:: ChangeAsciiInputDelimiterResponse - :members: - -.. autoclass:: ForceListenOnlyModeRequest - :members: - -.. autoclass:: ForceListenOnlyModeResponse - :members: - -.. autoclass:: ClearCountersRequest - :members: - -.. autoclass:: ClearCountersResponse - :members: - -.. autoclass:: ReturnBusMessageCountRequest - :members: - -.. autoclass:: ReturnBusMessageCountResponse - :members: - -.. autoclass:: ReturnBusCommunicationErrorCountRequest - :members: - -.. autoclass:: ReturnBusCommunicationErrorCountResponse - :members: - -.. autoclass:: ReturnBusExceptionErrorCountRequest - :members: - -.. autoclass:: ReturnBusExceptionErrorCountResponse - :members: - -.. autoclass:: ReturnSlaveMessageCountRequest - :members: - -.. autoclass:: ReturnSlaveMessageCountResponse - :members: - -.. autoclass:: ReturnSlaveNoResponseCountRequest - :members: - -.. autoclass:: ReturnSlaveNoReponseCountResponse - :members: - -.. autoclass:: ReturnSlaveNAKCountRequest - :members: - -.. autoclass:: ReturnSlaveNAKCountResponse - :members: - -.. autoclass:: ReturnSlaveBusyCountRequest - :members: - -.. autoclass:: ReturnSlaveBusyCountResponse - :members: - -.. autoclass:: ReturnSlaveBusCharacterOverrunCountRequest - :members: - -.. autoclass:: ReturnSlaveBusCharacterOverrunCountResponse - :members: - -.. autoclass:: ReturnIopOverrunCountRequest - :members: - -.. autoclass:: ReturnIopOverrunCountResponse - :members: - -.. autoclass:: ClearOverrunCountRequest - :members: - -.. autoclass:: ClearOverrunCountResponse - :members: - -.. autoclass:: GetClearModbusPlusRequest - :members: - -.. autoclass:: GetClearModbusPlusResponse - :members: - diff --git a/doc/sphinx/html/_sources/library/events.rst.txt b/doc/sphinx/html/_sources/library/events.rst.txt deleted file mode 100644 index 5bc4d466e..000000000 --- a/doc/sphinx/html/_sources/library/events.rst.txt +++ /dev/null @@ -1,28 +0,0 @@ -:mod:`events` --- Events Used in PyModbus -============================================================ - -.. module:: events - :synopsis: Events Used in PyModbus - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.events - -.. autoclass:: ModbusEvent - :members: - -.. autoclass:: RemoteReceiveEvent - :members: - -.. autoclass:: RemoteSendEvent - :members: - -.. autoclass:: EnteredListenModeEvent - :members: - -.. autoclass:: CommunicationRestartEvent - :members: diff --git a/doc/sphinx/html/_sources/library/exceptions.rst.txt b/doc/sphinx/html/_sources/library/exceptions.rst.txt deleted file mode 100644 index 03c05ea71..000000000 --- a/doc/sphinx/html/_sources/library/exceptions.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -:mod:`exceptions` --- Exceptions Used in PyModbus -============================================================ - -.. module:: exceptions - :synopsis: Exceptions Used in PyModbus - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.exceptions - -.. autoclass:: ModbusException - :members: - -.. autoclass:: ModbusIOException - :members: - -.. autoclass:: ParameterException - :members: - -.. autoclass:: NotImplementedException - :members: - diff --git a/doc/sphinx/html/_sources/library/factory.rst.txt b/doc/sphinx/html/_sources/library/factory.rst.txt deleted file mode 100644 index 5f0fcc83a..000000000 --- a/doc/sphinx/html/_sources/library/factory.rst.txt +++ /dev/null @@ -1,19 +0,0 @@ -:mod:`factory` --- Request/Response Decoders -============================================================ - -.. module:: factory - :synopsis: Request/Response Decoders - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.factory - -.. autoclass:: ServerDecoder - :members: - -.. autoclass:: ClientDecoder - :members: diff --git a/doc/sphinx/html/_sources/library/file-message.rst.txt b/doc/sphinx/html/_sources/library/file-message.rst.txt deleted file mode 100644 index e5d0b666d..000000000 --- a/doc/sphinx/html/_sources/library/file-message.rst.txt +++ /dev/null @@ -1,34 +0,0 @@ -:mod:`file_message` --- File Modbus Messages -============================================================ - -.. module:: file_message - :synopsis: File Modbus Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.file_message - -.. autoclass:: FileRecord - :members: - -.. autoclass:: ReadFileRecordRequest - :members: - -.. autoclass:: ReadFileRecordResponse - :members: - -.. autoclass:: WriteFileRecordRequest - :members: - -.. autoclass:: WriteFileRecordResponse - :members: - -.. autoclass:: ReadFifoQueueRequest - :members: - -.. autoclass:: ReadFifoQueueResponse - :members: diff --git a/doc/sphinx/html/_sources/library/index.rst.txt b/doc/sphinx/html/_sources/library/index.rst.txt deleted file mode 100644 index f21e8e4a7..000000000 --- a/doc/sphinx/html/_sources/library/index.rst.txt +++ /dev/null @@ -1,35 +0,0 @@ - -Pymodbus Library API Documentation -==================================== - -*The following are the API documentation strings taken -from the sourcecode* - -.. toctree:: - :maxdepth: 2 - - bit-read-message.rst - bit-write-message.rst - client-common.rst - sync-client.rst - async-client.rst - constants.rst - datastore/index.rst - diag-message.rst - device.rst - factory.rst - interfaces.rst - exceptions.rst - other-message.rst - mei-message.rst - file-message.rst - events.rst - payload.rst - pdu.rst - pymodbus.rst - register-read-message.rst - register-write-message.rst - sync-server.rst - async-server.rst - transaction.rst - utilities.rst diff --git a/doc/sphinx/html/_sources/library/interfaces.rst.txt b/doc/sphinx/html/_sources/library/interfaces.rst.txt deleted file mode 100644 index cb10d0c62..000000000 --- a/doc/sphinx/html/_sources/library/interfaces.rst.txt +++ /dev/null @@ -1,28 +0,0 @@ -:mod:`interfaces` --- System Interfaces -============================================================ - -.. module:: interfaces - :synopsis: System Interfaces - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.interfaces - -.. autoclass:: Singleton - :members: - -.. autoclass:: IModbusDecoder - :members: - -.. autoclass:: IModbusFramer - :members: - -.. autoclass:: IModbusSlaveContext - :members: - -.. autoclass:: IPayloadBuilder - :members: diff --git a/doc/sphinx/html/_sources/library/mei-message.rst.txt b/doc/sphinx/html/_sources/library/mei-message.rst.txt deleted file mode 100644 index d75809445..000000000 --- a/doc/sphinx/html/_sources/library/mei-message.rst.txt +++ /dev/null @@ -1,19 +0,0 @@ -:mod:`mei_message` --- MEI Modbus Messages -============================================================ - -.. module:: mei_message - :synopsis: MEI Modbus Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.mei_message - -.. autoclass:: ReadDeviceInformationRequest - :members: - -.. autoclass:: ReadDeviceInformationResponse - :members: diff --git a/doc/sphinx/html/_sources/library/other-message.rst.txt b/doc/sphinx/html/_sources/library/other-message.rst.txt deleted file mode 100644 index 3baf24888..000000000 --- a/doc/sphinx/html/_sources/library/other-message.rst.txt +++ /dev/null @@ -1,31 +0,0 @@ -:mod:`other_message` --- Other Modbus Messages -============================================================ - -.. module:: other_message - :synopsis: Other Modbus Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.other_message - -.. autoclass:: ReadExceptionStatusRequest - :members: - -.. autoclass:: ReadExceptionStatusResponse - :members: - -.. autoclass:: GetCommEventCounterRequest - :members: - -.. autoclass:: GetCommEventCounterResponse - :members: - -.. autoclass:: ReportSlaveIdRequest - :members: - -.. autoclass:: ReportSlaveIdResponse - :members: diff --git a/doc/sphinx/html/_sources/library/payload.rst.txt b/doc/sphinx/html/_sources/library/payload.rst.txt deleted file mode 100644 index 4083aa2ca..000000000 --- a/doc/sphinx/html/_sources/library/payload.rst.txt +++ /dev/null @@ -1,19 +0,0 @@ -:mod:`payload` --- Modbus Payload Utilities -============================================================ - -.. module:: payload - :synopsis: Modbus Payload Utilities - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.payload - -.. autoclass:: BinaryPayloadBuilder - :members: - -.. autoclass:: BinaryPayloadDecoder - :members: diff --git a/doc/sphinx/html/_sources/library/pdu.rst.txt b/doc/sphinx/html/_sources/library/pdu.rst.txt deleted file mode 100644 index 46b8fd456..000000000 --- a/doc/sphinx/html/_sources/library/pdu.rst.txt +++ /dev/null @@ -1,32 +0,0 @@ -:mod:`pdu` --- Base Structures -============================================================ - -.. module:: pdu - :synopsis: Base Structures - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.pdu - -.. autoclass:: ModbusPDU - :members: - -.. autoclass:: ModbusRequest - :members: - -.. autoclass:: ModbusResponse - :members: - -.. autoclass:: ModbusExceptions - :members: - -.. autoclass:: ExceptionResponse - :members: - -.. autoclass:: IllegalFunctionRequest - :members: - diff --git a/doc/sphinx/html/_sources/library/pymodbus.rst.txt b/doc/sphinx/html/_sources/library/pymodbus.rst.txt deleted file mode 100644 index 54719825d..000000000 --- a/doc/sphinx/html/_sources/library/pymodbus.rst.txt +++ /dev/null @@ -1,7 +0,0 @@ -:mod:`pymodbus` --- Pymodbus Library -============================================================ - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -.. automodule:: pymodbus diff --git a/doc/sphinx/html/_sources/library/register-read-message.rst.txt b/doc/sphinx/html/_sources/library/register-read-message.rst.txt deleted file mode 100644 index aeb4c3402..000000000 --- a/doc/sphinx/html/_sources/library/register-read-message.rst.txt +++ /dev/null @@ -1,38 +0,0 @@ -:mod:`register_read_message` --- Register Read Messages -============================================================ - -.. module:: register_read_message - :synopsis: Register Read Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.register_read_message - -.. autoclass:: ReadRegistersRequestBase - :members: - -.. autoclass:: ReadRegistersResponseBase - :members: - -.. autoclass:: ReadHoldingRegistersRequest - :members: - -.. autoclass:: ReadHoldingRegistersResponse - :members: - -.. autoclass:: ReadInputRegistersRequest - :members: - -.. autoclass:: ReadInputRegistersResponse - :members: - -.. autoclass:: ReadWriteMultipleRegistersRequest - :members: - -.. autoclass:: ReadWriteMultipleRegistersResponse - :members: - diff --git a/doc/sphinx/html/_sources/library/register-write-message.rst.txt b/doc/sphinx/html/_sources/library/register-write-message.rst.txt deleted file mode 100644 index 71a917646..000000000 --- a/doc/sphinx/html/_sources/library/register-write-message.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -:mod:`register_write_message` --- Register Write Messages -============================================================ - -.. module:: register_write_message - :synopsis: Register Write Messages - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.register_write_message - -.. autoclass:: WriteSingleRegisterRequest - :members: - -.. autoclass:: WriteSingleRegisterResponse - :members: - -.. autoclass:: WriteMultipleRegistersRequest - :members: - -.. autoclass:: WriteMultipleRegistersResponse - :members: - diff --git a/doc/sphinx/html/_sources/library/sync-client.rst.txt b/doc/sphinx/html/_sources/library/sync-client.rst.txt deleted file mode 100644 index 5f60a3a50..000000000 --- a/doc/sphinx/html/_sources/library/sync-client.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -:mod:`client.sync` --- Twisted Synchronous Modbus Client -========================================================= - -.. module:: client.sync - :synopsis: Twisted Synchronous Modbus Client - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation ------------------- - -.. automodule:: pymodbus.client.sync - -.. autoclass:: BaseModbusClient - :members: - -.. autoclass:: ModbusTcpClient - :members: - -.. autoclass:: ModbusUdpClient - :members: - -.. autoclass:: ModbusSerialClient - :members: - diff --git a/doc/sphinx/html/_sources/library/sync-server.rst.txt b/doc/sphinx/html/_sources/library/sync-server.rst.txt deleted file mode 100644 index 3dcf9e04d..000000000 --- a/doc/sphinx/html/_sources/library/sync-server.rst.txt +++ /dev/null @@ -1,40 +0,0 @@ -:mod:`server.sync` --- Twisted Synchronous Modbus Server -============================================================ - -.. module:: server.sync - :synopsis: Twisted Synchronous Modbus Server - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.server.sync - -.. autoclass:: ModbusBaseRequestHandler - :members: - -.. autoclass:: ModbusSingleRequestHandler - :members: - -.. autoclass:: ModbusConnectedRequestHandler - :members: - -.. autoclass:: ModbusDisconnectedRequestHandler - :members: - -.. autoclass:: ModbusTcpServer - :members: - -.. autoclass:: ModbusUdpServer - :members: - -.. autoclass:: ModbusSerialServer - :members: - -.. autofunction:: StartTcpServer - -.. autofunction:: StartUdpServer - -.. autofunction:: StartSerialServer diff --git a/doc/sphinx/html/_sources/library/transaction.rst.txt b/doc/sphinx/html/_sources/library/transaction.rst.txt deleted file mode 100644 index b6ee89a8a..000000000 --- a/doc/sphinx/html/_sources/library/transaction.rst.txt +++ /dev/null @@ -1,31 +0,0 @@ -:mod:`transaction` --- Transaction Controllers for Pymodbus -============================================================ - -.. module:: transaction - :synopsis: Transaction controllers for pymodbus - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.transaction - -.. autoclass:: DictTransactionManager - :members: - -.. autoclass:: FifoTransactionManager - :members: - -.. autoclass:: ModbusSocketFramer - :members: - -.. autoclass:: ModbusRtuFramer - :members: - -.. autoclass:: ModbusAsciiFramer - :members: - -.. autoclass:: ModbusBinaryFramer - :members: diff --git a/doc/sphinx/html/_sources/library/utilities.rst.txt b/doc/sphinx/html/_sources/library/utilities.rst.txt deleted file mode 100644 index d8e78527e..000000000 --- a/doc/sphinx/html/_sources/library/utilities.rst.txt +++ /dev/null @@ -1,33 +0,0 @@ -:mod:`utilities` --- Extra Modbus Helpers -========================================== - -.. module:: utilities - :synopsis: Extra Modbus Helpers - -.. moduleauthor:: Galen Collins -.. sectionauthor:: Galen Collins - -API Documentation -------------------- - -.. automodule:: pymodbus.utilities - -.. autofunction:: default - -.. autofunction:: dict_property - -.. autofunction:: pack_bitstring - -.. autofunction:: unpack_bitstring - -.. autofunction:: __generate_crc16_table - -.. autofunction:: computeCRC - -.. autofunction:: checkCRC - -.. autofunction:: computeLRC - -.. autofunction:: checkLRC - -.. autofunction:: rtuFrameSize diff --git a/doc/sphinx/html/_static/README b/doc/sphinx/html/_static/README deleted file mode 100644 index 06016c7ce..000000000 --- a/doc/sphinx/html/_static/README +++ /dev/null @@ -1 +0,0 @@ -include any html static content here diff --git a/doc/sphinx/html/_static/ajax-loader.gif b/doc/sphinx/html/_static/ajax-loader.gif deleted file mode 100644 index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/doc/sphinx/html/_static/basic.css b/doc/sphinx/html/_static/basic.css deleted file mode 100644 index dc88b5a2d..000000000 --- a/doc/sphinx/html/_static/basic.css +++ /dev/null @@ -1,632 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - width: 170px; -} - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, .highlighted { - background-color: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/doc/sphinx/html/_static/classic.css b/doc/sphinx/html/_static/classic.css deleted file mode 100644 index 22fa0bde7..000000000 --- a/doc/sphinx/html/_static/classic.css +++ /dev/null @@ -1,261 +0,0 @@ -/* - * classic.css_t - * ~~~~~~~~~~~~~ - * - * Sphinx stylesheet -- classic theme. - * - * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: sans-serif; - font-size: 100%; - background-color: #11303d; - color: #000; - margin: 0; - padding: 0; -} - -div.document { - background-color: #1c4e63; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 230px; -} - -div.body { - background-color: #ffffff; - color: #000000; - padding: 0 20px 30px 20px; -} - -div.footer { - color: #ffffff; - width: 100%; - padding: 9px 0 9px 0; - text-align: center; - font-size: 75%; -} - -div.footer a { - color: #ffffff; - text-decoration: underline; -} - -div.related { - background-color: #133f52; - line-height: 30px; - color: #ffffff; -} - -div.related a { - color: #ffffff; -} - -div.sphinxsidebar { -} - -div.sphinxsidebar h3 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.4em; - font-weight: normal; - margin: 0; - padding: 0; -} - -div.sphinxsidebar h3 a { - color: #ffffff; -} - -div.sphinxsidebar h4 { - font-family: 'Trebuchet MS', sans-serif; - color: #ffffff; - font-size: 1.3em; - font-weight: normal; - margin: 5px 0 0 0; - padding: 0; -} - -div.sphinxsidebar p { - color: #ffffff; -} - -div.sphinxsidebar p.topless { - margin: 5px 10px 10px 10px; -} - -div.sphinxsidebar ul { - margin: 10px; - padding: 0; - color: #ffffff; -} - -div.sphinxsidebar a { - color: #98dbcc; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - - - -/* -- hyperlink styles ------------------------------------------------------ */ - -a { - color: #355f7c; - text-decoration: none; -} - -a:visited { - color: #355f7c; - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - - - -/* -- body styles ----------------------------------------------------------- */ - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Trebuchet MS', sans-serif; - background-color: #f2f2f2; - font-weight: normal; - color: #20435c; - border-bottom: 1px solid #ccc; - margin: 20px -20px 10px -20px; - padding: 3px 0 3px 10px; -} - -div.body h1 { margin-top: 0; font-size: 200%; } -div.body h2 { font-size: 160%; } -div.body h3 { font-size: 140%; } -div.body h4 { font-size: 120%; } -div.body h5 { font-size: 110%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #c60f0f; - font-size: 0.8em; - padding: 0 4px 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - background-color: #c60f0f; - color: white; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - text-align: justify; - line-height: 130%; -} - -div.admonition p.admonition-title + p { - display: inline; -} - -div.admonition p { - margin-bottom: 5px; -} - -div.admonition pre { - margin-bottom: 5px; -} - -div.admonition ul, div.admonition ol { - margin-bottom: 5px; -} - -div.note { - background-color: #eee; - border: 1px solid #ccc; -} - -div.seealso { - background-color: #ffc; - border: 1px solid #ff6; -} - -div.topic { - background-color: #eee; -} - -div.warning { - background-color: #ffe4e4; - border: 1px solid #f66; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre { - padding: 5px; - background-color: #eeffcc; - color: #333333; - line-height: 120%; - border: 1px solid #ac9; - border-left: none; - border-right: none; -} - -code { - background-color: #ecf0f3; - padding: 0 1px 0 1px; - font-size: 0.95em; -} - -th { - background-color: #ede; -} - -.warning code { - background: #efc2c2; -} - -.note code { - background: #d6d6d6; -} - -.viewcode-back { - font-family: sans-serif; -} - -div.viewcode-block:target { - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} - -div.code-block-caption { - color: #efefef; - background-color: #1c4e63; -} \ No newline at end of file diff --git a/doc/sphinx/html/_static/comment-bright.png b/doc/sphinx/html/_static/comment-bright.png deleted file mode 100644 index 15e27edb12ac25701ac0ac21b97b52bb4e45415e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ diff --git a/doc/sphinx/html/_static/default.css b/doc/sphinx/html/_static/default.css deleted file mode 100644 index 81b936363..000000000 --- a/doc/sphinx/html/_static/default.css +++ /dev/null @@ -1 +0,0 @@ -@import url("classic.css"); diff --git a/doc/sphinx/html/_static/doctools.js b/doc/sphinx/html/_static/doctools.js deleted file mode 100644 index 565497723..000000000 --- a/doc/sphinx/html/_static/doctools.js +++ /dev/null @@ -1,287 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s == 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node) { - if (node.nodeType == 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this); - }); - } - } - return this.each(function() { - highlight(this); - }); -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') - return string; - return (typeof translated == 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); \ No newline at end of file diff --git a/doc/sphinx/html/_static/down-pressed.png b/doc/sphinx/html/_static/down-pressed.png deleted file mode 100644 index 5756c8cad8854722893dc70b9eb4bb0400343a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl diff --git a/doc/sphinx/html/_static/down.png b/doc/sphinx/html/_static/down.png deleted file mode 100644 index 1b3bdad2ceffae91cee61b32f3295f9bbe646e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* diff --git a/doc/sphinx/html/_static/file.png b/doc/sphinx/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/doc/sphinx/html/_static/jquery-3.1.0.js b/doc/sphinx/html/_static/jquery-3.1.0.js deleted file mode 100644 index f2fc27478..000000000 --- a/doc/sphinx/html/_static/jquery-3.1.0.js +++ /dev/null @@ -1,10074 +0,0 @@ -/*eslint-disable no-unused-vars*/ -/*! - * jQuery JavaScript Library v3.1.0 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2016-07-07T21:44Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.1.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return just the one element from the set - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return all the elements in a clean array - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = jQuery.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.0 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-01-04 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - // Known :disabled false positives: - // IE: *[disabled]:not(button, input, select, textarea, optgroup, option, menuitem, fieldset) - // not IE: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Check form elements and option elements for explicit disabling - return "label" in elem && elem.disabled === disabled || - "form" in elem && elem.disabled === disabled || - - // Check non-disabled form elements for fieldset[disabled] ancestors - "form" in elem && elem.disabled === false && ( - // Support: IE6-11+ - // Ancestry is covered for us - elem.isDisabled === disabled || - - // Otherwise, assume any non-

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