[PATCH rtems-docs v3] Add Regulator documentation based on V1 functionality
Joel Sherrill
joel at rtems.org
Wed Aug 9 15:42:36 UTC 2023
---
README.txt | 19 +-
c-user/index.rst | 1 +
c-user/regulator/background.rst | 90 ++++
c-user/regulator/directives.rst | 549 ++++++++++++++++++++
c-user/regulator/index.rst | 19 +
c-user/regulator/introduction.rst | 25 +
c-user/regulator/operations.rst | 67 +++
c-user/rtems_data_types.rst | 95 ++++
images/c_user/regulator_input_sequence.png | Bin 0 -> 38120 bytes
images/c_user/regulator_input_sequence.puml | 16 +
10 files changed, 879 insertions(+), 2 deletions(-)
create mode 100644 c-user/regulator/background.rst
create mode 100644 c-user/regulator/directives.rst
create mode 100644 c-user/regulator/index.rst
create mode 100644 c-user/regulator/introduction.rst
create mode 100644 c-user/regulator/operations.rst
create mode 100644 images/c_user/regulator_input_sequence.png
create mode 100644 images/c_user/regulator_input_sequence.puml
diff --git a/README.txt b/README.txt
index b61a73a..1c4d729 100644
--- a/README.txt
+++ b/README.txt
@@ -120,8 +120,10 @@ Please add your host to this section as you set it up.
The best results are produced with Python3 and a virtual environment`. It can
create a specific python environment using `pip`.
-Virtual Environment
-~~~~~~~~~~~~~~~~~~~
+Similarly, npm packages can be installed into a users $HOME directory.
+
+Python Virtual Environment
+~~~~~~~~~~~~~~~~~~~~~~~~~~
Create a directory to house the virtual environment, create the environment,
and then activate it. This example assumes Python3 and the `venv` module:
@@ -143,6 +145,19 @@ Either way, the prompt will now change. You can install Sphinx with:
When you have finished you enter `deactivate`.
+NPM Per User Environment
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Change npm's default directory to a local one:
+
+ mkdir ~/.npm-global
+ npm config set prefix '~/.npm-global'
+
+Subsequent packages installed via `npm install` will be local
+to the user. The following shows the PATH changes needed.
+
+ export PATH=${HOME}/.npm-global/bin:$PATH
+
Sphinx Per User Install
~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/c-user/index.rst b/c-user/index.rst
index 09aafe8..b4ad322 100644
--- a/c-user/index.rst
+++ b/c-user/index.rst
@@ -51,6 +51,7 @@ RTEMS Classic API Guide (|version|).
user-extensions/index
config/index
self_contained_objects
+ regulator/index
multiprocessing/index
symmetric_multiprocessing_services
pci_library
diff --git a/c-user/regulator/background.rst b/c-user/regulator/background.rst
new file mode 100644
index 0000000..f6a6bff
--- /dev/null
+++ b/c-user/regulator/background.rst
@@ -0,0 +1,90 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2023 On-Line Applications Research Corporation (OAR)
+
+.. _RegulatorManagerBackground:
+
+Background
+==========
+The regulator provides facilities to accept bursty input and buffer it
+as needed before delivering it at a pre-defined periodic rate. The input
+is referred to as the Source, with the output referred to as the
+Destination. Messages are accepted from the Source and delivered to
+the Destination by a user-provided Delivery function.
+
+The Regulator implementation uses the RTEMS Classic API Partition Manager
+to manage the buffer pool and the RTEMS Classic API Message Queue
+Manager to send the buffer to the Delivery thread. The Delivery thread
+invokes a user-provided delivery function to get the message to the
+Destination.
+
+Regulator Buffering
+-------------------
+The regulator is designed to sit logically between two entities -- a
+source and a destination, where it limits the traffic sent to the
+destination to prevent it from being flooded with messages from the
+source. This can be used to accommodate bursts of input from a source
+and meter it out to a destination. The maximum number of messages
+which can be buffered in the regulator is specified by the
+``maximum_messages`` field in the :ref:`InterfaceRtemsRegulatorAttributes`
+structure passed as an argument to :ref:`InterfaceRtemsRegulatorCreate`.
+
+The regulator library accepts an input stream of messages from a
+source and delivers them to a destination. The regulator assumes that the
+input stream from the source contains sporadic bursts of data which can
+exceed the acceptable rate of the destination. By limiting the message rate,
+the regulator prevents an overflow of messages.
+
+The regulator can be configured for the input buffering required to manage
+the maximum burst and for the metering rate for the delivery. The delivery
+rate is in messages per second. If the sender produces data too fast,
+the regulator will buffer the configured number of messages.
+
+A configuration capability is provided to allow for adaptation to different
+message streams. The regulator can also support running multiple instances,
+which could be used on independent message streams.
+
+It is assumed that the application has a design limit on the number of
+messages which may be buffered. All messages accepted by the regulator,
+assuming no overflow on input, will eventually be output by the Delivery
+thread.
+
+Message Delivery Rate
+---------------------
+
+The Source sends buffers to the Regulator instance. The Regulator
+then sends the buffer via a message queue which delivers them to the
+Delivery thread. The Delivery thread executes periodically at a rate
+specified by the ``delivery_thread_period`` field in the
+:ref:`InterfaceRtemsRegulatorAttributes` structure passed as an argument
+to :ref:`InterfaceRtemsRegulatorCreate`.
+
+During each period, the Delivery thread attempts to receive
+up to ``maximum_to_dequeue_per_period`` number of buffers and
+invoke the Delivery function to deliver each of them to the
+Destination. The ``maximum_to_dequeue_per_period`` field in the
+:ref:`InterfaceRtemsRegulatorAttributes` structure passed as an argument
+to :ref:`InterfaceRtemsRegulatorCreate`.
+
+For example, consider a Source that may produce a burst of up to seven
+messages every five seconds. But the Destination cannot handle a burst
+of seven and either drops messages or gives an error. This can be
+accommodated by a Regulator instance configured as follows:
+
+* ``maximum_messages`` - 7
+* ``delivery_thread_period`` - one second
+* ``maximum_to_dequeue_per_period`` - 3
+
+In this scenario, the application will use the Delivery thread
+:ref:`InterfaceRtemsRegulatorSend` to enqueue the seven messages when they
+arrive. The Delivery thread will deliver three messages per second. The
+following illustrates this sequence:
+
+* Time 0: Source sends seven messages
+* Time 1: Delivery of messages 1 to 3
+* Time 3: Delivery of messages 4 to 6
+* Time 3: Delivery of message 7
+* Time 4: No messages to deliver
+
+This configuration of the regulator ensures that the Destination does
+not overflow.
diff --git a/c-user/regulator/directives.rst b/c-user/regulator/directives.rst
new file mode 100644
index 0000000..eea3fff
--- /dev/null
+++ b/c-user/regulator/directives.rst
@@ -0,0 +1,549 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2023 On-Line Applications Research Corporation (OAR)
+
+.. _RegulatorManagerDirectives:
+
+Directives
+==========
+
+This section details the directives of the Regulator Manager. A subsection is
+dedicated to each of this manager's directives and lists the calling sequence,
+parameters, description, return values, and notes of the directive.
+
+.. *** START of rtems_regulator_create()
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: rtems_regulator_create()
+.. index:: create a regulator
+
+.. _InterfaceRtemsRegulatorCreate:
+
+rtems_regulator_create()
+------------------------
+
+Creates a regulator.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+ rtems_status_code rtems_regulator_create(
+ rtems_regulator_attributes *attributes,
+ rtems_regulator_instance **regulator
+ );
+
+.. rubric:: PARAMETERS:
+
+``attributes``
+ This parameter is the attributes associated with the regulator
+ being created.
+
+``regulator``
+ This parameter is the pointer to a regulator instance. When the
+ directive call is successful, a pointer to the created regulator
+ will be stored in this object.
+
+.. rubric:: DESCRIPTION:
+
+This function creates an instance of a regulator. It uses the provided
+``attributes`` to create the instance return in ``regulator``. This instance
+will allocate the buffers associated with the regulator instance as well
+as the Delivery Thread.
+
+The ``attributes`` parameter points to an instance of
+:ref:`InterfaceRtemsRegulatorAttributes` which is filled in to reflect
+the desired configuration of the regulator instance. It defines multiple
+characteristics of the the Delivery thread dedicated to this regulator
+instance including the priority and stack size. It also defines the
+period of the Delivery thread and the maximum number of messages that may
+be delivered per period via invocation of the delivery function.
+
+For each regulator instance, the following resources are allocated:
+
+* A memory area for the regulator control block using ``malloc()``.
+
+* A RTEMS Classic API Message Queue is constructed with message
+ buffer memory allocated using ``malloc()``. Each message consists
+ of a pointer to the contents and a length field.
+
+* A RTEMS Classic API Partition.
+
+* A RTEMS Classic API Rate Monotonic Period.
+
+.. rubric:: RETURN VALUES:
+
+:c:macro:`RTEMS_SUCCESSFUL`
+ The requested operation was successful.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``attributes`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``regulator`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``deliverer`` field in the structure pointed to by the
+ ``attributes`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INVALID_SIZE`
+ The ``maximum_messages`` field in the structure pointed to by the
+ ``attributes`` parameter was 0.
+
+:c:macro:`RTEMS_INVALID_NUMBER`
+ The ``maximum_to_dequeue_per_period`` field in the structure pointed
+ to by the ``attributes`` parameter was 0.
+
+:c:macro:`RTEMS_NO_MEMORY`
+ The allocation of memory for the regulator instance failed.
+
+:c:macro:`RTEMS_NO_MEMORY`
+ The allocation of memory for the buffers failed.
+
+:c:macro:`RTEMS_NO_MEMORY`
+ The allocation of memory for the internal message queue failed.
+
+.. rubric:: NOTES:
+
+:ref:`InterfaceRtemsRegulatorCreate` uses
+:ref:`InterfaceRtemsPartitionCreate`,
+:ref:`InterfaceRtemsMessageQueueConstruct`,
+:ref:`InterfaceRtemsTaskCreate`, and :ref:`InterfaceRtemsTaskStart`. If
+any of those directives return a status indicating failure, it will be
+returned to the caller.
+
+.. rubric:: CONSTRAINTS:
+
+The following constraints apply to this directive:
+
+* The directive may be called from within device driver initialization context.
+
+* The directive may be called from within task context.
+
+* The directive may obtain and release the object allocator mutex. This may
+ cause the calling task to be preempted.
+
+* The number of tasks available to the application is configured through the
+ :ref:`CONFIGURE_MAXIMUM_TASKS` application configuration option.
+
+* Where the object class corresponding to the directive is configured to use
+ unlimited objects, the directive may allocate memory from the RTEMS
+ Workspace.
+
+.. *** START of rtems_regulator_delete()
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: rtems_regulator_delete()
+.. index:: delete a regulator
+
+.. _InterfaceRtemsRegulatorDelete:
+
+rtems_regulator_delete()
+------------------------
+
+Deletes the regulator.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+ rtems_status_code rtems_regulator_delete(
+ rtems_regulator_instance *regulator,
+ rtems_interval ticks
+ );
+
+.. rubric:: PARAMETERS:
+
+``regulator``
+ This parameter points to the regulator instance.
+
+``ticks``
+ This parameter specifies the maximum length of time to wait.
+
+.. rubric:: DESCRIPTION:
+
+This directive is used to delete the specified ``regulator``
+instance. It will deallocate the resources that were allocated by the
+:ref:`InterfaceRtemsRegulatorCreate` directive.
+
+
+This directive ensures that no buffers are outstanding either because the
+Source is holding one of more buffers or because they are being held by
+the regulator instance pending delivery.
+
+If the Delivery Thread has been created and is running, this directive will
+request the thread to voluntarily exit. This call will wait up to ``ticks`` for the thread to exit.
+
+.. rubric:: RETURN VALUES:
+
+:c:macro:`RTEMS_SUCCESSFUL`
+ The requested operation was successful.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``regulator`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INCORRECT_STATE`
+ The ``regulator`` instance was not initialized.
+
+:c:macro:`RTEMS_RESOURCE_IN_USE`
+ The ``regulator`` instance has buffers outstanding.
+
+:c:macro:`RTEMS_TIMEOUT`
+ The ``regulator`` instance was not able to be deleted within the
+ specific number of ``ticks``.
+
+.. rubric:: NOTES:
+
+It is the responsibility of the user to ensure that any resources
+such as sockets or open file descriptors used by the Source or delivery
+function are also deleted if necessary. It is likely safer to delete those
+delivery resources after deleting the regulator instance rather than before.
+
+
+It is the responsibility of the user to ensure that all buffers associated
+with this regulator instance have been released and that none are in
+the process of being delivered.
+
+.. rubric:: CONSTRAINTS:
+
+The following constraints apply to this directive:
+
+* The directive may be called from within task context.
+
+* The directive may obtain and release the object allocator mutex. This may
+ cause the calling task to be preempted.
+
+* The calling task does not have to be the task that created the object. Any
+ local task that knows the object identifier can delete the object.
+
+* Where the object class corresponding to the directive is configured to use
+ unlimited objects, the directive may free memory to the RTEMS Workspace.
+
+.. *** START of rtems_regulator_obtain_buffer()
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: rtems_regulator_obtain_buffer()
+.. index:: obtain buffer from regulator
+
+.. _InterfaceRtemsRegulatorObtainBuffer:
+
+rtems_regulator_obtain_buffer()
+-------------------------------
+
+Obtain buffer from regulator.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+ rtems_status_code rtems_regulator_obtain_buffer(
+ rtems_regulator_instance *regulator,
+ void **buffer
+ );
+
+.. rubric:: PARAMETERS:
+
+``regulator``
+ This parameter is the regulator instance to operate upon.
+
+``buffer``
+ This parameter will point to the buffer allocated.
+
+.. rubric:: DESCRIPTION:
+
+This function is used to obtain a buffer from the regulator's pool. The
+``buffer`` returned is assumed to be filled in with contents and used
+in a subsequent call to :ref:`InterfaceRtemsRegulatorSend`.
+
+When the ``buffer`` is delivered, it is expected to be released. If the
+``buffer`` is not successfully accepted by this method, then it should
+be returned using :ref:`InterfaceRtemsRegulatorReleaseBuffer` or used
+to send another message.
+
+The ``buffer`` returned is of the maximum_message_size specified in the
+attributes passed in to :ref:`InterfaceRtemsRegulatorCreate`.
+
+.. rubric:: RETURN VALUES:
+
+:c:macro:`RTEMS_SUCCESSFUL`
+ The requested operation was successful.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``regulator`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INCORRECT_STATE`
+ The ``regulator`` instance was not initialized.
+
+.. rubric:: NOTES:
+
+:ref:`InterfaceRtemsRegulatorObtainBuffer` uses
+:ref:`InterfaceRtemsPartitionGetBuffer` and if it returns a status
+indicating failure, it will be returned to the caller.
+
+.. rubric:: CONSTRAINTS:
+
+The following constraints apply to this directive:
+
+* The directive may be called from within device driver initialization context.
+
+* The directive may be called from within task context.
+
+.. *** START of rtems_regulator_release_buffer()
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: rtems_regulator_release_buffer()
+.. index:: release buffer back to regulator
+
+.. _InterfaceRtemsRegulatorReleaseBuffer:
+
+rtems_regulator_release_buffer()
+--------------------------------
+
+Release buffer to regulator.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+ rtems_status_code rtems_regulator_release_buffer(
+ rtems_regulator_instance *regulator,
+ void *buffer
+ );
+
+.. rubric:: PARAMETERS:
+
+``regulator``
+ This parameter is the regulator instance to operate upon.
+
+``buffer``
+ This parameter will point to the buffer to be released.
+
+.. rubric:: DESCRIPTION:
+
+This function is used to release a buffer to the regulator's pool. It is
+assumed that the ``buffer`` returned will not be used by the application
+anymore.
+
+The ``buffer`` must have previously been allocated by
+:ref:`InterfaceRtemsRegulatorObtainBuffer` and NOT yet passed to
+:ref:`InterfaceRtemsRegulatorSend`, or it has been sent and delivery
+has been completed by the delivery function.
+
+If a subsequent :ref:`InterfaceRtemsRegulatorSend` using this ``buffer``
+is successful, the ``buffer`` will eventually be processed by the delivery
+thread and released.
+
+.. rubric:: RETURN VALUES:
+
+:c:macro:`RTEMS_SUCCESSFUL`
+ The requested operation was successful.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``regulator`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INCORRECT_STATE`
+ The ``regulator`` instance was not initialized.
+
+.. rubric:: NOTES:
+
+:ref:`InterfaceRtemsRegulatorReleaseBuffer` uses
+:ref:`InterfaceRtemsPartitionReturnBuffer` and if it returns a status
+indicating failure, it will be returned to the caller.
+
+.. rubric:: CONSTRAINTS:
+
+The following constraints apply to this directive:
+
+* The directive may be called from within device driver initialization context.
+
+* The directive may be called from within task context.
+
+.. *** START of rtems_regulator_send()
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: rtems_regulator_send()
+.. index:: send buffer to regulator for delivery
+
+.. _InterfaceRtemsRegulatorSend:
+
+rtems_regulator_send()
+----------------------
+
+Send buffer to regulator.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+ rtems_status_code rtems_regulator_send(
+ rtems_regulator_instance *regulator,
+ void *message,
+ size_t length
+ );
+
+.. rubric:: PARAMETERS:
+
+``regulator``
+ This parameter is the regulator instance to operate upon.
+
+``message``
+ This parameter points to the buffer to send.
+
+``length``
+ This parameter specifies the number of bytes in the ``message``.
+
+.. rubric:: DESCRIPTION:
+
+This method is used by the producer to send a ``message`` to the
+``regulator`` for later delivery by the delivery thread. The message is
+contained in the memory pointed to by ``message`` and is ``length``
+bytes in length.
+
+It is required that the message buffer was obtained via
+:ref:`InterfaceRtemsRegulatorObtainBuffer`.
+
+It is assumed that the ``message`` buffer has been filled in with
+application content to deliver.
+
+If the :ref:`InterfaceRtemsRegulatorSend` is successful, the ``message``
+buffer is enqueued inside the regulator instance for subsequent delivery.
+After the ``message`` is delivered, it may be released by either delivery
+function or other application code depending on the implementation.
+
+The status ``RTEMS_TOO_MANY`` is returned if the regulator's
+internal queue is full. This indicates that the configured
+maximum number of messages was insufficient. It is the
+responsibility of the caller to decide whether to hold messages,
+drop them, or print a message that the maximum number of messages
+should be increased
+
+.. rubric:: RETURN VALUES:
+
+:c:macro:`RTEMS_SUCCESSFUL`
+ The requested operation was successful.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``regulator`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INCORRECT_STATE`
+ The ``regulator`` instance was not initialized.
+
+.. rubric:: NOTES:
+
+:ref:`InterfaceRtemsRegulatorSend` uses
+:ref:`InterfaceRtemsMessageQueueSend` and if it returns a status
+indicating failure, it will be returned to the caller.
+
+
+.. rubric:: CONSTRAINTS:
+
+The following constraints apply to this directive:
+
+* The directive may be called from within device driver initialization context.
+
+* The directive may be called from within task context.
+
+.. *** START of rtems_regulator_get_statistics()
+
+.. raw:: latex
+
+ \clearpage
+
+.. index:: rtems_regulator_get_statistics()
+.. index:: obtain statistics from regulator
+
+.. _InterfaceRtemsRegulatorGetStatistics:
+
+rtems_regulator_get_statistics()
+--------------------------------
+
+Obtain statistics from regulator.
+
+.. rubric:: CALLING SEQUENCE:
+
+.. code-block:: c
+
+ rtems_status_code rtems_regulator_get_statistics(
+ rtems_regulator_instance *regulator,
+ rtems_regulator_statistics *statistics
+ );
+
+.. rubric:: PARAMETERS:
+
+``regulator``
+ This parameter is the regulator instance to operate upon.
+
+``statistics``
+ This parameter points to the statistics structure to be filled in.
+
+.. rubric:: DESCRIPTION:
+
+This method is used by the application to obtain the current
+``statistics`` for this ``regulator``. The statistics information
+provided includes:
+
+* the number of buffers obtained via
+ :ref:`InterfaceRtemsRegulatorObtainBuffer`
+* the number of buffers released via
+ :ref:`InterfaceRtemsRegulatorReleaseBuffer`
+* the number of buffers delivered by the Delivery
+ Thread via the ``deliverer`` function specified in the
+ :ref:`InterfaceRtemsRegulatorAttributes` structure provided to
+ :ref:`InterfaceRtemsRegulatorCreate`` via the ``attibutes`` parameter.
+* the ``period_statistics`` for the Delivery Thread. For more details on
+ period statistics, see :ref:`InterfaceRtemsRateMonotonicPeriodStatistics`.
+
+.. rubric:: RETURN VALUES:
+
+:c:macro:`RTEMS_SUCCESSFUL`
+ The requested operation was successful.
+
+:c:macro:`RTEMS_INVALID_ADDRESS`
+ The ``regulator`` or ``statistics`` parameter was `NULL
+ <https://en.cppreference.com/w/c/types/NULL>`_.
+
+:c:macro:`RTEMS_INCORRECT_STATE`
+ The ``regulator`` instance was not initialized.
+
+.. rubric:: NOTES:
+
+The number of buffers outstanding is ``released`` minus
+``obtained``. The regulator instance cannot be deleted using
+:ref:`InterfaceRtemsRegulatorDelete` until all buffers are released.
+
+The ``obtained`` and ``released`` values are cumulative over
+the life of the Regulator instance and are likely to larger than the
+``maximum_messages`` value in the ``attributes`` structure
+(:ref:`InterfaceRtemsRegulatorAttributes`
+provided to :ref:`InterfaceRtemsRegulatorCreate`.
+
+.. rubric:: CONSTRAINTS:
+
+The following constraints apply to this directive:
+
+* The directive may be called from within device driver initialization context.
+
+* The directive may be called from within task context.
+
diff --git a/c-user/regulator/index.rst b/c-user/regulator/index.rst
new file mode 100644
index 0000000..4731b7b
--- /dev/null
+++ b/c-user/regulator/index.rst
@@ -0,0 +1,19 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2023 OAR Corporation
+
+.. index:: regulator
+
+.. _RTEMSAPIRegulator
+
+Regulator Manager
+*****************
+
+.. toctree::
+
+ introduction
+ background
+ operations
+ directives
+.. deprecated-directives
+.. removed-directives
diff --git a/c-user/regulator/introduction.rst b/c-user/regulator/introduction.rst
new file mode 100644
index 0000000..3ad90d3
--- /dev/null
+++ b/c-user/regulator/introduction.rst
@@ -0,0 +1,25 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2023 On-Line Applications Research Corporation (OAR)
+
+.. _RegulatorManagerIntroduction:
+
+Introduction
+============
+
+The Regulator Manager provides a set of directives to manage a data flow
+from a source to a destination. The focus is on regulating the bursty
+input so that it is delivered to the destination at a regular rate.
+The directives provided by the Regulator Manager are:
+
+* :ref:`InterfaceRtemsRegulatorCreate` - Creates a regulator.
+
+* :ref:`InterfaceRtemsRegulatorDelete` - Deletes the regulator.
+
+* :ref:`InterfaceRtemsRegulatorObtainBuffer` - Obtain buffer from a regulator.
+
+* :ref:`InterfaceRtemsRegulatorReleaseBuffer` - Release buffer to a regulator.
+
+* :ref:`InterfaceRtemsRegulatorSend` - Send buffer to a regulator.
+
+* :ref:`InterfaceRtemsRegulatorGetStatistics` - Obtain statistics for a regulator.
diff --git a/c-user/regulator/operations.rst b/c-user/regulator/operations.rst
new file mode 100644
index 0000000..a9e5a44
--- /dev/null
+++ b/c-user/regulator/operations.rst
@@ -0,0 +1,67 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Copyright (C) 2023 On-Line Applications Research Corporation (OAR)
+
+.. _RegulatorManagerOperations:
+
+Operations
+==========
+
+Application Sourcing Data
+-------------------------
+
+The application interacting with the Source will obtain buffers from
+the regulator instance, fill them with information, and send them to
+the regulator instance. This allows the regulator to buffer bursty input.
+
+A regulator instance is used as follows from the Source side:
+
+.. code-block:: c
+
+ while (1) {
+ use rtems_regulator_obtain_buffer to obtain a buffer
+ // Perform some input operation to fetch data into the buffer
+ rtems_regulator_send(buffer, size of message)
+ }
+
+The delivery of message buffers to the Destination and subsequent release is
+performed in the context of the delivery thread by either the delivery
+function or delivery thread. Details are below.
+
+The sequence diagram below shows the interaction between a message Source,
+a Regulator instance, and RTEMS, given the usage described in the above
+paragraphs.
+
+.. _fig-regulator_input_sequence:
+
+.. figure:: ../../images/c_user/regulator_input_sequence.png
+ :width: 90%
+ :alt: Regulator Application Input Source Usage
+ :figclass: align-center
+
+As illustrated in the preceding sequence diagram, the Source usually
+corresponds to application software reading a system input. The Source
+obtains a buffer from the Regulator instance and fills it with incoming
+data. The application explicitly obtaining a buffer and filling it in
+allows for zero copy operations on the Source side.
+
+After the Source has sent the message to the Regulator instance,
+the Source is free to process another input and the Regulator
+instance will ensure that the buffer is delivered to the Delivery
+function and Destination.
+
+Delivery Function
+-----------------
+The Delivery function is provided by the application for a specific
+Regulator instance. Depending on the Destination, it may use a function which
+copies the buffer contents (e.g., write()) or which operates directly
+on the buffer contents (e.g. DMA from buffer). In the case of a
+Destination which copies the buffer contents, the buffer can be released
+via :ref:`InterfaceRtemsRegulatorReleaseBuffer` as soon as the function
+or copying completes. In the case where the delivery uses the buffer
+and returns, the call to :ref:`InterfaceRtemsRegulatorReleaseBuffer`
+will occur when the use of the buffer is complete (e.g. completion
+of DMA transfer). This explicit and deliberate exposure of buffering
+provides the application with the ability to avoid copying the contents.
+
+
diff --git a/c-user/rtems_data_types.rst b/c-user/rtems_data_types.rst
index 8e4274b..0a5461c 100644
--- a/c-user/rtems_data_types.rst
+++ b/c-user/rtems_data_types.rst
@@ -1171,6 +1171,101 @@ executed_since_last_period
postponed_jobs_count
This member contains the count of jobs which are not released yet.
+.. Handwritten
+
+.. index:: rtems_regulator_attributes
+
+.. _InterfaceRtemsRegulatorAttributes:
+
+rtems_regulator_attributes
+--------------------------
+
+This structure defines the configuration of a regulator created by
+:ref:`InterfaceRtemsRegulatorCreate`.
+
+.. rubric:: MEMBERS:
+
+deliverer
+ This member contains a pointer to an application function invoked by
+ the Delivery thread to output a message to the destination.
+
+deliverer_context
+ This member contains a pointer to an application defined context which
+ is passed to delivery function.
+
+maximum_message_size
+ This member contains the maximum size message to process.
+
+maximum_messages
+ This member contains the maximum number of messages to be able to buffer.
+
+output_thread_priority
+ This member contains the priority of output thread.
+
+output_thread_stack_size
+ This member contains the Stack size of output thread.
+
+output_thread_period
+ This member contains the period (in ticks) of output thread.
+
+maximum_to_dequeue_per_period
+ This member contains the maximum number of messages the output thread
+ should dequeue and deliver per period.
+
+.. rubric:: NOTES:
+
+This type is passed as an argument to :ref:`InterfaceRtemsRegulatorCreate`.
+
+.. Handwritten
+
+.. index:: rtems_regulator_deliverer
+
+.. _InterfaceRtemsRegulatorDeliverer:
+
+rtems_regulator_deliverer
+-------------------------
+
+This type represents the function signature used to specify a delivery
+function for the RTEMS Regulator.
+
+.. rubric:: NOTES:
+
+This type is used in the :ref:`InterfaceRtemsRegulatorAttributes`
+structure which is passed as an argument to
+:ref:`InterfaceRtemsRegulatorCreate`.
+
+.. Handwritten
+
+.. index:: rtems_regulator_statistics
+
+.. _InterfaceRtemsRegulatorStatistics:
+
+rtems_regulator_statistics
+--------------------------
+
+This structure defines the statistics maintained by each Regulator instance.
+
+.. rubric:: MEMBERS:
+
+obtained
+ This member contains the number of successfully obtained buffers.
+
+released
+ This member contains the number of successfully released buffers.
+
+delivered
+ This member contains the number of successfully delivered buffers.
+
+period_statistics
+ This member contains the Rate Monotonic Period
+ statistics for the Delivery Thread. It is an instance of the
+ :ref:`InterfaceRtemsRateMonotonicPeriodStatistics` structure.
+
+.. rubric:: NOTES:
+
+This type is passed as an argument to
+:ref:`InterfaceRtemsRegulatorGetStatistics`.
+
.. Generated from spec:/rtems/signal/if/set
.. index:: rtems_signal_set
diff --git a/images/c_user/regulator_input_sequence.png b/images/c_user/regulator_input_sequence.png
new file mode 100644
index 0000000000000000000000000000000000000000..d7f229214473ca742a94049dbcafb2256b2dc9f3
GIT binary patch
literal 38120
zcmce;bySt>w>G>G1yMppT0)Tq2?<%m5|J)x5D7s#r5h9lK?G?erMpYIL8Lnu-Q6AU
zy+GaWv-kTu-#KG^?_Z3;dg6ZWnDd&~HRtqvCMkq*jqn--0>KawekucjTsne4kVLOu
z0{=meM3n=7Xe<SkEVWF{?2NQ^EFnVLCfepNEwx{fY1)zLSz4Mw85zxtUYb~185=#&
zGBv)*#CZoiAzoij$@16#AxPjcwh;v~5~f3sZ<J@%x!})SHYnSK)?x5I6?yZNqVO at Z
zSphD7M9^|UDJk`KzYQ^}UfR<pihho*(K3#Q97AT>M#@!#<g<n2i85v?{qL15$Z64F
z+Qu01LGp(0-p_JISzWyYStFFpzZzIAqr2$(s`rQ4-Mk>UiL{mPK4-pgmNayODCgjj
zi0_kvJW4`5WuMuv_t?+6)bU5d1z)ghSrulo?~mQ at KMfm?9BrTJrsi;Iq?P6%f_hxi
zHi_c>u{RWTlB<`4W7tJ3pTGY}9WR&PWaO#MA?Dq at w_<t1ngcOit%C#@j_hBZ2g+qH
z-Ky~Tibek+l=Mmn)1B6sls(}+XIwXvB%^oiqUlB!IV4}!i9LkqK2bBj)&FG9V*d!j
z6wDPvs~pSvDpy<*<K@`V-I3ZDa|Mkr`OxM*h0EU3(Ye({Yiit5p5!!pi7XzLS*kTx
zHSexG{E|r3K%wol=s=IIXU0cRulbqz&=E)HWwf_hv+>Ia;v(!M>}pNtIaR;V=8+Pj
zr>_3!bh^)1R2e8-Ah9SInED49G!Tfy1CghEa<*zKa4aSH{zyj0&z~Wm_#WRIA-ned
zN{_+9fbjj4w@(efy9S3f6z{Isss|`$s9_(Cd|~%;r=7J<#Q(u<fNhFePl$8VAeQo>
zye2CDbNX4VQ>1$?B;=Ykk16;blW(5B;-qV~+8vrRdzZJzJ9lK)H<h<LWVlw|=e{#s
zX~8X2eu&s8BatB^;16WnI{#r5k;}<so=qBqs>zEJnJ65{yt&)^wHJKfAQ~fNSLf+<
zSG+xZ2IqE?6Po9!QfHKrTpw^K?YH5)yAEl<c<b6`-q&nvpnlS;ySAG5A_cxlcfyJ6
zN-4(ZICrh)itG0-zN%HkCG-0#MUpC+FKEV+V7icwR|^;KxS<TaI-uHS624KEr!Azd
zJ%dW>_)J}WtgEYQaF9mo7GzcDA6MS4jM$qEHzk2Nm!+n9CBpmqDF6M!<<o;%j#1mV
z^mOk;iDD88`_21E<0ips7o+z}aC3#vEEf_;b+((^td59uC%(wa&CN|o5sA7F8ENgh
zK34qJ42dk)@<w)P1e|?puyR6?bxyU^8V3(gHdawxo$+5@``s2Yj`{bm7i>U=*o5j%
zIM~?@vSSK?nZ5Ca>gpru<p*<oy4*ZGE<ajTIbUm9K6X`qS{F)sOqLNlscu|KptRgZ
z0AXFAcg#B5tU}&vtb2Mq1v@<nQLoS)Hcs|}dpDY(qFzT#axqzz&7jQ63 at RmsQ}^!k
z?j)&Mr#tP?ix<ESr4O-O9?dNey20Tt21eXv4ttb at UyM1BKf)1975TnBPRevG8g}~4
zc6FpN%H{N^5bmD3-kjnE$Hc at 1>)ct6iZooHKYVZ1%a`<QwUn!_VRN%T#gBBxw(q44
zCl+*SW6$Ml+>~$OO1jZlMX(G^ee7tyy<bhGaoCuOKG8O-GD^ZTyr_u7 at Ze-k{Up3n
zWPPg?_Q2$L%{inQD`wZ!iOwgtd468VdE+Avhe?EgTa(w%u`x1Ch=rUQw}jrv5zw_e
zo#j|+ at I5oVjjO3ezPCI`pXs!Lu6aGHr!QDryA=}?6CK^rtom(WJB(4+K_ERza^3Hq
zx6+LVkf(dMF0+>E7k((Erfdlhp=Wnqb9gvvJB8yM=-hV~x3t-=gFs5Ihnz|Zcc at U7
z)0WA%=0}cJmX)<aN3<Nwk~(@NH<HOTMpX2NO<1^ZZfnu#p_T3aJjdAaPH!3xsgs;|
zwNHVf-0 at N%P0qHiqN29bNerh2$#DJxRTrmn4j0(+ at p<dUZg4j&ly!;784<d$E at FF(
zy?Q*Vh4$A|HT4BqCD*b#^nFQPR)z}p&JO#}l!`Y!#6li)a4W#}Kim|gy^069m*nP}
z8m{y4+tO at nrFaDX$%My|ax*IFayToEJK=#eRM|uBV$l;4?BaxcpMP6#IzB!-8Fk>Q
zJX~aS?Dr;+)n^=w#}AA+W>6 at K%*G$umrLQ^9SEG9bn%DEiim})$?tGg*lkP>V^ew;
ztXMa{`ME{#=w0}aj>e>B9IS%pu%+&IUB|EZc<bhHzB^u|s@%N%jRcl3;%zry{Fm{F
zLt_q(wKcYik!R%I>Iv*4u9I&8_tEl*(~&bxln~X at XD|2+_q?}<sLF6Dm(A&0HB+af
z;f+AY at -yd~hFI6^lgm#ouL)WiytLxARI5YlUYS}sJ;genbE%-SN_>L7yFtMB-qyjP
zTUxH at uQ4*Z)3WG at e-EN-yrUd-`*NL4JPo~VN;l!Ks)U3Pb*j5NO3u<|w`k)cDk*b~
z at Rf;6kEbnf+$bG1_OphU9fYLFo;mQ>s>mgG^(!(EC;WiMYua#f1#EoKZjWjWpsdd>
zG44Ra#C&C?Uo%Oh(DeZN^x at RTR%vCz%$V`8@$a+LuWz##eR at 0xA3L6X7ZEYznANr!
z$U>5u)>omU6v}2e)b3n3-7Pg%{CeuP>QEsvoewH$3fT+DhX~9|g>cK~Mm8&BXU#Zt
zQOXsLchAH~dZjh{?&6d-AE-Sf*(m4%E7<&_a9uSaLA^5P&aGS2lx{8u%|xl+1&~&&
z-nihZD8<Mc5AXULmm2 at tbqQAX6E!ON$y{7?1BqZTrwShzkL7&cy*G8NJ^RQgnS1Do
zeHKzQW)tnZt+<#v9_JOF{&PU7CSeSPrH6;9q)wJBIJ+pmZ9hi?j!XOYLcm8a_D(qm
z`%^i^y(58-6?;>pXAHwu>l$jWUMblfEZvTomrC8j!jdVfJSw%@rd at Al9OH66F7U*T
zGv+6vvm7V)<#yaRLxMN@!XBJfV|6JVk)Ey-*>@@^g?9JtuIfe;!_24EWn?PINxuJ@
zVN)U}J!2DKW_qoHsS+MZOZy&g_*NzqNV&*FM*r~3{v3)Q9kSP*nfXIDY4`s9ryIM#
zu#7r8EVYK)_>)AAYjK(9{QNv9+(-qbK<xK^oSSZ{(T%e6_rK+Gh6*f<%jwpcNcD%c
zgnm0_=9}A_Vux?3>#IpmsCigfshQTR<Ks;iUF>t>rxlkCGjEUYE)TX0k2%?(zL&Od
z6*_<iNKq1V?S@&B(OJ)-L&7X^D^{RRbCDTir`FtKJz$SwH-5Ulw^MFf^Dd|IWTkm;
zY^`~S80~s*uW5(;{0&h}=aVIu at s-;Y)OMR21l1~X)s5EEnh5^^7rXJyYO5=D(a3 at 1
zB%Pn$I%MnXLy|4LQVSFSG?ez&%8MTII+q!jN}q4 at w`5F?^{eLRjtITGM!jr51x$Ei
zi1u2gI;*zmGNViJP@(VnwXEWNRcwD;%Shkyh1>24 at J)`#`(<U(n^<F^F^K7Nr at 8tq
z5xDOEo5NGGpWsqNSl(dFOV%L|Sx6w?YX9z1{Wc&~#DDk3-rlH?)$HvWn at q$j=!q{c
zKhS-}4Kedbz^kx8e9Ef at G7THfC2j5k6=#7)mCTOp9mLeqm#;_CAq=D#DpF~)GUHT^
zW#^ZN5WRmunYo5uMi at -G^#_-VHNX)?M|0sHorA at wa>Z%rWm<u|Ev~(IIl7q#*;lo;
zAp+mz+}zDpjxoonPaM|IZ(xL at NXhCM82D46KnxIrM=S>bF?tVlj|kcUdU>oYqpVCo
zT-hw6SH)^X$So0*kRT9+4 at p+GnczYNpP&gR`}(|X_hHl_I9I8(Q2(w3O|clH?ri;a
z*7t>l>~@-vuR8GeYj=R>^|W$xHQ*d>x21-~YEet4rl)iB##=vd5HTT?VbvgH$B0Vo
zK;R^FNRPYe#1j5$=vQR$3KmB`jc<x2=XWM^BnVq7$;!%}d_F8#E1F5XD}bE%vU^<r
zT6uZ-W*y|Q at jh;a&x8*e6fD;LTD;5d4hd<&c_-ew`^#JQaweA`Sni>aaWwDe3t*|M
z=x<;{xZg<A5fflRLa%6Ea;0K2NFe&M5n*TNF>)C~g3gRog^gd(^{K at cfiPbngX<uW
zZ!oZm0B at dt-T;4Gj~=p2F)!wcK{O;kph2Rll7mcMHE8whbwjEm{_XkXQ%I1!$KsIn
z%Yqq};7J;|f8M4Wf<8B+J#DOuPEf1C_#DhW5mB?xttFr4)>a8AsSp*99t{smUlfO8
zhcb_?*;a>{AjRpvms2 at lsBvJZs5g%^lF=9a9*VENMsFkL9f%`wIo{~%k{K>>D=8 at v
z^d(URSZ at tq#x1gkhj4jjb%P`d=EBR$nqOL~GKvJzU~~HzB}iZt$iZ3KoijW!n(`pV
zfb^Cd&jCLcPtWkMp^D8jX=!OeLH7}8&$8qX6AwOu<w5Y2U97U!JexJOVjM`70SX?^
zCzb(fQ*-Mit)kj;S=A at Ky!TNY%yZ5(d?~KuJs2r>C_>zi+4B2-|C*W_fseRN84!rV
zl=x*!q-(8Q*2^D0d|2Pz-My7v?&Rb|#9?v==Ir?FS%*J`82Ffd>ES}-aBjQY%F45N
zkpNm+T56 at nhK9p~0}2X?NSI5M6?lS at rslmJ5n<thJY6iqp8J?_>Q1Wm at G_&p-0|`8
z`T6+_m7>kpqFDIDyWolG>GV)0CMJNot{58|8)dPoL(dj_(`svK8oUYkaZXuO38N?@
zwe*u&$3K7m9DO`Z)t{xV`>88|P3XJ*rl_=ZXPqZD@}*1jl>I$D+13(ac-kv69J@)0
z&O2B&ORGe;aB!?9YOZYLE1c=?mL8M%gJTmK8hQq0hPcYZaVS*9=kmmETR(jGQ04ja
z{lsq^jEtth5P$mgiI|x9BOaq#o({%Za8#5e7U#9G;^Ja*A)l7--}UtLG{PV1w!MPa
z)YgiLirU-TQ=@jdY|vuxTfwcC`dY&|vb3urI4$<|5?&4$N_}BTC at U)~Ej<FCMyHth
zqQo+#=S@>vo1~c7k>z6m3lDde>^NTAhFSU~?1~{LZ*Dd-ZtZ4aS!=wL`vP-umX*bZ
zPe(*VOixc|VHHk{3mBUQ$|;_Z#S=XdSt&5=-<R%E>lJA^?q0Sz;8`Z!e{>rzQo)&S
zsd)+V4I at tBP*u9C-m)TE at MTePvGT}m>)po2#{Ry(+`}L`#fDErjf*`in={SnlD^O(
zBV*&4aBc%%Vy?okU&klwKN`t;u%h=`EnMMnL0(uM%nQRJdM#_93+3Wkc+Zw5Mm&FP
z`CK6 at C1rx~Tf&5X7iVx$G^d52kuHu(7`Yt$l?0}m+?JrHRWH_)lDp2%&N2;JJJC9o
z&1)~us(jhV$Q~OJ at Isl9AS3S5bgJY^rQU53G|QtUR$^e7qs}X<6!^@V?{qkNb*!v*
zjt{o at pFGjj(()zYq22Wpu6?E&5|w_uMhWJB|GgaYc#v$8WI|#h%9SfQ*oXW3!o>Jc
zSY&W-%9HT)Rja*q)`dH12D&&6t5 at YMdZxz(*rXox$-}N at m6{66$@Nf0JJxU{l&1!S
z9wZH}Z8{9V){CA8CU`Q`3Q<u)T!(?BTH=Xz4{wV|SZ8p`z5C!nCJ6S7Udr*QTLjb`
zPSkpUU0WyUY58HXB-Q3h-5&mP6%{+Ktd8s3AnGe9DjF-Z%ZrP1D-zr4wNo5llDr0O
zjN-EK=}kd44SA437-KA8Asbtg3 at 4)K1*2M6L>${<3#u_ow_g)R6%y^VtDN#WbiVE~
z#Eb}-GtQD?e=wkIB0|C+aokPq?NVZ5ak$qu<mKg$iN1G9r?$4Vw19}Ndr9kuE!eE}
zytfw6Q<pMTOM_iDwN^)pkCVZs0$VFHGqa&VaM9 at KMyz96dU|?MQBh3HT{^mtV7Lie
zTT;&PiHVsiMLq??yb(qVcf|O$Nm0K%)Wtkw^|aLQy=qJs7JjQ&U}cm#CG(I^STX5%
zY9T3lHaz%9f2c59P;r#sKPoEo4C(A{JT^9@$`}~VnfX~!Xtb(-jftAtXtH#it(LmF
zIv*dOqod>F$5r|I-I&DCx}k(Px$uO91hB9>dwWvi;`EG+ct^tV50f*+n!2~zVWhWj
z-^Rfy&~C;BclSwVjR*MqCtEyu@<dwNZ-syUyC3<sO!%RYpkUV*yHbR8NtI7)K>vE}
zOblb#BY+`NtH=Z{iVR{uwF*bhGlx41U8y&R6j(VZQa=urOUtP4xP8u)Y~SpR6YB5n
z)nAp5th*0u4WN=Ta7G`g-^(s6><c=(6eB4PffT*$5$$*2eS^(=I8Sa**p#918Q1~X
zPLHg4S}ppqeqwz5e9}}VpUv9nS%~LqvoS_ih^pyYpbc<vH&~)#HfpXj<^vDT!O<SY
zb5xI~9%$p1FrLIY%?p!OC5+f5l{(AMnB=!3g}925O%=C_eH;-{1Sjh0)4EzL*zt%(
zyXV*kYXZA%<Y~#wd%jw(BTaSaXZj at +qV`^EQloPx^D#nQ?PptS>%mx%Z=pd^{16TO
z!0kJCI4z?4;{p$F!`2^-ZX!VxS$?_K+fm!u=49h&8w{jize#EIh;pz at O-N&1xl&&%
z*2JF at GL|`_+hL=CR22mLJBlv1IX2{5LA#V($Udw(H$roa02Ntwj4)bxZ&7WR1nZ}}
zN4R6WiG{Xm={&4`m%VabHGkelw?9Avj){w6vrPl<+QMWw^wwW*KKJ?Kn#*HTIZm=d
zZ-3q)sKX8L#k%POWLE+*@Ms8R&ja8<KvR(d)Chr?xqvGKovhIyEogtC3-3c`LP#j~
zA4B?Agx~|7)N+ZrnzpPAWp6ndP(hzQX$yH;HO|b=CMG2{XV~O9NR|@c-+Q!dw>4Y7
z`Gd}!4!@`ib)%NZ{NkNW-I{L~H&P5Ze5-xdHyTM985jyOxRTS-47cYycXoD+WUZ{^
zxpa%%rb#@UPLB^dIyzQYP3$}x9~vZJtu|soG*H}}EWf-n7)Z6|f5d_>bohb9em-V&
zR1M$@FE1|^7M5uRB5NV-^C!Sz>+J2L<qk6nOy9?yk0B5prU9W4k!1G_1CDp(Zm;8g
zg_mIiT1_?YuY+yKP&Ab7pmRQaBN-*7Z+e~gigC~<TYPUos_N(M^0XR#K76=pYHG at e
zG(6njU-WvaVPmQh^~x0n<=ptRw2!0(#>0h80aQmvM^a&|DY3C{qaNqv<bXXXA|f)^
z9<2-aA?6AW4Hb5}b?X-Js<nh{ooL{^5dz<O>(*ufaOc4BrI%-BKA at wcd-UkhZy-=s
z*_N#=&?{;0;GmeLMvRNguG4~_y1s{>%>Ucv>)m5xV at p@XCN3}<WFaI1(7IhJ)2`bH
zHLgkQHEDd at K%%XrbfqTx@(t%Py@#~4i{PWX^wCsp>b-DS3qnKj5BavNaTxnC!+ZMs
zy9Z8}>NJ?RDoMedJ#P00Rx>ylw}NK1wYfQ*$H7`lOG`+o5xB$tbmiL8grubITK_1K
z{|*ocNK%Q5iIuXt(lS;avlvFRXp7p}+1c3a^`<ET7*K4vATz42JK!kW8x<KTp?L5c
z3wRuC&2g}?bv`vWH}?++sN@}JD6s;xO?W?xMq32u at idfUWyuXkZjX=cW{zt5k~d$O
zX`r`Ssr4t)`u6OXwJ7Z9)-KCFBlWebr2Cg|VMLj}%~?KnMyHG8Exinx1vYqIxoc#E
z-sBqB(bUwGp`oGj$&VnqsfJHlR*TjLo7xIVLX^gZg at v0Er__X8)<%4M)%73o1`{!%
zwS#%O$|o&f9)^Kv9Do3M-n1nwm8~XP6G0)Nt>)gI9>D!k#(GNDjJ3w*Z3HZhuqt%M
zlwhTLept~|)kU9l+S=OcZn2#&nLNqiGRMOzbs0~>zHx)B at Nwm;D5-+AGt50mdQ1u#
zV$tP^woPAbwG{k~X1VNy#5F{t?!(P6xLkN|Z|~MzI~E$6=ci9R_S?w=LQg!lx3{yQ
z^7A4si%F7^q7o7q*RE+IuWxKjoLITHa>%b(I=42b92&;P?W=oqirDI+nubv_);m4J
z5I4eGf@<AZQ~8Af4hZ6p$W`INA%-5{JOK>w+KZthtF+4_D00mArFKsQQdNYd=G$%Y
z$>;!$$;rvEu&_E@!JYfvBk{VuzhD3wvH9u<rvl7jm)<47mA2G+#lY0G(r!yfNC*{{
zcba{mCSTg-z?~jjOe0<17+0d-rNNrA>b9>VZfKY`>vUr&m09 at V^KWJoZIN6Dlw)H3
zGqsN_X1!0H=4}qLk5GAwkC*e>ML&Jb1H(F=dQA~Gi+;YY at wy^<deknKe#ghh`T48{
zF>?y?@;GOddCodj902A at Me|B99 at 0#qVPOG3I{&%YVlEf!Em%$umu&aVc)(zfj*hy!
zy8~d}Dx_1{iWun8P=VpWoUM$kY=4Fdl~u<`V28;5oUPt^S>9rzh+AiT306~66DKF9
zs;VkL&X!MFkI4GuwLa at S9Ryqztd-+nba~l`7ai)mNUIq~=ONM6-Ms_5zV^jZ;V|3Z
zg*)@r?>VJ!YHlWCGq`QKytG6|P5r^w7whWPP<G>?7=90>Qp-Sty!?F2#h#SY(^F4R
z&zYGSO;XSPst~7GV0_%%LKxNC&I-?+e#uyWKL-nozhLaa_vIo2_N?R~8Z?yxgWgai
zxd|8YxUdhD(8YtfXsm13VqcmL=DtU18j|ObAoQl}bxH=fPE<4&oAUmBfGq~wgj3TR
z$W$Y5eY`*cA`bOgF~(yRkwwwmb~0PtBM(Tdjg1*juRM`}(m5$DoJeAET%5C4r=ee?
zQA5XsNS&UxI~4a`V>cZ=?va&h%D6^DLv#2g&9K9jXVK-$e8ouLy8YnJuB4p@!0ROi
zii{9fI%U==yNUOB07Zs}hwHXSolJgY{85VJ{v9YOVs71|4zme`URX0ulp0OF*C9;l
zW%=3G#cBHAYl*9 at XXfUFo<8M1UaxKE*^Ag`GcBF&#`w&Ibd`F6W;ZgY{iw63LAS5G
zq~EW|@dZj{DR7ibufT6;wweG80JjZXb3eD~!MR6ujj0PDp{?I*{o2!rZhC<KWdna_
zkOIO)g-a^^?Ab^`Aa|hs!HQ^H)G2VaN9ey at tHb{B)17Km-OZ<SkE?93c>JADqg@(D
zr<e^Ae#PWw$lP$6inEPLRFX5_%9E6BPLenUC~(|N*MZ|tD?L%oI11RagV9!`kpFR8
zHtX)%#=yn at 0DbUtIN*+ at n#y8y at G%<Pf2R!ifr<iwthRsmZcJ`}faJ<~ml9%o2~4#g
zf$xQ}dGap=!B6*p!AStZ$yJ$*GW1<Yh at UTtnFB!I<SrSX4wr8sfW%u7vZ*(~IEXf8
zu|d8O$?{|q-|=>Xzo?aSL&B%sFF=9VXr-bSy1Bj14mS)nV1n>psqBMj*loWX&Cvo&
z^$q~;5Z9HJrKRC-uc!7mrrh4X4W?J_>g}!f9V#>)o^A>_IXR({2$KV3fRYkE5z*4z
zTu5M`<>|3q-^xIa7B~()RCn*b1mH1UI>1<JxVopeS6f^A3Mwip3d#ee?5`Oa5_v>f
z!r_G>&kh#TvU2nC$jQk;%u;9q|3T<*?r9|$v>Lo)t{La<F7;<+DdoHs#KFeq-+QMn
zX|)7NzY5qGB@&*P|2A571|hfo=egNgpF5l^<m7QNF>j24+X}F{j)lcYL$k235OYVb
zGgja at zmU~I)a}c^_{CO}REbtGy&(_>q$}s?S!ZNqG>0(iehNee(SQ?_jDkY@<Zvh5
zsn#8%$9bWPqOXlHsl*DR at Crc%>4pF*D8dJA`<;o22`<O`$diqYje>%Lbmy5LK>)?%
zK&?t04_MOFfx~2{;T#VK<|LihdU at dO+qWR-&y^q!<4LIg0AgJ7d-s%7gC>Q;!$LY(
zU)H<}3nNTnhC&ZPAe=7gprxs)6iKVeRT;6^hct3MN%4?J=79hn)8dgnAg3f7FWWyE
zy9i}>WmhNvLny1a8z|`j%vw)R&)2VH?D(Xlq(3KMb8Bm9VWCq${+h8t;Z}2s32{}q
znSH_-`8kmVUO at u`d<`zg)Gt32B(G;8BWSh1K9QZxlp`I`BTFbQF5UtnzM<h^)6ufQ
z&d%zrdscC`r-4;Z9~~N6tka;TAnbAAo@<NL+5xNv at ZbM@%iXIO7&Gmr{?XCV!NGzI
zf&6mv^4hOnWm})z_Au4a(TU=9DoIN6 at b_L{H_P#TnwP|iFDm=v#}9zuKx_)!%D#NO
z$)8?=Rf7s8AUvGQu#djPYo9X;&={NT8^5AVU0vPwNUpsu$YRy`y6)911UdTx{?Ao;
z;1gQ^Fc*;;<5Gp=(UHVG8s-1!GidAm*u})e04P{oTZ;}2RZ>%Xu<HjV9K~Y#yWh8O
zkAPnM{kt$Bj%i2<05A6`C^}uSZ`}gWIs(7t6A_1+{Xzmj!J^)Ureke{H1f}X`H%ns
zf`MG^X5e<>;^I>B;3}wQjLVtZFExMfKugUhD)k;~XTCcL)%wxV$-#R_t_kz$+b^|W
z0dw?q&E7#5p5}nnsI#&arMAp9l{b|%4MG+lKJcqf-DnTz`ll}*BzE>^9~MwagxRG^
zrV<2Jr)f7Ip?r^oKoAt_H5b_=dds%zsvajbUm0fk5 at ZPOdqm7Kxj7s}frasklRPo+
zg~t!)=y;1tdg#_BW@=vLsSvSMPlgJ|XJGp#0#G5cF`;JV<pHPk*CR{EY#J)wcqi>w
zG>Rh2uD{VnM77;x- at SFC`OYEPEv=e47jD(4+)3-vsmS~>Dl`!+K#eRe_#)m~!%n$g
z<hTnzWo at 4lwug+ku87)ToNrVp^Te(SZwjosvJrV41>yIfAU^UX2W9eUt2QM2Mk$?B
z=wFWIub>YR(3v5g at dy9=zc%KF<z?Q-Y>@GvEHV7MP^7d43K|Ou6WXsgZc1~=MXR#(
zA`e$rKN at Id6KBI;f5ndjIExk#<F2kJKm7A2z(!AKGzk&&#Mmqk+`M^nVr6B8Lc`(c
z at Q~eP<dO67{@1TxDa3*;t*kcUfDvc6+kEBXawZZ$DK95?8yC0XKXa$AhP$nqtgNh*
zm6fZjtKYnNa~+pn&#?3aMmA(Ug`?lSdy7`xX-D4L+WHkx%#;TDGE|hcOikAS%b23w
z63Q$WBhlv!tRxPdLPxTursjOq`OyZ0?p0=+YHDdQ($}8|pBx3;Bmngs?CjQ-mh at _6
zwyj}oWh(aehwrcB&GSWpGipBl-P_w6NT7wB7PI1g4BXsh@$vECxSM|k4Dv?zP}edI
zhR%;b8UV=Pa5xCrREy1Lx)Q|LN>kX`7-RIi6D9I=T4M(b3JV{oS46PMU<L*U?=H9o
z1_tgd_2=zk5V1cyN)QWCx-g{>h*G5d!>HL=o!7DhgTNT7tEe<Df{2L#5YlO~MZgo}
z9Rh=)7vPUvv9Pw*z6e5925RbWwj1|`dtwG<3B8l^@*dv1_qJD_#wS0;4ow1^QXIfK
zKSFR;fro5f%;%t_bni{McVSZzQ$j=9{$PAtH)I~oX{nC^@nWgskN+X$h#i!LuB6B&
z0ay%t^?(N8tynKU7tnB7Nl8LUezf^1gBN}&bHWl(MArd?0dVEf$qDQKPiEWI at DVZC
zt4|Pn_4CF%clXUXj$f?ckGrX<sems~Ds}d%{TU0uySw>C1Z{1<4G4knAw*B00gwSm
zI~W)kVAmbf$`t)c4-#f$yEV18MzR^=stO$6Y5y}WXdKGR%L6XNK_6l at 9wG~eLi)|1
zfH!>)s6L6vjTfeCMz-bYN1H2a9G>y7C;-pilPq19la-YPJRUDEFBzEzaP}UU#F{Iq
zw}po285km=R;iVhE at 0!@*%e=muf>mC2t-_tPEG*2=*yL<E-J{%1_TB^MV1s6rlzGe
z*JR=_8L?eR2)TFf9yRk&g%g)yyqtb-s=OA;v-f8bxY`=c!3 at _iF@1b|65FgziCqnW
zJAsU&fcc_qwH>16b#&Qq at A^yyR6d3^WC%yXFSZgWQbw>+%kuKP)!uR;?5IJQrhU$u
zcVFC^2r;DU(_jN2WMK$M_>knLgKW~PS3msrbuss0CaIQ<fT?SepMH%F at HYff1xI&Q
z+T^gp<ncdM=sEsvw;>Rds_))&=XN_m#>=AW>~-+cvq9Lsh2_MWhm31qp$=2mt$L*Q
zBA}2eCT5nY1yWnzx$Q*;RH1~`t*8o9vMHK_1{*OqohjsIU at e*6dAHcsg;-{oDxMzM
zoH|FhYXP#)mW%)xY}A at z?q9-LUi<8kzIx at 1#ZgvC)Z;GXacLthARCYZY+TGjlDV_;
z1IAsL&-w at h+&9<Z2_}pEVzTgi5m4Kt$pma{4g@!71uQzrl|MPQ3uydX<pZOFd_(!k
z$^khLOvcIG3(8LSx6}M>n*mZ^OZp3`gP;J}){ek#crEhL>Bz{)_O|8AxsJTU6_y`n
zV;sE)bFJZfKj^Z)XZUOk0BTSg404FMnaw*aZ$i%ZTH5&3+TtQ1kG-Xn(+T{@Bed5v
zMB4qRBBjmc57G^pn;nD&x51}dx0quz&ZT>0;A-1It-0_&Vr3;KQ<IZVtw!><ufns3
zs~=(<82d>kTbu&oZv|eeXkz6$1$2z`=H#GEZ{-K$`??{PnrS$Lkv?$DhRIqL5X!H@
zOV>s at x0gpTN{P9<Kab%yK8*S$!eN?mgTrD)P|y{`+^lq4{D1CGo=t<;duMA4=uuFY
zQ|=`IXLIW6o-PJ_{+zAbPSTewa!0W8uml|L-$wxGEOewvi)ht!7hc9vLqlWy?Un08
zLndd at DTRRe&r&Og($gDVI1^_QAW^YWrG;IM%uY_$o2>IhLPD}^G%zqwIs#@~F<pso
z%G=X3hN}e?_d<75(DhI`vEJc2R*4UboW<xj>WPr7JUmU#OxE0c%vkTMVgV`KQ?`1P
zl9iRDj#GgK*iIWBtroYp`T$ajiCrJNy*E2E(;CH73V6l1IIWGzdc(f-2{<4S76`<d
zc{n(10Ei<XAOQBt$YQqTOS+1!tu0_5rKGTU%D2@$MS(_S123 at x!mS|zlWyCc4ZkYd
zF3K$N|Id=##rK+lT_PbNVcB>=$SEJWV-V><LLR7UB9GU`3GD-Cq!dYPvNPPfwr=WY
zU>(NsB2Su)xc5X_Rl0ulO)6=T0i+N{)>;dwn{k0kq9^JQ$P^r>2JxvD7I}c+TK4tz
z&C1Bo-T?xkHxUPrg@$LELzE+<>hcGNhJJ9^T_yRGhttPTUFs5hdD?XbLJ_Fc)mH1o
zpB^s()6yBrkk(D7f4Zm))YI0cRLa;AElYvd5J%ge3f$j at d0$e<%0*65F2~`kfk7(L
zz^N-MmTov$T1VhX&{?A>bRJi418gywn7y^Da$W81O>#j!YguCjMa6EzZXnAJ3=DvD
zF)ye4T}*QQ38=8MG;Dj~cE)%@NLB>YiWbncfXRvMXlxW(tm-&e$WNEV8G2=vRqBx>
zVv(EbDcnC3-UYFB_{qO5p0H0ztJb#^rH#!RrAqWJvzmU>i8Fwv9>tZ!dcl$HQ1xZm
zAo4E5t%ry9qT%lV6mBS`(<u&Z(+!E&pmkcm_e+_xe3HFF$#aZJ%6kVFmy%sHo?otC
zzMK+w>{5(kZK0G85Q6`y%ymyLNtVR_oU?k1xwf1`pmW(CAt>|JktQ%YkF-q9&EbR+
zw5~)0Ywuapke=i)pT*O8_0C{8vb?M;#^aLqRK!A`b9C3Zh<`f~VtW*H?8vnwk!n^}
z)<D>65wIN3pA!~zAm at TyR2RPIRF^-7fBEtyNh&%KFKc`Mf}}%;U4TD)ep>7S*t*R)
zKnPoyn*;HjkccSdq3Ils{eDnTQ0LOZ1#LI_pf#ke9Tw^z7FJ>chxR?dkP4W6C66r)
z&jBo4SbqYNC7Edw>MmgBjEAGaOmi1C7uFX_7o=PqQ8|h8?Epx#_?~3wGd8wfNc>Sc
zGy>qgB^Rp40>8vi!^@%}onP{9i*Idi3VtH2CjzMV+O=zwQ&T{XPm~C^p6|HZmx=wh
zz7?e70-SVsbVNl-85|Pw5o{C!uu-T6|DoThU3l}zivVnY&~^qP;2r*}fJaB9e_ at S2
zEc$q=j}8J~Z<<6kKi?U*w73|5>b*!yS*%JW6?GeC1OnQ(`G5bse6E|lZ&FiIP{`nb
zv<2KiSLNdYr{au>o!q6B$TET7pE-t;_o5}46D!S^_wYj$wt3poP?_D9tP~GL5wxXh
zILO~WHhL}W4f&p~64m5)$o=gjjiX9&N9WiQ*6F4_JX5{2{bxfI=FOoH$Snl5^{+x-
zE!?bho50z{T?@isdMdPW(sU#w4ufuZSY at sDIyN^(0wq5g04ab%ybqWC85kMNsZ<XR
z4nW8Oq`!5Gb{;C{m&4lAomii_zPL{mHBX~g!fIJvrNn&jj_wEXaPN&Jp6qLAq^_v&
z&H^9K<Otm3tP}Mm*Q1vrSmiZb>s3={yeo~SpW1uuno%JdR|&psJnP}-<J(x5*<F8e
zxTT at 7I8#J7gO3DZvIM{aQq_(4MEd&~M%w}0Q=B)};V_2L4yS`Q7djLOlQ<$$|Cnt#
zH_lH}WI?>PAT$}Re+uU^rvd at f%U`~JhZ at c~ex`cDVfB~O{~2iFm7c6^TuwR}E;=Lq
z>vu%j5IW;=cr%2I<u4BL|CZPDS2_^<JBUsJ+F<*cK=d<!#QK?C1TfnLU;FMaO;OMZ
zhH<VKy1xtQ at AobIi8zu_a$t}2M$7E7$~L`57V!}bB24F;d<Qr4ztv>|95^tBnORvO
zLlmjjSQ8`L?a?q&Lc$?9oMFw(Rhka|#SRna{Elf`akB at 4ZXV;6Bmx2gz>C?e^|-22
z&9#Jcn68bMo2Mb)QD5M1{!W?)qEv{5IXC6_%`4FTti}uZ&S_5)W8cbL^5x5kSb>kz
z3aF1Nx;%mr!}%@pe98ZxYj~QLMn>t;(I9WK3#d at aMc@e(l$0{j at 7}%RaoEikl)#L7
z#zxY5U7x-09|Ys4g1z0{2P%c$Lm<uqN}s_Vrd|mMLA`M3=I=8zGqVyq-&&|P-J5n>
z$r7<ROnulv0f-h#$q4)#Hy(48B__HTr0D?89g(vGu*1 at x;%nb%hsw#=Nk-QXY>O{q
zD=MN)$i^%q+Rl}t7KB*00YaI)goO8|UJk$#>9j||fj{c(%(2~=WHanrHvw$pc1s*n
z<bR4|NmLKBl!>`x47kJax{M<Jg^%p3FoBl<s8 at g<3bGz5u~O*_hO%GsKYu<1!dBjs
z?e4(9+u++Whj<P&jtsjZDi+Z#J%6fr80}3>B9f9iE2#vXaVH4ctqrq(Eo+hlw&z?g
zV4QSzxReD0k4Vq7KnvrAzpT)A-sDDth<|u%{@-8&$Di0B`)}9)RVta#clJFikw9c*
zBrp-_l8hS%T-ShvFtf*JB_Od~65*r01E|dZGT>CA%rHMd at aZ(fE&du^!ot}EmW!~s
z_%To)Kmss at -YNnabRRDthay2*T;Fbje6Bi)mvbv2n|~q$u<2p<@84%<-vtI4h%}4n
zz+0ZrF1OX99Dt0^p55Sb1M-exl8`M>m;qj~Dpl-xN)@A}tjdiBXzJ7etinpl)`hgT
z at q}-&27-Y1j&|HcOWWh>P#3UL1t7qvmD7M7bE&;t{k61n;prPoFKd7`HgF at wfTAl)
z+rZJ<-sVdHFihQ7 at v`#r`c}a9F$-FBNgsv>N)z)sKBA`=Hwv7Oeq);2P^+gVYyiOP
zV1c2cgToQX+~9&j_rJ(z?d)Vx#{@(p5_Q at mIBTWuRgiZL4H=woVg4|%%!pa*{EZGU
zw-u#T6^G<7!kLff+C=bXbdP{gH~$VeqT`aZRf=oZuOo7JihJw81bPHXN2^{s7dpEh
zQX(Khj__|t at C^Y8?kexR@@N00+eI!g-yk6Y^ks4znQ>}EoZa14L3=`k^KU-9aQ at D-
z=RB%KOC(qSDh`{ru5Ncu2ug?a@%=x!S4)&qDpDgCiLh?PNIt7t`G>K~Z(K;~{Z2JW
z{T55WLJfpj^cdZ#i7uUe%F6h|fs%s46YXA{g(nEQPNWXg5FBR0YoQkn7ZKV*-DMib
zxtW<yglt|MyE{8Lw{O=qHlkj>EFR9j(h<X-u8R1Gf0D3&eMJMvtLrc{yr5#CIIxF2
zX`qti0I+At$;k{Vh0jp?GD~79H$K9Ki%jRJK)P9sE=lCwyLV%flfSQ8q717C%x=r;
zK7*U}de7ellJI;<2^94R=yU!qgwNwkGV at ai3uo`J5qT`mWrls26*!PDTWuhe4 at u6*
zsIPqd=&B&d-Uay~FQ1(!@0>PexHU!_o9KhEL5gQ5a3u9J!p(02HxIMH6Mwgwx?L%5
zscvFuTfS`XkTj6o1aeTP8B5O1^b>Kjy6cQ(9YaGyBO}}nyUTd$j?$w%wyTjF-#*<v
zE5`CbWXPZ-oq(wPwA;=8AQ<?B at 9LK4F5y*FsM%iWk<Ir=bU?L}-n_Z74w8HJMl2>3
zvy7Xt at yTq=<r~O-L2?gT&z-YkqL2Pj$fr^r&mY*CDfFI&4<8+<&yX}Al&J{-6wZ~Y
zORhv;<CEwgWlR%|CA8>_eTXlrJh16f;k{rhfL}C&(J#;t2ibEi5Ku!+55A$F>u)4?
z5aM3?9rUuulfcV~YR;uHY6qEb&poNTO!J!5?Xf-lghxkf4$CV|?G*$EMM6}k*?=AK
zaSSlrzYq at Z)^<g at y-6{ZIw7UNN~ox`<p+egITiWenBFu)yR_H=4m&_|LroViP|hyF
z_6aLc7y&IShJXU^xb^oWi2slV5kg;jV=|~O`6cE3Rt<k9D*Yox7 at +`;6aJld_?apc
zjgSG)kKz+?CNxGya#D=(T>y~;PoER*{2WNY;|Ao~ABcs{DmY(g!qiZWKPA0!XLpdZ
z6YN*ncfOnSlQrL_kPKjAHdLErzD%ulJt9aA;#ERCl1&$UT9VeK|Ch9}VfS(aU031?
zg<QqqV%qZZ^7rrGv$L~-_0DYol0V2uk!=oT)=CDsl7KQ^qEkr!DqUY!*TFM^AoE-u
zCbmT at g?^_}H7$fbmYV->vt-o2nY|&I{?BPL&-3+e!ZH|Iqq;N_#lOgaWI#CFX=kw)
z<fcAQEs at I$H;~=B6$VlOSb<a&rfO)o1aeiC$!8wx>+45j3X6y+S32_;j%B|@E>JJA
z^ep&OBm>9};(C`)YX1KnmF$W`6LJqE7k6MEUc}6K(dKxJ)gNw>BiP}zv^0<yMGEqv
zh=?4v=cUi3GRvXA@>Z+&_xBOOwSn4`006?Iq<kgG<@IFqBL9$JqXJ1m`O?Sm*RNj#
zPD1l~+z(n-4w^V9D27o|3LQumS){?Bq@>j8&r}6^1c&M9^8Ea`qF;&hHS?7rHU(2-
zV=GOjz*`uLJW;>m+x;22BFri;1Z<xXLE}TDkT?hYN+G!u3n~rB$=wQ;k{&q%U$nKo
z(9Ofc6Zq<#hX)Ae5L)T8Fc}4fzTx5Fj*ibkLG?gj6qA%}Yie3pTr at B;ibvvN4h0BW
zIZvlkzOH>E9g%+OL&e5s1*n;H9xg5ikck?C@(k6Pvo`}d``&LrK5Z%f**^&A6Vh>l
z8x0i|6+oZ`6XfdZ3M2($sO5)(G?_d4|B at 4;Bc;zI<a5XK<HxO?oloB0 at zNXCDJo#L
zWMpn(Ji723p4B5jYEKAJ^ZM}NYn|TF?n=6!OoDux!Y6{qIHw%Sfp384p$BPcP-qx*
zxZDbIAwq)a=OTMB0FKbj@<7D6+FVrGi2(szVFDKRFTE>IE6E48aYl?Td35}=pbQH_
zFQA)%MR)#lA at hX2!<^9BIwMd9^Os!5uqj1s%JRQQz7Qa3gcM`Dei_KL>}N86iGOY?
zm?<5tmwQNc=;1D7T0Kh3Tyd6isUls(kZ(eQJSP`HA;Q+zzsnly*$|1%eze}#HYIEW
z8S#{sazPvdNGFKi#7IPmZDr?nRk+fZ_e7wjc2w_$Q}Z5sLKl-&icH85BfAHr)g?8!
z!+n#9wc1(YYc2+3kGo_Y&%Ei*cBzW#AXOR&!~W19ZGZiwo=B7=Vn<<n at 1qkbe-|=j
z50M`bis#a-3oLnk1rPwM?0~^=KMNv(gnCJeYnUDcPL53>W%EV`@uq`m{AJ`znUT(B
zSzL*-L5>v=<1TVP5LR3Wp%K3M8I=85KLP@}f8=o>Dn(ok|B(VZzqeVF1$g&woaCfd
zh at 8y(-)*bz{|-2X;Ln_3t#VjKsHjsK9Q{na8dU)p at _^EQ2of-f4w8vdIl~v<tc+{i
zS)L_KBt*B(jqw6Br4GV*l3Gc&e~Ie&pI1!)5C{?qPmYiM{r%gbVeKWvT-Nl=%zlRe
zF#|f!gUuj!MV~A5ygniwR83S>Rb9D`n_mDwJ##fG-SEoScR&lusyL(t33x!z0R-(*
zUq*UPQIQR>n>{RuT*(ef!^(@mOHU32UY1f9C!7srML;y}g3+hxa08}^fq}tMb|gF`
zgaZH-AV&gS1myW;Dd)M{h)GFRnoV5d`EFrh0gloaKflh7jw*KDwuq*Z_Z}V~_XMQe
zJ;TfgS)<O+RS-tt-$+%Ex}P{p!D<Y&oxXHs*3!PdK0s^c3I2EkSRr0wfU9zyPwe|D
zK+d8;rRBmc!@2*W9f92)ak_kqCk7-z)l0n8bpbjX$hJyTFE-Z(=Qmvv4iv?fMPTdV
zBt$Xy6DuoWX at 9F;K$wEqwzf7P;wva7JnBLWM<SFdCNWXaz}v@%7i8$Ab&rC4P=zF~
zf&Z%3(UG?62ujU^<KY=z)8_m`wd^vvpm)b|;!t{KCaB|a78VvZGFk?SVIZ>}xG;UG
zNN5m<tN;Q=0g07ygAxS@^$~!2U@)PdfFj#!eQx9+kZdSeg2_aX_w$Va4-b^D+%IHG
zO at Cq$z>-?)f#vc3z2~Q}c;FO){$;%~)H^!r4A7{L52iCt3Q+<X_+G7 at zCHyi6n>h{
zucK3(Hmi5iK;?z|xu1YQ(%XnxqB=UBogPyHo(Q<go+q47K~;dDAc|qX)a!k~ug at -Y
zCpm!1m8PrbxqygFoEX-GKXd=p1r~!rZ9qUkH^{gg7!XFb)?@<C93kbVeTbe?F12Pj
zyCY>_un3Y<l^m?CcR{@ZBgR+EWAjuMK)7gF0S$8cKg9)z%$k2 at _ajEaX+ACd;zdMO
zmg%ck_dj_RiNQh42#$+h6&e~EU`r&?XF=r(WBIns)2Ejy1VLB;a)W3yKz2q8Bz3*A
zDHa_R9BBjDytA{jXK*zGfWK at gu!N=2swJbNgX{Lndo#mh^C*xaT at E0;5M9)v%{#&}
zGA3)WEzbI@$MXSBZ$5%lNr3p~qT0ejn;Y22_8Ht$UZYXoH6bkS^>4roBiJ}azeeWA
ztCuw-3K7LDz6eO~k??2^B<PJrZdLA%MVF1u<(!Zwk~&h?-(SFleDjumeFO3W5jdDN
z)Q<JgIFo&0Pa%UNtt$!E^Fhog&U4e+k3RN?a0mXlMXa`abU*Sa39hR)%4fAZLD?fM
z1m|Bg!iJ25Bi`km<TCEY1=vEKJ6k6}zZ9!rwg8sfqH1lU{fAVODk6;{LL0oPK;BWQ
znED9h<293<lK3Ms<nf>DG}+>x2DgKZ`}&H9pSQvPsy;I*Hq_=6If`zqA&Ty*o-wgZ
z<s1!CAjmh8`rn!#%haH5$N#$W?tjnF4H2||s&w8MEbXmT-L>N}7=9!-1Bx at x8%*@m
zJ4UjkGxH^ZDp00Ov`e)mT~@())(u;ORj%}^>*}8`p$8MupLdvmOrh{S);+HX%{pDo
zv)NP5>@hhAI*mYj9Pp2#QOn~Dl_Unm%)qtoXiy!R`}acAqE_3{!Q41d?&*fbn+*1?
zzW&1Uav&8N#3t__S9+<pIc&9Z_>#iZ<mCmrO$-eK{{2GhGsi6=(=urV1wqhY!uJ-B
zoj=5k<L at 0JtcSgm=5>p?Y*yp-Wiu6(l?Q<>`IqJrpiRc|*g9R<7RUwj`uLHiGYycG
z|MFUZ1O98tEJ)XM<!Z at WFE1-IBJzksl-IUkUyh(YuN;nwih|9|W=1?>hLTk=-qUQs
za{jC!y^&Q2N2mW)y4>$#H~!{GOY`382I<);DCEvtVVA2nY0xTib2~3GesN>G)F@?l
z6FI=YLf;`{p_^)p*GHH5;su~)`osekVX?bhy}AlxV<!P64%nYs3d7&juOgPJt!Az>
zsc5gA)a3=Y&8k*A?96G{gkK)Gy!xL_F6KwwTvvwjjc?l2H~PBl!HG4sK!thFcVBbv
zCD5M(HF9JB2-eZLAvA2QP-v<ymJ*${=CnO$n3XZLQizQ!Th_1Mo><p9JRDwde7cu)
z+B$ZB{{T*k$8l;?**xR%?5L;$M`%#na+|zzzut?8LsDe!)vvLI1g|HEow4hPe;A0(
z<968!x0-4^<G6M`C&$lW*9f=2!WJdxy`q6(b8fEAd9o(&Hx0fYbI~Dr<@fqzsrH3$
z3etn><X8u^OJQ(Ul{(ei*t4x-xI~qE<pic>8`of>u%#Ox&s!o;(JuN0P+d13PPxM!
zD)e$@Ag3S7MF-00Nuh!5)`OCvMb9WGX1H2gg$8F;Oi!TPj@#j;r-zHZUcS7vi5iVV
zbhM{dKLV8w^U~6CD^5EiIDL(Wwy_r?(gz~JmhV#DFRWgzMn&ESodDu-Bo;8s-H#?e
z25irLdp$8Zq^SB{aX!D%w-WfPBNtG8p8n#XHbD$ek0g!MvF<84qU(!aH{au4i9CT3
zAjzszN_wBJ*Pf)$xMA%|gx%)<bW9zY&QE)>=v`f9z^yX8*nj1Gdgi=V9tm=t at G1-&
zyi at W+Ol8nTB~NkFh9#BIjU7|vNF0nrUvI!fB2(fMB(hQuiO0%pH&)QF8-}b)XR3Z~
zk?X;gF()T$Nt at -+<}FXETMJjv#{@h-7(cK5*!F;SoA!eYK`Z8AwU9TH45BQXllZbx
zsV75WU7N$+X*B3h(D*#c$$GWIsq%JvT!57 at D03&VY~WAGSb;}!x$tEbRh+EYidKxe
zRDLKxy~5Ko>ipIw4qA{6C519hzFXMcum)`bPPbrVK~UKkw4;6RuTKCexj>yd{MQ)q
z_;CmxQcnK}((<8~x^`)jtLrvyS&#mwmCVFM^4s$K{B8qQ2l@$GJAbyy_yAun6fQLx
zJ#OwvIV+EuV4#&-SV{}_k<liW$tjJ9Y_hG()oq^@3D8u6v(H~fMa?Z?eYt at _r;kS*
z`(*=c<FT&IwZfIcU;A}#DZlhc3Un`6HFdUlBH3nMp{Q#oN`TcXZ>au|z9o!pMHi;B
zxsbF5;Fs3}<KZ_rjc&ejh+=(7(CNhl3VJ^5uAR+z;k47MSA0IB at Li;4KJVG#m_^{b
z|J(qqptiQker8u!)|e6|8rtoE>dNC84EgC;h|PEv>?1>ZM at pfwLsKEV@Yk;Ef|i?2
zFg)*xjKndL1%q)(6R>io6{@M>sF*kdT~L%y>O9Yyhu2Emg%0Vg<kzL^B@})RNS>n=
zcUaZQsn?em`sJE~o6y|P(SQyjx`*3M0s`TBsi2KcYTD6BtiagOhVNPM3e=W~k%c9_
z?AXfd*)~=0fd^{J at Yo5Q+a70sCS;8mb~;q&*;yF#2?x6FCq%;Q_|0{7s*x1$Y#dcT
z{RGQpAER84j=n|T&|xpH-G`KO6C^#4-Nc&yHN!=pc=OqdOx2qgq0Ip at 5y{Cyr~8d#
zT|-H*ls2guVI^U4 at Al>+eMQBY6j_H`w_<G_fMGGMEZ>=J<r49gT+bmcK5t6{<~!1)
zkil&z;rD*D*nBndu$@~(#Iy1Y8CV$D*}+-7M%`Z5Qdwx|Rr>=9C%(YRabM>^5<<e;
z`1=|%T^u{GawVBfx?MKKYi7V8&91Cfl)BYWm(Ru>uQpKy_z*itKtJQ0H-~^;AG40E
z*lO!Db>WIKU8I-t@|<dTe{?v?@v>%M>~weLXl+k>1vCd)T;!OiwY*BfTzR?!TetSQ
z707+C?>)|t`n!R~D#g|05<7iqt3n>%-%WIU4=(z2;L#uNjSdr#!bS_>$>$wm_-^1=
zfQ~BXj>uhqf>G_b2TXW(bMD?4V;Bp?Zb;<|<Kf2hYY7v{#>4)&77uq;Jc|1+ at J+nV
zj%uS)2Og#^&k(z#_V(o$vj5&A;`}{-?+ZZyqT7*|fA1#+V$y%@*Yw}Fuh?OU8e*u7
zonlbb8#n~&p2Xi<S)_+-D3#2&AX-XPU$m59GP!Zt5&>f at rWQj$GO^A~Bm)<~5yK~2
ztpc#-1Z?HR+qfy93Mg#k<wfrdlyCeuo-u+BTtafn$_Jq5RmDaF5f{S;cL}#78df&8
zCTwH~8v;uF?3TeA0{S-00rc{fJ_S at d`iyDQ{OS_X)pZZiB_h3aJ<<*I=gBd- at r(g<
ztdIgd0zh>UvB-i<PC|#P{s60O*b`8$!p#hMmbY4Cg9+M8)s^r)E{Iss<qjn6WDca3
zS5P1+x=qM*-U(wK0gyl^j6T)#P8gq+IIbomnn!rp%X&Ta09sD3$~BD8^YL!)?*2fG
zcj>|Tc!kr6F3U9!Is<|L5oi3J)ZIHnM#35WG|I0o0e*#u2uME7e4_Ez^Pj!+*gz+|
z2j{)?4ty*TP4 at m*z4WgAOD{bEpH2ferrYjo$POMBgDmKjd6~1R>6yq$`Ql5)O$L-m
zJU*Z<@+g5WAtKG<bj!styi-(5b&SVv$>=uw*>z6KTPr!=U&`q8AYY2(euaiHRo|vZ
zJ&n$Nso~1?E9%wk8RKD$O_NifYaczbQ0SQNBs^J3N2M2`q(W22%vcR_J;|z}KPe*}
zC#Et+S;l$p-&;R**XJ#Vag1C;+GEv`M>`T?5G~etdOK%~&D8r9ui|?Lo^bjq>|8Sc
zwEARsCN3wIKK5mmrsTnOZ8 at tZ&(3BjZ~aY?USG?|9q3%l#vP<a1H5#R2RT-`JCoO%
ztk=7Ac9lg=A##kG)LPnByAa4z{GT1`BGDW%`wtuEoY4I9gRbPfyWdwg^i@<^tfNG}
zx!1+Sp|fj}RzN>IScWxOO^m!ifg`Z6Uy?dO+CE4|%#cQY;<-VZaG?9Uva`9!fIC#W
zZQ`R(Yr?1ZPFm(pxaT<Am1kSZ<~Vdmo1R)A7JJo$k_+*d19Es7ge}BxctPl6CiGPb
z{BPvuJT~}abH8$1q}#9j{o5yHhTzBkZyP7pgF!g;+$ss8IAJb(E5ky&fPEGXq at I|V
z at B`VUO+fg5hI{3^Hu|@w`%z0K*>B&q>Rd-hzr(6`1LJ*Y5F58HzG3z*Qz at vf)2ss7
z7`om!ksskIgNJ8*gKD`?HDC<VeGM%Hx)fjcpu<|Z&@M=h9$em?2~n3Z2h_+bS=Sd0
zuHh}7#j7Zcq5l4xKoJf&0R`d0%Eb*zZUr8LfR%w+FXL~0<`dCE&!eEv1zLvM#$3FO
ztj$_*`6VxXLr`GD8fmpU@?{yIW5tez-ZVUlCK2V^Rrk8PyJ7p|ZuUEib`B06?(S`&
z%x>KDVqw at KqhYN2G9{J^2EC~aO4+X5K(e<#JJ|z8L4b2jUIsjG6M3-qGZRo{19F`8
z2!x^m(WJ$UD`8P*pWo7^luvgLw-{8?3~DzAv*~cMunn6Ofg-#L^-AY1mXCbbJ3vbt
zGte`{U;UvXo|Z|1XwWx7-m~MaK-LB(m706k!Fu6%`ke{)ueE%M2`$7V;TG=x;_EB*
z{P}ax1K>Io)a9h4qyXMGPymVE91uu>_ZLJ(MG4sq0x5+<9#H|t${$|gbaZyI<^n1_
z2)S*UI6+a)cTUUsXJIEz{Ols{m8?Ns4T2un4WyB^295eqnutE;=skajgU5rr;`QMQ
zHa2$C1I5e;=8vG&L><V{)c>;6DMae$((#o~b0DvsR}6#UdHx5ZTLRh`gZ7~k$WNd)
z$NL-a-d%pq&8!-zX%d1*t&omi->e2mMw|F_rPswmQiI_*JKhS3;sjyKp(yk!g+`$0
z_*F-)8?Q+6zUX_(7n^r@?0fu*zbC7fvNzvKYX1EBMlKfUci at lyy!3OxwAV6dG2kyj
z5?ueopBBI at w?U9<7%Rwj(ocq~)tP^l?twl15YEIE)yhhn|5Mvr$3?ldZNqG_12!V5
zqS7thUD8N5N)0X2(kd!a(nupYBF!KjN_P!4v`DA4^m~r`zMuDgp5Oc5_dWcxw=*zv
zUF%xwT<3Y5$8oIfc_pRa4j<koiFn7`Mz|_HF%8hIep*U_cv9mLeK94*()(zS#xJ5d
zc5Lp#Ib2+z7czVPg)>bN?mFAr<R5Qvv`EEI#k5S8XEU77h3T6KU>zwisMuOa at df=^
zF`y{3tNoeR at Tuq$i1}~z6zfD_RzKd1Uvw9*N24PXxf~+9oLf6Og3JTVyKIB9q;+Bz
zi!8O at Xe$KjWUJAj7N~%S+Lv!A7~#}UG0#i*fStiS&b^#;d%VcB#bXhej>?SYxv$WQ
zkM_>te5<)H%&^pN8cHW~+Hm;evVWY265wfFZlE(aPX<2-wjOwhFG%%Ci)dcI;WK0$
zR^hfD=v5qIH__!BOS2*<y4;XvNMI`dA(rUQ9mTzPZX4NOvQ16Q*%yPDDS?D2gjJ=t
zLDNGug3&^bLdB;2$hr0JlZYEI5wGMW$|jy#_H7{~>h0`34)dmb>ykR9gww%NFR07S
zAS6pArCSKtR=D`4b#p?%*8qE%j0zW!ltG`sOn1h)&BvGWEtT+nY4^=0k~V(h`twR>
zcj*}z0#5LxzLIssV~CZ43U5ar7xDU=S5cbi-!##B`t&~LiSG$_L5PJM_j at _h0+|nY
z<dXlwy=c&XFkE*k-3E;hvW~#_J}6Rub7BZ#-1)wQzMHAE87c;emMktV&DTf!3yiwR
zSEPjPCaT>dS^K$-`y?Z?v!<>>!<~={uJO1RoP>UT!v)@kVWl$$IKSHpPBYMz?#qxP
zyqaTFb7+y`Ekp6e0%mnd{N~P1u4c{<=<YHW_H*t0-O-eQ_nDN at xQhq5N@tWxHRi(Y
za#{Ai6kTRP1e8W;>{$cTcp&AbfEkvz`r&m^?)ycH()S$Kv4hI+#LFSo$4?<C*-U{Z
zOEJKA<JqQmWo#+L;n|1E4qvoW1{Q}h6`~Z!>dr#7@(QXC;~g=Lf1-BlqgcMa_JEVG
zgaK%nsI#XBm*KDO<IAcbGyC5j-rz7I3QzWd#nw+Zhf8p?mk!=NkRA=E>K61Y(d(~>
z3lo#;r}O_2A}aGI{BH&A<Y>!<<X0b(D{y$Hv2<+D(Tb&DFNBI(`J;evn{7mns9p)R
zcjfrPf$hh~|9s&4?Y9I;RR(9Y$uyXsH%l^eb;7wHU&L-M_kAmNk2XF&dGX-qtD2pi
z##Z0=qVjQnd4n}?*v7b`?DRESJq7de8Ps{~Z%;oHyV-Oq@{w4rEQOEv(myYyPR&$p
zp6o?EtPMk5|8p(l(u$K>&;I<y{i%bs#Xix~-;#TJ=l*<ZC^fB-Ua{GdNfHRt7|+b#
z+{A8ZFTEbHu-Jjd0cFv13eG`o_Z>z-m=<Wx<a;nj!mn{*=L!yv*rcQy*N=%dYGqK)
zFC3P*thiOVu44rf7|i6lA9j~)HKpx7o*n$53S4V>@6o!mZ}yKuBjm&F9IEjD+;1pZ
znWbqoflacf%Xl49ksFPKzGX_?^Kgwo+luNB(IR;|MU-r8g`duBepQX1)w5f^CA~wA
zvwki^B|7cw==o|sU2~_e>1<UBi$TT!67I|tTFoWR5gjY^wK>Pv3_x0kUFluSII at Ic
z7%#K=I>|=y4kT?L9x-k!irFM;w(>sCH<xk|mz1;ZUd=kZI5t0GwFr?W&^59?vvYLZ
z!g^n92?Q3<pG}Ug?E%%^cl}-YXO)9De3ot%OZEOtxQp_^vdYlIsu1f(woRRGH00GO
zzi`_EYX`ZMQiyhDZEAX=MbmdyB5A*&unlNvN at F#lX4ck>G!G5RpTi}C7(M3U6OgRD
zye=Q8=@6yvr`rjPSMb*Xlpi)vVivu|MA%CM0j|fx14hgm8rcIKcAyHgyCwufFJ~a%
zaIB*v2fCO?`x^^B2>RPMRWH)J>Dn5;DgL5e;Pd;JF^6)Bh#d+8+q&c)e4+KgXYpo`
zzf`(ytS>BR!=?>{v`vDnV(1D$Dw08oN8*|idGAqsZX}@nSPG(A=2cBW&}&^o>Yiou
z2c~8s!M5v at xZkryd$I6~k6-hLu($is)KgW2qw^V6=*+7S(KwG6*_Y7^o;}_lpSv$L
zpTYjxe<*joyGSJ9U8};w8j!%AN7#=P{s^E;zVBB%387Ii6U1E!Ws at F37i78VnYe<o
zAE(wscB8JQ=5sLj5eyOE at ng4U0)lX$ipR!+Em#kjBuuf!1r*f-5(!4Ui3ooX<#O9k
z8eCQ9p-#L0-29`o=dbDSK<Iy93Y$Kp4e^3*tSJBMWD+tk{LomzQsy!;sL6l8=D$S_
zgHhku`D1k5Y3o=v&czV|8SolT*UF~4!Ab{+YkGWLhbmpF1<EU7?BGzgZt;!)h0<^@
zlnTD!G^#nblwmuZdlToXFyhczh<&bVqc-yOwqnX+hm3Z-v#|2s%fE0TYjN^FP4D>b
zcS#q=P*n at M#F+d}4+J|TinMXU?pqnLSPv$x2aUkdhAwrZ!Mh at fc(+(@=(tzb&;9EO
zmlt=W)c`4*$IfMSgq at M`3oIZrFemca9n=<j7oM1?c#RgJeuGXqaauQjRfMi5H0u3`
zoF4g>`T0jnTq~m7EuJpZ-~K`w1;i$0!oxFRj{VPPSHXKIB?N{;Fkh8bR0=e6hz*q@
z{fW;z&$T+XeWFGg#_e{RxNb};k$i#73bxKqZAtuA0`ys?Wn*?cx4kFfq3FI<>#ux3
zVE&S+ig}dlamEejJ`kmQf+vWmsA&8I$Xziw>!V+DV4+53F7 at JVkvFE`7-GD`tA*7N
zNw-#J>5~vA$Weo(=*vA3CQ+9Z8g<x^hC~f7)G+zFG&r|B*5gD at fYhWE&xI+q(+8ew
zT+8a0#M%R{Yn%!B0?|ZzExqI9BqZ9kUhXj&?t37GH+f00r+%ZwR-))x>-$?zOFK-y
zs;OXI_CQGKve^4-b#HAfQptuPM!E_1ci*M{Od!w#0V3X|KYD_sZH&r%NG?7+WCcGH
zoqMJ+2#YCJY2s&1#Kp&N%JPGY_~M(3x~#NWA}aU{|Dul?=k%roPD&pbMcLOLyrY@&
z+EzNvxoBt-3iP%E_+$}~cIt6KtJZmaTvs<$R}peEaJP{pDcyNn at Hq9HQ*&eEV at a-$
zeP)$T3(A3YhN`rX9?wN4H58IG*Zi5`Y-8p{{MmG1%=OT)atCsn)?^`f4h#fd<{(4~
z=rs+Xc?+Wci7Gc<*9ha%qxM(kvp>Q)R%YK^A=E2-rlh>Ne>)SMb`~nUM|yM;u#<4c
zNPFYcWqZRwRSIT;pCj`nIh|n<?XHHo=U>*h)C?eDnqItkacf_#ci0h@)?Wf<zp7}Q
zb)oi9fB3Kfh(HjOu&Wn*W8M8O-T-6ihK2 at MXmOEx8T?>a8Z`rEfYneZj1if00D}`m
znW!4J!{{3U^thd_y0*&8Z3T6w at _Q<xCsKQ`C|gD14?rF=oS$i9hmRl1sQINAk6f^g
zZOnV_8^_i!Sfw05{{ZpMz}2pf<BioQ<)BmGS8`HQH}>>|-g+&nNe}nqCXWqKCU?dX
zU8Bj=U<L(2i2B|7(A)9CA^9U|={BS1p at p#<R~y5N7e#SC-8V^9(Jz}vihv#AV6HCk
zRDwnG&OK8Q=U0Qx{3_YLOo}CA(b(E?59zBhwU-}m?Ob^&I6Lfp#Oqrjv4?0Wk`z6z
zmfVcZ;oiJmm#(yjn4A1lG4B5u$2eW{uO?DYox48ej}#qDc_aVf@#az6l#kBgXy#nk
znZfpDvZyF3jnygN>9-UQwVC^ZOCOw(iz{^y#LcFQgphI0Z}^^7tq!(rD;N$lIScoD
z_i}`Dj+?rTr{Ysqi-Hj4F7GpgAw?W9Vl_3j7^%8_qYzgo at Ayp?+Rt4J>62ey#A(3>
zhwp$^X0iJDyOM0`!x>VTACuD*6?UtJ!_uJlgr&nO^cRcJtUW5rcjj?T7I)pwQmE+Z
zul at anje+o1SD6l;m){!<g574R)u`Pv at 3=kgm8H;%E-Tk>dEu*^Bp^-q1KXRQ$Hj5(
zM-O-F^W~{psKzyh6bF|bLAT!3`{etNo-<m;$nv!V=B<yy37KjcuOlZvWUFV_d{&$p
z;-5KKo3i^TKlf2YDS;;siojytNLz~%TU=^`P&Z-hcWx28E&APbTZtV>5%E5(K07^<
zpvC#tR(j(}OX&uG3o=_ZrqS-*MuXECf9%;xT}tf}xh*Ffzg)SpGJ8wu-OE)IZZUZ(
z{b<qnszT$%NExMw(m<N{zGeAi-?f8G6(Bp$DEzQ&;(b0XCMsG7(-pMLK|S}|-8gN|
zF?X(J4hy}!-Oei(WcjYlAfYBxpShm>8jn^-hoj^{`!aZ5;FGewbPZ`&yCF3BKB}pT
zT41Rk0XkK%rGt?{Dx9CsP+jXw_lFV{M0CDqCvNi at uc4gCoYeZFVFg=LC)vGwKt+?}
z at qidyO3zw<^y_D+s8+5HJ1uQ<sz7mj>a{CZie6AvH3juI at fIf}8A=%#-0>W~i1X6n
z#eQu?Pxb6A3P19IG5<M=xn&~40mNR|XS-{M8Tp<%#2L)(QB6+AqH83L)qOwue91Fg
zO|Ib|++HGEvG!R~hkiG(u6rWE!ozqYMkKRtGrs3OVgnJAWr+G{w9WR6ehP;rEql^2
z&r6}~{m4D@!eYImPl&B{>j(gO1(W+y<1|Jc2+U(<v8JC;wOa{+2Sdx5$x^hoQ7Qot
zx at f;I0;=GoCQfeW*e|8h(2<y-33|K-WPC8*W at Z`E4g^D&7-cVcLrv6~EmYi`it_o7
zTg5wh`vu<lDTfotQS!+cUz~JMwjx}ruQ{^l$F6VeuTRVh#ACd6mYLk!O@}VWx5->u
zJyz~)9_J at jZ7HM#l057-^62_>O at A}Q&g&w(Cojs86(MUsA9H=~_9tnsLH+z_`z2z6
zqx9=qS{=vZk86wLW0a^fJG01{T at B)B_;a)ix~smYN?%WCmzy}yclvx^pDM6GEwj&a
zA<50>^uS`1MA_Vd;0rV;$VwbX!Fth+F*Mg<F?Xu<*<P9`%gSv`S2wGFZOPWJU(;|8
zw9dM=UY995<`ZZbCie+R)Jm2QXYF^DyX-rOWQV8+UH5|gjXbJ-nr?Q*?w$86<Gvc<
zaILb={3w~~cxp6$|4`~<KNr(x#!j=1h+k|?f^NKPmyric_i5+j+Q0OqINdwGZn8{J
zs`&<gM+}mC($g?ROqJez)cl at 9!I5z)&9K-^ZiRsOQK)Ok>=ZO6S#0jmHc5ZxyV3?+
zLn$OCJo;VtVaO`+LwORo0asW4LZ5Te$-rdM6+QpJUh%URN_IeK>QQ6tk|ufnqIS=+
zQHpg?%B{(wXSnHjy7rnYuJ&B34MIamu!O~u%Bc;1Z0+0kZ at vC!Qccp??e*KFe=qde
zF4<xkZZ2~Ul09L+m;e((GTGVtL`p$z)VqzL34Pf1n^nVl2AZ-_iSphvwj+hF&ii57
zXDBs}2eQ=%cIwVf?AN&jv6BV6E)E08uA@*LuclJO!s)i!7Es=o>nk>QBm3Aej$Tz8
zD~O7!3GJbw662%O at D1;1i$g582*8SDx<{cDT~jO*fHnLxoE|A97=?n6cUw1lDdXGp
z^Y6ZcYb2d|#c}~Iay2!|3p(%z8!8%ps*HS~6gl1-v!_Acx_9 at klKOD~AswqhIUA5r
z=7R$R$@!k&Upj>3JK5*ZYF=X*vbH44Z29yuv$mT)1)91BZ-|hmk+e#QeBu0EA95Sm
zoQdttcs*4sONJ2^B;s at r3U0ill>PQ8G+{SkOE2$o`nU30xfQzFqA_oax)-fYx4mtD
zmK_;X_qCLYr92wjzq9#c=*hNNie=u<jSXLc?M%BFb!*6*=Q-bFs^T*D<q~RkMlJs=
z=eX**QR5e|o;UA~s1 at pdZKjZyyXkj&a)dT{+aB>*|5yhg9F8vrxsTuQgN^f}U{Y1E
zW_bA$=hT3k;XJo0Kva4&zmQvvr_U2u&y6fXQfLVnUuQNmYkg3PuqO{Q^D5-guCe!Y
z{f!ryCtH(Ew$hx7w(+)6LCT^6SLAe?p5g at F%1}AAx62c8)GVvR4{ckAgt()6nC=Mm
z44uOjd|P8`In`;9Sd^jK(DH-*KKFI+tzEbI$!rk<5Erct<t41Tm^$vnJY&#_XLq{P
z)t8}GT-F<&?odm(xYKY%B}U-Cq~80+&V_cv@?g2;%$nHh7HLyV60O|Wos=wW?1(3S
zHt-;b#bu%aZDbi1H0FJm;$#6li!+70;zWp;v7c at FD`^qk at vu&jDU^^-SxQRk`fVP?
zZdL<Qe>|Kp-}i?*P at cwY*sYE79_D=-k_oA3u(Mw1zGgDn+Q%69dMar7bom#3`ej|)
z3>C>!?$>9wJq#s>8FRBN6YbN2eMr!f0!z<vt{sHXp=Z835&@2j07v*|sI1MeuN^M+
zz+ at dvN58x?wa$r|^e$gJl;*S_FAoQ-ccq?K=C0badv%x}k)a}3PvG5F)rdRkcnoE&
zbSYEC=0Vkw0&ledsrd9bZ2*}ZgkM{}`aF~ufoJzSL)G43igwWUtI*zBW1~WK1 at 76B
zaTKLhP{M%YP?Q{qKB_fdv`z)9QQPI+^RR9zjwXJX@)oLnG4Xnd6r&))!^7el at 1tsw
z)M{oS%rlKyv}!}}*<(}R at dO$1nXyUt(CYoY+eqcMvVALdi(AySgV_V8=@r+ch1Ic;
z#LL%jzKVn#2^f#YMA~---5yDORBAtKsvo at 3fby3j^F1|QJ=>E^XXf9rXxH`;_)uq|
zH4_rPL2jO%czQKJ&c20oSMdrKp168bB{(i6PsF?MXD5`O;j(5&7Ha5}W&7iYq?C1V
zREIESc;)(!OqBoXXoUhE(Qn%ylyY$+l7AoV-wTuM!s10 at uPBAR=eO)B$g3#zz4e?H
zXNr?rjMfe!wp^zKSx##KAkfo`H}KVh^y&l4v$iIyu3(BW9<RLPDL=}7s++|4;yO5g
z?y2SA8p%{F$?#T9-q2ymL0O|AGM`ze+T%q>{;}&+Mtt5-x4z|Ooioh{)lK~ckqYB3
zlIG!8@!u)JpW=&~<-C^1!cC7KV`}%mZ5QQK`fNph6}emce9gIkH=8Q$Ne&V4me?1%
zCw<UmvW|`%=4385bI6}FF`dL`U7uu4W at s4A2l7Zfs%<y_K0hdv$xJcngvEwFiAgF%
zstnn#Z;N}C9!5n)5ZAe*3`8OUj%#dg&e!`Iczx;MLeL<7lX|v`gAEvA(2GQ`7c%cc
zmjUWv&zcW!rNptH^G(twye-9^wAAcL{%!!5DQMfLy!R(CoEDwQbDUdkkM8-FKJSB~
zDjOH!X!1s0)d>p~)t$Y>m~>;|t(OuFdo`DuSw>&*?gj+1d8g5QT<Mv2 at TR=LQDwLI
z68kKSXMmlj0PL8<$_f5Kx|^i^!Ei}(X~CkjahogQ>A6wco7Jln%Rj>+iqxoW9g}hX
z%!1p<?qe9JvJO`YC&QHSzp>f(E#=Y;VKEzqKbd$L6{Pm3b%M2`vDjw?XAptHJYHkj
zt6y`GFsvfdm&S$U`SyARQF9T82hMYqy$#V{n0jf?Yk19PpF6_p9HDGAtnuJh0ryP~
zN=k`Vw<nIg-s8p$*)P_uox%kRgdTB|`Zd*@PW$0E=7N=XTu8v1EOlU$fP_&-MrNHT
zKOy(pq<L`FPpt{uPxSYF=dk!T0IA8;2|^OJM-f#^RBoAkYMX+&EOl+F`@!F56eoaY
z4t3*JE{GV)`9e|SVDkk4jdCJiUrWnE%RS#Hzj2(OMx??3<w<WwuZ&l0gS|kjPMwc8
zl$NpEAjgpO$76X?3&zMeWKm{5+O&%$B_+U)(au(T8 at TQJw+|Fj(78A|IEV(w3ifz_
zea(En7=x`kY~6cXTh^l`ORy=}Ye%*H51?wcSHVFiSo-827^wtf+pLxd2155lykdi)
zK2 at Iu^?R!b^ix3Hr9-o-&X`}(>yG*mK<d^Tu1S%Wo^Ev_{<Fe*kTHHPyA(V`w}&sP
z<AgW?90`7Pmu`?ZK4Gf2DR)^R9{l^x9dLCVL#o{SX;XgZizI{VG$fX~<<B1|G&eQf
zAY~KlG=F!KVL!=j^2Y*c565jvftAk>w$S-~c!4Zirq-%LV-AGu>v+7fkFz6yuj_9^
zbp at yOZeaEs#GqE5Uiju>dgvBe%=s*+rI5~xCI at +ClO{e^m8#uJKU+fWCn|UC>rPyu
zQU~ZeoF9^XsA12BpZLOzs at dsRfHsM_&zDpvSzAKyAqx)Sp~dss`&6YVGHQG-bYAKQ
zv!W*eX~kJ28!Km91sz&Rn0YirlyzLbP9gLHU^+9P#^h*Zt3f?rz8CgD^3E6jAUf1q
zwQh at 4u3K2}E8I)8bacMIfB1vkM&k+!Y%Uvd7oR2#Jun6QT<r!V6(R561D_bgmOuhu
z`1PY9?nxsbhsmYSwjh%L$4qp(G|w*DR*^cxK!6F{mZ;3*ZuEh3wt(yE3mGI#5tE=9
zc5bHRwQ_hm{$!AuGw7GD!ZV3O+fwIUf~L>aWqVaHPse)ePw}p&G7b4%!skek%E8iR
zV`}}|3uyABqnNJXDG at qvcG!M-WfqLV605lz*UA+a<G~?n4}1vI)G=I=U(UdIU#KH@
z0I0vQY`t$tiHHWX)#-}Cmj at 0DV)8fco+<BlCnz$d91 at gm&Q$2$=j`{8C{c)EZo~ck
zUEulj%gv{6- at PjyeBc1u53m421d%?H8MV=~h<u+9EeWtn=ADm!Fc%Sc>!FcBT+`qF
z at 0BG^1&Bw*i=;PW17-auJ;tSit0du8I4$Q&0BE5=@I<tG|AjMqdAIC+zV*^ISeWeV
zsodv%2`|E;Dcup)@L_2xPQ+S1*o_Sh4{M_tpl`QbrG_<Tv5K47*m#mIbK~aC`6x=3
zWee>Sp*A~$cwQ@>4D-JSpZ|k@^(RbEKiv}4i2TST_wLVgeVnUh6>02UD9abLG_vNJ
z&?S at 7`B0+xL9KnPEj~Uz0_6ctV5Afjli<n=seu#Hl0MvVNiluyeUv$mR0-8_GsoJ;
zk+c_zU4cPL2^blqWiJD?A>WUQ=Z8?^+;^j|jk~_2U{mUo#^6W$41w+!KhQ+V4VC+(
zk<a&}s0<f^ya)XKxRfuoXIxg214$4Rsups4W4J9%hnZ at WCCstV;ssl!Ryg!V7*i5s
zqFa44yPPSBcO{m<>QZ#or;;{4=f%HKOP|SxRRDk&@Hyr~b$!y at 03@d|5=1dMx+q$d
zyRfl<;_avjPRcn5TSX9I)M7Ay>*l7!erIFKzr)nVBOv_~(s?fCv(x=L_gJQXmZm+e
z<Y9j;a8Hi+=_>i|g0bs1T(1{&G)uZ+qA!kDptf>Ez*iBZQfO<%<CB1_39MV$9NR&a
z+s3m*yeK&t2!U91O}m%NTl at 3lSNuyHi7M@QA6Gug2Pme9)WE`2&r*Egxi#Bn24_(e
zGaChHj7N7TxF||h__Z589yNm#s!Uh+>H4*QhQ7s0A-J*^ob8HW#t1y`e7FT!f0-?2
z>)R{bfg6X^2_L9B)b?~S!c@$>EG!{f%Bxo{jH<JD7>h_b-`tu?vAoo!$MvrprtyoX
zRZ2_dL}FwaSI)z{L)(Y%Tu7I*{ujPB_Nasn;%@fGk0geV9_kc|9eh<(Qo76UXa-$B
zrLU0BBf23v_wSE4G^EQ%GjeU*M&g=B6nPzNUA#g5!o%a8zdsz*z_|e9>h0zAqB>|-
zAydldWLJ9&#eF`HqE*CWhrVNGQ_VqJz<!9GU=EK_Uv)J8^w>yN_Hx&$v-nf5ku4b5
z0cVhN-7SX=xd3v61L?)jP;)!JifP>;yL-3m>{?uLkI4$9ZaRl!5bSYul2FK(Oa1(g
zkd(48JUcxBj*rzaY#Ou^_Or1>Bn_Rm>1fMdbK;~mE<U{NaE&1d!UVsGi6jE+XJzYU
z7-^up{PumlXgHDh)gqCa<E at SoFMfv^$haF}4b0l&h&@Q_RW_53lgL$p#{sr>fC*ru
zu`k;toX7MGC4^+q(>iwpn-IJd{L}cF{_v+aR!;S&CAWV0|A)86!$sy=&dB-!gWEz@
z7^JTv`{DcUlh7m7MB2cr#BFVK7ocZHDOz_90$!V;Rp9xBC%UUSv4)LymELa0$%NEI
z?8D>E3@;BQdHHxDcgG-Nmg4!T`EI%y=&_F at CEqR9ZO1!Z!d~q7`6fk1<pPj2Bauit
zGO$UrnW{ZG*`HELG23okT(kt&K1dD{;RuzF99z(@^*&ref<<tIFW^@IYH0|uvMTS~
zc6t3k0NvjYZYv<M)~NM5fc_Et0yLIDO8DdFPc(G>rhLx~gWWEeR^fFBM5|HrM at xbb
z;~RO-5;r@$1MD;Kc~r2pCSkXzfr&Q#-S22;seuYMHgm`R1<);jvtg6iLW8LRi0p=q
zJXsz*cy*LL4X|@Fu+?ox*d7=p&qOOT4gz-nC4}|_T(Rc8;7FXqy|n~rU({oAv>&n?
z=_22#r8w##XEpHdLW9+20L|1gHFXAMI;{mTAwVP}-3-R at OqyRBsp29<D$wWjyu!#e
z3ye;nvGg<<m?~IHTL?Z7GD)Zm<My+YVW$eDpycEG4PMoFC-Y`+uM#yfn<w3zspY)G
zU!d;D2z4CJOKvSRlfJ05lvJ2unpD8RfCk62 at p5sV(AjRN1`$yt2={g4FcEB_?wkp=
zXOxidsTcGM?3cqFz;c4ZirL0FhEcQqMMGGnDu8xX6VFhXMfLVB;_NFiC7;pJKL7d}
zjA8+VG`;hQBHp9MI-=}!dHBGsaA%-`^Z}Y;Ho#uVDX8^;9ccdec)O<}g5ZhQ=7rFQ
zM%8=)#3~#a?kUdepo~xR|E%|waaY%|^25M+1-*gn)&Cl at +?^%ZxuLfPp1E{K6${C?
zd2DsSlLHb9kNx#7Du4WY%F2hUQ+1*R-(|tLUG!j<(5eDmW<NDDqJwB at Y}|oD)B=lw
zkJ;DF$-Sed042=YSedB9%z2h-pc%9!f};ZNCA^I2sed6G>_&|FQrRlRE{sPE|DHHa
zQC%clV9!U5v&x$cAxlO|YTRwgdq<8Z^p2n_924ROKw(pr6Dvqs>q*20uF|*<!88Qv
zXt~}mR`ys<K>5M79oi3B=9r_6x}HQxD5x at -)w8bW<r6<N>P)<D)O(KM9SzHJ)M2*s
zzlT=^1JmZ)#Gf|#|C_}1r$zq1_twDSE$Bf3&U2GSzLyT;$OG3C)<eHzHC5{k-5jVP
zTmX#+f=TNs9CR{!AKtz%s=BCdW;P2G)ZG#ClC$3}qOo~aSi2yY8_-|FDim?H?z|NN
zPiCw&0bLugpN)Bz)M1N*{IS6an(!}=#ZpzkGPK&~L_j6N at QVfmB2pxY&*8NNR>E`e
zMj|D5SOqLign&DR(@J;iaL4y--?x85B|JR5lh%922VTB^_IMFI(>&W_SgH_R@!;SH
z#uvr=>k}Qte~1w4c-A$#U#&G^q6!NMEjoc{a2y|7O+9yeISGINKj?D*%Om|SYM%D4
zT!&OQec`QIVW=?crMeLdRcr}PnCVsmcX^*-7`yv!v$n3a*H8zBmJ+k9yx6!VeGBCT
z7A%khL(8 at O<3mwUiL)!jcR`Lj3bxuRDm at TY0nJY2hgKFWAlYu{bODu4pD&vJLONvJ
zkgL;}LVBShazO3GsE?e{{Gvg|iRd&973T5Sv0T3crw{!z$D#HAEm258(Wu7bD<F-q
zB%tm-h7jJw3`6Ed_?9&Io at nws@WS4}hk`;aK)2u4C`T&~LKxO(+AMhIB|ikb5_lrm
z-3}l{4vzl%Y*=tDAMReeaU=8HXX)ZNb&LQ}3OLLhUB7bWM>n)8;anPMqd!@Ph3>S)
z%zgkKhdXOyyx_JkAW#WTt0uq-dRY}9aUDw=_%$t#$w|M3Pf0`51e`1kEIXfn!0iQS
z-~GbLR1ZMBJecxWVbP=OtEX2e`7k2TbOtu~tLTOXKS69<zUYnZ6TW6vP`n7U6a<CA
zVD);Hi19tJ8FAKWuhuYVe!124yIA{Cd>60Xs0K7DVTrt#DE8c6M<#m&ntcN-nwXtf
znMRE;5rmBDLl9lcA7KPI8&wcs?;Ih%tOF#A;H@}alL&0af%vEQ9Qd!#XaBT|hTAqP
zPzJL<;B~Y`mN4qU**r>z;Qz|L+zyp7*nb*21d^^8??9mnt~Na)N6h>5`n+f)6s&?f
zyXrs~;Amfw_0)h#uJ_`~0rtvoTxEa%;R7VWC;u1QWzT_!G39f_q7uWPj({Kvcv(Ts
z9yy60bi=T;FRiCguw1!%wfH%s>M|PIn%2YlNii`pDQ29=Vi!(tauKf=peXmQ{Z)Uh
zvn^~7EJ&@Vzr6x4_L9e*u!X-B!_Ez&x1 at 06A4u6>YtaD-YoqS0HWqtm2{hD2Heg;A
z8dNxzPy~jA%ymQZ3)HG_Xfz6lUyx;gea_f-JuGr(D^f+|!B1!<!LETDq*2;^eKV2_
zHn82jy=UmGE-)I3i+r%w2kGSD{)S5XqafLph3gP8W|^*fGkQHgfd75`nEoaq?;n`u
zj<m_lyFZW_E+H at W3jddv__%aRhHo!xkx5hFw{K$RTBWo30~52#d)-MD{+`bG39MJk
zdwxxBCy#IA-Fi0r9Wa_Tc(U$*rba{ZBjH0~8bvd=2?*CRm?+2QT`#<k+;mqiz5Dk*
zYhAcNq}|l|o9Zv)X%sAk;I0e at X3$YnKldFH({6M1D)$e at 7x^vL2~G2)SSG|A%Yj}6
zQ>@GVu|B7_&|Qb)T+o(GZH9y&1nKF+wRdr7wx-udiqe5uASB1*{^t0&{xHa{Yz!#0
z<^?wNOwLT}W*d&}6L&(Ytvk{vl3ieu0)$WlHpmg8NHf8PKssxfN7#9bg5J8RH~9k5
ze|#g*T)^tM^S^&%;P=dxUU)gI2n5>z->@w}$bgCsX8i#G^&IqV$C%`B$nr$JezTE*
zH()8o7F5^|jv#>mxc={-Ar~JJ{*BwJQ}|RICM{_6z%8TF_snO$4!#cx8xWcUnSlrF
zGfdy&)z~^aJ3|g;1#CM#Zph06v24#67JZ$UO{d)nybsyf!uH-q0DCFT1IQkb{X>EX
zTZHE1`IgFt`fmOP16$s)(|i1m8L;AKnSoLWziWBOQ`#idS!g*tVsXV>AFpN=c0nr_
z*`Ne*zl(hi#y&x%u at 7iNyom{tV2uF)5;2u#-+aPRYHq91=>hp8F{?pq1XQoM7q1u6
z(-%Wx3r6w~zad`3*us}&gSx!h9 at xN9)z5#t4ocEk$L5DiM;+&|hiWtus<0)PI@}5l
zk*7D!_#h`YubPa1(^=^l&fb(Q)zvksaQs_GtkjTbB|JjU^$Az at eJbG0!4XUl?^D$V
z?B+{IpRdpca=^2Y9QmTj#6jV`qw3?@|Gdm*cs&Zwkgj%jNWatG)qo%J&}4|uWYk3e
zK}(`+zI}tBk3j~6Z`i6K<EnGgV70r`{5?*@b(iSbFqgqxiGH^DK9S>JlJNszDNlpo
zwH|nXL1*=$6_2{E2~d<_qJy#-A_s8I?|?Vec97Yaagjf3X at cF^f5WO&A%=Ooiz8&^
zf?T7$iHj_Q?p}T!3~XACI%$0@>4U0uTG#f(?2cMcEyI3CF1`#tne#aGbUKD=xgxOy
z!Tg=L&;Lcz`rHa~AxVnmF-Y-sSPk!T at H-SmwtJ6Pxjj^Br*`4ejv(&eVIg+Vp}1h4
zPKjV2N=L>e;+u>>$bq8t^H at ZZo$lQI!k6PN(YJ at 5aLv5}LYEhOoA1$D8RUz#zh{Cv
zt=OlBlx~^d@>75j_d~eHKd<o5HvqPGtL;q|y?C~<)pAEDR9k9afe`}q+h8~dF_6%J
z;xC%io=Zv!Nh;@`@&}5_QAMavHRi`_%97;aoutY9L6puh at 9hH|)k!NMDT!GQ<8xa#
z0DG~Xng2V2(u>Z>w<M^{zUe=s#v^GRH0%ycDkJ2-$E=qlRY6(ctEJ5JY3?iKjDHUu
zr-0kKqC5&J62NK4V{I-P-UXBa*g6rOvdfE(30+Mkct?=o-(_`ElNx_?c&ZGiS-{GN
zZA5Q~o{spDIOg+v-Qe9tE7}D=(mjB+uqVRFj71kG3X1m5IFy{GF$g|}Z1QI%+T>ea
z0)0FE#gCsh_(KNZiI)4vh&WfY*g^=fMg43~Wg-_~bKac!hmIBhXptFCl%}owXM}XA
zRpbp_Y9#tfN1kk!Q3_1_7ak=P6lv!#T^F>*c*H!4J&0(mlqIAhOH!EYVi1f*T&f}m
z^QhWT9J(|rgrl>#99Cvode<1EQFZx?+kyX}Sgk-f?O)C?Zg{tfh}RXq2_<A!kOxFt
zpyKylxZ~7s01&x}Ksx|P5w&-(quRUn93aRT8yi!5mdF$SB;yypO010fKo;3fEDaP!
zY|>0_hbpeVf)Z!j`#$=RM!K#)<|;>Hk)}X&)l*{<T}6K}^1GayNLAVzV;(~!eM=N8
z3mktkkSck}-$y^uR!^ab`KPhg&?g~V1oGA{)@Q6UOMzvW>6RVpB-%PXdlnXAT8nJy
zUE&kg(wtS4rTTZ6v*@oQ;Oz#S|B93ouco%8Q^rf^To#VsuRgV-3`OIT6x33rqfQ*k
z+3*lYG+(7j>cN<gP-T6rEL2pvIq1z&Va_GgVf14-IHDYEh)}a&zu5~%p~9B6yFQWN
zZm^nx5h=AEw4SVXhh$^}jSMC2VH3QH2muPB073{8wSem%6AIZQFx5WV`nzMQ1$q$+
z$vOsBOfCMbf{rCVGwcZ0 at FwTW8GY{926dNur83!n0%t<<{{Ux>ic7b#+6 at NvtT5mo
zniYekh;Ga#8<Wjr3Lb_CY&-m9#58nMe=uL0eiU)UG)N3*xft(srAB%J0Ks+6gq3Ox
zFUW^vOmj~c+&R)a79h@`DP!{`E9!s<d+f>DypU%2L08}G7p}NA-SN9BU46tt#DE2X
zx$hm;U_XqHoL$Yy-WcS;898?<r!!TG4+^B(v$~c)F7{`3KmqbuxgQCs<8xntMr1X9
zqyJ)cRjUYvR!CM5U3 at Me8RT4+_rEYVtkTDFTmRr%iQP0)PsXqQ4QLaE&u`=OE|c62
z#!KSY!y?qCI=h97%KLf9&nHm>w=*mGeVu3p$MnC4Ds`hDpbT8+*6C}Sm4CyrF at I1u
z2{`sfj6bXH^pNQQ!}}&*tnCkE#zA3dextpCR(gv%DIGSPU)$U1*J9uZges#{%Y?N8
zjWPHJSsO`7NvreZe^_sf>>tDb?;66g+Lqe>0qq7P*Hggb*f54Xp<BA at 4yu&vBrXTk
z90J5UEOYqGabL|{S>?QmRR!+;YsC6Ah2(DKr7a%Di-1R_Rpm!;AKDEv3vmRoY$8_!
z8qFyrBqSn|e1tvjfRt30jz~fNg1g#shT}cC1yE$vpOek8bhO}U`R{`!Gz~>URv*tO
zb8}^`<KK-q3=F$ntK)=0Om^u%dQ}o23GYwM2*Qtl9gB|six(BdOnMGy{6c&OoSbE5
zZ~S2FN*TaPCAnOqcqHwwC9ZrBz<DMPol?MyK-9!yaf^6e%5*)0nZA7bGw$<^)Pvz?
zW!rUg&K6wH-NNz3RMTWPuxE6XUBEKM|7TgAcN^ZC_G#@2g#Z4xpRkWnx2+qr%y<uM
z;r0F0 at P-e0t<Scw)&IJmLwCKFGtWQoeCM+;W)ev7f;#-=(bGg!AyJZ&2z=}}Z?<mr
zX5Cyd`-3udqV%L567b{*p=o-zRiGNQ_NpcEB%A9&x at dFAZu<yyWuHH4bZ at t1{Yi?f
z_AIX$p&@B-tbBWB{&2m(iYIUH)%DPk$0FS1l at sgxD*Bs_ at e}GyL|-)H&1_;_1<Uq)
z1b6*Cq`f&~<`Rmak2?K<bb*;Ow90P3)c--yZj*Y|SWt9T at 4byIy}^gJyDDS14T?Xy
zf5*JqvNzLZnYj1E`JLCZ$~V^Mq13*0E7&O}?os=f!_2O#IK+PKT`g0;wOZo%i4J!c
z-zQEX5o+OK(mXu^@p&2Zx+*!fLs|~iUFm6@$?}8z^kwxt at j)jksOZapR*|LkEvF6*
zjS)FA3uIl^v98)s&5JG28dqUD$;f+Fzcw!+f{M<aUyaa~WO?D!oN|fGQ#xS^-97#Z
z&JN>3v5 at EOCM7xNkDTZgT`D=EaQF~h#Q$?|+T5axizAKGG8v^kz-uZr73>XCOSeWo
zi#YcT<^mbL5hKrr1Ttkcs;>NSwgExof_+gzvZ&dcO at Y6izjFU>P(BO~KduTH`pdaU
zg{SHE?X<O1t?pK9Cfgsrm=%hzmwZjOedrTJ6z&o>#I9k!k^P#E4!#%m`AUpFr${<o
zw;`YLzEAAi96_z(FPu5u1QjlvV<mlEJo*kH89D3rdzT2;PHPe?s6(2GGxOHjExMZI
zEtZUu8kFhea at mvZn`{39 at Yo~~#f)HOXIgDxMp3ZDzSkS$i1>QCay|WRxK2j*L*;}h
z8ATpNr&DVarqpCL3`c7PLjEI4hejrJfSo-UlPbtjTz}^5VQJnRv0vt3jk}vjldW2m
zThd1!ez^`Y7-pHkE#EFRaLP|r_TAm$S$6!gjJ<u?sz{OxcbA4u>DwnR#K_vV&3eQt
z%+zwKX8w*&Dsyhdu9?o*g0oK9ehG0x+V)_|IMI0p?!pY6+f%YXNV`3s;R{SPYn%mJ
zG0cYx(7rQ2Ki=A@)DxjU-eaXu_01`>%SayIRX3%RJoALZgemJ;)bQhZckdh4!(Ui>
ziu=<}`6i6Cnsf=%u%f2-4&5BvIu>$=japZ{(xL)&=$i5-<*Iz|=?AnkHwKi at 68eQu
zv{_yMTbREe8S$W-d3a+Zz+4(1jl4)Qd&p8+jGHtgbs?u9(jFHvK9%!jopbCzCPFT1
z_Q-QA(HNm;lBDqrpVs17&3wN*SN(~^d-iq at DI~ktPT`T~u}tFbiSQJ1XMsw at arfYI
zQSM?z-B(od7X|Z7_OWyC1b^Dmd?kOv6nNfyv9oEL0MMV8|6F#_0+np$@<~s{qC<Q1
zkAur7 at +hKWSTEb|)gCQtH|$5ODn4Bab at tS7j``xW=vr7z(TBa2)r0p(`c?yHwke^P
zjXt?$H6$&o=beq((Ike_MzFqnf*L+(qS$%Wl~YvNch!D*W;RvxNxIgjOQV9g62v)9
znE!ZOk#<_m+jGf>+jF6o+(S7F>$Z_I^T$C07Pd666Pe!KjQ+~eGq#-4(R%f?ah~8?
zVEp>qS+0w+$-xU9!bzcH;mVftq8Hvi8Qi#3`D?#IjZj8qgtbaVTi?NVL6VXt$L6#L
zBjMKG6>x#(1?z6(!G490t`8CCGn4FGZtMg$PDBQC>h+B$7MS*ysC`wuB;`@pCp`6;
zZXhM_r_zzBP<tA{VB^<*GHXSZ_4}d*N9PT05Ar8&c7!qc25LP2S6GGMNi>&ts5j;v
z%6Bh>Y47E>|7UBat0+G1*MI_yll at G5o408D|A at M&>#7T$YlTEze`4)_i`@U;|IzA6
z&c9mH2C_+<3+EF2wX*8+hP00S<o15q><QG3;37wa7~72z;}sXj-ESafpLD at 5Zjpq_
z>y13~?0TWUM3)qA_At|ZsE<*pguDFd!-+oHM>*wAH_ErkJ6r4GvFHa?X at uUI_uf@|
z2ItnQ0GXR}y1Z0!9K^@jd6NvD4J&(<SN6iBOONyfP84x|HwRt1j^Y<CTixv$^%E&1
zsuFGJsrRC?OPv~PC_peU4LuzoGR>b7wfl<Cccgw~;ki_YVXU^w at ola+&Dl+=(Xf+d
zz~0L{M at hTEpNTV4Ovv~ITYTCvKhYr<=@fKFXrbl_hh(L-&x-S*^H+ at U*N8#xv&qul
zq%1uN4N_C8 at K1v}aSKUAT5;j3_}B1``qp<pA(&zaY;(Ua$??7 at URM7~R627?E at vp?
z7?)R`GQVHKDK}%md;!bp5hHi<)kivN7|tXPop_AOzWAMJRQzRVIyAT~DbFR*hPFYk
zLl0N>4Sm_<S at Gp}+Ud;f&E)i$Us<a^*gIK?mP_OwHf7|M%hV73y7&hq;>Zwak{1lQ
zM3}T)KB0i}oJvMBfNxgwtkH at fGO`pNQen+rJA2u^Pi)p=0Z;RmeQkGp1U5E`3^*E}
zCis))e at +d*b||G5MH8osWaprQ?L$ob)lR^9xu1u#d6<nVVI<m`!B!hSFs+#QxF~P3
zO|iy-&v)KfSLVj&uY*er`w?AQ{RhvVmcBN277&h$kQtHJ(KHF?8UkhEC!D|c(obrM
zmD88i7VL!2jLJ4P+=rY*1UA2!Zmm_D;F}#cOO7 at Rh4h=>c*={rmaII665o4moSXXN
zM$N^7;0!my9C_x5_IY?><$`||jD9(N<SUXEq2+{H`_8mCtzwr!4D%o-uf(0Z`YzdF
z&30<l&F|fric24qy}uN(OI9wYI9Q8ivpslGh5m`n7K-&k3hd85WyW28SM*L#KQVcW
z%C;nVJGbENngeYYW05Rl0t~_QdhbnSx436TsxGlyhL}usg7t$SyIp0zl!bh^eu|y&
zE~@)fK`{oqJ?4G*YVmqwJFRD!j at sB75i%QkvNX*nb~ex34(J**qBqpFqIIaFyI`Kv
z<3wHVw?4B)Y7Tg_B;h{_GwCa4cpk`N7Vc$%Z90_ajL2KhT@*Zfy7!%_n+~;diYVYf
zH&X!Z{D0%;6V8v`vZ~G`E)P2Mzi>V+)`JCKhyGS+cXeKuw1NEqsTI~@tTnlc&2!$4
z&|P0Y`RDuuF7$l;n!MVJPqVEqajjKmo#a~iqDy$W*MhSQ(Ip#Pd9FjP7Tk7a$-4<z
zyPfe(ye1!?9X~<fY?iMd$o+c1)6Z0$rG1*4+Q7nPm!4(VS7N3#mbD+IE{7HwEK&DZ
zAmp+O&-!}Ham9L+B;Hl4=R_4<X?Cc45+1)-lV#Xtt6<CZNU$R*5$~{9^?M!HTAfEk
z17(%XD6x{lK#4+psUBM54O}+8ge(eqxkE42>h#d7E24v|O9h=gw6=kgQR9$BGp?Xn
zX~xXD=5~f6bI$kJPHe|d|0qGDKG!oIHe1hs{W?^_<;_!&WmOwrD%Rt{!?~|7jL}33
zapzS|u6K9l`a8SxWm^%%yQXBlU0H5=x*KUC{Mo9hSU`HLDJfbgL#B+QL#r=D|Fu+6
ztG5Sw-)59v_`nXq3N$&Ekwkhs6RpqBJP}I7!zIp2RpH!Q;hnQo9vmVztjMTZ4%tDM
z4~15vR^IXX)Q!)1R?HL3X?44*OIa!nA9Cs{t5CEl77wZ@)LaQr@*sY~8Bln5J3BFL
zZKhkEf)-J2>m+<&h=`CDNsOyjQ8DUKJclFJSI?K?sH3%+D;Jt8*H`<H)4eYFn93%<
z)og-Otn6O at nvyOq-$xDZ?a_R5+NL!GV%;r{;_6tA6??oEyN&o%XU1iwdN+0Fz|s{#
zCXZ9K=o2Q+HcACETDvc!u*N?>Wyh6=b%NNo`e^uDUlF6ZJ4d3=8$9gfX>ns(_OKB~
zls%3iAuj53uGPI2-c20>|3Wq63*L>3iorF}iJh+A7Sf>^D!Hp)J2PCM!9cI4)A>>@
zMmhq6D68(*RLVu4e2*`ElJa%q<2L7St%o+QzV at hRZas?en_~0$2yIT`sl~Q#lgG6E
z&&ZSbCv=N)oqa>2qt`bAfUJk}SfeoZuT173Y7|EO`f>QH_nqUM9vsY^ZHpO#q64CJ
zt?@Md;-4|Uy`-E at cni;;@ZNrSQdZ=1xcw at 4W4A@%^{yb|?ylNxP87X}G+KGFhx>(%
z9<GvpL>$dpR$m-CiKwG^fvT~%d4WnQm;x at Iv5@TXXd^R&TAbOQ(;>>jcj@(J?%x=F
zbT?Vx*e=_=m&C8zOL<l;JJ$P4O0v6LLn&;>k|bZ!4{_)4%@N##B~6u=4Tm?jyfdu+
zD(kS?<z5qwcQxvnuzOK!Fr)0M^`+3S_UWO*RH at adsYFbXRXXGrVtB0+TmljgUBq9U
zPZtZTN`lSiIeu$X)LN!h$F5rX+#NSM5<zH2PEUrR84^wo2=WrMh)bFxW45us`agff
WPPfh)qlQZ)^G-If at BQ1G<^KS^5Zqh<
literal 0
HcmV?d00001
diff --git a/images/c_user/regulator_input_sequence.puml b/images/c_user/regulator_input_sequence.puml
new file mode 100644
index 0000000..aa9020c
--- /dev/null
+++ b/images/c_user/regulator_input_sequence.puml
@@ -0,0 +1,16 @@
+' SPDX-License-Identifier: CC-BY-SA-4.0
+
+' Copyright (C) 2023 OAR Corporatoin
+
+ at startuml "Regulator Application Input Source Usage"
+ Source -> Regulator : rtems_regulator_obtain_buffer(regulator, buffer)
+ Regulator -> RTEMS : rtems_partition_get_buffer(id, buffer)
+ RTEMS --> Regulator : rtems_status_code
+ Regulator --> Source : rtems_status_code
+ Source -> Regulator : rtems_regulator_send(regulator, message, length)
+ Regulator -> RTEMS : rtems_message_queue_send(id, message, size)
+ RTEMS --> Regulator : rtems_status_code
+ Regulator --> Source : rtems_status_code
+
+ at enduml
+
--
2.31.1
More information about the devel
mailing list