diff --git a/doc/_static/factory_in_class.pdf b/doc/_static/factory_in_class.pdf index 26b91f0..2b874ea 100644 Binary files a/doc/_static/factory_in_class.pdf and b/doc/_static/factory_in_class.pdf differ diff --git a/doc/_static/factory_in_class.svg b/doc/_static/factory_in_class.svg index 73ac433..635c2f4 100644 --- a/doc/_static/factory_in_class.svg +++ b/doc/_static/factory_in_class.svg @@ -1,7 +1,7 @@ -Factoryb1entry / chart.post_fifo(Event(signal=signals.hook_1))exit / chart.post_fifo(Event(signal=signals.hook_2))common_behaviorsentry / chart.subscribe(Event(signal=signals.OTHER_INNER_MOST))hook_1 / chart.worker1()hoot_2 / chart.worker2() ClassWithStatechartInItattribute1attribute2name b11entry / chart.post_fifo( Event(signal=signals.inner_most)) inner_most / chart.publish( Event(signal=signals.OTHER_INNER_MOST)) OTHER_INNER_MOST / {} a1entry / if random.randint(1, 5) <= 2: chart.post_fifo( Event(signal=signals.to_b1) )12resetworker1()worker2()to_b1OTHER_INNER_MOSTSynchronous Main Threadparts in blackAsynchronous Statechart Thread partsin blueif "__name__" == "__main__": chart1 = ClassWithStatechartInit('chart1', live_trace=True) chart2 = ClassWithStatechartInit('chart2', live_trace=True) chart3 = ClassWithStatechartInit('chart3', live_trace=True) time.sleep(3) 10.0;10.0;10.0;30.0;210.0;30.0;210.0;10.0 + + Relation + + 1134 + 216 + 81 + 72 + + lt=<<<<- + 10.0;10.0;70.0;10.0;70.0;60.0;10.0;60.0 + + + Text + + 1143 + 252 + 27 + 27 + + 2 +style=wordwrap +layer=3 + + + + Text + + 1143 + 198 + 27 + 27 + + 1 +style=wordwrap +layer=3 + + diff --git a/doc/recipes.rst b/doc/recipes.rst index e45c0d7..f251a9d 100644 --- a/doc/recipes.rst +++ b/doc/recipes.rst @@ -70,7 +70,6 @@ There are different ways to create states with miros: * :ref:`Do something when the state is entered` * :ref:`Do something when the state is initialized` * :ref:`Do something when the state is exited` -* :ref:`Augment your active object` * :ref:`Create a hook` * :ref:`Catch and release` * :ref:`Create a one-shot` @@ -572,18 +571,6 @@ outside of of your state method's boundary. self.temp.fun = self.c return status -.. _recipes-markup-your-event-processor: - -Augment Your Active Object -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -It is a bad idea to add variables to the state methods, instead augment your -active objects using the ``augment`` command. - -.. code-block:: python - - chart = ActiveObect() - chart.augment(other=0, name='counter') - assert(chart.counter == 0) .. _recipes-create-a-hook: @@ -746,7 +733,7 @@ Create a Multi-Shot .. _recipes-cancelling-events-state: -Cancelling Events +Canceling Events ^^^^^^^^^^^^^^^^^ To kill a cancel a specific event, see :ref:`this.` @@ -794,145 +781,459 @@ The highlighted code is the guard. To learn more about guards read the :ref:`hacking to learn example.` -.. _recipes-creating-a-state-method-from-a-template: - -Creating a Statechart From a Template -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To have the library create your state methods for you: - -1. :ref:`Import the correct items from the miros library` -2. :ref:`Create a set of states from the miros template.` -3. :ref:`Create callback functions which you will link into the chart` -4. :ref:`Create an active object, and link it to your state handler` -5. :ref:`Register callbacks to each of your events.` -6. :ref:`Relate your states to one another by assigning them parents` -7. :ref:`Start up the active object in the desired state` -8. :ref:`Debugging a templated state method` +.. _recipes-events-and-signals: +Events And Signals +------------------ +.. _recipes-creating-an-event: -.. image:: _static/factory2.svg - :target: _static/factory2.pdf - :align: center +Creating an Event +^^^^^^^^^^^^^^^^^ +An event is something that will be passed into your statechart, it will be +reacted to, then removed from memory. -.. _recipes-template-1: +.. code-block:: python -Import the correct items from the miros library: + from miros import Event + from miros import signals -.. code-block:: python + event_1 = Event(signal="name_of_signal") + # or + event_2 = Event(signal=signals.name_of_signal) - from miros import state_method_template - from miros import ActiveObject - from miros import signals, Event, return_status +.. _recipes-creating-a-signal: -.. _recipes-template-2: +Creating a Signal +^^^^^^^^^^^^^^^^^ +A signal is the name of an event. Many different events can have the same +name, or signal. When a signal is created, it is given a number which is one +higher than the oldest signal that was within your program. You shouldn't have +to worry about what a signal number is, they are only used to speed up the +event processor. (it is faster to compare two numbers than two strings) -Create a set of states from the miros template: +When you create a signal it will not be removed from memory until your program +finishes. They are created at the moment they are referenced, so you don't +have to explicitly define them. .. code-block:: python + :emphasize-lines: 6 - tc2_s1 = state_method_template('tc2_s1') - tc2_s2 = state_method_template('tc2_s2') - tc2_s3 = state_method_template('tc2_s3') + from miros import Event + from miros import signals + + # signal named "name_of_signaL" invented + # here and given a unique number + event_1 = Event(signal="name_of_signal") + # the signal number of this event will have + # the same number as in line 6 + event_2 = Event(signal=signals.name_of_signal) -.. _recipes-template-3: +Notice that the signal was invented on line **6** then re-used on line **9**. -Create callback functions which you will link into your chart: +The signals are shared across your whole program. To see reflect upon your +signals read :ref:`this`. -.. code-block:: python - def trans_to_c2_s1(chart, e): - return chart.trans(tc2_s1) +.. _posting_events: - def trans_to_c2_s3(chart, e): - return chart.trans(tc2_s3) +Posting Events +^^^^^^^^^^^^^^ +The Active Object ``post_fifo``, ``post_lifo``, ``defer`` and ``recall`` +methods are use to feed events to the statechart. An Event can be thought of +as a kind of named marble that is placed onto a topological map. If a +particular elevation doesn't know what to do with the marble, it rolls the +marble to the next lower elevation, or state. If the lowest elevation is +reached and the program doesn't know what to do, it just ignores the event, or +lets the marble fall out of play. - def trans_to_c2_s2(chart, e): - return chart.trans(tc2_s2) +The name of the marble is the signal name. An event can have a payload, but it +doesn't have to. An event can only be posted to a chart after the chart has +started. Otherwise the behavior of the active object is undefined. - def handled(chart, e): - return return_status.HANDLED +The state methods typically react to the names of a event, or the signal names. +This means that the if-else structures that you write will use the signal names +in their logic. -.. _recipes-template-4: +If you use the chart's post event methods within the chart, the chart will not +concern itself with *where* you initiated that event. It will post its events +into its queue as if they were provided by the outside world. In this way +these events are called *artificial*; instead of the world creating the event, +the chart does. There are a number of situations where it makes sense to do +this, they will be described in the patterns section. -Create an active object and link it to your state handler: +.. _recipes-posting-an-event-to-the-fifo: + +Posting an Event to the Fifo +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To post an event to the active object first-in-first-out (fifo) buffer, you +must have first started your statechart. Here is a simple example: .. code-block:: python ao = ActiveObject() + # start at 'outer' for the sake of our example + ao.start_at(outer) -.. _recipes-template-5: - -Register callbacks to each of your events: + # Send an event with the signal name 'mary' + ao.post_fifo(Event(signal=signals.mary)) -.. code-block:: python +The signal names used by the events are common across the entire system. You +do not need to declare them. If the system had not seen the ``signals.mary`` +signal code before in our above example, this name would be added and assigned +a unique number automatically. - ao.register_signal_callback(tc2_s1, signals.BB, trans_to_c2_s1) - ao.register_signal_callback(tc2_s1, signals.ENTRY_SIGNAL, handled) - ao.register_signal_callback(tc2_s1, signals.EXIT_SIGNAL, handled) - ao.register_signal_callback(tc2_s1, signals.INIT_SIGNAL, trans_to_c2_s2) +.. _recipes-posting-an-event-to-the-lifo: - ao.register_signal_callback(tc2_s2, signals.A, trans_to_c2_s3) - ao.register_signal_callback(tc2_s2, signals.EXIT_SIGNAL, handled) - ao.register_signal_callback(tc2_s2, signals.INIT_SIGNAL, handled) +Posting an Event to the LIFO +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ao.register_signal_callback(tc2_s3, signals.A, trans_to_c2_s2) - ao.register_signal_callback(tc2_s3, signals.ENTRY_SIGNAL, handled) +To post an event to the active object last-in-first-out (lifo) buffer, you +must have first started your statechart. Here is a simple example: +.. code-block:: python -.. _recipes-template-6: + ao = ActiveObject() + # start at 'outer' for the sake of our example + ao.start_at(outer) -Relate your states to one another by assigning them to parents: + # Now say we want to send an event with + # th the signal name of 'mary' to the chart + ao.post_lifo(Event(signal=signals.mary)) -.. code-block:: python +You would post to the 'lifo' buffer if you needed your event to be moved to the +front of the active object's collection of unprocessed events. You might want +to do this with a timing heart beat or for any event that needs to be processed +with a greater priority than other events. - ao.register_parent(tc2_s1, ao.top) - ao.register_parent(tc2_s2, tc2_s1) - ao.register_parent(tc2_s3, tc2_s1) -.. _recipes-template-7: +.. _recipes-creating-a-one-shot-event: +Creating a One-Shot Event +^^^^^^^^^^^^^^^^^^^^^^^^^ -Start up the active object in the desired state: +.. include:: i_create_a_one_shot.rst -.. code-block:: python +.. _recipes-creating-a-multishot-event: - ao.start_at(tc2_s2) +Creating a Multishot Event +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. include:: i_create_a_multishot.rst -:ref:`Then all of you usual state recipes apply`. +Cancelling a Specific Event Source +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The requests to the ``post_fifo`` and ``post_lifo`` methods, where ``times`` are +specified, can be thought of as event sources. This is because they create +background threads which track time and periodically post events to the active +object. -.. _recipes-template-8: +There are two different ways to cancel event sources. You can cancel a +specific event source, or you can cancel all event sources that create a +specific signal name (easier). Read the +:ref:`recipes-cancelling-event-source-by-signal-name` recipe to see how to do +this. -If you need to debug or unwind your templated state methods, reference -:ref:`this`. +To cancel a specific signal source, you need to track the thread id which was +created when it was made, then use that id to cancel the event. Since a state +method can be used by many different active objects, you don't want to store +this id on the method itself, or in its variable name space. Instead, you can +markup the name of the chart that is using the method, this ``chart`` object is +passed to the state method as the first argument. -.. _recipes-creating-a-state-method-from-a-factory: -Creating a Statechart From a Factory -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To have the library create your state methods for you: +.. code-block:: python -1. :ref:`Import the correct items from the miros library` -2. :ref:`Create the statechart's event callback methods` -3. :ref:`Create a factory object` -4. :ref:`Build up your statemethods using the factory object` -5. :ref:`Add the hierarchy information to your factory object` -6. :ref:`Start your statechart in the desired state` -7. :ref:`Debugging a state method made from a factory` + # Here define a middle state the creates a multi-shot event called + # three_pulse. The same three_pulse signal is captured + # by the middle state and used to transition into the inner state + # + # We want to cancel this specific event source when we are exiting this + # state + @spy_on + def middle(chart, e): + status = state.UNHANDLED + if(e.signal == signals.ENTRY_SIGNAL): + multi_shot_thread = \ + chart.post_fifo(Event(signal=signals.three_pulse), + times=3, + period=1.0, + deferred=True) + # We graffiti the provided chart object with this id + chart.augment(other=multi_shot_thread, + name='multi_shot_thread') + status = state.HANDLED -.. image:: _static/factory5.svg - :target: _static/factory5.pdf - :align: center + elif(e.signal == signals.EXIT_SIGNAL): + chart.cancel_event(chart.multi_shot_thread) -.. _recipes-factory-1: + # remove our graffiti + del(chart.multi_shot_thread) + status = state.HANDLED -Import the correct items from the miros library: + if(e.signal == signals.INIT_SIGNAL): + status = state.HANDLED + elif(e.signal == signals.three_pulse): + status = chart.trans(inner) + else: + status, chart.temp.fun = state.SUPER, outer + return status -.. code-block:: python +The ``augment`` api is used to graffiti our chart upon entering the state. +We write the event-source id onto the ``multi_shot_thread`` chart attribute, +so that we can use it later. By marking this specific ``chart`` object, the +middle state method handler can be shared by other active objects. - from miros import Factory - from miros import signals, Event, return_status +You would use this method of canceling an event source if you need the +three_pulse signal name elsewhere in your statechart. If you do not intend on +re-using this signal name you can just cancel event sources using a much +simpler api: the ``cancel_event``. -.. _recipes-factory-2: +.. _recipes-cancelling-event-source-by-signal-name: + +Cancelling Event Source By Signal Name +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +If you would like to re-use your event source signal names through your chart, +then you can use the :ref:`recipes-cancelling-a-specific-event-source` recipe +to cancel a specific source and leave your other event sources running. +Otherwise, you can use the simpler ``cancel_sources`` api provided by the +Active Object: + +.. code-block:: python + + # Here we define a middle state the creates a multi-shot event called + # three_pulse. The same three_pulse signal is captured + # by the middle state and used to transition into the inner state + # + # We want to cancel this specific event source when we are exiting this + # state + @spy_on + def middle(chart, e): + status = state.UNHANDLED + if(e.signal == signals.ENTRY_SIGNAL): + chart.post_fifo(Event(signal=signals.three_pulse), + times=3, + period=1.0, + deferred=True) + status = state.HANDLED + + elif(e.signal == signals.EXIT_SIGNAL): + # cancel all event sources with the signal named three_pulses + chart.cancel_events(Event(signal=signals.three_pulse)) + status = state.HANDLED + + if(e.signal == signals.INIT_SIGNAL): + status = state.HANDLED + elif(e.signal == signals.three_pulse): + status = chart.trans(inner) + else: + status, chart.temp.fun = state.SUPER, outer + return status + +There is no need to keep a thread id for the event source, since the Active +Object can just look at all of the event source threads and kill any of them +that have this signal name provided to the ``cancel_events`` call. + +.. _recipes-deferring-an-event: + +Deferring and Recalling an Event +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. include:: i_defer_and_recall.rst + +.. _recipes-adding-a-payload-to-an-event: + +Adding a Payload to an Event +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To add a payload to your event: + +.. code-block:: python + + e = Event(signal=signals.YOUR_SIGNAL_NAME, payload="My Payload") + +.. _recipes-determining-if-an-event-has-a-payload: + +Determining if an Event Has a Payload +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To determine if an event has a payload: + +.. code-block:: python + + e1 = Event(signal=signals.YOUR_SIGNAL_NAME, event="My Payload") + e2 = Event(signal=signals.YOUR_SIGNAL_NAME) + + assert(e1.has_payload() == True) + assert(e2.has_payload() == False) + + +.. _recipes-activeobjects-and-factories: + +Activeobjects and Factories +--------------------------- + +* :ref:`Augment your active object` +* :ref:`Create a statechart from a template` +* :ref:`Create a statechart from a Factory` +* :ref:`Subscribing to an event posted by another Activeobject and Factories` +* :ref:`Publishing events to other Activeobjects and Factories` +* :ref:`Create a statechart inside of a Class` +* :ref:`Getting information out of of your Statechart` +* :ref:`Working with Multiple statecharts` + +.. _recipes-markup-your-event-processor: + +Augment Your Activeobject +^^^^^^^^^^^^^^^^^^^^^^^^^^ +It is a bad idea to add variables to the state methods, instead augment your +active objects using the ``augment`` command. + +.. code-block:: python + + chart = ActiveObect() + chart.augment(other=0, name='counter') + assert(chart.counter == 0) + +An even better idea would be to include the attributes in a subclass of an +Activeobject or Factory. + + +.. _recipes-creating-a-state-method-from-a-template: + +Creating a Statechart From a Template +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To have the library create your state methods for you: + +1. :ref:`Import the correct items from the miros library` +2. :ref:`Create a set of states from the miros template.` +3. :ref:`Create callback functions which you will link into the chart` +4. :ref:`Create an active object, and link it to your state handler` +5. :ref:`Register callbacks to each of your events.` +6. :ref:`Relate your states to one another by assigning them parents` +7. :ref:`Start up the active object in the desired state` +8. :ref:`Debugging a templated state method` + + +.. image:: _static/factory2.svg + :target: _static/factory2.pdf + :align: center + +.. _recipes-template-1: + +Import the correct items from the miros library: + +.. code-block:: python + + from miros import state_method_template + from miros import ActiveObject + from miros import signals, Event, return_status + +.. _recipes-template-2: + +Create a set of states from the miros template: + +.. code-block:: python + + tc2_s1 = state_method_template('tc2_s1') + tc2_s2 = state_method_template('tc2_s2') + tc2_s3 = state_method_template('tc2_s3') + +.. _recipes-template-3: + +Create callback functions which you will link into your chart: + +.. code-block:: python + + def trans_to_c2_s1(chart, e): + return chart.trans(tc2_s1) + + def trans_to_c2_s3(chart, e): + return chart.trans(tc2_s3) + + def trans_to_c2_s2(chart, e): + return chart.trans(tc2_s2) + + def handled(chart, e): + return return_status.HANDLED + +.. _recipes-template-4: + +Create an active object and link it to your state handler: + +.. code-block:: python + + ao = ActiveObject() + +.. _recipes-template-5: + +Register callbacks to each of your events: + +.. code-block:: python + + ao.register_signal_callback(tc2_s1, signals.BB, trans_to_c2_s1) + ao.register_signal_callback(tc2_s1, signals.ENTRY_SIGNAL, handled) + ao.register_signal_callback(tc2_s1, signals.EXIT_SIGNAL, handled) + ao.register_signal_callback(tc2_s1, signals.INIT_SIGNAL, trans_to_c2_s2) + + ao.register_signal_callback(tc2_s2, signals.A, trans_to_c2_s3) + ao.register_signal_callback(tc2_s2, signals.EXIT_SIGNAL, handled) + ao.register_signal_callback(tc2_s2, signals.INIT_SIGNAL, handled) + + ao.register_signal_callback(tc2_s3, signals.A, trans_to_c2_s2) + ao.register_signal_callback(tc2_s3, signals.ENTRY_SIGNAL, handled) + + +.. _recipes-template-6: + +Relate your states to one another by assigning them to parents: + +.. code-block:: python + + ao.register_parent(tc2_s1, ao.top) + ao.register_parent(tc2_s2, tc2_s1) + ao.register_parent(tc2_s3, tc2_s1) + +.. _recipes-template-7: + + +Start up the active object in the desired state: + +.. code-block:: python + + ao.start_at(tc2_s2) + +:ref:`Then all of you usual state recipes apply`. + +.. _recipes-template-8: + +If you need to debug or unwind your templated state methods, reference +:ref:`this`. + +.. _recipes-creating-a-state-method-from-a-factory: + +Creating a Statechart From a Factory +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To have the library create your state methods for you: + +1. :ref:`Import the correct items from the miros library` +2. :ref:`Create the statechart's event callback methods` +3. :ref:`Create a factory object` +4. :ref:`Build up your statemethods using the factory object` +5. :ref:`Add the hierarchy information to your factory object` +6. :ref:`Start your statechart in the desired state` +7. :ref:`Debugging a state method made from a factory` + +.. image:: _static/factory5.svg + :target: _static/factory5.pdf + :align: center + +.. _recipes-factory-1: + +Import the correct items from the miros library: + +.. code-block:: python + + from miros import Factory + from miros import signals, Event, return_status + +.. _recipes-factory-2: Create the statechart's event callback methods: @@ -1028,7 +1329,7 @@ of programming this way: * it is not hard to network your federations with other federations across the internet (`systems of systems: miros-rabbitmq `_) -To program this way we use the Factory class from miros. +To program this way we use the :ref:`Factory ` class from miros. Here is a simple example of a statechart within an object: @@ -1479,306 +1780,23 @@ same class. UML really falls-over in describing object interactions. If you have any suggestions about how to draw this better, email me. -.. _recipes-events-and-signals: - -Events And Signals ------------------- +.. _recipes-getting-information-from-your-statecchart: -.. _recipes-creating-an-event: +Getting Information from your Statechart +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Creating an Event -^^^^^^^^^^^^^^^^^ -An event is something that will be passed into your statechart, it will be -reacted to, then removed from memory. +You will find yourself in situations where you would like to read information +that has asynchronously been gathered by your statechart from your main program. +This may happen if you have built a statechart to monitor an external device, or +to listen to pricing signals coming in from the internet, or to track the +weather... whatever your application, there will be times when you want the +synchronous part of your program, main, to get information from the +asynchronous part of your program, the statechart. -.. code-block:: python - - from miros import Event - from miros import signals - - event_1 = Event(signal="name_of_signal") - # or - event_2 = Event(signal=signals.name_of_signal) - -.. _recipes-creating-a-signal: - -Creating a Signal -^^^^^^^^^^^^^^^^^ -A signal is the name of an event. Many different events can have the same -name, or signal. When a signal is created, it is given a number which is one -higher than the oldest signal that was within your program. You shouldn't have -to worry about what a signal number is, they are only used to speed up the -event processor. (it is faster to compare two numbers than two strings) - -When you create a signal it will not be removed from memory until your program -finishes. They are created at the moment they are referenced, so you don't -have to explicitly define them. - -.. code-block:: python - :emphasize-lines: 6 - - from miros import Event - from miros import signals - - # signal named "name_of_signaL" invented - # here and given a unique number - event_1 = Event(signal="name_of_signal") - # the signal number of this event will have - # the same number as in line 6 - event_2 = Event(signal=signals.name_of_signal) - -Notice that the signal was invented on line **6** then re-used on line **9**. - -The signals are shared across your whole program. To see reflect upon your -signals read :ref:`this`. - - -.. _posting_events: - -Posting Events -^^^^^^^^^^^^^^ -The Active Object ``post_fifo``, ``post_lifo``, ``defer`` and ``recall`` -methods are use to feed events to the statechart. An Event can be thought of -as a kind of named marble that is placed onto a topological map. If a -particular elevation doesn't know what to do with the marble, it rolls the -marble to the next lower elevation, or state. If the lowest elevation is -reached and the program doesn't know what to do, it just ignores the event, or -lets the marble fall out of play. - -The name of the marble is the signal name. An event can have a payload, but it -doesn't have to. An event can only be posted to a chart after the chart has -started. Otherwise the behavior of the active object is undefined. - -The state methods typically react to the names of a event, or the signal names. -This means that the if-else structures that you write will use the signal names -in their logic. - -If you use the chart's post event methods within the chart, the chart will not -concern itself with *where* you initiated that event. It will post its events -into its queue as if they were provided by the outside world. In this way -these events are called *artificial*; instead of the world creating the event, -the chart does. There are a number of situations where it makes sense to do -this, they will be described in the patterns section. - -.. _recipes-posting-an-event-to-the-fifo: - -Posting an Event to the Fifo -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To post an event to the active object first-in-first-out (fifo) buffer, you -must have first started your statechart. Here is a simple example: - -.. code-block:: python - - ao = ActiveObject() - # start at 'outer' for the sake of our example - ao.start_at(outer) - - # Send an event with the signal name 'mary' - ao.post_fifo(Event(signal=signals.mary)) - -The signal names used by the events are common across the entire system. You -do not need to declare them. If the system had not seen the ``signals.mary`` -signal code before in our above example, this name would be added and assigned -a unique number automatically. - -.. _recipes-posting-an-event-to-the-lifo: - -Posting an Event to the LIFO -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To post an event to the active object last-in-first-out (lifo) buffer, you -must have first started your statechart. Here is a simple example: - -.. code-block:: python - - ao = ActiveObject() - # start at 'outer' for the sake of our example - ao.start_at(outer) - - # Now say we want to send an event with - # th the signal name of 'mary' to the chart - ao.post_lifo(Event(signal=signals.mary)) - -You would post to the 'lifo' buffer if you needed your event to be moved to the -front of the active object's collection of unprocessed events. You might want -to do this with a timing heart beat or for any event that needs to be processed -with a greater priority than other events. - - -.. _recipes-creating-a-one-shot-event: - -Creating a One-Shot Event -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. include:: i_create_a_one_shot.rst - -.. _recipes-creating-a-multishot-event: - -Creating a Multishot Event -^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. include:: i_create_a_multishot.rst - -Cancelling a Specific Event Source -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The requests to the ``post_fifo`` and ``post_lifo`` methods, where ``times`` are -specified, can be thought of as event sources. This is because they create -background threads which track time and periodically post events to the active -object. - -There are two different ways to cancel event sources. You can cancel a -specific event source, or you can cancel all event sources that create a -specific signal name (easier). Read the -:ref:`recipes-cancelling-event-source-by-signal-name` recipe to see how to do -this. - -To cancel a specific signal source, you need to track the thread id which was -created when it was made, then use that id to cancel the event. Since a state -method can be used by many different active objects, you don't want to store -this id on the method itself, or in its variable name space. Instead, you can -markup the name of the chart that is using the method, this ``chart`` object is -passed to the state method as the first argument. - - -.. code-block:: python - - # Here define a middle state the creates a multi-shot event called - # three_pulse. The same three_pulse signal is captured - # by the middle state and used to transition into the inner state - # - # We want to cancel this specific event source when we are exiting this - # state - @spy_on - def middle(chart, e): - status = state.UNHANDLED - if(e.signal == signals.ENTRY_SIGNAL): - multi_shot_thread = \ - chart.post_fifo(Event(signal=signals.three_pulse), - times=3, - period=1.0, - deferred=True) - # We graffiti the provided chart object with this id - chart.augment(other=multi_shot_thread, - name='multi_shot_thread') - status = state.HANDLED - - elif(e.signal == signals.EXIT_SIGNAL): - chart.cancel_event(chart.multi_shot_thread) - - # remove our graffiti - del(chart.multi_shot_thread) - status = state.HANDLED - - if(e.signal == signals.INIT_SIGNAL): - status = state.HANDLED - elif(e.signal == signals.three_pulse): - status = chart.trans(inner) - else: - status, chart.temp.fun = state.SUPER, outer - return status - -The ``augment`` api is used to graffiti our chart upon entering the state. -We write the event-source id onto the ``multi_shot_thread`` chart attribute, -so that we can use it later. By marking this specific ``chart`` object, the -middle state method handler can be shared by other active objects. - -You would use this method of canceling an event source if you need the -three_pulse signal name elsewhere in your statechart. If you do not intend on -re-using this signal name you can just cancel event sources using a much -simpler api: the ``cancel_event``. - -.. _recipes-cancelling-event-source-by-signal-name: - -Cancelling Event Source By Signal Name -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you would like to re-use your event source signal names through your chart, -then you can use the :ref:`recipes-cancelling-a-specific-event-source` recipe -to cancel a specific source and leave your other event sources running. -Otherwise, you can use the simpler ``cancel_sources`` api provided by the -Active Object: - -.. code-block:: python - - # Here we define a middle state the creates a multi-shot event called - # three_pulse. The same three_pulse signal is captured - # by the middle state and used to transition into the inner state - # - # We want to cancel this specific event source when we are exiting this - # state - @spy_on - def middle(chart, e): - status = state.UNHANDLED - if(e.signal == signals.ENTRY_SIGNAL): - chart.post_fifo(Event(signal=signals.three_pulse), - times=3, - period=1.0, - deferred=True) - status = state.HANDLED - - elif(e.signal == signals.EXIT_SIGNAL): - # cancel all event sources with the signal named three_pulses - chart.cancel_events(Event(signal=signals.three_pulse)) - status = state.HANDLED - - if(e.signal == signals.INIT_SIGNAL): - status = state.HANDLED - elif(e.signal == signals.three_pulse): - status = chart.trans(inner) - else: - status, chart.temp.fun = state.SUPER, outer - return status - -There is no need to keep a thread id for the event source, since the Active -Object can just look at all of the event source threads and kill any of them -that have this signal name provided to the ``cancel_events`` call. - -.. _recipes-deferring-an-event: - -Deferring and Recalling an Event -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. include:: i_defer_and_recall.rst - -.. _recipes-adding-a-payload-to-an-event: - -Adding a Payload to an Event -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To add a payload to your event: - -.. code-block:: python - - e = Event(signal=signals.YOUR_SIGNAL_NAME, payload="My Payload") - -.. _recipes-determining-if-an-event-has-a-payload: - -Determining if an Event Has a Payload -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To determine if an event has a payload: - -.. code-block:: python - - e1 = Event(signal=signals.YOUR_SIGNAL_NAME, event="My Payload") - e2 = Event(signal=signals.YOUR_SIGNAL_NAME) - - assert(e1.has_payload() == True) - assert(e2.has_payload() == False) - - -.. _recipes-getting-information-from-your-statecchart: - -Getting Information from your Statechart ----------------------------------------- -You will find yourself in situations where you would like to read information -that has asynchronously been gathered by your statechart from your main program. -This may happen if you have built a statechart to monitor an external device, or -to listen to pricing signals coming in from the internet, or to track the -weather... whatever your application, there will be times when you want the -synchronous part of your program, main, to get information from the -asynchronous part of your program, the statechart. - -But, your main program and your statechart run in different threads. If they share a -global variable, and one thread writes to it while the other thread reads from -the variable, or they both partially write to the same variable at the same -time, you have created an extremely pernicious bug called a 'race condition'. +But, your main program and your statechart run in different threads. If they share a +global variable, and one thread writes to it while the other thread reads from +the variable, or they both partially write to the same variable at the same +time, you have created an extremely pernicious bug called a 'race condition'. These kinds of bugs do not behave deterministicly, because the timing between your threads is managed by the OS in a layer of the system in which you have no @@ -1896,32 +1914,6 @@ Here is the code (asynchronous parts highlighted): # have the synchronous part of our program get information from the # asynchronous part of our program print(tracker.get_weather()) #=> sunny -.. _recipes-multiple-statecharts: - -Multiple Statecharts --------------------- -Break your design down into different interacting charts by using the -ActiveFabric. - -The active fabric is a set of background tasks which act together to dispatch -events between the active objects in your system. - -As a user of the software you wouldn't touch the active fabric directly, but -instead would use your active object's ``publish`` and ``subscribe`` methods. The -active fabric has two different priority queues and two different tasks which -pend upon them. One is for managing subscriptions in a first in first (fifo) -out manner, the other is for managing messages in a last in first out (lifo) -manner. By having two different queues and two different tasks an active -object is given the option to subscribe to another active object's published -events, using one of two different strategies: - -1. If it subscribes to an event using the ``fifo`` strategy, the active fabric - will post events to it using its :ref:`post_fifo` method. -2. If it subscribes in a ``lifo`` way it will post using the :ref:`post_lifo` method. - -You can also set the priority of the event while it is in transit within the -active fabric. This would only be useful if you are expecting contention -between various events being dispatched across your system. .. _recipes-subscribing-to-an-event-posted-by-another-active-object: @@ -1969,7 +1961,6 @@ call as saying, "I would like to subscribe to this type of event". Event(signal=signals.THING_SUBSCRIBING_AO_CARES_ABOUT), queue_type='fifo') - .. _recipes-publishing-event-to-other-active-objects: Publishing events to other Active Objects @@ -2026,6 +2017,32 @@ Here is how to publish an event with a specific priority: If two events have the same priority the queue will behave like a first in first out queue. +.. _recipes-multiple-statecharts: + +Multiple Statecharts +^^^^^^^^^^^^^^^^^^^^ +Break your design down into different interacting charts by using the +ActiveFabric. + +The active fabric is a set of background tasks which act together to dispatch +events between the active objects in your system. + +As a user of the software you wouldn't touch the active fabric directly, but +instead would use your active object's ``publish`` and ``subscribe`` methods. The +active fabric has two different priority queues and two different tasks which +pend upon them. One is for managing subscriptions in a first in first (fifo) +out manner, the other is for managing messages in a last in first out (lifo) +manner. By having two different queues and two different tasks an active +object is given the option to subscribe to another active object's published +events, using one of two different strategies: + +1. If it subscribes to an event using the ``fifo`` strategy, the active fabric + will post events to it using its :ref:`post_fifo` method. +2. If it subscribes in a ``lifo`` way it will post using the :ref:`post_lifo` method. + +You can also set the priority of the event while it is in transit within the +active fabric. This would only be useful if you are expecting contention +between various events being dispatched across your system. .. _recipes-seeing-what-is-: diff --git a/docs/_images/factory_in_class.svg b/docs/_images/factory_in_class.svg index 73ac433..635c2f4 100644 --- a/docs/_images/factory_in_class.svg +++ b/docs/_images/factory_in_class.svg @@ -1,7 +1,7 @@ -Factoryb1entry / chart.post_fifo(Event(signal=signals.hook_1))exit / chart.post_fifo(Event(signal=signals.hook_2))common_behaviorsentry / chart.subscribe(Event(signal=signals.OTHER_INNER_MOST))hook_1 / chart.worker1()hoot_2 / chart.worker2() ClassWithStatechartInItattribute1attribute2name b11entry / chart.post_fifo( Event(signal=signals.inner_most)) inner_most / chart.publish( Event(signal=signals.OTHER_INNER_MOST)) OTHER_INNER_MOST / {} a1entry / if random.randint(1, 5) <= 2: chart.post_fifo( Event(signal=signals.to_b1) )12resetworker1()worker2()to_b1OTHER_INNER_MOSTSynchronous Main Threadparts in blackAsynchronous Statechart Thread partsin blueif "__name__" == "__main__": chart1 = ClassWithStatechartInit('chart1', live_trace=True) chart2 = ClassWithStatechartInit('chart2', live_trace=True) chart3 = ClassWithStatechartInit('chart3', live_trace=True) time.sleep(3) ` * :ref:`Do something when the state is initialized` * :ref:`Do something when the state is exited` -* :ref:`Augment your active object` * :ref:`Create a hook` * :ref:`Catch and release` * :ref:`Create a one-shot` @@ -572,18 +571,6 @@ outside of of your state method's boundary. self.temp.fun = self.c return status -.. _recipes-markup-your-event-processor: - -Augment Your Active Object -^^^^^^^^^^^^^^^^^^^^^^^^^^^ -It is a bad idea to add variables to the state methods, instead augment your -active objects using the ``augment`` command. - -.. code-block:: python - - chart = ActiveObect() - chart.augment(other=0, name='counter') - assert(chart.counter == 0) .. _recipes-create-a-hook: @@ -746,7 +733,7 @@ Create a Multi-Shot .. _recipes-cancelling-events-state: -Cancelling Events +Canceling Events ^^^^^^^^^^^^^^^^^ To kill a cancel a specific event, see :ref:`this.` @@ -794,145 +781,459 @@ The highlighted code is the guard. To learn more about guards read the :ref:`hacking to learn example.` -.. _recipes-creating-a-state-method-from-a-template: - -Creating a Statechart From a Template -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To have the library create your state methods for you: - -1. :ref:`Import the correct items from the miros library` -2. :ref:`Create a set of states from the miros template.` -3. :ref:`Create callback functions which you will link into the chart` -4. :ref:`Create an active object, and link it to your state handler` -5. :ref:`Register callbacks to each of your events.` -6. :ref:`Relate your states to one another by assigning them parents` -7. :ref:`Start up the active object in the desired state` -8. :ref:`Debugging a templated state method` +.. _recipes-events-and-signals: +Events And Signals +------------------ +.. _recipes-creating-an-event: -.. image:: _static/factory2.svg - :target: _static/factory2.pdf - :align: center +Creating an Event +^^^^^^^^^^^^^^^^^ +An event is something that will be passed into your statechart, it will be +reacted to, then removed from memory. -.. _recipes-template-1: +.. code-block:: python -Import the correct items from the miros library: + from miros import Event + from miros import signals -.. code-block:: python + event_1 = Event(signal="name_of_signal") + # or + event_2 = Event(signal=signals.name_of_signal) - from miros import state_method_template - from miros import ActiveObject - from miros import signals, Event, return_status +.. _recipes-creating-a-signal: -.. _recipes-template-2: +Creating a Signal +^^^^^^^^^^^^^^^^^ +A signal is the name of an event. Many different events can have the same +name, or signal. When a signal is created, it is given a number which is one +higher than the oldest signal that was within your program. You shouldn't have +to worry about what a signal number is, they are only used to speed up the +event processor. (it is faster to compare two numbers than two strings) -Create a set of states from the miros template: +When you create a signal it will not be removed from memory until your program +finishes. They are created at the moment they are referenced, so you don't +have to explicitly define them. .. code-block:: python + :emphasize-lines: 6 - tc2_s1 = state_method_template('tc2_s1') - tc2_s2 = state_method_template('tc2_s2') - tc2_s3 = state_method_template('tc2_s3') + from miros import Event + from miros import signals + + # signal named "name_of_signaL" invented + # here and given a unique number + event_1 = Event(signal="name_of_signal") + # the signal number of this event will have + # the same number as in line 6 + event_2 = Event(signal=signals.name_of_signal) -.. _recipes-template-3: +Notice that the signal was invented on line **6** then re-used on line **9**. -Create callback functions which you will link into your chart: +The signals are shared across your whole program. To see reflect upon your +signals read :ref:`this`. -.. code-block:: python - def trans_to_c2_s1(chart, e): - return chart.trans(tc2_s1) +.. _posting_events: - def trans_to_c2_s3(chart, e): - return chart.trans(tc2_s3) +Posting Events +^^^^^^^^^^^^^^ +The Active Object ``post_fifo``, ``post_lifo``, ``defer`` and ``recall`` +methods are use to feed events to the statechart. An Event can be thought of +as a kind of named marble that is placed onto a topological map. If a +particular elevation doesn't know what to do with the marble, it rolls the +marble to the next lower elevation, or state. If the lowest elevation is +reached and the program doesn't know what to do, it just ignores the event, or +lets the marble fall out of play. - def trans_to_c2_s2(chart, e): - return chart.trans(tc2_s2) +The name of the marble is the signal name. An event can have a payload, but it +doesn't have to. An event can only be posted to a chart after the chart has +started. Otherwise the behavior of the active object is undefined. - def handled(chart, e): - return return_status.HANDLED +The state methods typically react to the names of a event, or the signal names. +This means that the if-else structures that you write will use the signal names +in their logic. -.. _recipes-template-4: +If you use the chart's post event methods within the chart, the chart will not +concern itself with *where* you initiated that event. It will post its events +into its queue as if they were provided by the outside world. In this way +these events are called *artificial*; instead of the world creating the event, +the chart does. There are a number of situations where it makes sense to do +this, they will be described in the patterns section. -Create an active object and link it to your state handler: +.. _recipes-posting-an-event-to-the-fifo: + +Posting an Event to the Fifo +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To post an event to the active object first-in-first-out (fifo) buffer, you +must have first started your statechart. Here is a simple example: .. code-block:: python ao = ActiveObject() + # start at 'outer' for the sake of our example + ao.start_at(outer) -.. _recipes-template-5: - -Register callbacks to each of your events: + # Send an event with the signal name 'mary' + ao.post_fifo(Event(signal=signals.mary)) -.. code-block:: python +The signal names used by the events are common across the entire system. You +do not need to declare them. If the system had not seen the ``signals.mary`` +signal code before in our above example, this name would be added and assigned +a unique number automatically. - ao.register_signal_callback(tc2_s1, signals.BB, trans_to_c2_s1) - ao.register_signal_callback(tc2_s1, signals.ENTRY_SIGNAL, handled) - ao.register_signal_callback(tc2_s1, signals.EXIT_SIGNAL, handled) - ao.register_signal_callback(tc2_s1, signals.INIT_SIGNAL, trans_to_c2_s2) +.. _recipes-posting-an-event-to-the-lifo: - ao.register_signal_callback(tc2_s2, signals.A, trans_to_c2_s3) - ao.register_signal_callback(tc2_s2, signals.EXIT_SIGNAL, handled) - ao.register_signal_callback(tc2_s2, signals.INIT_SIGNAL, handled) +Posting an Event to the LIFO +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ao.register_signal_callback(tc2_s3, signals.A, trans_to_c2_s2) - ao.register_signal_callback(tc2_s3, signals.ENTRY_SIGNAL, handled) +To post an event to the active object last-in-first-out (lifo) buffer, you +must have first started your statechart. Here is a simple example: +.. code-block:: python -.. _recipes-template-6: + ao = ActiveObject() + # start at 'outer' for the sake of our example + ao.start_at(outer) -Relate your states to one another by assigning them to parents: + # Now say we want to send an event with + # th the signal name of 'mary' to the chart + ao.post_lifo(Event(signal=signals.mary)) -.. code-block:: python +You would post to the 'lifo' buffer if you needed your event to be moved to the +front of the active object's collection of unprocessed events. You might want +to do this with a timing heart beat or for any event that needs to be processed +with a greater priority than other events. - ao.register_parent(tc2_s1, ao.top) - ao.register_parent(tc2_s2, tc2_s1) - ao.register_parent(tc2_s3, tc2_s1) -.. _recipes-template-7: +.. _recipes-creating-a-one-shot-event: +Creating a One-Shot Event +^^^^^^^^^^^^^^^^^^^^^^^^^ -Start up the active object in the desired state: +.. include:: i_create_a_one_shot.rst -.. code-block:: python +.. _recipes-creating-a-multishot-event: - ao.start_at(tc2_s2) +Creating a Multishot Event +^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. include:: i_create_a_multishot.rst -:ref:`Then all of you usual state recipes apply`. +Cancelling a Specific Event Source +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The requests to the ``post_fifo`` and ``post_lifo`` methods, where ``times`` are +specified, can be thought of as event sources. This is because they create +background threads which track time and periodically post events to the active +object. -.. _recipes-template-8: +There are two different ways to cancel event sources. You can cancel a +specific event source, or you can cancel all event sources that create a +specific signal name (easier). Read the +:ref:`recipes-cancelling-event-source-by-signal-name` recipe to see how to do +this. -If you need to debug or unwind your templated state methods, reference -:ref:`this`. +To cancel a specific signal source, you need to track the thread id which was +created when it was made, then use that id to cancel the event. Since a state +method can be used by many different active objects, you don't want to store +this id on the method itself, or in its variable name space. Instead, you can +markup the name of the chart that is using the method, this ``chart`` object is +passed to the state method as the first argument. -.. _recipes-creating-a-state-method-from-a-factory: -Creating a Statechart From a Factory -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To have the library create your state methods for you: +.. code-block:: python -1. :ref:`Import the correct items from the miros library` -2. :ref:`Create the statechart's event callback methods` -3. :ref:`Create a factory object` -4. :ref:`Build up your statemethods using the factory object` -5. :ref:`Add the hierarchy information to your factory object` -6. :ref:`Start your statechart in the desired state` -7. :ref:`Debugging a state method made from a factory` + # Here define a middle state the creates a multi-shot event called + # three_pulse. The same three_pulse signal is captured + # by the middle state and used to transition into the inner state + # + # We want to cancel this specific event source when we are exiting this + # state + @spy_on + def middle(chart, e): + status = state.UNHANDLED + if(e.signal == signals.ENTRY_SIGNAL): + multi_shot_thread = \ + chart.post_fifo(Event(signal=signals.three_pulse), + times=3, + period=1.0, + deferred=True) + # We graffiti the provided chart object with this id + chart.augment(other=multi_shot_thread, + name='multi_shot_thread') + status = state.HANDLED -.. image:: _static/factory5.svg - :target: _static/factory5.pdf - :align: center + elif(e.signal == signals.EXIT_SIGNAL): + chart.cancel_event(chart.multi_shot_thread) -.. _recipes-factory-1: + # remove our graffiti + del(chart.multi_shot_thread) + status = state.HANDLED -Import the correct items from the miros library: + if(e.signal == signals.INIT_SIGNAL): + status = state.HANDLED + elif(e.signal == signals.three_pulse): + status = chart.trans(inner) + else: + status, chart.temp.fun = state.SUPER, outer + return status -.. code-block:: python +The ``augment`` api is used to graffiti our chart upon entering the state. +We write the event-source id onto the ``multi_shot_thread`` chart attribute, +so that we can use it later. By marking this specific ``chart`` object, the +middle state method handler can be shared by other active objects. - from miros import Factory - from miros import signals, Event, return_status +You would use this method of canceling an event source if you need the +three_pulse signal name elsewhere in your statechart. If you do not intend on +re-using this signal name you can just cancel event sources using a much +simpler api: the ``cancel_event``. -.. _recipes-factory-2: +.. _recipes-cancelling-event-source-by-signal-name: + +Cancelling Event Source By Signal Name +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +If you would like to re-use your event source signal names through your chart, +then you can use the :ref:`recipes-cancelling-a-specific-event-source` recipe +to cancel a specific source and leave your other event sources running. +Otherwise, you can use the simpler ``cancel_sources`` api provided by the +Active Object: + +.. code-block:: python + + # Here we define a middle state the creates a multi-shot event called + # three_pulse. The same three_pulse signal is captured + # by the middle state and used to transition into the inner state + # + # We want to cancel this specific event source when we are exiting this + # state + @spy_on + def middle(chart, e): + status = state.UNHANDLED + if(e.signal == signals.ENTRY_SIGNAL): + chart.post_fifo(Event(signal=signals.three_pulse), + times=3, + period=1.0, + deferred=True) + status = state.HANDLED + + elif(e.signal == signals.EXIT_SIGNAL): + # cancel all event sources with the signal named three_pulses + chart.cancel_events(Event(signal=signals.three_pulse)) + status = state.HANDLED + + if(e.signal == signals.INIT_SIGNAL): + status = state.HANDLED + elif(e.signal == signals.three_pulse): + status = chart.trans(inner) + else: + status, chart.temp.fun = state.SUPER, outer + return status + +There is no need to keep a thread id for the event source, since the Active +Object can just look at all of the event source threads and kill any of them +that have this signal name provided to the ``cancel_events`` call. + +.. _recipes-deferring-an-event: + +Deferring and Recalling an Event +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. include:: i_defer_and_recall.rst + +.. _recipes-adding-a-payload-to-an-event: + +Adding a Payload to an Event +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To add a payload to your event: + +.. code-block:: python + + e = Event(signal=signals.YOUR_SIGNAL_NAME, payload="My Payload") + +.. _recipes-determining-if-an-event-has-a-payload: + +Determining if an Event Has a Payload +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To determine if an event has a payload: + +.. code-block:: python + + e1 = Event(signal=signals.YOUR_SIGNAL_NAME, event="My Payload") + e2 = Event(signal=signals.YOUR_SIGNAL_NAME) + + assert(e1.has_payload() == True) + assert(e2.has_payload() == False) + + +.. _recipes-activeobjects-and-factories: + +Activeobjects and Factories +--------------------------- + +* :ref:`Augment your active object` +* :ref:`Create a statechart from a template` +* :ref:`Create a statechart from a Factory` +* :ref:`Subscribing to an event posted by another Activeobject and Factories` +* :ref:`Publishing events to other Activeobjects and Factories` +* :ref:`Create a statechart inside of a Class` +* :ref:`Getting information out of of your Statechart` +* :ref:`Working with Multiple statecharts` + +.. _recipes-markup-your-event-processor: + +Augment Your Activeobject +^^^^^^^^^^^^^^^^^^^^^^^^^^ +It is a bad idea to add variables to the state methods, instead augment your +active objects using the ``augment`` command. + +.. code-block:: python + + chart = ActiveObect() + chart.augment(other=0, name='counter') + assert(chart.counter == 0) + +An even better idea would be to include the attributes in a subclass of an +Activeobject or Factory. + + +.. _recipes-creating-a-state-method-from-a-template: + +Creating a Statechart From a Template +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To have the library create your state methods for you: + +1. :ref:`Import the correct items from the miros library` +2. :ref:`Create a set of states from the miros template.` +3. :ref:`Create callback functions which you will link into the chart` +4. :ref:`Create an active object, and link it to your state handler` +5. :ref:`Register callbacks to each of your events.` +6. :ref:`Relate your states to one another by assigning them parents` +7. :ref:`Start up the active object in the desired state` +8. :ref:`Debugging a templated state method` + + +.. image:: _static/factory2.svg + :target: _static/factory2.pdf + :align: center + +.. _recipes-template-1: + +Import the correct items from the miros library: + +.. code-block:: python + + from miros import state_method_template + from miros import ActiveObject + from miros import signals, Event, return_status + +.. _recipes-template-2: + +Create a set of states from the miros template: + +.. code-block:: python + + tc2_s1 = state_method_template('tc2_s1') + tc2_s2 = state_method_template('tc2_s2') + tc2_s3 = state_method_template('tc2_s3') + +.. _recipes-template-3: + +Create callback functions which you will link into your chart: + +.. code-block:: python + + def trans_to_c2_s1(chart, e): + return chart.trans(tc2_s1) + + def trans_to_c2_s3(chart, e): + return chart.trans(tc2_s3) + + def trans_to_c2_s2(chart, e): + return chart.trans(tc2_s2) + + def handled(chart, e): + return return_status.HANDLED + +.. _recipes-template-4: + +Create an active object and link it to your state handler: + +.. code-block:: python + + ao = ActiveObject() + +.. _recipes-template-5: + +Register callbacks to each of your events: + +.. code-block:: python + + ao.register_signal_callback(tc2_s1, signals.BB, trans_to_c2_s1) + ao.register_signal_callback(tc2_s1, signals.ENTRY_SIGNAL, handled) + ao.register_signal_callback(tc2_s1, signals.EXIT_SIGNAL, handled) + ao.register_signal_callback(tc2_s1, signals.INIT_SIGNAL, trans_to_c2_s2) + + ao.register_signal_callback(tc2_s2, signals.A, trans_to_c2_s3) + ao.register_signal_callback(tc2_s2, signals.EXIT_SIGNAL, handled) + ao.register_signal_callback(tc2_s2, signals.INIT_SIGNAL, handled) + + ao.register_signal_callback(tc2_s3, signals.A, trans_to_c2_s2) + ao.register_signal_callback(tc2_s3, signals.ENTRY_SIGNAL, handled) + + +.. _recipes-template-6: + +Relate your states to one another by assigning them to parents: + +.. code-block:: python + + ao.register_parent(tc2_s1, ao.top) + ao.register_parent(tc2_s2, tc2_s1) + ao.register_parent(tc2_s3, tc2_s1) + +.. _recipes-template-7: + + +Start up the active object in the desired state: + +.. code-block:: python + + ao.start_at(tc2_s2) + +:ref:`Then all of you usual state recipes apply`. + +.. _recipes-template-8: + +If you need to debug or unwind your templated state methods, reference +:ref:`this`. + +.. _recipes-creating-a-state-method-from-a-factory: + +Creating a Statechart From a Factory +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To have the library create your state methods for you: + +1. :ref:`Import the correct items from the miros library` +2. :ref:`Create the statechart's event callback methods` +3. :ref:`Create a factory object` +4. :ref:`Build up your statemethods using the factory object` +5. :ref:`Add the hierarchy information to your factory object` +6. :ref:`Start your statechart in the desired state` +7. :ref:`Debugging a state method made from a factory` + +.. image:: _static/factory5.svg + :target: _static/factory5.pdf + :align: center + +.. _recipes-factory-1: + +Import the correct items from the miros library: + +.. code-block:: python + + from miros import Factory + from miros import signals, Event, return_status + +.. _recipes-factory-2: Create the statechart's event callback methods: @@ -1028,7 +1329,7 @@ of programming this way: * it is not hard to network your federations with other federations across the internet (`systems of systems: miros-rabbitmq `_) -To program this way we use the Factory class from miros. +To program this way we use the :ref:`Factory ` class from miros. Here is a simple example of a statechart within an object: @@ -1479,306 +1780,23 @@ same class. UML really falls-over in describing object interactions. If you have any suggestions about how to draw this better, email me. -.. _recipes-events-and-signals: - -Events And Signals ------------------- +.. _recipes-getting-information-from-your-statecchart: -.. _recipes-creating-an-event: +Getting Information from your Statechart +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Creating an Event -^^^^^^^^^^^^^^^^^ -An event is something that will be passed into your statechart, it will be -reacted to, then removed from memory. +You will find yourself in situations where you would like to read information +that has asynchronously been gathered by your statechart from your main program. +This may happen if you have built a statechart to monitor an external device, or +to listen to pricing signals coming in from the internet, or to track the +weather... whatever your application, there will be times when you want the +synchronous part of your program, main, to get information from the +asynchronous part of your program, the statechart. -.. code-block:: python - - from miros import Event - from miros import signals - - event_1 = Event(signal="name_of_signal") - # or - event_2 = Event(signal=signals.name_of_signal) - -.. _recipes-creating-a-signal: - -Creating a Signal -^^^^^^^^^^^^^^^^^ -A signal is the name of an event. Many different events can have the same -name, or signal. When a signal is created, it is given a number which is one -higher than the oldest signal that was within your program. You shouldn't have -to worry about what a signal number is, they are only used to speed up the -event processor. (it is faster to compare two numbers than two strings) - -When you create a signal it will not be removed from memory until your program -finishes. They are created at the moment they are referenced, so you don't -have to explicitly define them. - -.. code-block:: python - :emphasize-lines: 6 - - from miros import Event - from miros import signals - - # signal named "name_of_signaL" invented - # here and given a unique number - event_1 = Event(signal="name_of_signal") - # the signal number of this event will have - # the same number as in line 6 - event_2 = Event(signal=signals.name_of_signal) - -Notice that the signal was invented on line **6** then re-used on line **9**. - -The signals are shared across your whole program. To see reflect upon your -signals read :ref:`this`. - - -.. _posting_events: - -Posting Events -^^^^^^^^^^^^^^ -The Active Object ``post_fifo``, ``post_lifo``, ``defer`` and ``recall`` -methods are use to feed events to the statechart. An Event can be thought of -as a kind of named marble that is placed onto a topological map. If a -particular elevation doesn't know what to do with the marble, it rolls the -marble to the next lower elevation, or state. If the lowest elevation is -reached and the program doesn't know what to do, it just ignores the event, or -lets the marble fall out of play. - -The name of the marble is the signal name. An event can have a payload, but it -doesn't have to. An event can only be posted to a chart after the chart has -started. Otherwise the behavior of the active object is undefined. - -The state methods typically react to the names of a event, or the signal names. -This means that the if-else structures that you write will use the signal names -in their logic. - -If you use the chart's post event methods within the chart, the chart will not -concern itself with *where* you initiated that event. It will post its events -into its queue as if they were provided by the outside world. In this way -these events are called *artificial*; instead of the world creating the event, -the chart does. There are a number of situations where it makes sense to do -this, they will be described in the patterns section. - -.. _recipes-posting-an-event-to-the-fifo: - -Posting an Event to the Fifo -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To post an event to the active object first-in-first-out (fifo) buffer, you -must have first started your statechart. Here is a simple example: - -.. code-block:: python - - ao = ActiveObject() - # start at 'outer' for the sake of our example - ao.start_at(outer) - - # Send an event with the signal name 'mary' - ao.post_fifo(Event(signal=signals.mary)) - -The signal names used by the events are common across the entire system. You -do not need to declare them. If the system had not seen the ``signals.mary`` -signal code before in our above example, this name would be added and assigned -a unique number automatically. - -.. _recipes-posting-an-event-to-the-lifo: - -Posting an Event to the LIFO -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -To post an event to the active object last-in-first-out (lifo) buffer, you -must have first started your statechart. Here is a simple example: - -.. code-block:: python - - ao = ActiveObject() - # start at 'outer' for the sake of our example - ao.start_at(outer) - - # Now say we want to send an event with - # th the signal name of 'mary' to the chart - ao.post_lifo(Event(signal=signals.mary)) - -You would post to the 'lifo' buffer if you needed your event to be moved to the -front of the active object's collection of unprocessed events. You might want -to do this with a timing heart beat or for any event that needs to be processed -with a greater priority than other events. - - -.. _recipes-creating-a-one-shot-event: - -Creating a One-Shot Event -^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. include:: i_create_a_one_shot.rst - -.. _recipes-creating-a-multishot-event: - -Creating a Multishot Event -^^^^^^^^^^^^^^^^^^^^^^^^^^ -.. include:: i_create_a_multishot.rst - -Cancelling a Specific Event Source -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -The requests to the ``post_fifo`` and ``post_lifo`` methods, where ``times`` are -specified, can be thought of as event sources. This is because they create -background threads which track time and periodically post events to the active -object. - -There are two different ways to cancel event sources. You can cancel a -specific event source, or you can cancel all event sources that create a -specific signal name (easier). Read the -:ref:`recipes-cancelling-event-source-by-signal-name` recipe to see how to do -this. - -To cancel a specific signal source, you need to track the thread id which was -created when it was made, then use that id to cancel the event. Since a state -method can be used by many different active objects, you don't want to store -this id on the method itself, or in its variable name space. Instead, you can -markup the name of the chart that is using the method, this ``chart`` object is -passed to the state method as the first argument. - - -.. code-block:: python - - # Here define a middle state the creates a multi-shot event called - # three_pulse. The same three_pulse signal is captured - # by the middle state and used to transition into the inner state - # - # We want to cancel this specific event source when we are exiting this - # state - @spy_on - def middle(chart, e): - status = state.UNHANDLED - if(e.signal == signals.ENTRY_SIGNAL): - multi_shot_thread = \ - chart.post_fifo(Event(signal=signals.three_pulse), - times=3, - period=1.0, - deferred=True) - # We graffiti the provided chart object with this id - chart.augment(other=multi_shot_thread, - name='multi_shot_thread') - status = state.HANDLED - - elif(e.signal == signals.EXIT_SIGNAL): - chart.cancel_event(chart.multi_shot_thread) - - # remove our graffiti - del(chart.multi_shot_thread) - status = state.HANDLED - - if(e.signal == signals.INIT_SIGNAL): - status = state.HANDLED - elif(e.signal == signals.three_pulse): - status = chart.trans(inner) - else: - status, chart.temp.fun = state.SUPER, outer - return status - -The ``augment`` api is used to graffiti our chart upon entering the state. -We write the event-source id onto the ``multi_shot_thread`` chart attribute, -so that we can use it later. By marking this specific ``chart`` object, the -middle state method handler can be shared by other active objects. - -You would use this method of canceling an event source if you need the -three_pulse signal name elsewhere in your statechart. If you do not intend on -re-using this signal name you can just cancel event sources using a much -simpler api: the ``cancel_event``. - -.. _recipes-cancelling-event-source-by-signal-name: - -Cancelling Event Source By Signal Name -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you would like to re-use your event source signal names through your chart, -then you can use the :ref:`recipes-cancelling-a-specific-event-source` recipe -to cancel a specific source and leave your other event sources running. -Otherwise, you can use the simpler ``cancel_sources`` api provided by the -Active Object: - -.. code-block:: python - - # Here we define a middle state the creates a multi-shot event called - # three_pulse. The same three_pulse signal is captured - # by the middle state and used to transition into the inner state - # - # We want to cancel this specific event source when we are exiting this - # state - @spy_on - def middle(chart, e): - status = state.UNHANDLED - if(e.signal == signals.ENTRY_SIGNAL): - chart.post_fifo(Event(signal=signals.three_pulse), - times=3, - period=1.0, - deferred=True) - status = state.HANDLED - - elif(e.signal == signals.EXIT_SIGNAL): - # cancel all event sources with the signal named three_pulses - chart.cancel_events(Event(signal=signals.three_pulse)) - status = state.HANDLED - - if(e.signal == signals.INIT_SIGNAL): - status = state.HANDLED - elif(e.signal == signals.three_pulse): - status = chart.trans(inner) - else: - status, chart.temp.fun = state.SUPER, outer - return status - -There is no need to keep a thread id for the event source, since the Active -Object can just look at all of the event source threads and kill any of them -that have this signal name provided to the ``cancel_events`` call. - -.. _recipes-deferring-an-event: - -Deferring and Recalling an Event -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -.. include:: i_defer_and_recall.rst - -.. _recipes-adding-a-payload-to-an-event: - -Adding a Payload to an Event -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To add a payload to your event: - -.. code-block:: python - - e = Event(signal=signals.YOUR_SIGNAL_NAME, payload="My Payload") - -.. _recipes-determining-if-an-event-has-a-payload: - -Determining if an Event Has a Payload -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -To determine if an event has a payload: - -.. code-block:: python - - e1 = Event(signal=signals.YOUR_SIGNAL_NAME, event="My Payload") - e2 = Event(signal=signals.YOUR_SIGNAL_NAME) - - assert(e1.has_payload() == True) - assert(e2.has_payload() == False) - - -.. _recipes-getting-information-from-your-statecchart: - -Getting Information from your Statechart ----------------------------------------- -You will find yourself in situations where you would like to read information -that has asynchronously been gathered by your statechart from your main program. -This may happen if you have built a statechart to monitor an external device, or -to listen to pricing signals coming in from the internet, or to track the -weather... whatever your application, there will be times when you want the -synchronous part of your program, main, to get information from the -asynchronous part of your program, the statechart. - -But, your main program and your statechart run in different threads. If they share a -global variable, and one thread writes to it while the other thread reads from -the variable, or they both partially write to the same variable at the same -time, you have created an extremely pernicious bug called a 'race condition'. +But, your main program and your statechart run in different threads. If they share a +global variable, and one thread writes to it while the other thread reads from +the variable, or they both partially write to the same variable at the same +time, you have created an extremely pernicious bug called a 'race condition'. These kinds of bugs do not behave deterministicly, because the timing between your threads is managed by the OS in a layer of the system in which you have no @@ -1896,32 +1914,6 @@ Here is the code (asynchronous parts highlighted): # have the synchronous part of our program get information from the # asynchronous part of our program print(tracker.get_weather()) #=> sunny -.. _recipes-multiple-statecharts: - -Multiple Statecharts --------------------- -Break your design down into different interacting charts by using the -ActiveFabric. - -The active fabric is a set of background tasks which act together to dispatch -events between the active objects in your system. - -As a user of the software you wouldn't touch the active fabric directly, but -instead would use your active object's ``publish`` and ``subscribe`` methods. The -active fabric has two different priority queues and two different tasks which -pend upon them. One is for managing subscriptions in a first in first (fifo) -out manner, the other is for managing messages in a last in first out (lifo) -manner. By having two different queues and two different tasks an active -object is given the option to subscribe to another active object's published -events, using one of two different strategies: - -1. If it subscribes to an event using the ``fifo`` strategy, the active fabric - will post events to it using its :ref:`post_fifo` method. -2. If it subscribes in a ``lifo`` way it will post using the :ref:`post_lifo` method. - -You can also set the priority of the event while it is in transit within the -active fabric. This would only be useful if you are expecting contention -between various events being dispatched across your system. .. _recipes-subscribing-to-an-event-posted-by-another-active-object: @@ -1969,7 +1961,6 @@ call as saying, "I would like to subscribe to this type of event". Event(signal=signals.THING_SUBSCRIBING_AO_CARES_ABOUT), queue_type='fifo') - .. _recipes-publishing-event-to-other-active-objects: Publishing events to other Active Objects @@ -2026,6 +2017,32 @@ Here is how to publish an event with a specific priority: If two events have the same priority the queue will behave like a first in first out queue. +.. _recipes-multiple-statecharts: + +Multiple Statecharts +^^^^^^^^^^^^^^^^^^^^ +Break your design down into different interacting charts by using the +ActiveFabric. + +The active fabric is a set of background tasks which act together to dispatch +events between the active objects in your system. + +As a user of the software you wouldn't touch the active fabric directly, but +instead would use your active object's ``publish`` and ``subscribe`` methods. The +active fabric has two different priority queues and two different tasks which +pend upon them. One is for managing subscriptions in a first in first (fifo) +out manner, the other is for managing messages in a last in first out (lifo) +manner. By having two different queues and two different tasks an active +object is given the option to subscribe to another active object's published +events, using one of two different strategies: + +1. If it subscribes to an event using the ``fifo`` strategy, the active fabric + will post events to it using its :ref:`post_fifo` method. +2. If it subscribes in a ``lifo`` way it will post using the :ref:`post_lifo` method. + +You can also set the priority of the event while it is in transit within the +active fabric. This would only be useful if you are expecting contention +between various events being dispatched across your system. .. _recipes-seeing-what-is-: diff --git a/docs/_static/factory_in_class.pdf b/docs/_static/factory_in_class.pdf index 26b91f0..2b874ea 100644 Binary files a/docs/_static/factory_in_class.pdf and b/docs/_static/factory_in_class.pdf differ diff --git a/docs/_static/factory_in_class.svg b/docs/_static/factory_in_class.svg index 73ac433..635c2f4 100644 --- a/docs/_static/factory_in_class.svg +++ b/docs/_static/factory_in_class.svg @@ -1,7 +1,7 @@ -Factoryb1entry / chart.post_fifo(Event(signal=signals.hook_1))exit / chart.post_fifo(Event(signal=signals.hook_2))common_behaviorsentry / chart.subscribe(Event(signal=signals.OTHER_INNER_MOST))hook_1 / chart.worker1()hoot_2 / chart.worker2() ClassWithStatechartInItattribute1attribute2name b11entry / chart.post_fifo( Event(signal=signals.inner_most)) inner_most / chart.publish( Event(signal=signals.OTHER_INNER_MOST)) OTHER_INNER_MOST / {} a1entry / if random.randint(1, 5) <= 2: chart.post_fifo( Event(signal=signals.to_b1) )12resetworker1()worker2()to_b1OTHER_INNER_MOSTSynchronous Main Threadparts in blackAsynchronous Statechart Thread partsin blueif "__name__" == "__main__": chart1 = ClassWithStatechartInit('chart1', live_trace=True) chart2 = ClassWithStatechartInit('chart2', live_trace=True) chart3 = ClassWithStatechartInit('chart3', live_trace=True) time.sleep(3) 10.0;10.0;10.0;30.0;210.0;30.0;210.0;10.0 + + Relation + + 1134 + 216 + 81 + 72 + + lt=<<<<- + 10.0;10.0;70.0;10.0;70.0;60.0;10.0;60.0 + + + Text + + 1143 + 252 + 27 + 27 + + 2 +style=wordwrap +layer=3 + + + + Text + + 1143 + 198 + 27 + 27 + + 1 +style=wordwrap +layer=3 + + diff --git a/docs/objects.inv b/docs/objects.inv index 3d07476..95b8f5a 100644 Binary files a/docs/objects.inv and b/docs/objects.inv differ diff --git a/docs/recipes.html b/docs/recipes.html index 4b5f6f1..fdaec56 100644 --- a/docs/recipes.html +++ b/docs/recipes.html @@ -89,7 +89,6 @@
  • Do something when the state is entered
  • Do something when the state is initialized
  • Do something when the state is exited
  • -
  • Augment your active object
  • Create a hook
  • Catch and release
  • Create a one-shot
  • @@ -526,16 +525,6 @@ -
    -

    Augment Your Active Object¶

    -

    It is a bad idea to add variables to the state methods, instead augment your -active objects using the augment command.

    -
    chart = ActiveObect()
    -chart.augment(other=0, name='counter')
    -assert(chart.counter == 0)
    -
    -
    -

    Create a Hook¶

    A hook is some application code that is shared between your state method and @@ -761,8 +750,8 @@ when you would need your heart beat event signal to barge ahead of all other events waiting to be processed by the active object.

    -
    -

    Cancelling Events¶

    +
    +

    Canceling Events¶

    To kill a cancel a specific event, see this.

    To kill all events sharing a signal name, see this.

    @@ -809,144 +798,512 @@

    To learn more about guards read the hacking to learn example.

    -
    -

    Creating a Statechart From a Template¶

    -

    To have the library create your state methods for you:

    -
      -
    1. Import the correct items from the miros library
    2. -
    3. Create a set of states from the miros template.
    4. -
    5. Create callback functions which you will link into the chart
    6. -
    7. Create an active object, and link it to your state handler
    8. -
    9. Register callbacks to each of your events.
    10. -
    11. Relate your states to one another by assigning them parents
    12. -
    13. Start up the active object in the desired state
    14. -
    15. Debugging a templated state method
    16. -
    -
    _images/factory2.svg
    -
    -

    Import the correct items from the miros library:

    -
    from miros import state_method_template
    -from miros import ActiveObject
    -from miros import signals, Event, return_status
    -
    -
    -

    Create a set of states from the miros template:

    -
    tc2_s1 = state_method_template('tc2_s1')
    -tc2_s2 = state_method_template('tc2_s2')
    -tc2_s3 = state_method_template('tc2_s3')
    -
    -

    Create callback functions which you will link into your chart:

    -
    def trans_to_c2_s1(chart, e):
    -  return chart.trans(tc2_s1)
    -
    -def trans_to_c2_s3(chart, e):
    -  return chart.trans(tc2_s3)
    -
    -def trans_to_c2_s2(chart, e):
    -  return chart.trans(tc2_s2)
    +
    +

    Events And Signals¶

    +
    +

    Creating an Event¶

    +

    An event is something that will be passed into your statechart, it will be +reacted to, then removed from memory.

    +
    from miros import Event
    +from miros import signals
     
    -def handled(chart, e):
    -  return return_status.HANDLED
    +event_1 = Event(signal="name_of_signal")
    +# or
    +event_2 = Event(signal=signals.name_of_signal)
     
    -

    Create an active object and link it to your state handler:

    -
    ao = ActiveObject()
    -
    -

    Register callbacks to each of your events:

    -
    ao.register_signal_callback(tc2_s1, signals.BB, trans_to_c2_s1)
    -ao.register_signal_callback(tc2_s1, signals.ENTRY_SIGNAL, handled)
    -ao.register_signal_callback(tc2_s1, signals.EXIT_SIGNAL,  handled)
    -ao.register_signal_callback(tc2_s1, signals.INIT_SIGNAL,  trans_to_c2_s2)
    -
    -ao.register_signal_callback(tc2_s2, signals.A, trans_to_c2_s3)
    -ao.register_signal_callback(tc2_s2, signals.EXIT_SIGNAL,  handled)
    -ao.register_signal_callback(tc2_s2, signals.INIT_SIGNAL,  handled)
    +
    +

    Creating a Signal¶

    +

    A signal is the name of an event. Many different events can have the same +name, or signal. When a signal is created, it is given a number which is one +higher than the oldest signal that was within your program. You shouldn’t have +to worry about what a signal number is, they are only used to speed up the +event processor. (it is faster to compare two numbers than two strings)

    +

    When you create a signal it will not be removed from memory until your program +finishes. They are created at the moment they are referenced, so you don’t +have to explicitly define them.

    +
    from miros import Event
    +from miros import signals
     
    -ao.register_signal_callback(tc2_s3, signals.A, trans_to_c2_s2)
    -ao.register_signal_callback(tc2_s3, signals.ENTRY_SIGNAL, handled)
    -
    -
    -

    Relate your states to one another by assigning them to parents:

    -
    ao.register_parent(tc2_s1, ao.top)
    -ao.register_parent(tc2_s2, tc2_s1)
    -ao.register_parent(tc2_s3, tc2_s1)
    +# signal named "name_of_signaL" invented
    +# here and given a unique number
    +event_1 = Event(signal="name_of_signal")
    +# the signal number of this event will have
    +# the same number as in line 6
    +event_2 = Event(signal=signals.name_of_signal)
     
    -

    Start up the active object in the desired state:

    -
    ao.start_at(tc2_s2)
    -
    +

    Notice that the signal was invented on line 6 then re-used on line 9.

    +

    The signals are shared across your whole program. To see reflect upon your +signals read this.

    -

    Then all of you usual state recipes apply.

    -

    If you need to debug or unwind your templated state methods, reference -this.

    +
    +

    Posting Events¶

    +

    The Active Object post_fifo, post_lifo, defer and recall +methods are use to feed events to the statechart. An Event can be thought of +as a kind of named marble that is placed onto a topological map. If a +particular elevation doesn’t know what to do with the marble, it rolls the +marble to the next lower elevation, or state. If the lowest elevation is +reached and the program doesn’t know what to do, it just ignores the event, or +lets the marble fall out of play.

    +

    The name of the marble is the signal name. An event can have a payload, but it +doesn’t have to. An event can only be posted to a chart after the chart has +started. Otherwise the behavior of the active object is undefined.

    +

    The state methods typically react to the names of a event, or the signal names. +This means that the if-else structures that you write will use the signal names +in their logic.

    +

    If you use the chart’s post event methods within the chart, the chart will not +concern itself with where you initiated that event. It will post its events +into its queue as if they were provided by the outside world. In this way +these events are called artificial; instead of the world creating the event, +the chart does. There are a number of situations where it makes sense to do +this, they will be described in the patterns section.

    -
    -

    Creating a Statechart From a Factory¶

    -

    To have the library create your state methods for you:

    -
      -
    1. Import the correct items from the miros library
    2. -
    3. Create the statechart’s event callback methods
    4. -
    5. Create a factory object
    6. -
    7. Build up your statemethods using the factory object
    8. -
    9. Add the hierarchy information to your factory object
    10. -
    11. Start your statechart in the desired state
    12. -
    13. Debugging a state method made from a factory
    14. -
    -
    _images/factory5.svg
    -
    -

    Import the correct items from the miros library:

    -
    from miros import Factory
    -from miros import signals, Event, return_status
    +
    +

    Posting an Event to the Fifo¶

    +

    To post an event to the active object first-in-first-out (fifo) buffer, you +must have first started your statechart. Here is a simple example:

    +
    ao = ActiveObject()
    +# start at 'outer' for the sake of our example
    +ao.start_at(outer)
    +
    +# Send an event with the signal name 'mary'
    +ao.post_fifo(Event(signal=signals.mary))
     
    -

    Create the statechart’s event callback methods:

    -
    # the statechart's event callback methods
    -def trans_to_fc(chart, e):
    -  return chart.trans(fc)
    -
    -def trans_to_fc1(chart, e):
    -  return chart.trans(fc1)
    +

    The signal names used by the events are common across the entire system. You +do not need to declare them. If the system had not seen the signals.mary +signal code before in our above example, this name would be added and assigned +a unique number automatically.

    +
    +
    +

    Posting an Event to the LIFO¶

    +

    To post an event to the active object last-in-first-out (lifo) buffer, you +must have first started your statechart. Here is a simple example:

    +
    ao = ActiveObject()
    +# start at 'outer' for the sake of our example
    +ao.start_at(outer)
     
    -def trans_to_fc2(chart, e):
    -  return chart.trans(fc2)
    +# Now say we want to send an event with
    +# th the signal name of 'mary' to the chart
    +ao.post_lifo(Event(signal=signals.mary))
     
    -

    Create your statechart using the Factory class.

    -
    # Factory is a type of ActiveObject, so it will have it's methods
    -chart = Factory('factory_class_example')
    -
    +

    You would post to the ‘lifo’ buffer if you needed your event to be moved to the +front of the active object’s collection of unprocessed events. You might want +to do this with a timing heart beat or for any event that needs to be processed +with a greater priority than other events.

    -

    Create the state methods and describe how you want to react to different -signals. Then turn it it into a method.

    -
    fc = chart.create(state='fc'). \
    -  catch(signal=signals.B, handler=trans_to_fc). \
    -  catch(signal=signals.INIT_SIGNAL, handler=trans_to_fc1). \
    -  to_method()
    +
    +

    Creating a One-Shot Event¶

    +

    A one-shot event can be used to add some delay between state transitions. You +can think of them as delayed init signals. You might want to use a one-shot if +you need a system to settle down a bit before transitioning into an inner +state.

    +

    Generally speaking, you should cancel your one-shot events as your chart passes +control to outer states. You don’t need to do this, but if you don’t your +outer states will be hit with one-shot messages that they don’t care about +and your chart will needlessly search as it reacts to these events.

    +

    It is important to know that if your chart changes state, the event posted to +it will look like it came from outside of your statechart, even though it was +originally generated within a given state. The construction of any event with +the fifo or lifo api behaves like this.

    +
    # Here define a middle state the creates a one-shot event called
    +# delayed_one_second.  The same delayed_one_second signal is captured
    +# by the middle state and used to transition into the inner state
    +@spy_on
    +def middle(ao, e):
    +  status = state.UNHANDLED
     
    -fc1 = chart.create(state='fc1'). \
    -  catch(signal=signals.A, handler=trans_to_fc2). \
    -  to_method()
    +  # we have entered the state and we would like to delay one
    +  # second prior to entering the inner state
    +  if(e.signal == signals.ENTRY_SIGNAL):
    +      ao.post_fifo(
    +        Event(signal=signals.delay_one_second),
    +        times=1,
    +        period=1.0,
    +        deferred=True
    +      )
    +    status = state.HANDLED
     
    -fc2 = chart.create(state='fc2'). \
    -  catch(signal=signals.A, handler=trans_to_fc1). \
    -  to_method()
    -
    -
    -

    Add the hierarchy information to your state methods:

    -
    chart.nest(fc,  parent=None). \
    -      nest(fc1, parent=fc). \
    -      nest(fc2, parent=fc)
    +  elif(e.signal == signals.EXIT_SIGNAL):
    +    # we are leaving this state for an outer state
    +    # so we cancel our one-shot in case it hasn't gone off yet
    +    ao.cancel_events(signals.delay_one_second)
    +    status = state.HANDLED
    +
    +  # ignore our init
    +  if(e.signal == signals.INIT_SIGNAL):
    +    status = state.HANDLED
    +
    +  # our one-shot has fired, one second has passed since
    +  # we transitioned into this state, now transition
    +  # to our desired target; 'inner'
    +  elif(e.signal == signals.delay_one_second):
    +    status = ao.trans(inner)
    +
    +  else:
    +    status, ao.temp.fun = state.SUPER, outer
    +  return status
     
    -

    Start your statechart in the desired state.

    -
    chart.start_at(fc)
    -
    -

    Then all of you usual state recipes apply.

    -

    If you need to debug or unwind your factor generated state methods, reference -this.

    +
    +

    Creating a Multishot Event¶

    +

    A multi-shot event is just an extension of the one-shot idea. Instead of only +being fired once on entry, it can be fired between 2 and an infinite number of +times. You would use a multi-shot event if you would like to provide an inner +part of your chart with a heart beat that the outer part of your chart doesn’t +need to know about. In this way you could save cycles by avoiding unnecessary +event processing in the parts of the chart that don’t need these heart beats. +This will also be useful while debugging your chart, your logs won’t be filled +with unnecessary events.

    +

    You should cancel your multi-shot events in the exit handler of the state that +created them.

    +
    # Here define a middle state the creates a multi-shot event called
    +# three_pulse.  The same three_pulse signal is captured
    +# by the middle state and used to transition into the inner state
    +@spy_on
    +def middle(ao, e):
    +  status = state.UNHANDLED
    +  if(e.signal == signals.ENTRY_SIGNAL):
    +    multi_shot_thread = \
    +      ao.post_fifo(Event(signal=signals.three_pulse),
    +                      times=3,
    +                      period=1.0,
    +                      deferred=True)
    +    # We mark up the ao with this id, so that
    +    # state function can be used by many different aos
    +    ao.augment(other=multi_shot_thread,
    +                  name='multi_shot_thread')
    +    status = state.HANDLED
    +
    +  elif(e.signal == signals.EXIT_SIGNAL):
    +    ao.cancel_event(ao.multi_shot_thread)
    +    status = state.HANDLED
    +
    +  if(e.signal == signals.INIT_SIGNAL):
    +    status = state.HANDLED
    +  elif(e.signal == signals.three_pulse):
    +    status = ao.trans(inner)
    +  else:
    +    status, ao.temp.fun = state.SUPER, outer
    +  return status
    +
    +
    +

    By setting the times argument of the post_fifo to 0, you can create an +infinite multi-shot event. This is how you could make an inner heart beat.

    +

    The post_lifo api can be used the same as the post_fifo api for +creating these types of repeating events. You would use the post_lifo api +when you would need your heart beat event signal to barge ahead of all other +events waiting to be processed by the active object.

    +
    +
    +

    Cancelling a Specific Event Source¶

    +

    The requests to the post_fifo and post_lifo methods, where times are +specified, can be thought of as event sources. This is because they create +background threads which track time and periodically post events to the active +object.

    +

    There are two different ways to cancel event sources. You can cancel a +specific event source, or you can cancel all event sources that create a +specific signal name (easier). Read the +Cancelling Event Source By Signal Name recipe to see how to do +this.

    +

    To cancel a specific signal source, you need to track the thread id which was +created when it was made, then use that id to cancel the event. Since a state +method can be used by many different active objects, you don’t want to store +this id on the method itself, or in its variable name space. Instead, you can +markup the name of the chart that is using the method, this chart object is +passed to the state method as the first argument.

    +
    # Here define a middle state the creates a multi-shot event called
    +# three_pulse.  The same three_pulse signal is captured
    +# by the middle state and used to transition into the inner state
    +#
    +# We want to cancel this specific event source when we are exiting this
    +# state
    +@spy_on
    +def middle(chart, e):
    +  status = state.UNHANDLED
    +  if(e.signal == signals.ENTRY_SIGNAL):
    +    multi_shot_thread = \
    +      chart.post_fifo(Event(signal=signals.three_pulse),
    +                      times=3,
    +                      period=1.0,
    +                      deferred=True)
    +    # We graffiti the provided chart object with this id
    +    chart.augment(other=multi_shot_thread,
    +                  name='multi_shot_thread')
    +    status = state.HANDLED
    +
    +  elif(e.signal == signals.EXIT_SIGNAL):
    +    chart.cancel_event(chart.multi_shot_thread)
    +
    +    # remove our graffiti
    +    del(chart.multi_shot_thread)
    +    status = state.HANDLED
    +
    +  if(e.signal == signals.INIT_SIGNAL):
    +    status = state.HANDLED
    +  elif(e.signal == signals.three_pulse):
    +    status = chart.trans(inner)
    +  else:
    +    status, chart.temp.fun = state.SUPER, outer
    +  return status
    +
    +
    +

    The augment api is used to graffiti our chart upon entering the state. +We write the event-source id onto the multi_shot_thread chart attribute, +so that we can use it later. By marking this specific chart object, the +middle state method handler can be shared by other active objects.

    +

    You would use this method of canceling an event source if you need the +three_pulse signal name elsewhere in your statechart. If you do not intend on +re-using this signal name you can just cancel event sources using a much +simpler api: the cancel_event.

    +
    +
    +

    Cancelling Event Source By Signal Name¶

    +

    If you would like to re-use your event source signal names through your chart, +then you can use the recipes-cancelling-a-specific-event-source recipe +to cancel a specific source and leave your other event sources running. +Otherwise, you can use the simpler cancel_sources api provided by the +Active Object:

    +
    # Here we define a middle state the creates a multi-shot event called
    +# three_pulse.  The same three_pulse signal is captured
    +# by the middle state and used to transition into the inner state
    +#
    +# We want to cancel this specific event source when we are exiting this
    +# state
    +@spy_on
    +def middle(chart, e):
    +  status = state.UNHANDLED
    +  if(e.signal == signals.ENTRY_SIGNAL):
    +    chart.post_fifo(Event(signal=signals.three_pulse),
    +                    times=3,
    +                    period=1.0,
    +                    deferred=True)
    +    status = state.HANDLED
    +
    +  elif(e.signal == signals.EXIT_SIGNAL):
    +    # cancel all event sources with the signal named three_pulses
    +    chart.cancel_events(Event(signal=signals.three_pulse))
    +    status = state.HANDLED
    +
    +  if(e.signal == signals.INIT_SIGNAL):
    +    status = state.HANDLED
    +  elif(e.signal == signals.three_pulse):
    +    status = chart.trans(inner)
    +  else:
    +    status, chart.temp.fun = state.SUPER, outer
    +  return status
    +
    +
    +

    There is no need to keep a thread id for the event source, since the Active +Object can just look at all of the event source threads and kill any of them +that have this signal name provided to the cancel_events call.

    +
    +
    +

    Deferring and Recalling an Event¶

    +

    There will be situations where you want to post a kind of artificial event into +a queue which won’t immediately be acted upon by your startchart. It is an +artificial event, because your chart is making it up, it isn’t being given to +it by the outside world. It is a way for your chart to build up a kind of +processing pressure that can be relieved when you have the cycles to work on +things.

    +

    This is a two stage process, one, deferring the event, and two, recalling the +event. It is called a deferment of an event because we are holding off our +reaction to it.

    +
    # code to place in the state that is deferring the event:
    +chart.defer(Event(signal=signals.signal_that_is_deferred)
    +
    +# code to place in the state where you would like the event reposted into
    +# the chart's first in first out queue
    +chart.recall() # posts our deferred event to the chart.
    +
    +
    +
    +
    +

    Adding a Payload to an Event¶

    +

    To add a payload to your event:

    +
    e = Event(signal=signals.YOUR_SIGNAL_NAME, payload="My Payload")
    +
    +
    +
    +
    +

    Determining if an Event Has a Payload¶

    +

    To determine if an event has a payload:

    +
    e1 = Event(signal=signals.YOUR_SIGNAL_NAME, event="My Payload")
    +e2 = Event(signal=signals.YOUR_SIGNAL_NAME)
    +
    +assert(e1.has_payload() == True)
    +assert(e2.has_payload() == False)
    +
    +
    +
    +
    +
    +

    Activeobjects and Factories¶

    + +
    +

    Augment Your Activeobject¶

    +

    It is a bad idea to add variables to the state methods, instead augment your +active objects using the augment command.

    +
    chart = ActiveObect()
    +chart.augment(other=0, name='counter')
    +assert(chart.counter == 0)
    +
    +
    +

    An even better idea would be to include the attributes in a subclass of an +Activeobject or Factory.

    +
    +
    +

    Creating a Statechart From a Template¶

    +

    To have the library create your state methods for you:

    +
      +
    1. Import the correct items from the miros library
    2. +
    3. Create a set of states from the miros template.
    4. +
    5. Create callback functions which you will link into the chart
    6. +
    7. Create an active object, and link it to your state handler
    8. +
    9. Register callbacks to each of your events.
    10. +
    11. Relate your states to one another by assigning them parents
    12. +
    13. Start up the active object in the desired state
    14. +
    15. Debugging a templated state method
    16. +
    +
    _images/factory2.svg
    +
    +

    Import the correct items from the miros library:

    +
    from miros import state_method_template
    +from miros import ActiveObject
    +from miros import signals, Event, return_status
    +
    +
    +

    Create a set of states from the miros template:

    +
    tc2_s1 = state_method_template('tc2_s1')
    +tc2_s2 = state_method_template('tc2_s2')
    +tc2_s3 = state_method_template('tc2_s3')
    +
    +
    +

    Create callback functions which you will link into your chart:

    +
    def trans_to_c2_s1(chart, e):
    +  return chart.trans(tc2_s1)
    +
    +def trans_to_c2_s3(chart, e):
    +  return chart.trans(tc2_s3)
    +
    +def trans_to_c2_s2(chart, e):
    +  return chart.trans(tc2_s2)
    +
    +def handled(chart, e):
    +  return return_status.HANDLED
    +
    +
    +

    Create an active object and link it to your state handler:

    +
    ao = ActiveObject()
    +
    +
    +

    Register callbacks to each of your events:

    +
    ao.register_signal_callback(tc2_s1, signals.BB, trans_to_c2_s1)
    +ao.register_signal_callback(tc2_s1, signals.ENTRY_SIGNAL, handled)
    +ao.register_signal_callback(tc2_s1, signals.EXIT_SIGNAL,  handled)
    +ao.register_signal_callback(tc2_s1, signals.INIT_SIGNAL,  trans_to_c2_s2)
    +
    +ao.register_signal_callback(tc2_s2, signals.A, trans_to_c2_s3)
    +ao.register_signal_callback(tc2_s2, signals.EXIT_SIGNAL,  handled)
    +ao.register_signal_callback(tc2_s2, signals.INIT_SIGNAL,  handled)
    +
    +ao.register_signal_callback(tc2_s3, signals.A, trans_to_c2_s2)
    +ao.register_signal_callback(tc2_s3, signals.ENTRY_SIGNAL, handled)
    +
    +
    +

    Relate your states to one another by assigning them to parents:

    +
    ao.register_parent(tc2_s1, ao.top)
    +ao.register_parent(tc2_s2, tc2_s1)
    +ao.register_parent(tc2_s3, tc2_s1)
    +
    +
    +

    Start up the active object in the desired state:

    +
    ao.start_at(tc2_s2)
    +
    +
    +

    Then all of you usual state recipes apply.

    +

    If you need to debug or unwind your templated state methods, reference +this.

    +
    +
    +

    Creating a Statechart From a Factory¶

    +

    To have the library create your state methods for you:

    +
      +
    1. Import the correct items from the miros library
    2. +
    3. Create the statechart’s event callback methods
    4. +
    5. Create a factory object
    6. +
    7. Build up your statemethods using the factory object
    8. +
    9. Add the hierarchy information to your factory object
    10. +
    11. Start your statechart in the desired state
    12. +
    13. Debugging a state method made from a factory
    14. +
    +
    _images/factory5.svg
    +
    +

    Import the correct items from the miros library:

    +
    from miros import Factory
    +from miros import signals, Event, return_status
    +
    +
    +

    Create the statechart’s event callback methods:

    +
    # the statechart's event callback methods
    +def trans_to_fc(chart, e):
    +  return chart.trans(fc)
    +
    +def trans_to_fc1(chart, e):
    +  return chart.trans(fc1)
    +
    +def trans_to_fc2(chart, e):
    +  return chart.trans(fc2)
    +
    +
    +

    Create your statechart using the Factory class.

    +
    # Factory is a type of ActiveObject, so it will have it's methods
    +chart = Factory('factory_class_example')
    +
    +
    +

    Create the state methods and describe how you want to react to different +signals. Then turn it it into a method.

    +
    fc = chart.create(state='fc'). \
    +  catch(signal=signals.B, handler=trans_to_fc). \
    +  catch(signal=signals.INIT_SIGNAL, handler=trans_to_fc1). \
    +  to_method()
    +
    +fc1 = chart.create(state='fc1'). \
    +  catch(signal=signals.A, handler=trans_to_fc2). \
    +  to_method()
    +
    +fc2 = chart.create(state='fc2'). \
    +  catch(signal=signals.A, handler=trans_to_fc1). \
    +  to_method()
    +
    +
    +

    Add the hierarchy information to your state methods:

    +
    chart.nest(fc,  parent=None). \
    +      nest(fc1, parent=fc). \
    +      nest(fc2, parent=fc)
    +
    +
    +

    Start your statechart in the desired state.

    +
    chart.start_at(fc)
    +
    +
    +

    Then all of you usual state recipes apply.

    +

    If you need to debug or unwind your factor generated state methods, reference +this.

    Creating a Statechart Inside of a Class¶

    @@ -973,7 +1330,7 @@ the internet (systems of systems: miros-rabbitmq)
    -

    To program this way we use the Factory class from miros.

    +

    To program this way we use the Factory class from miros.

    Here is a simple example of a statechart within an object:

    _images/factory_in_class_simple.svg
    @@ -1052,686 +1409,342 @@ return status @staticmethod - def common_behaviors_hook_1(chart, e): - status = return_status.HANDLED - # call the ClassWithStatechartInIt work2 method - chart.worker1() - return status - - @staticmethod - def common_behaviors_hook_2(chart, e): - status = return_status.HANDLED - # call the ClassWithStatechartInIt work2 method - chart.worker2() - return status - - @staticmethod - def common_behaviors_reset(chart, e): - status = chart.trans(chart.common_behaviors) - return status - - @staticmethod - def a1_entry(chart, e): - status = return_status.HANDLED - # post an event to ourselves - chart.post_fifo(Event(signal=signals.to_b1)) - return status - - @staticmethod - def a1_to_b1(chart, e): - status = chart.trans(chart.b1) - return status - - @staticmethod - def b1_init(chart, e): - status = return_status.HANDLED - return status - - @staticmethod - def b1_entry(chart, e): - status = return_status.HANDLED - # post an event to ourselves - chart.post_fifo(Event(signal=signals.hook_1)) - return status - - @staticmethod - def b1_exit(chart, e): - status = return_status.HANDLED - # post an event to ourselves - chart.post_fifo(Event(signal=signals.hook_2)) - return status - - def worker1(self): - print('worker1 called') - - def worker2(self): - print('worker2 called') - -if __name__ == '__main__': - chart = ClassWithStatechartInIt(name='chart', live_trace=True) - chart.post_fifo(Event(signal=signals.reset)) - time.sleep(1) -
    -
    -

    This will result in the following output:

    -
    [2019-06-19 06:16:02.662672] [chart] e->start_at() top->a1
    -[2019-06-19 06:16:02.662869] [chart] e->to_b1() a1->b1
    -worker1 called
    -[2019-06-19 06:16:02.664588] [chart] e->reset() b1->a1
    -worker2 called
    -[2019-06-19 06:16:02.665011] [chart] e->to_b1() a1->b1
    -worker1 called
    -
    -
    -

    Here is something a bit weirder, a concurrent statechart:

    -
    _images/factory_in_class.svg
    -
    -

    Above we define a class that contains a statechart that subscribes to, and -publishes events to other statecharts. The class will be used to create three -objects which will message each other.

    -

    Upon starting, there is a 2/5 chance the statechart within -ClassWithStatechartInIt will end up within b11 state. If a chart ends -up in this state, it will publish the OTHER_INNER_MOST signal to any chart -that has subscribed to the signal_name.

    -

    The chart sending the OTHER_INNER_MOST event ignores it, and all other -charts will respond by re-entering their common_behaviors state if they are -not in the b11 state.

    -
    -

    Note

    -

    The red and green dots are not UML. They are markers that act to highlight -the important parts of a concurrent statechart design.

    -

    I put the red dot on the part of the chart that is publishing an -event. It is red because once an item is published, it is put in a queue and the -message flows stops momentarily.

    -

    I put the green dot beside events that have been subscribed to and have been -posted to the chart. They are green, because they have been extracted from a -queue by a thread and are being posted to the event processor attached to the -chart.

    -
    -

    We will make three of these charts, turn on some instrumentation, run them in -parallel and see what happens.

    -

    Here is the code (asynchronous parts highlighted):

    -
    import time
    -import random
    -
    -from miros import Event
    -from miros import signals
    -from miros import Factory
    -from miros import return_status
    -
    -class ClassWithStatechartInIt(Factory):
    -  def __init__(self, name, live_trace=None, live_spy=None):
    -
    -    # call the Factory ctor
    -    super().__init__(name)
    -
    -    # determine how this object will be instrumented
    -    self.live_spy = False if live_spy == None else live_spy
    -    self.live_trace = False if live_trace == None else live_trace
    -
    -    # define our states and their statehandlers
    -    self.common_behaviors = self.create(state="common_behaviors"). \
    -      catch(signal=signals.INIT_SIGNAL,
    -        handler=self.common_behaviors_init). \
    -      catch(signal=signals.ENTRY_SIGNAL,
    -        handler=self.common_behaviors_entry). \
    -      catch(signal=signals.hook_1,
    -        handler=self.common_behaviors_hook_1). \
    -      catch(signal=signals.hook_2,
    -        handler=self.common_behaviors_hook_2). \
    -      catch(signal=signals.reset,
    -        handler=self.common_behaviors_reset). \
    -      catch(signal=signals.OTHER_INNER_MOST,
    -        handler=self.common_behaviors_other_inner_most). \
    -      to_method()
    -
    -    self.a1 = self.create(state="a1"). \
    -      catch(signal=signals.ENTRY_SIGNAL,
    -        handler=self.a1_entry). \
    -      catch(signal=signals.to_b1,
    -        handler=self.a1_to_b1). \
    -      to_method()
    -
    -    self.b1 = self.create(state="b1"). \
    -      catch(signal=signals.INIT_SIGNAL,
    -        handler=self.b1_init). \
    -      catch(signal=signals.ENTRY_SIGNAL,
    -        handler=self.b1_entry). \
    -      catch(signal=signals.EXIT_SIGNAL,
    -        handler=self.b1_exit). \
    -      to_method()
    -
    -    self.b11 = self.create(state="b11"). \
    -      catch(signal=signals.ENTRY_SIGNAL,
    -        handler=self.b11_entry). \
    -      catch(signal=signals.inner_most,
    -        handler=self.b11_inner_most). \
    -      catch(signal=signals.OTHER_INNER_MOST,
    -        handler=self.b11_other_inner_most). \
    -      to_method()
    -
    -    # nest our states within other states
    -    self.nest(self.common_behaviors, parent=None). \
    -        nest(self.a1, parent=self.common_behaviors). \
    -        nest(self.b1, parent=self.common_behaviors). \
    -        nest(self.b11, parent=self.b1)
    -
    -    # start our statechart, which will start its thread
    -    self.start_at(self.common_behaviors)
    -
    -    # let the internal statechart initialize before you give back control
    -    # to the synchronous part of your program
    -    time.sleep(0.01)
    -
    -  @staticmethod
    -  def common_behaviors_init(chart, e):
    -    status = chart.trans(chart.a1)
    -    return status
    -
    -  @staticmethod
    -  def common_behaviors_entry(chart, e):
    -    status = return_status.HANDLED
    -    chart.subscribe(Event(signal=signals.OTHER_INNER_MOST))
    -    return status
    -
    -  @staticmethod
    -  def common_behaviors_hook_1(chart, e):
    -    status = return_status.HANDLED
    -    # call the ClassWithStatechartInIt work2 method
    -    chart.worker1()
    -    return status
    -
    -  @staticmethod
    -  def common_behaviors_hook_2(chart, e):
    -    status = return_status.HANDLED
    -    # call the ClassWithStatechartInIt work2 method
    -    chart.worker2()
    -    return status
    -
    -  @staticmethod
    -  def common_behaviors_reset(chart, e):
    -    status = chart.trans(chart.common_behaviors)
    -    return status
    -
    -  @staticmethod
    -  def common_behaviors_other_inner_most(chart, e):
    -    status = chart.trans(chart.b11)
    -    return status
    -
    -  @staticmethod
    -  def a1_entry(chart, e):
    -    status = return_status.HANDLED
    -    # post an event to ourselves 2/5 of the time
    -    if random.randint(1, 5) <= 3:
    -      chart.post_fifo(Event(signal=signals.to_b1))
    -    return status
    -
    -  @staticmethod
    -  def a1_to_b1(chart, e):
    -    status = chart.trans(chart.b1)
    -    return status
    -
    -  @staticmethod
    -  def b1_init(chart, e):
    -    status = chart.trans(chart.b11)
    +  def common_behaviors_hook_1(chart, e):
    +    status = return_status.HANDLED
    +    # call the ClassWithStatechartInIt work2 method
    +    chart.worker1()
         return status
     
       @staticmethod
    -  def b1_entry(chart, e):
    +  def common_behaviors_hook_2(chart, e):
         status = return_status.HANDLED
    -    # post an event to ourselves
    -    chart.post_fifo(Event(signal=signals.hook_1))
    +    # call the ClassWithStatechartInIt work2 method
    +    chart.worker2()
         return status
     
       @staticmethod
    -  def b1_exit(chart, e):
    -    status = return_status.HANDLED
    -    # post an event to ourselves
    -    chart.post_fifo(Event(signal=signals.hook_2))
    +  def common_behaviors_reset(chart, e):
    +    status = chart.trans(chart.common_behaviors)
         return status
     
       @staticmethod
    -  def b11_entry(chart, e):
    +  def a1_entry(chart, e):
         status = return_status.HANDLED
    -    chart.post_fifo(Event(signal=signals.inner_most))
    +    # post an event to ourselves
    +    chart.post_fifo(Event(signal=signals.to_b1))
         return status
     
       @staticmethod
    -  def b11_inner_most(chart, e):
    -    status = return_status.HANDLED
    -    chart.publish(Event(signal=signals.OTHER_INNER_MOST))
    +  def a1_to_b1(chart, e):
    +    status = chart.trans(chart.b1)
         return status
     
       @staticmethod
    -  def b11_other_inner_most(chart, e):
    +  def b1_init(chart, e):
         status = return_status.HANDLED
         return status
    -
    -  def worker1(self):
    -    print('{} worker1 called'.format(self.name))
    -
    -  def worker2(self):
    -    print('{} worker2 called'.format(self.name))
    -
    -if __name__ == '__main__':
    -  chart1 = ClassWithStatechartInIt(name='chart1', live_trace=True)
    -  chart2 = ClassWithStatechartInIt(name='chart2', live_trace=True)
    -  chart3 = ClassWithStatechartInIt(name='chart3', live_trace=True)
    -  # send a reset event to chart1
    -  chart1.post_fifo(Event(signal=signals.reset))
    -  time.sleep(0.2)
    -
    -
    -

    There is a probabilistic aspect to this program, so it could behave differently -every time you run it. Here is what I saw when I ran it for the first time:

    -
    [2019-06-19 12:03:17.949042] [chart1] e->start_at() top->a1
    -[2019-06-19 12:03:17.949227] [chart1] e->to_b1() a1->b11
    -chart1 worker1 called
    -[2019-06-19 12:03:17.962356] [chart2] e->start_at() top->a1
    -[2019-06-19 12:03:17.962482] [chart2] e->to_b1() a1->b11
    -chart2 worker1 called
    -[2019-06-19 12:03:17.975225] [chart3] e->start_at() top->a1
    -[2019-06-19 12:03:17.985577] [chart1] e->reset() b11->a1
    -chart1 worker2 called
    -[2019-06-19 12:03:17.986041] [chart1] e->to_b1() a1->b11
    -chart1 worker1 called
    -[2019-06-19 12:03:17.986845] [chart3] e->OTHER_INNER_MOST() a1->b11
    -chart3 worker1 called
    -
    -
    -

    The diagram describing this concurrent statechart is very compact and detailed, -but we may want an even smaller version which hides the specifics of how the -statechart behaves.

    -

    Typically class diagrams are suppose to describe the attributes and the -messages (methods) which can be received by an object instantiated from the -class. When you pack a statechart into a class, the idea of a message brakes -into two things:

    -
    -
      -
    • synchronous messages (methods), and
    • -
    • asynchronous messages (events)
    • -
    -
    -

    The asynchronous messages should be more nuanced: broken into events intended -only for one statechart (using post_fifo/post_lifo) and events that are intended -to be published into other statecharts which have subscribed to their signal -names.

    -

    As far as I know there is no standard way of describing how to do this, so I’ll -show you how I do it:

    -
    _images/factory_in_class_compact.svg
    -
    -

    We see that the ClassWithStatechartInIt state inherits from the Factory -and that it has three attributes: name, live_spy and live_trace. It -has two methods, worker1 and worker2.

    -

    The rest of the diagram is non-standard: I put an e in front of the -internal (e)vents from the chart, the to_b1 and the reset then I mark the -asynchronous interface, by placing red and green dots on the compact form of a -state icon. Then place the signal names beside arrows showing how they publish or -subscribe to these signal names.

    -

    UML isn’t descriptive enough to actually capture a design’s intention, so I -never hesitate to mark up a diagram with code. In this case, my code is -saying, let’s make three of these things and run them together.

    -

    As you become more experienced building statecharts that work in concert, you -will notice that you stop paying any attention to what attributes or methods a -specific class has. You don’t care about it’s internal events and you don’t -care about from what it was inherited. You only care about what published -events it consumes and what events it publishes:

    -
    _images/factory_in_class_compact_2.svg
    -
    -

    Then to draw a federation:

    -
    _images/federation_drawing.svg
    -
    -

    There is probably a much better way to do this, since it looks like three -classes are working together rather than three instantiated objects from the -same class. UML really falls-over in describing object interactions.

    -

    If you have any suggestions about how to draw this better, email me.

    -
    -
    -
    -

    Events And Signals¶

    -
    -

    Creating an Event¶

    -

    An event is something that will be passed into your statechart, it will be -reacted to, then removed from memory.

    -
    from miros import Event
    -from miros import signals
    -
    -event_1 = Event(signal="name_of_signal")
    -# or
    -event_2 = Event(signal=signals.name_of_signal)
    -
    -
    -
    -
    -

    Creating a Signal¶

    -

    A signal is the name of an event. Many different events can have the same -name, or signal. When a signal is created, it is given a number which is one -higher than the oldest signal that was within your program. You shouldn’t have -to worry about what a signal number is, they are only used to speed up the -event processor. (it is faster to compare two numbers than two strings)

    -

    When you create a signal it will not be removed from memory until your program -finishes. They are created at the moment they are referenced, so you don’t -have to explicitly define them.

    -
    from miros import Event
    -from miros import signals
    -
    -# signal named "name_of_signaL" invented
    -# here and given a unique number
    -event_1 = Event(signal="name_of_signal")
    -# the signal number of this event will have
    -# the same number as in line 6
    -event_2 = Event(signal=signals.name_of_signal)
    -
    -
    -

    Notice that the signal was invented on line 6 then re-used on line 9.

    -

    The signals are shared across your whole program. To see reflect upon your -signals read this.

    -
    -
    -

    Posting Events¶

    -

    The Active Object post_fifo, post_lifo, defer and recall -methods are use to feed events to the statechart. An Event can be thought of -as a kind of named marble that is placed onto a topological map. If a -particular elevation doesn’t know what to do with the marble, it rolls the -marble to the next lower elevation, or state. If the lowest elevation is -reached and the program doesn’t know what to do, it just ignores the event, or -lets the marble fall out of play.

    -

    The name of the marble is the signal name. An event can have a payload, but it -doesn’t have to. An event can only be posted to a chart after the chart has -started. Otherwise the behavior of the active object is undefined.

    -

    The state methods typically react to the names of a event, or the signal names. -This means that the if-else structures that you write will use the signal names -in their logic.

    -

    If you use the chart’s post event methods within the chart, the chart will not -concern itself with where you initiated that event. It will post its events -into its queue as if they were provided by the outside world. In this way -these events are called artificial; instead of the world creating the event, -the chart does. There are a number of situations where it makes sense to do -this, they will be described in the patterns section.

    -
    -
    -

    Posting an Event to the Fifo¶

    -

    To post an event to the active object first-in-first-out (fifo) buffer, you -must have first started your statechart. Here is a simple example:

    -
    ao = ActiveObject()
    -# start at 'outer' for the sake of our example
    -ao.start_at(outer)
    -
    -# Send an event with the signal name 'mary'
    -ao.post_fifo(Event(signal=signals.mary))
    -
    -
    -

    The signal names used by the events are common across the entire system. You -do not need to declare them. If the system had not seen the signals.mary -signal code before in our above example, this name would be added and assigned -a unique number automatically.

    -
    -
    -

    Posting an Event to the LIFO¶

    -

    To post an event to the active object last-in-first-out (lifo) buffer, you -must have first started your statechart. Here is a simple example:

    -
    ao = ActiveObject()
    -# start at 'outer' for the sake of our example
    -ao.start_at(outer)
    -
    -# Now say we want to send an event with
    -# th the signal name of 'mary' to the chart
    -ao.post_lifo(Event(signal=signals.mary))
    -
    -
    -

    You would post to the ‘lifo’ buffer if you needed your event to be moved to the -front of the active object’s collection of unprocessed events. You might want -to do this with a timing heart beat or for any event that needs to be processed -with a greater priority than other events.

    -
    -
    -

    Creating a One-Shot Event¶

    -

    A one-shot event can be used to add some delay between state transitions. You -can think of them as delayed init signals. You might want to use a one-shot if -you need a system to settle down a bit before transitioning into an inner -state.

    -

    Generally speaking, you should cancel your one-shot events as your chart passes -control to outer states. You don’t need to do this, but if you don’t your -outer states will be hit with one-shot messages that they don’t care about -and your chart will needlessly search as it reacts to these events.

    -

    It is important to know that if your chart changes state, the event posted to -it will look like it came from outside of your statechart, even though it was -originally generated within a given state. The construction of any event with -the fifo or lifo api behaves like this.

    -
    # Here define a middle state the creates a one-shot event called
    -# delayed_one_second.  The same delayed_one_second signal is captured
    -# by the middle state and used to transition into the inner state
    -@spy_on
    -def middle(ao, e):
    -  status = state.UNHANDLED
    -
    -  # we have entered the state and we would like to delay one
    -  # second prior to entering the inner state
    -  if(e.signal == signals.ENTRY_SIGNAL):
    -      ao.post_fifo(
    -        Event(signal=signals.delay_one_second),
    -        times=1,
    -        period=1.0,
    -        deferred=True
    -      )
    -    status = state.HANDLED
    -
    -  elif(e.signal == signals.EXIT_SIGNAL):
    -    # we are leaving this state for an outer state
    -    # so we cancel our one-shot in case it hasn't gone off yet
    -    ao.cancel_events(signals.delay_one_second)
    -    status = state.HANDLED
    -
    -  # ignore our init
    -  if(e.signal == signals.INIT_SIGNAL):
    -    status = state.HANDLED
    -
    -  # our one-shot has fired, one second has passed since
    -  # we transitioned into this state, now transition
    -  # to our desired target; 'inner'
    -  elif(e.signal == signals.delay_one_second):
    -    status = ao.trans(inner)
    -
    -  else:
    -    status, ao.temp.fun = state.SUPER, outer
    -  return status
    +
    +  @staticmethod
    +  def b1_entry(chart, e):
    +    status = return_status.HANDLED
    +    # post an event to ourselves
    +    chart.post_fifo(Event(signal=signals.hook_1))
    +    return status
    +
    +  @staticmethod
    +  def b1_exit(chart, e):
    +    status = return_status.HANDLED
    +    # post an event to ourselves
    +    chart.post_fifo(Event(signal=signals.hook_2))
    +    return status
    +
    +  def worker1(self):
    +    print('worker1 called')
    +
    +  def worker2(self):
    +    print('worker2 called')
    +
    +if __name__ == '__main__':
    +  chart = ClassWithStatechartInIt(name='chart', live_trace=True)
    +  chart.post_fifo(Event(signal=signals.reset))
    +  time.sleep(1)
     
    -
    -
    -

    Creating a Multishot Event¶

    -

    A multi-shot event is just an extension of the one-shot idea. Instead of only -being fired once on entry, it can be fired between 2 and an infinite number of -times. You would use a multi-shot event if you would like to provide an inner -part of your chart with a heart beat that the outer part of your chart doesn’t -need to know about. In this way you could save cycles by avoiding unnecessary -event processing in the parts of the chart that don’t need these heart beats. -This will also be useful while debugging your chart, your logs won’t be filled -with unnecessary events.

    -

    You should cancel your multi-shot events in the exit handler of the state that -created them.

    -
    # Here define a middle state the creates a multi-shot event called
    -# three_pulse.  The same three_pulse signal is captured
    -# by the middle state and used to transition into the inner state
    -@spy_on
    -def middle(ao, e):
    -  status = state.UNHANDLED
    -  if(e.signal == signals.ENTRY_SIGNAL):
    -    multi_shot_thread = \
    -      ao.post_fifo(Event(signal=signals.three_pulse),
    -                      times=3,
    -                      period=1.0,
    -                      deferred=True)
    -    # We mark up the ao with this id, so that
    -    # state function can be used by many different aos
    -    ao.augment(other=multi_shot_thread,
    -                  name='multi_shot_thread')
    -    status = state.HANDLED
    -
    -  elif(e.signal == signals.EXIT_SIGNAL):
    -    ao.cancel_event(ao.multi_shot_thread)
    -    status = state.HANDLED
    -
    -  if(e.signal == signals.INIT_SIGNAL):
    -    status = state.HANDLED
    -  elif(e.signal == signals.three_pulse):
    -    status = ao.trans(inner)
    -  else:
    -    status, ao.temp.fun = state.SUPER, outer
    -  return status
    +

    This will result in the following output:

    +
    [2019-06-19 06:16:02.662672] [chart] e->start_at() top->a1
    +[2019-06-19 06:16:02.662869] [chart] e->to_b1() a1->b1
    +worker1 called
    +[2019-06-19 06:16:02.664588] [chart] e->reset() b1->a1
    +worker2 called
    +[2019-06-19 06:16:02.665011] [chart] e->to_b1() a1->b1
    +worker1 called
     
    -

    By setting the times argument of the post_fifo to 0, you can create an -infinite multi-shot event. This is how you could make an inner heart beat.

    -

    The post_lifo api can be used the same as the post_fifo api for -creating these types of repeating events. You would use the post_lifo api -when you would need your heart beat event signal to barge ahead of all other -events waiting to be processed by the active object.

    +

    Here is something a bit weirder, a concurrent statechart:

    +
    _images/factory_in_class.svg
    +
    +

    Above we define a class that contains a statechart that subscribes to, and +publishes events to other statecharts. The class will be used to create three +objects which will message each other.

    +

    Upon starting, there is a 2/5 chance the statechart within +ClassWithStatechartInIt will end up within b11 state. If a chart ends +up in this state, it will publish the OTHER_INNER_MOST signal to any chart +that has subscribed to the signal_name.

    +

    The chart sending the OTHER_INNER_MOST event ignores it, and all other +charts will respond by re-entering their common_behaviors state if they are +not in the b11 state.

    +
    +

    Note

    +

    The red and green dots are not UML. They are markers that act to highlight +the important parts of a concurrent statechart design.

    +

    I put the red dot on the part of the chart that is publishing an +event. It is red because once an item is published, it is put in a queue and the +message flows stops momentarily.

    +

    I put the green dot beside events that have been subscribed to and have been +posted to the chart. They are green, because they have been extracted from a +queue by a thread and are being posted to the event processor attached to the +chart.

    -
    -

    Cancelling a Specific Event Source¶

    -

    The requests to the post_fifo and post_lifo methods, where times are -specified, can be thought of as event sources. This is because they create -background threads which track time and periodically post events to the active -object.

    -

    There are two different ways to cancel event sources. You can cancel a -specific event source, or you can cancel all event sources that create a -specific signal name (easier). Read the -Cancelling Event Source By Signal Name recipe to see how to do -this.

    -

    To cancel a specific signal source, you need to track the thread id which was -created when it was made, then use that id to cancel the event. Since a state -method can be used by many different active objects, you don’t want to store -this id on the method itself, or in its variable name space. Instead, you can -markup the name of the chart that is using the method, this chart object is -passed to the state method as the first argument.

    -
    # Here define a middle state the creates a multi-shot event called
    -# three_pulse.  The same three_pulse signal is captured
    -# by the middle state and used to transition into the inner state
    -#
    -# We want to cancel this specific event source when we are exiting this
    -# state
    -@spy_on
    -def middle(chart, e):
    -  status = state.UNHANDLED
    -  if(e.signal == signals.ENTRY_SIGNAL):
    -    multi_shot_thread = \
    -      chart.post_fifo(Event(signal=signals.three_pulse),
    -                      times=3,
    -                      period=1.0,
    -                      deferred=True)
    -    # We graffiti the provided chart object with this id
    -    chart.augment(other=multi_shot_thread,
    -                  name='multi_shot_thread')
    -    status = state.HANDLED
    +

    We will make three of these charts, turn on some instrumentation, run them in +parallel and see what happens.

    +

    Here is the code (asynchronous parts highlighted):

    +
    import time
    +import random
     
    -  elif(e.signal == signals.EXIT_SIGNAL):
    -    chart.cancel_event(chart.multi_shot_thread)
    +from miros import Event
    +from miros import signals
    +from miros import Factory
    +from miros import return_status
     
    -    # remove our graffiti
    -    del(chart.multi_shot_thread)
    -    status = state.HANDLED
    +class ClassWithStatechartInIt(Factory):
    +  def __init__(self, name, live_trace=None, live_spy=None):
     
    -  if(e.signal == signals.INIT_SIGNAL):
    -    status = state.HANDLED
    -  elif(e.signal == signals.three_pulse):
    -    status = chart.trans(inner)
    -  else:
    -    status, chart.temp.fun = state.SUPER, outer
    -  return status
    -
    -
    -

    The augment api is used to graffiti our chart upon entering the state. -We write the event-source id onto the multi_shot_thread chart attribute, -so that we can use it later. By marking this specific chart object, the -middle state method handler can be shared by other active objects.

    -

    You would use this method of canceling an event source if you need the -three_pulse signal name elsewhere in your statechart. If you do not intend on -re-using this signal name you can just cancel event sources using a much -simpler api: the cancel_event.

    -
    -
    -

    Cancelling Event Source By Signal Name¶

    -

    If you would like to re-use your event source signal names through your chart, -then you can use the recipes-cancelling-a-specific-event-source recipe -to cancel a specific source and leave your other event sources running. -Otherwise, you can use the simpler cancel_sources api provided by the -Active Object:

    -
    # Here we define a middle state the creates a multi-shot event called
    -# three_pulse.  The same three_pulse signal is captured
    -# by the middle state and used to transition into the inner state
    -#
    -# We want to cancel this specific event source when we are exiting this
    -# state
    -@spy_on
    -def middle(chart, e):
    -  status = state.UNHANDLED
    -  if(e.signal == signals.ENTRY_SIGNAL):
    -    chart.post_fifo(Event(signal=signals.three_pulse),
    -                    times=3,
    -                    period=1.0,
    -                    deferred=True)
    -    status = state.HANDLED
    +    # call the Factory ctor
    +    super().__init__(name)
     
    -  elif(e.signal == signals.EXIT_SIGNAL):
    -    # cancel all event sources with the signal named three_pulses
    -    chart.cancel_events(Event(signal=signals.three_pulse))
    -    status = state.HANDLED
    +    # determine how this object will be instrumented
    +    self.live_spy = False if live_spy == None else live_spy
    +    self.live_trace = False if live_trace == None else live_trace
     
    -  if(e.signal == signals.INIT_SIGNAL):
    -    status = state.HANDLED
    -  elif(e.signal == signals.three_pulse):
    -    status = chart.trans(inner)
    -  else:
    -    status, chart.temp.fun = state.SUPER, outer
    -  return status
    -
    -
    -

    There is no need to keep a thread id for the event source, since the Active -Object can just look at all of the event source threads and kill any of them -that have this signal name provided to the cancel_events call.

    -
    -
    -

    Deferring and Recalling an Event¶

    -

    There will be situations where you want to post a kind of artificial event into -a queue which won’t immediately be acted upon by your startchart. It is an -artificial event, because your chart is making it up, it isn’t being given to -it by the outside world. It is a way for your chart to build up a kind of -processing pressure that can be relieved when you have the cycles to work on -things.

    -

    This is a two stage process, one, deferring the event, and two, recalling the -event. It is called a deferment of an event because we are holding off our -reaction to it.

    -
    # code to place in the state that is deferring the event:
    -chart.defer(Event(signal=signals.signal_that_is_deferred)
    +    # define our states and their statehandlers
    +    self.common_behaviors = self.create(state="common_behaviors"). \
    +      catch(signal=signals.INIT_SIGNAL,
    +        handler=self.common_behaviors_init). \
    +      catch(signal=signals.ENTRY_SIGNAL,
    +        handler=self.common_behaviors_entry). \
    +      catch(signal=signals.hook_1,
    +        handler=self.common_behaviors_hook_1). \
    +      catch(signal=signals.hook_2,
    +        handler=self.common_behaviors_hook_2). \
    +      catch(signal=signals.reset,
    +        handler=self.common_behaviors_reset). \
    +      catch(signal=signals.OTHER_INNER_MOST,
    +        handler=self.common_behaviors_other_inner_most). \
    +      to_method()
    +
    +    self.a1 = self.create(state="a1"). \
    +      catch(signal=signals.ENTRY_SIGNAL,
    +        handler=self.a1_entry). \
    +      catch(signal=signals.to_b1,
    +        handler=self.a1_to_b1). \
    +      to_method()
    +
    +    self.b1 = self.create(state="b1"). \
    +      catch(signal=signals.INIT_SIGNAL,
    +        handler=self.b1_init). \
    +      catch(signal=signals.ENTRY_SIGNAL,
    +        handler=self.b1_entry). \
    +      catch(signal=signals.EXIT_SIGNAL,
    +        handler=self.b1_exit). \
    +      to_method()
     
    -# code to place in the state where you would like the event reposted into
    -# the chart's first in first out queue
    -chart.recall() # posts our deferred event to the chart.
    -
    -
    -
    -
    -

    Adding a Payload to an Event¶

    -

    To add a payload to your event:

    -
    e = Event(signal=signals.YOUR_SIGNAL_NAME, payload="My Payload")
    -
    -
    -
    -
    -

    Determining if an Event Has a Payload¶

    -

    To determine if an event has a payload:

    -
    e1 = Event(signal=signals.YOUR_SIGNAL_NAME, event="My Payload")
    -e2 = Event(signal=signals.YOUR_SIGNAL_NAME)
    +    self.b11 = self.create(state="b11"). \
    +      catch(signal=signals.ENTRY_SIGNAL,
    +        handler=self.b11_entry). \
    +      catch(signal=signals.inner_most,
    +        handler=self.b11_inner_most). \
    +      catch(signal=signals.OTHER_INNER_MOST,
    +        handler=self.b11_other_inner_most). \
    +      to_method()
     
    -assert(e1.has_payload() == True)
    -assert(e2.has_payload() == False)
    +    # nest our states within other states
    +    self.nest(self.common_behaviors, parent=None). \
    +        nest(self.a1, parent=self.common_behaviors). \
    +        nest(self.b1, parent=self.common_behaviors). \
    +        nest(self.b11, parent=self.b1)
    +
    +    # start our statechart, which will start its thread
    +    self.start_at(self.common_behaviors)
    +
    +    # let the internal statechart initialize before you give back control
    +    # to the synchronous part of your program
    +    time.sleep(0.01)
    +
    +  @staticmethod
    +  def common_behaviors_init(chart, e):
    +    status = chart.trans(chart.a1)
    +    return status
    +
    +  @staticmethod
    +  def common_behaviors_entry(chart, e):
    +    status = return_status.HANDLED
    +    chart.subscribe(Event(signal=signals.OTHER_INNER_MOST))
    +    return status
    +
    +  @staticmethod
    +  def common_behaviors_hook_1(chart, e):
    +    status = return_status.HANDLED
    +    # call the ClassWithStatechartInIt work2 method
    +    chart.worker1()
    +    return status
    +
    +  @staticmethod
    +  def common_behaviors_hook_2(chart, e):
    +    status = return_status.HANDLED
    +    # call the ClassWithStatechartInIt work2 method
    +    chart.worker2()
    +    return status
    +
    +  @staticmethod
    +  def common_behaviors_reset(chart, e):
    +    status = chart.trans(chart.common_behaviors)
    +    return status
    +
    +  @staticmethod
    +  def common_behaviors_other_inner_most(chart, e):
    +    status = chart.trans(chart.b11)
    +    return status
    +
    +  @staticmethod
    +  def a1_entry(chart, e):
    +    status = return_status.HANDLED
    +    # post an event to ourselves 2/5 of the time
    +    if random.randint(1, 5) <= 3:
    +      chart.post_fifo(Event(signal=signals.to_b1))
    +    return status
    +
    +  @staticmethod
    +  def a1_to_b1(chart, e):
    +    status = chart.trans(chart.b1)
    +    return status
    +
    +  @staticmethod
    +  def b1_init(chart, e):
    +    status = chart.trans(chart.b11)
    +    return status
    +
    +  @staticmethod
    +  def b1_entry(chart, e):
    +    status = return_status.HANDLED
    +    # post an event to ourselves
    +    chart.post_fifo(Event(signal=signals.hook_1))
    +    return status
    +
    +  @staticmethod
    +  def b1_exit(chart, e):
    +    status = return_status.HANDLED
    +    # post an event to ourselves
    +    chart.post_fifo(Event(signal=signals.hook_2))
    +    return status
    +
    +  @staticmethod
    +  def b11_entry(chart, e):
    +    status = return_status.HANDLED
    +    chart.post_fifo(Event(signal=signals.inner_most))
    +    return status
    +
    +  @staticmethod
    +  def b11_inner_most(chart, e):
    +    status = return_status.HANDLED
    +    chart.publish(Event(signal=signals.OTHER_INNER_MOST))
    +    return status
    +
    +  @staticmethod
    +  def b11_other_inner_most(chart, e):
    +    status = return_status.HANDLED
    +    return status
    +
    +  def worker1(self):
    +    print('{} worker1 called'.format(self.name))
    +
    +  def worker2(self):
    +    print('{} worker2 called'.format(self.name))
    +
    +if __name__ == '__main__':
    +  chart1 = ClassWithStatechartInIt(name='chart1', live_trace=True)
    +  chart2 = ClassWithStatechartInIt(name='chart2', live_trace=True)
    +  chart3 = ClassWithStatechartInIt(name='chart3', live_trace=True)
    +  # send a reset event to chart1
    +  chart1.post_fifo(Event(signal=signals.reset))
    +  time.sleep(0.2)
     
    +

    There is a probabilistic aspect to this program, so it could behave differently +every time you run it. Here is what I saw when I ran it for the first time:

    +
    [2019-06-19 12:03:17.949042] [chart1] e->start_at() top->a1
    +[2019-06-19 12:03:17.949227] [chart1] e->to_b1() a1->b11
    +chart1 worker1 called
    +[2019-06-19 12:03:17.962356] [chart2] e->start_at() top->a1
    +[2019-06-19 12:03:17.962482] [chart2] e->to_b1() a1->b11
    +chart2 worker1 called
    +[2019-06-19 12:03:17.975225] [chart3] e->start_at() top->a1
    +[2019-06-19 12:03:17.985577] [chart1] e->reset() b11->a1
    +chart1 worker2 called
    +[2019-06-19 12:03:17.986041] [chart1] e->to_b1() a1->b11
    +chart1 worker1 called
    +[2019-06-19 12:03:17.986845] [chart3] e->OTHER_INNER_MOST() a1->b11
    +chart3 worker1 called
    +
    +

    The diagram describing this concurrent statechart is very compact and detailed, +but we may want an even smaller version which hides the specifics of how the +statechart behaves.

    +

    Typically class diagrams are suppose to describe the attributes and the +messages (methods) which can be received by an object instantiated from the +class. When you pack a statechart into a class, the idea of a message brakes +into two things:

    +
    +
      +
    • synchronous messages (methods), and
    • +
    • asynchronous messages (events)
    • +
    +
    +

    The asynchronous messages should be more nuanced: broken into events intended +only for one statechart (using post_fifo/post_lifo) and events that are intended +to be published into other statecharts which have subscribed to their signal +names.

    +

    As far as I know there is no standard way of describing how to do this, so I’ll +show you how I do it:

    +
    _images/factory_in_class_compact.svg
    +
    +

    We see that the ClassWithStatechartInIt state inherits from the Factory +and that it has three attributes: name, live_spy and live_trace. It +has two methods, worker1 and worker2.

    +

    The rest of the diagram is non-standard: I put an e in front of the +internal (e)vents from the chart, the to_b1 and the reset then I mark the +asynchronous interface, by placing red and green dots on the compact form of a +state icon. Then place the signal names beside arrows showing how they publish or +subscribe to these signal names.

    +

    UML isn’t descriptive enough to actually capture a design’s intention, so I +never hesitate to mark up a diagram with code. In this case, my code is +saying, let’s make three of these things and run them together.

    +

    As you become more experienced building statecharts that work in concert, you +will notice that you stop paying any attention to what attributes or methods a +specific class has. You don’t care about it’s internal events and you don’t +care about from what it was inherited. You only care about what published +events it consumes and what events it publishes:

    +
    _images/factory_in_class_compact_2.svg
    +
    +

    Then to draw a federation:

    +
    _images/federation_drawing.svg
    +
    +

    There is probably a much better way to do this, since it looks like three +classes are working together rather than three instantiated objects from the +same class. UML really falls-over in describing object interactions.

    +

    If you have any suggestions about how to draw this better, email me.

    -

    Getting Information from your Statechart¶

    +

    Getting Information from your Statechart¶

    You will find yourself in situations where you would like to read information that has asynchronously been gathered by your statechart from your main program. This may happen if you have built a statechart to monitor an external device, or @@ -1852,28 +1865,6 @@

    -
    -

    Multiple Statecharts¶

    -

    Break your design down into different interacting charts by using the -ActiveFabric.

    -

    The active fabric is a set of background tasks which act together to dispatch -events between the active objects in your system.

    -

    As a user of the software you wouldn’t touch the active fabric directly, but -instead would use your active object’s publish and subscribe methods. The -active fabric has two different priority queues and two different tasks which -pend upon them. One is for managing subscriptions in a first in first (fifo) -out manner, the other is for managing messages in a last in first out (lifo) -manner. By having two different queues and two different tasks an active -object is given the option to subscribe to another active object’s published -events, using one of two different strategies:

    -
      -
    1. If it subscribes to an event using the fifo strategy, the active fabric -will post events to it using its post_fifo method.
    2. -
    3. If it subscribes in a lifo way it will post using the post_lifo method.
    4. -
    -

    You can also set the priority of the event while it is in transit within the -active fabric. This would only be useful if you are expecting contention -between various events being dispatched across your system.

    Subscribing to an Event Posted by Another Active Object¶

    Your active object can subscribe to the events published by other active objects.

    @@ -1959,6 +1950,29 @@ first out queue.

    +
    +

    Multiple Statecharts¶

    +

    Break your design down into different interacting charts by using the +ActiveFabric.

    +

    The active fabric is a set of background tasks which act together to dispatch +events between the active objects in your system.

    +

    As a user of the software you wouldn’t touch the active fabric directly, but +instead would use your active object’s publish and subscribe methods. The +active fabric has two different priority queues and two different tasks which +pend upon them. One is for managing subscriptions in a first in first (fifo) +out manner, the other is for managing messages in a last in first out (lifo) +manner. By having two different queues and two different tasks an active +object is given the option to subscribe to another active object’s published +events, using one of two different strategies:

    +
      +
    1. If it subscribes to an event using the fifo strategy, the active fabric +will post events to it using its post_fifo method.
    2. +
    3. If it subscribes in a lifo way it will post using the post_lifo method.
    4. +
    +

    You can also set the priority of the event while it is in transit within the +active fabric. This would only be useful if you are expecting contention +between various events being dispatched across your system.

    +

    Seeing What is Going On¶

    @@ -2655,17 +2669,13 @@

    Table of Contents

  • Do Something when the State is Entered
  • Do Something when the State is Initialized
  • Do Something when the State is Exited
  • -
  • Augment Your Active Object
  • Create a Hook
  • Catch and Release
  • Create a One-Shot
  • Create a Multi-Shot
  • -
  • Cancelling Events
  • +
  • Canceling Events
  • Deferring and Recalling an Event
  • Create a Guard
  • -
  • Creating a Statechart From a Template
  • -
  • Creating a Statechart From a Factory
  • -
  • Creating a Statechart Inside of a Class
  • Events And Signals
  • +
  • Activeobjects and Factories
      +
    • Augment Your Activeobject
    • +
    • Creating a Statechart From a Template
    • +
    • Creating a Statechart From a Factory
    • +
    • Creating a Statechart Inside of a Class
    • Getting Information from your Statechart
    • -
    • Multiple Statecharts
    • Seeing What is Going On
        diff --git a/docs/searchindex.js b/docs/searchindex.js index ef00c89..ebb9adb 100644 --- a/docs/searchindex.js +++ b/docs/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["activeobject","architecture","cellular_automata","comprehensive","concurrency_essay","event","examples","glossary","hsm","i_bitcoin_miner_toaster_oven","i_create_a_multishot","i_create_a_one_shot","i_defer_and_recall","i_determining_the_current_state","i_making_sequence_diagrams_from_trace","i_mongol_example","i_mongol_with_empathy_code_listing","i_navigation_1","i_navigation_2","i_navigation_3","i_navigation_4","i_navigation_5","i_navigation_6","i_networking_instrumentation_file_table","i_scribble_on_the_spy","i_seeing_your_signals","i_spy_reactive","i_test_with_spy","i_test_with_trace","i_trace_reactive","index","installation","interactingcharts","introduction","networked_instrumentation","patterns","postingexample","quickstart","reading_diagrams","recipes","reflection","scribbleexample","setting_up_rabbit_mq","singlechartexample","testing","towardsthefactoryexample","zero_to_one"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["activeobject.rst","architecture.rst","cellular_automata.rst","comprehensive.rst","concurrency_essay.rst","event.rst","examples.rst","glossary.rst","hsm.rst","i_bitcoin_miner_toaster_oven.rst","i_create_a_multishot.rst","i_create_a_one_shot.rst","i_defer_and_recall.rst","i_determining_the_current_state.rst","i_making_sequence_diagrams_from_trace.rst","i_mongol_example.rst","i_mongol_with_empathy_code_listing.rst","i_navigation_1.rst","i_navigation_2.rst","i_navigation_3.rst","i_navigation_4.rst","i_navigation_5.rst","i_navigation_6.rst","i_networking_instrumentation_file_table.rst","i_scribble_on_the_spy.rst","i_seeing_your_signals.rst","i_spy_reactive.rst","i_test_with_spy.rst","i_test_with_trace.rst","i_trace_reactive.rst","index.rst","installation.rst","interactingcharts.rst","introduction.rst","networked_instrumentation.rst","patterns.rst","postingexample.rst","quickstart.rst","reading_diagrams.rst","recipes.rst","reflection.rst","scribbleexample.rst","setting_up_rabbit_mq.rst","singlechartexample.rst","testing.rst","towardsthefactoryexample.rst","zero_to_one.rst"],objects:{"":{activeobject:[0,0,0,"-"],event:[5,0,0,"-"],hsm:[8,0,0,"-"]},"activeobject.ActiveFabricSource":{clear:[0,3,1,""],publish:[0,3,1,""],start:[0,3,1,""],stop:[0,3,1,""],subscribe:[0,3,1,""],thread_runner_fifo:[0,3,1,""],thread_runner_lifo:[0,3,1,""]},"activeobject.ActiveObject":{append_publish_to_spy:[0,3,1,""],append_subscribe_to_spy:[0,3,1,""],cancel_event:[0,3,1,""],cancel_events:[0,3,1,""],make_unique_name_based_on_start_at_function:[0,3,1,""],run_event:[0,3,1,""],start_thread_if_not_running:[0,3,1,""],stop:[0,3,1,""],trace:[0,3,1,""]},"event.Event":{dumps:[5,4,1,""],has_payload:[5,3,1,""],loads:[5,4,1,""]},"event.SignalSource":{name_for_signal:[5,3,1,""]},"hsm.HsmEventProcessor":{augment:[8,3,1,""],child_state:[8,3,1,""],dispatch:[8,3,1,""],init:[8,3,1,""],is_in:[8,3,1,""],start_at:[8,3,1,""],top:[8,3,1,""],trans:[8,3,1,""],trans_:[8,3,1,""]},activeobject:{ActiveFabric:[0,1,1,""],ActiveFabricSource:[0,2,1,""],ActiveObject:[0,2,1,""]},event:{Event:[5,2,1,""],OrderedDictWithParams:[5,2,1,""],ReturnStatusSource:[5,2,1,""],Signal:[5,1,1,""],SignalSource:[5,2,1,""]},hsm:{HsmEventProcessor:[8,2,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","staticmethod","Python static method"]},objtypes:{"0":"py:module","1":"py:attribute","2":"py:class","3":"py:method","4":"py:staticmethod"},terms:{"0bmhjf0rke8":[],"100m":[35,46],"13th":15,"142x5zhqemk5lljxgzeitbwpv2oxqpfahj":[9,37],"1980s":[],"1990s":[33,38],"1st":[43,46],"2000s":33,"257m":4,"2nd":[37,38,43,46],"2onedcellularautomata":[],"2twodcellularautomata":[],"33691e":[],"37474f":[],"3nd":43,"3rd":34,"3th":43,"4nd":43,"4th":43,"70s":4,"75c8c":[14,29,36,39,40],"8ahweo_dgs0":[],"90s":[],"95a8c":[14,39,40],"abstract":[15,35,37,45],"break":[4,14,15,35,36,37,39,40,43,45,46],"case":[11,15,36,37,39,43,46],"catch":[7,9,15,16,32,34,35,37,38,45,46],"class":[0,5,6,7,8,9,13,15,16,17,18,19,20,21,22,25,33,35,36,37,40,41,44,46],"default":[0,15,35,39,42,46],"enum":5,"final":[7,8,15,34,35,36,37,43,46],"float":[4,46],"function":[0,3,5,7,8,10,13,32,35,36,37,38,39,40,45,46],"import":[4,9,11,15,16,25,26,27,28,32,35,36,37,38,39,40,43,45,46],"int":[25,39,40,46],"long":[15,32,35,36,37,46],"new":[0,4,5,7,8,15,26,27,28,34,35,36,37,38,39,40,41,42,43,45,46],"public":[42,43],"return":[0,5,7,8,9,10,11,15,16,24,32,34,35,36,37,38,39,41,43,45,46],"short":[15,35,37,38,41,46],"static":[5,15,34,36],"super":[4,8,9,10,11,15,16,24,34,35,36,37,39,41,43,45,46],"switch":[3,35,46],"throw":[14,15,37,38,39,40,46],"true":[0,5,7,8,9,10,11,15,16,34,35,36,37,38,39,40,41,43,46],"try":[4,8,15,34,35,36,37,38,39,41,43,45,46],"var":[],"while":[3,4,7,10,14,15,16,33,34,35,36,37,38,39,40,42,43,45,46],Adding:34,And:[15,16,46],Are:46,Being:[37,46],But:[15,33,34,35,36,37,38,39,40,41,42,45,46],Eve:[37,46],For:[0,5,7,27,34,35,37,38,39,40,43,45,46],Going:37,His:[4,15,46],Its:37,NOT:[0,42,43],Not:[7,37,46],One:[7,15,30,36,37,41],Such:[15,46],That:[4,15,28,32,35,36,37,39,40,41,45,46],The:[0,2,3,4,5,7,8,9,10,11,14,16,25,26,28,29,32,33,35,36,38,39,41,42,43,44,45,46],Their:[4,8,15,45],Then:[4,8,14,15,32,33,35,36,37,38,39,40,41,43,45,46],There:[0,4,7,8,12,15,29,32,34,35,36,37,38,39,40,41,42,46],These:[4,8,15,33,35,37,38,39,42,45,46],Use:[4,34,35,38,46],Used:8,Useful:8,Using:[6,15,37],WLS:[],With:[15,28,36,37,38,39,40,45],Yes:46,__add__:[15,16],__getattr__:[25,39,40],__init__:[5,9,15,16,34,35,37,38,39,46],__main__:[9,15,34,37,39,41,46],__name__:[9,15,34,37,39,41,45,46],__post_ev:0,_decrypt:34,_encrypt:34,_fake_new:35,_fake_news_gener:35,_gener:[],_static:[],_strip_trac:34,a1_entri:39,a1_to_b1:39,a53:46,aa00ff:[],abandon:[38,39],abil:[7,15,33,36,37,46],abl:[7,15,34,35,38,40,46],about:[0,4,7,8,10,11,14,15,26,27,29,33,34,35,36,37,39,40,41,42,43,45,46],abov:[3,8,14,15,28,34,35,36,37,38,39,40,41,42,43,45,46],abs:[],absent:15,absolut:[15,39],acceler:7,acceleromet:[],acceller:[],accept:[34,44],accerer:[],access:[4,7,15,25,26,34,35,37,38,39,40,46],accident:[15,38,45,46],accomod:46,accord:[7,15,37,38],account:[4,9,36,37,46],accumul:[38,46],accur:15,achiev:[4,15],acquisit:35,acronym:[37,46],across:[5,8,15,25,33,35,36,37,39,40,42,45,46],act:[4,8,12,14,15,16,34,35,36,37,38,39,40,46],action:[0,7,8,15,33,36,37,38,41,43,45,46],activ:[1,3,4,6,7,10,14,15,24,26,27,28,29,32,34,35,36,37,38,40,41,45,46],active_object:45,active_object_input_queu:0,activefabr:[0,39,43],activefabricsourc:0,activefactori:38,activeobect:[39,46],activeobject:[0,9,15,35,36,37,38,39,40,41,43,45,46],actual:[4,7,8,14,15,16,27,29,32,35,37,38,39,40,41,43,45,46],adapt:35,add:[4,5,7,8,11,15,24,32,35,36,38,42,43,46],add_member_if_need:15,add_timeout:34,added:[5,15,34,36,37,39,45,46],adding:[7,15,33,35,37,46],addit:[3,7,15,34,37,38,40,46],address:[15,16,34,37,42,46],adher:[7,15],adjac:8,adjust:[3,14,15,16,34,35,36,39,40,41],admistr:7,advanc:[8,15,16,38],advance_close_enough_for_circl:[15,16],advance_entri:[15,16],advance_exit:[15,16],advance_other_advanced_war_cri:[15,16],advance_senior_advanced_war_cri:[15,16],advance_war_cri:[15,16],advantag:15,adventur:[37,46],advertis:46,advic:46,advis:46,advoc:[],aesthet:[37,46],af_inet:34,affair:15,affect:37,afford:37,after:[3,4,7,15,26,27,33,35,36,37,38,39,40,41,42,43,45,46],afternoon:38,again:[0,8,15,32,35,36,37,39,41,43,45,46],against:[7,15,25,28,34,36,39,40,41,46],agent:15,aggreg:[23,34,35,38],aggress:35,aggression_max:35,agil:15,ago:[],agre:35,agress:35,ahead:[10,39],aim:[8,15],ain:15,air:4,aircraft:4,airforc:[],alan:[33,39],alarm:8,albert:38,alcohol:[37,46],alert:[],alexand:[7,35],algebra:15,algorithm:[7,8,33,35,36,37,38,39,41,45,46],align:[],aliv:15,all:[0,3,4,5,7,8,10,14,15,16,23,26,32,34,35,36,37,38,39,40,42,43,45,46],all_readi:35,alli:[],allow:[3,7,15,33,34,35,36,37,42,43,46],allowfullscreen:[],allur:15,almost:[15,36,38,44,45,46],alon:[15,37,46],along:[38,46],alpha:[],alreadi:[4,8,15,16,35,37,38,42,43,46],also:[3,4,5,7,8,10,14,15,34,35,36,37,38,39,40,41,42,45,46],altan:[15,16],altan_192:15,alter:15,alwai:[4,7,8,15,35,36,37,39,42,46],alzheim:[],ambiti:[35,40],american:4,ammunit:[15,16],ammunition_low:[15,16],amoungst:[],amount:[4,15,26,35,38,39,40,46],amplifi:[36,40],analog:41,analysi:[],analyz:[],ancestor:[8,15,37,46],ancestr:15,anchor:[7,39],angl:7,angle_in_radian:[],angri:15,ani:[0,3,4,5,7,8,11,15,25,34,35,36,37,38,39,40,41,43,44,46],anim:[],annihil:46,annoi:46,announc:[37,46],anoth:[3,4,5,7,8,14,15,16,29,32,34,35,36,37,38,40,41,42,43,45,46],answer:[4,15,37,44,45,46],anti:[38,39,46],anymor:[15,36,37,46],anyon:[15,36,37,40,46],anyth:[4,36,37,38,39,40,45,46],anytim:[7,15,34,35,37,39,43,46],anywai:[37,46],anywher:[15,38,46],ao1:[39,40],ao2:39,aos:[10,36,39],apart:[4,35,46],api:[0,10,11,15,24,34,39,43,45,46],app:[42,46],appear:[15,37,46],append:[0,5,8,15,16,34,39],append_publish_to_spi:0,append_subscribe_to_spi:0,append_to_spi:34,append_to_trac:34,appendix:46,appli:[7,15,37,39,43,46],applic:[4,15,33,37,38,39,45,46],approach:[0,4,7,8,15,35,37,39,41,46],approxim:[],apt:42,arab:4,arbitrari:15,archer:[6,16],architect:[7,15,35],architectur:[15,30,35,36,37,46],area:[4,35],aren:[4,7,15,35,36,37,38,46],arg:[5,8,46],argu:15,argument:[7,8,10,34,36,37,39,43,45,46],aris:[15,35,46],arm:[14,15,27,28,29,33,35,36,39,40,46],armi:15,armin:7,armli:[],armour:15,around:[4,7,15,28,34,35,37,39,40,46],arrai:[8,35,46],arrang:[37,38,46],array_equ:[],arriv:[15,37,38,46],arrow:[7,8,15,16,34,35,36,37,39,41,43,46],art:[34,39,43],artifact:46,artifici:[7,12,35,39],ascii:[7,14,34,39,40,46],ask:[4,15,34,35,36,37,38,39,41,43,44,45,46],aspect:[35,37,39,46],assert:[0,5,8,15,27,28,35,37,39,40,46],assign:[0,8,39,45,46],assimil:[],assist:[14,39,40],associ:[0,36,37,41,46],assort:38,assum:[15,26,35,39,40,41,45],assumpt:35,asychron:[],asymetr:46,asynchron:[4,7,39],asyncio:46,at15:46,atan:[],atom:41,attach:[37,39,43,46],attack:[15,16,41],attempt:38,attent:[3,4,8,14,15,32,35,36,37,38,39,40,43,45,46],attractor:15,attribut:[5,8,9,15,34,35,36,37,38,39,43,46],audienc:[37,38,46],augment:[8,10,35,36,38],augustin:4,aureliu:[],australia:[],author:35,authorized_kei:42,authorizing_author:35,authorizing_entri:35,autist:15,auto:[39,45],autocorrel:[],autodoc:[],autom:42,automat:[15,35,37,39,42,45,46],automata:6,autonom:15,autonoma:[],autoplai:[],avail:[4,38,46],avalanch:15,avion:4,avoid:[4,10,15,36,38,39,40,41,45,46],awai:[14,15,16,33,35,36,38,39,40,43,46],await:[26,39,40],awaken:46,awar:[4,15,37,38,46],awesom:[],awkward:[7,41],axi:46,b11:39,b11_entri:39,b11_inner_most:39,b11_other_inner_most:39,b1_entri:39,b1_exit:39,b1_init:39,b27300:[],b_chart:32,babi:4,back:[2,3,7,8,15,32,34,35,36,37,38,39,41,43,45,46],background:[15,32,35,38,39,43,46],backward:[8,38],bad:[4,15,32,34,35,39,46],bafflingli:15,bait:15,bak:44,bake:[9,35,37,46],bake_tim:46,bake_time_in_sec:46,baking_buzz_test_spec:46,baking_entri:35,baking_st:37,baking_time_m:46,balanc:4,ball:[],balloon:46,ban:[37,46],bang:15,bank:35,bar:[37,38,46],barg:[0,7,10,39,46],barrag:15,barrier:[],bartend:[37,46],base:[0,7,8,15,34,35,37,39,40,41,43,46],base_state_method:45,basic:[5,15,25,35,37,39,40,43],basic_consum:34,basic_publish:34,bate:15,batteri:[14,36,39,40],battery_charg:[27,28,29,36,39,40],battl:[4,15,16],battle_entri:[15,16],battle_init:[15,16],battlefield:15,battleground:4,bb_handler:32,beagleboard:46,beat:[4,10,39],beauti:[38,40,45],beautifulli:8,beazlei:46,becam:[4,39],becaus:[4,5,7,12,15,27,32,33,34,35,36,37,38,39,40,41,43,45,46],becom:[4,7,14,15,28,33,36,37,38,39,40,45,46],been:[0,2,3,4,5,7,8,15,27,31,32,34,35,36,37,39,40,41,43,45,46],befor:[0,4,5,7,8,9,11,15,33,34,35,36,37,38,39,41,42,43,45,46],began:[36,46],begin:[0,4,7,8,14,15,16,32,34,35,36,37,38,39,40,41,43,46],beginn:4,behav:[3,11,14,15,16,33,35,36,37,39,40,43,45,46],behavior:[7,15,24,26,27,28,32,33,34,35,36,37,38,39,41,43,45,46],behavior_nam:35,behaviour:[15,34,37,46],behind:[33,38,45,46],being:[4,5,7,8,10,12,15,16,23,25,28,34,35,36,37,38,39,40,43,45,46],beings:46,belief:15,believ:[37,46],belong:[15,35],below:[15,25,32,39,40,42],benefit:[37,38,39,45,46],benifit:[],bernhard:42,besid:[7,37,38,39,46],best:[0,4,7,15,37,38,46],better:[4,15,35,37,38,39,43,46],between:[4,7,8,10,11,15,16,26,29,35,36,37,38,39,40,41,43,45,46],beyond:[8,15,38,46],bia:[],bias:15,big:[7,15,34,35,36,37,39,41,43,46],bigger:[3,4,36,40],billion:4,bin:46,binari:7,bind:[34,44],binocular:46,bird:[37,46],bit:[4,9,11,15,32,34,36,37,39,41,43,45,46],bitcoin:[9,37],bitcoin_address:[9,37],bitcoin_miner_off:[9,37],bitcoin_miner_on:[9,37],black:[7,15,36,37,38,39,41,43,46],black_mask:[],blast:15,blazingli:46,blind:[15,27,32,39,40],blit:[],block:[4,15,35,37,39,41,43,45,46],blockingconnect:34,blog:[42,46],blue:[7,37,39,46],blueprint:[15,38],blur:15,bluster:15,board:[37,38,46],bob:[34,42],bodi:[15,34],bog:15,boiler:46,boilerpl:34,bold:35,bomb:4,bombard:15,book:[4,8,35,36,37,38,41],bool:8,bordercolor:[],borg:[],boss:46,bot:[15,42],both:[0,4,7,15,32,34,35,37,38,39,43,46],bother:[14,15,39,40,46],botnet:15,bottl:15,bottom:[4,45,46],bottom_bound:46,bounc:46,bouncer:[37,46],bound:15,boundari:[7,39,41,46],bow:[15,16],box:[34,37,46],boyd:33,bracket:[29,35,39,40,41],brain:[],brake:[35,39],brand:[38,39,46],brass:37,brave:15,breach:7,bread:[36,46],breakpoint:37,brethren:15,brew:[],bridg:[37,46],briefest:45,briefli:[37,46],bring:[4,15,39,41],broad:15,broadcast:[14,39,40],broadcast_spi:34,broadcast_trac:34,broken:[4,15,34,35,39,46],broker:42,brother:15,brown:[],browser:[37,46],bubbl:[35,37,39,46],buffer:[7,26,35,36,39,40],bug:[15,36,39,45,46],bui:[4,40,46],build:[3,4,7,8,12,16,32,34,35,36,37,38,39,40,41,43,45,46],build_next_mask:[],build_piston:35,built:[3,7,15,29,32,34,35,37,38,39,40,41,46],bulk:[],bullet:46,bunch:[7,15,37,46],burden:46,buri:[],burst:[15,35],burst_ev:35,bus:46,busi:[4,7,15,32,34,35,37],busy_count:35,busy_entri:35,busy_time_out:35,busy_time_out_hook:35,butterfli:[],button:[37,46],buttress:46,buzz:[41,46],buzz_tim:46,buzz_time_m:46,buzzer:46,buzzspec:46,c11:39,c1_a:34,c2_a:34,c_chart:32,c_trace_consum:[23,34],c_trace_produc:[23,34],cachefilechart:38,caf_second:[15,16],calcium:[],calcul:[],calculu:15,call:[0,3,4,7,8,10,11,12,15,25,26,29,32,33,34,35,36,37,38,39,40,41,43,45,46],call_something_lat:[37,46],callback:[7,15,16,32,35,37,39,46],callback_method:34,caller:[7,35,39],came:[4,7,11,15,26,35,38,39,40,46],camera:15,camil:43,campaign:[37,46],can:[0,2,3,4,5,6,7,8,9,10,11,12,14,15,16,24,25,26,27,28,29,32,33,35,36,37,38,39,40,41,42,43,44,45,46],cancel:[0,10,11,15,36,46],cancel_ev:[0,10,11,15,16,36,39,46],cancel_sourc:39,cannot:35,capabl:[15,34],capacitor:36,capacitor_charg:[27,36,39,40],captur:[10,11,15,35,39],card:15,care:[0,7,11,14,15,37,38,39,40,41,43,45,46],career:[4,15],carefulli:[27,39,40,46],cargo:4,carpet:[37,46],carri:[7,15,37,39,46],cascad:36,cast:46,casual:38,cat:42,catagor:7,caught:[7,15,35,37,39,46],caus:[3,4,15,29,32,35,36,37,38,39,40,43,45,46],causal:[],ccceler:[],cell:[],cells_per_gener:[],cellular:6,celsiu:35,cement:[],center:43,centr:35,centuri:15,ceo:4,certain:[15,37,38,45,46],certainli:[15,37],ceullular:[],chain:15,challeng:[37,46],chamber:35,chanc:[15,16,39,46],chang:[3,4,8,11,14,15,28,33,34,35,37,38,39,40,42,43,45,46],changebordercolor:[],channel:34,chao:[15,35],chaotic:15,chapter:[35,38],charact:[0,29,34,37,39,40,46],characterist:[8,15,35,46],charg:[14,15,16,36,39,40],charli:46,chart1:39,chart2:39,chart3:39,chart:[0,3,6,7,8,10,11,12,13,14,15,16,24,25,26,29,32,34,35,36,37,38,39,41,43,45,46],chart_b:32,chart_nam:34,chase:15,cheap:[40,46],check:[0,15,37,46],chicken:[15,16],child:[7,8,35,39,43],child_stat:8,child_state_graph_e1_s5:8,children:15,choa:[],choic:[39,46],chomski:42,choos:[15,37,46],chortl:4,chose:39,christoph:[7,35],chunk:[4,43],circl:[7,15,16,37,38,46],circle_and_fir:[15,16],circuit:[15,35,36],circular:46,claim:[35,46],clariti:5,classwithstatechartinit:39,claus:[7,35,37,39,46],clean:[5,45,46],clear:[0,8,15,28,37,39,40,43,46],clear_spi:[34,41,43,46],clear_trac:[15,34,37,43,46],clearer:[41,45],click:[3,7,15,35,37,38,46],client:[7,15,35],client_dequ:0,climb:[8,35,37,43,46],clip:[37,46],clobber:8,clock:[35,46],clone:[],close:[9,15,16,35,36,37,46],close_enough_for_circl:[15,16],closer:15,closest:15,closur:34,club:35,clue:[37,46],clumsi:34,cluster:[],clutter:[34,35,46],cmap:[],cod:[],code:[0,2,3,4,5,7,8,9,12,14,15,16,17,18,19,20,21,22,23,26,28,32,33,35,36,38,40,42,43,45],codebas:37,cognit:[15,36,41,45],cohes:15,collabor:[15,35],collect:[4,5,7,8,15,34,38,39,42,46],collegu:32,collis:41,color:[],color_numb:[],colour:[34,38],column:[],com:[],combin:[],come:[3,4,7,14,15,34,35,36,37,38,39,40,42,43,46],comfort:[15,34,37],command:[4,15,16,27,35,39,40,42],comment:[8,14,15,27,35,36,39,40,45,46],commerci:39,committe:38,commmon:7,common:[7,8,35,37,38,39,44,45,46],common_behavior:39,common_behaviors_entri:39,common_behaviors_hook_1:39,common_behaviors_hook_2:39,common_behaviors_init:39,common_behaviors_other_inner_most:39,common_behaviors_reset:39,common_featur:46,commonplac:[],commun:[0,4,7,15,32,35,37,38,39,44,45,46],comp:35,compact:[15,38,39,40,45],compani:[37,42,46],companion:[37,46],compar:[4,15,25,27,28,34,35,37,39,40,43,46],comparison:[4,46],compens:4,compet:15,compil:[33,46],complet:[4,7,8,15,34,35,36,37,38,43,44,45,46],complete_circuit:15,complex:[4,7,15,32,33,35,37,38,39,40,43,45,46],complianc:15,compliant:[14,39,40,46],complic:[4,15,35,38,39,40,45,46],complicit:15,compon:[3,15,46],composit:[35,38,41],comprehend:15,comprehens:6,comprehensive_no_instrument:3,compress:[15,16,35],compromis:15,comput:[7,15,23,33,34,35,37,38,39,42,46],concaten:42,conceiv:38,concentr:15,concept:[7,15,37,46],concern:[15,35,39,45],concert:39,concis:[32,45],conclud:15,conclus:15,concret:37,concurr:[32,33,38,39,46],condit:[3,4,7,15,16,35,36,37,38,39,41,46],conduct:15,cone:[],conf:42,confid:[15,46],config:42,configur:[7,8,14,39,40,41,42],confin:[33,35],confirm:[15,35,41,42,46],conflict:4,confus:[15,37,46],connect:[7,15,32,35,37,38,39,42,43,46],connection_attempt:15,connectionparamet:34,consciou:46,consequ:15,conserv:44,consid:[4,7,8,14,15,28,35,37,39,40,41,46],consider:37,consist:[15,34,35,37,46],constant:15,constraint:33,construct:[5,7,8,11,13,15,34,35,36,37,39,40,42,46],constructor:[],consult:42,consum:[7,15,23,38,39],consumpt:[15,37,46],contain:[3,4,5,7,15,26,28,29,32,34,35,36,37,38,39,40,41,43,45,46],contemporari:46,contemptu:15,content:[1,3,15,30,36,38,39],context:[4,7,28,35,37,38,39,40,41,45,46],contextu:38,continu:[4,7,15,35,36,37,43,46],contract:[15,35],contractor:[4,15],contradict:39,contrari:41,contrast:[7,35],contribut:[7,38],control:[3,11,15,35,36,37,38,39,40,41,42,43,45,46],conu:[],conundrum:15,conveni:35,convent:[15,38,46],convers:40,convert:[7,15],convinc:[15,46],cook:46,cook_tim:46,cook_time_sec:46,cool:[4,35,46],cool_enough:35,copi:[4,14,27,28,35,37,38,39,40,42,45,46],core:[33,35,46],core_color:[],corner:[15,46],coroutin:[],correct:[4,8,15,16,32,39,40,42,45,46],correctli:8,correspond:41,corrupt:4,cortext:46,cosmologist:44,cost:[4,7,35,37,38,40,46],couch:4,could:[4,10,14,15,16,28,32,34,35,36,37,38,39,40,41,43,45,46],couldn:[15,39],count:[15,35],countdown:37,counter:[15,39],countri:[4,35],coupl:[27,35,39,40,46],cours:[15,41],cover:15,coward:15,cpu:[15,35,46],cpython:46,crack:[],craft:7,crank:46,crash:[8,34],creat:[0,4,5,7,10,11,14,15,16,29,32,33,35,36,37,38,40,41,42,43,46],create_burst:35,createel:[],creation:46,creativ:[],credenti:[15,34],cri:[15,16],criteria:35,criterion:35,critic:4,crockford:4,crucial:15,crumb:36,crush:4,cry:[15,16],crypto:34,cryptographi:34,crystal:[],cscope:38,ctag:38,ctor:39,ctrl:[14,39,40],cued:[],cult:4,cultur:[4,15],cunningham:45,curat:[4,39],curiou:[],current:[0,7,8,15,35,37,38,40,43,46],current_numb:35,curs:40,custom:[5,36,37,38,39,40,43,46],cut:15,cyan:[],cycl:[7,10,12,15,35,36,37,39,46],cyphertext:34,daemon:[36,43,46],dag:46,dai:4,damag:[15,35],damn:39,danc:15,danger:[15,39],dark:[15,33],data:[7,8,14,15,26,35,38,39,40,42,45,46],data_readi:35,date:[15,28,37,39,40],datetim:[29,35,39,40,46],daunt:4,dave:38,david:[4,7,15,33,35,38,46],daydream:[37,46],dd2c00:[],dead:[15,16],deaden:15,deadlin:34,deadlock:[4,46],deal:[35,36],dean:46,debt:46,debug:[10,15,27,34,37,38,39,40,41,43,45,46],debugg:[37,38,46],deceit:16,deceit_in_detail:[15,16],deceit_in_detail_tact:15,decent:[15,28,38,39,40],decid:[15,34,36,37,43,46],decim:46,decis:[15,33,38,46],declar:[34,39],decod:34,decomposit:38,decor:[3,13,34,36,37,39,40,43,45,46],decoupl:[4,46],deep:[7,35,37,46],deeper:[38,39,46],deepest:[],deepli:[38,41],deer:37,def:[5,8,9,10,11,15,16,24,25,32,34,35,36,37,38,39,40,41,43,45,46],default_nam:39,defeat:15,defeat_in_detail_tact:15,defend:4,defens:4,defer:[0,3,7,10,11,12,15,16,26,27,32,34,36,37,40,41,43,45,46],defi:[],defin:[5,7,8,10,11,15,28,34,35,36,37,38,39,40,42,43,45,46],degre:35,deisgn:[],del:39,delai:[7,11,39,45,46],delay_in_m:46,delay_one_second:[11,39],delay_tim:[15,16],delayed_one_second:[11,39],delet:35,delic:4,deliv:15,deliver:15,delv:15,demo:[],demonstr:[4,15,34,35,38,39,45,46],depend:[4,15,31,33,38,45,46],deploi:[41,42],deploy:42,depth:8,dequ:[0,7,35,37,39,46],deriv:[15,37,46],desc:46,descend:[35,37,46],descent:46,describ:[3,4,7,8,15,27,28,29,32,33,35,36,37,38,40,41,43,45,46],descript:[14,15,26,35,37,38,39,45,46],deseri:5,design:[3,4,7,8,9,14,17,18,19,20,21,22,28,33,35,36,38,39,43,44,45],desir:[11,15,35,39],desktop:[],despit:[4,35,37,46],destination_ip:34,destination_port:34,destroi:[15,34,38,41,46],destruct:[],destructor:[14,39,40,41],detail:[7,16,26,32,33,35,36,37,39,43,46],detect:[14,35,37,39,40,41],deterim:35,determin:[7,8,15,25,27,35,36,40,43,46],determinist:[],deterministicli:39,develop:[4,15,33,36,37,38,39,45,46],deviat:46,devic:[7,15,36,39],diagram:[3,7,8,9,14,15,29,30,32,33,34,35,36,37,40,41,43,45,46],diamond:38,dict:[25,39,40],dictionari:[5,15,25,39,40],did:[3,4,15,32,35,36,37,38,39,43,45,46],didn:[7,15,34,35,36,37,38,39,42,43,46],didt_advance_war_cri:[15,16],didt_entri:[15,16],didt_exit:[15,16],didt_init:[15,16],didt_other_advance_war_cri:[15,16],didt_other_ready_war_cri:[15,16],didt_other_retreat_ready_war_cri:[15,16],didt_other_retreat_war_cri:[15,16],didt_other_skirmish_war_cri:[15,16],didt_retreat_war_cri:[15,16],didt_second:[15,16],didt_senior_advance_war_cri:[15,16],didt_skirmish_war_cri:[15,16],die:15,diff:[15,46],differ:[0,3,4,7,8,9,10,14,15,23,33,34,35,36,37,38,39,40,41,42,43,45,46],differenti:15,difficult:[7,33,35,43,46],difficulti:45,difficultli:35,dig:[35,37,40],digit:[39,46],dimens:[15,37,46],dimension:15,diminish:15,direct:[15,16,37,38,46],directli:[7,15,32,35,36,37,38,39,41,46],directori:[8,15,42],disarm:35,discard:4,disciplin:40,disconnect:34,discov:[7,8,15,16,37,39,45,46],discoveri:[4,15,46],discuss:[35,46],disk:[],disord:15,disorgan:15,dispatch:[0,3,7,8,15,16,34,35,39,43],dispatch_graph_a1_s1:8,dispatch_graph_f1_s0:8,dispatch_graph_f1_s22:8,dispatch_to_all_empathi:15,dispatch_to_empathi:15,displai:[39,43,46],disprov:41,disregard:39,distanc:15,distil:38,distinct:[15,35],distinguish:[5,29,37,39,40,45],distort:4,distract:15,distribut:[15,35],div:[],dive:[],divid:[],do_noth:45,dobb:[34,42],doc:[34,35,38,42],doc_process:38,dock:[37,46],docstr:[8,46],document:[4,7,8,14,15,32,33,34,35,37,39,40,42,46],dodg:15,doe:[0,7,8,15,27,28,35,36,37,38,40,41,42,43,45,46],doesn:[4,5,7,8,10,15,34,35,36,37,38,39,40,41,43,46],dogfight:4,dogmat:4,doh:15,doing:[7,15,27,29,35,36,37,38,39,40,41,43,46],dollar:4,domain:46,domin:4,don:[7,8,10,11,14,15,26,34,36,37,38,39,40,41,42,43,44,45,46],done:[4,15,35,36,37,38,39,42,43,45,46],done_buzz_period_sec:46,doom:15,door:[9,35,37,46],door_clos:[9,35,37,46],door_closed_bak:35,door_closed_init:35,door_closed_off:35,door_closed_open:35,door_closed_toast:35,door_open:[9,35,37,46],door_open_clos:35,door_open_entri:35,door_open_exit:35,dot:[7,15,35,36,37,38,39,41,43,46],dotenv:15,doubl:[],doubt:15,dougla:4,dove:4,down:[11,15,34,35,36,37,38,39,40,43,45,46],downward:46,draconian:15,dragon:37,draw:[7,8,15,32,33,35,37,38,41,43,46],drawit:39,drawn:[8,34,37,38,46],dreari:40,drew:33,drift:[37,46],drill:[7,35],drink:[15,16,37,46],drive:[15,35,37,38,46],driven:[8,35,37,38,46],driver:46,drop:[4,15,27,37,38,39,40,46],drown:15,drum:15,drunk:[37,46],dry:[7,14,15,39,40,42],dtdakkeosog:[],dtype:[],due:[5,15,46],dumber:15,dump:[5,37],durat:[36,46],dure:[5,7,8,15,37,38,39],duti:[35,37,46],dynam:[5,15,27,35,36,39,40,43,46],e_funct:41,each:[0,4,5,7,8,14,15,16,26,28,29,34,35,36,37,39,40,41,43,45,46],ear:[37,46],earli:[33,46],earshot:15,earth:[37,46],easi:[7,15,28,32,33,35,36,37,38,39,40,41,43,45,46],easier:[4,14,15,25,35,36,39,40,45,46],easiest:[39,44],easili:[15,35,37,39],easy_bak:35,eat:[],eco1:[],eco2:[],eco:[],ecosystem:46,edg:[37,39,46],edit:[4,7,35,37,38,39,41],editor:[4,14,38,39,40,46],educ:43,edward:15,effect:[7,14,15,35,37,38,39,40,46],effort:[14,15,35,38,39,40,42,46],effortless:[],effortlessli:39,eight:[],einstein:38,either:[4,7,15,16,35,37,38,39,41,43,46],elabor:46,elaps:46,electr:[7,35,37],element:[7,8,9,35,36,37,46],elev:39,elif:[7,8,9,10,11,15,16,24,35,36,37,39,41,43,45,46],ellison:46,els:[7,9,10,11,15,16,24,34,35,36,37,39,40,41,43,45,46],elsewher:[34,39,46],email:[39,46],emb:38,embed:[4,8,35,36,38,39,40,46],emerg:[15,37],emit:34,emot:38,emotion:38,empath:15,empathet:15,empathi:[15,16],empathy_for_first_broth:15,empathy_nam:[15,16],emphas:[33,36,38],emphasi:[],employe:15,empt:7,empti:[15,43],enabl:[3,15],enable_snoop_spi:15,enable_snoop_trac:15,enact:[],enammour:[],enamor:33,enclos:[34,38,46],encod:34,encompass:15,encount:[4,15],encourag:[37,46],encrypt:[15,34,42],end:[0,7,15,26,29,35,36,37,39,40,43,46],enemi:[4,15,16],energi:35,energy_gener:35,energy_generation_init:35,engag:[15,46],engin:[4,8,15,35,40,45],english:[15,35,38,46],enjoi:[37,46],enlist:35,enough:[8,15,16,33,34,35,36,37,38,39,41,43,45,46],enrag:15,ensur:[0,15,32,34,36,39,45,46],enter:[8,11,15,16,32,35,36,37,41,42,43,46],enthusiast:[37,46],entir:[15,37,39,45,46],entireti:40,entiti:[],entri:[3,7,8,10,15,32,35,36,37,38,39,41,43,45,46],entropi:[],entry_sign:[5,7,9,10,11,15,16,24,25,26,27,32,34,35,36,37,39,40,41,43,45,46],enumer:[5,7,46],env:[15,42],env_path:15,enviro:[],environ:[15,42,46],envis:15,equal:[],equat:15,equip:[15,37,46],equival:[15,36,46],era:43,ergod:15,ergot:15,erlang:42,erron:15,error:35,escap:[15,35],especi:[15,35,37,46],essenc:35,essenti:[],estim:[],etc:[7,42,46],etho:46,evalu:[32,35,41],even:[11,15,35,36,37,39,42,43,45,46],event:[0,1,3,4,7,8,9,10,11,12,14,15,16,25,26,27,29,32,33,36,37,40,43],event_1:39,event_2:39,event_a:0,event_b:0,event_or_sign:0,event_reset_chart:43,event_wait_complet:43,eventu:[37,46],ever:[4,15,34,35,38],everi:[3,4,7,15,16,34,35,37,38,39,46],everyon:[15,35,37,38,40,46],everyth:[0,15,28,32,37,38,39,40,46],everywher:42,evid:[15,37,39,41,46],evolv:46,evt_a:38,exact:[27,39,40,46],exactli:[4,8,15,32,37,38,41,45,46],examin:[36,41,46],exampl:[0,2,3,5,7,8,17,26,27,28,29,30,33,35,37,38,39,40,41,42],examplestatechart:3,exce:[],excel:[37,42],except:[4,7,15,34,36,37,42,46],exception:15,exchang:[4,34],exchange_declar:34,exchange_typ:34,excit:[37,46],exclud:35,exclus:34,execut:[0,4,8,15,41],exercis:15,exert:15,exhaust:[36,38,43,46],exist:[5,7,15,36,37,38,46],exit:[0,3,7,10,15,32,34,35,36,37,38,41,42,43,45,46],exit_sign:[7,9,10,11,15,16,24,25,26,32,34,35,36,37,39,40,41,43,45,46],expand:[],expans:[],expect:[15,32,33,34,35,36,37,39,41,43,45,46],expected_empathy_target_trac:15,expected_empathy_trac:15,expens:[4,7,35,40,46],experi:[15,35,40,41],experienc:[15,35,39,45],experiment:15,expertli:15,explain:[0,14,15,32,33,35,39,41,46],explan:[34,44,46],explicit:[7,35,37],explicitli:[7,15,35,37,39,46],explor:[37,46],exponenti:40,expos:15,express:[4,5,15,36,38,39,46],extend:[7,8,15,34,35,45],extens:[5,7,10,39,42],extern:[0,7,15,35,36,37,38,39,46],extract:[35,39],extraordinarili:[37,46],extrem:[4,15,37,38,39,46],extrud:[],eye:[37,46],eyebal:[],eyes:[15,37,38,41,43,46],fabric:[1,7,32,39,43],fabric_task_ev:0,face:[15,37,40,44,46],facil:[35,43],fact:[4,15,35,36,37,38,39,40,44,46],factor:[7,39],factori:[4,6,7,13,15,16,32,34,35,37,40,46],factory_class_exampl:[39,45],factory_class_recipe_exampl:39,factory_in_class:[],fad:38,fade:[37,46],fail:[8,27,35,39,40,46],fairli:[15,33,39],fake:[14,15,35,39,40,46],fake_black:[],fake_new:35,fake_transduc:35,fake_whit:[],fakenewsspec:35,fall:[37,39,46],fallaci:38,fallen:38,fals:[15,35,38,39,41,46],falsifi:44,fame:38,famili:15,familiar:[35,36,39,41],famous:4,fanout:34,far:[15,39,41,42,46],farc:46,fast:[15,35,37,38,46],faster:[15,39,46],fastest_tim:35,father:15,fathom:15,favor:[35,38],favour:15,fb11:32,fb1:32,fc1:[32,39,45],fc2:[32,39,45],featur:[7,8,14,15,33,34,35,37,38,39,40,46],fed:[15,35,46],feder:39,feed:[15,34,39],feedback:[4,15,37,46],feel:[4,15,34,35,36,37,41,46],feign:[15,16],feigned_retreat:[15,16],fellow:[37,46],fermet:34,fernet:34,few:[4,15,35,37,38,46],feynman:44,ff6d00:[],ff6doo:[],ffa501:[],ffff00:[],ffffff:[],ffmpeg:[],fiction:37,fidel:[15,46],field:[15,16,35,44],fifo:[0,7,11,15,32,36,38,46],fifo_queu:0,fifo_subscript:0,fig:[],fight:[15,39],fighter:4,figur:[15,32,35,36,37,39,42,43,46],file:[7,15,23,34,39,42,46],filenam:[],fill:[10,15,34,35,36,39,42],film:37,filter:[4,35],find:[2,4,7,8,15,33,35,36,37,38,39,45,46],findal:46,fine:40,finish:[7,15,35,36,37,38,39,46],finit:[7,38],fire:[10,11,15,16,35,36,37,39,43,46],firm:41,firmwar:[4,33],first:[0,5,7,8,12,14,28,29,34,35,36,37,38,39,40,43,44,45,46],first_brothers_nam:15,first_name_of_oth:15,firstscripttag:[],fit:[15,38,46],five:15,fix:[15,27,39,40,46],fixat:15,flank:15,flash:36,flashlight:33,flat:[7,15,35,45,46],flatten:[39,45],flavor:38,flexibl:[15,35],fli:[37,46],flip:46,float32:[],floor:36,flow:39,flower:[],floweri:[],fly:[37,39,46],fn_parent_state_handl:8,fn_state_handl:8,focu:[15,37,45,46],focus:[15,36],fodder:4,fog:15,folder:15,follow:[4,5,7,8,14,15,28,29,32,34,35,36,37,39,40,42,43,45,46],foo:3,food:[37,46],fool:[35,44],foot:38,footman:[15,16],footmen:15,footprint:46,forc:[4,15,35,43],forecast:37,foreign:[23,34],foreign_hsm:34,foreign_spy_item:34,foreign_trace_item:34,foreseen:15,forev:[0,26,39,40],forget:[36,41],forgot:32,fork:38,form:[7,15,34,35,39],formal:[4,7,15,33,35,36,37,38,39,40,45,46],format:[7,9,15,16,25,34,35,37,39,40,46],former:4,forth:[15,46],forward:[33,35,39],found:[2,3,6,8,15,35,37,42,43,46],foundat:46,four:[41,45],fowler:38,fr_entri:[15,16],fr_exit:[15,16],fr_other_retreat_war_cri:[15,16],fr_out_of_arrow:[15,16],fr_retreat_war_cri:[15,16],fr_second:[15,16],fragil:[15,38],frai:15,frame:[15,34,39,45],framebord:[],framework:[4,7,15,33,35,36,37,39,40,45,46],free:[4,15,35,39],freez:46,frequenc:36,fresh:35,fridai:38,friedrich:36,friendli:35,frighten:36,from:[0,3,4,5,7,8,9,11,14,15,16,23,25,26,28,29,32,33,34,35,36,37,38,41,43,45,46],from_list:[],front:[0,7,15,39,46],frustrat:[15,37,46],fsm:[7,38],fuck:4,fuel:[4,35],full:[0,3,15,16,26,27,33,34,35,36,37,39,40,43,46],fun:[8,9,10,11,15,16,24,35,36,37,39,41,43,45,46],funcanim:[],functool:34,further:[7,35,38],furthermor:[15,35],fusion:35,fusion_act:35,fusion_active_cool_enough:35,fusion_active_entri:35,fusion_and_heat_transf:35,fusion_and_heat_transfer_fir:35,fusion_reactor:35,fusionreactor:35,futil:[37,46],futur:[7,15,27,28,34,39,40,46],fuzzier:15,gain:[7,33,34,37,38],gallop:[15,16],game:38,ganbaatar:[15,16],gandbold:[15,16],gang:[14,39,40],ganssl:4,gantulga:[15,16],garbag:[5,8,46],garden:37,gather:39,gave:46,gaze:[37,46],gear:35,gearbox:35,gem:[],gener:[4,7,11,14,15,28,29,34,35,36,37,38,39,40,42,45,46],general_state_method:45,genghi:15,geniu:40,geometri:7,geopolit:43,gestur:[37,46],get:[4,5,7,8,15,25,28,35,36,37,38,40,41,42,43,45,46],get_100ms_from_timestamp:46,get_a_nam:15,get_composite_read:35,get_ip:34,get_my_m:46,get_nam:15,get_readi:46,get_ready_sec:46,get_temperature_read:35,get_weath:39,getelementbyid:[],getelementsbytagnam:[],getenv:15,getsocknam:34,gibberish:42,gift:4,gil:46,gist:[],git:15,give:[14,15,16,36,37,38,39,40,41,43,45,46],given:[0,7,8,11,12,15,25,29,32,35,36,37,39,40,45,46],glanc:[37,38,46],glee:4,global:[4,5,15,38,39,40,46],glossari:30,glow:37,glyph:[7,15,35,46],goal:[15,33,34,37,46],god:[37,46],goddess:[37,46],goe:[15,35,46],going:[8,15,34,35,36,37,38,39,44,46],gone:[11,34,39,46],good:[15,32,35,37,38,39,40,41,44,46],got:[14,15,35,36,38,39,40,41,42,43,46],gotten:[15,28,37,39,40,46],govern:[4,37],grab:[],grade:[],graffiti:39,grai:[],granit:15,grap:[],graph:[7,8,37,38,45,46],graph_e1_s1:8,graph_e1_s2:8,graph_e1_s3:8,graph_e1_s4:8,graph_e1_s5:8,graphic:[38,46],great:[4,14,15,32,35,37,39,40,42,46],greater:[4,15,36,39,43,46],greedi:0,green:[38,39],greeter:[37,46],grid:[],grind:40,grok:41,groov:[37,38],ground:[15,37],group:[15,33,46],grown:[],guarante:[4,5,15],guard:[7,38],guess:[15,37],guest:[37,42,46],guest_password:42,gui:[15,37,42,44,46],guid:[33,42],guidanc:[],guidenc:[],gun:[15,46],gusto:[37,46],gyroscop:[],hack:[6,32,37,39,46],hacker:41,had:[4,15,26,32,34,36,37,38,39,40,41,43,45,46],hadan:[15,16],hadn:4,hal:46,half:4,hall:46,halt:[15,16],hand:[4,7,15,37,38,39,41,45,46],handi:34,handl:[7,9,10,11,15,16,24,32,35,36,37,38,39,41,43,45,46],handler:[8,10,15,16,32,34,35,36,37,38,39,43,45,46],handwav:15,hang:[41,46],happen:[4,5,7,8,15,26,27,32,34,35,36,37,39,40,41,43,46],happi:[37,46],hard:[15,34,37,38,39,41,45,46],harden:46,harder:[15,38,45,46],hardli:45,hardwar:[4,38],harel:[4,7,15,33,35,36,37,38,39,40,45,46],harm:[4,15],has:[0,4,5,7,8,11,15,16,26,27,28,29,31,32,34,35,36,37,38,39,40,41,43,45,46],has_payload:[5,39],hasn:[0,3,5,7,11,15,37,39,46],hast:4,hate:[7,35],have:[0,2,3,4,5,7,8,11,12,13,14,15,25,26,27,28,29,32,33,35,36,37,38,41,42,43,45,46],haven:[4,15,29,34,35,36,37,38,39,40,41,42,43,46],hawk:4,hazard:38,head:[15,35,38,40,45,46],hear:[15,37,46],heard:[15,16,43],heart:[10,15,35,39],heat:[9,15,35,37,46],heater:[35,46],heater_off:[35,46],heater_on:[35,46],heating_element_off:[9,37],heating_element_on:[9,37],heating_entri:35,heating_exit:35,heating_st:46,heaven:[37,46],heavi:[4,15,35],heavili:[15,46],heed:4,heehaw:46,hei:[],height:[],heirach:[],held:[37,39,46],hello:[37,42,43,46],helmet:15,help:[4,15,33,35,37,38,40,43,46],helper:[8,46],helpless:15,her:[37,46],here:[2,3,4,5,7,10,11,15,26,27,29,32,33,34,35,36,37,38,39,40,41,42,43,45,46],herself:[37,46],hesit:39,heurist:15,hidden:[15,35,45],hide:[34,35,38,39,45],hierarch:[7,15,33,34,36,37,38],hierarchi:[7,8,15,34,36,37,38,39,41],high:[0,4,7,15,28,29,35,36,37,39,43,46],higher:[4,15,37,39,46],highest:[0,15,39],highli:[],highlight:[3,15,32,34,35,36,37,39,45,46],him:[4,15,16,35,37,46],himself:15,hint:[15,36],hire:4,his:[4,7,8,15,16,35,36,37,41,45,46],histor:[],histori:[9,15,37],hit:[11,15,35,39,42],hmm:41,hod:4,hold:[9,12,15,36,37,38,39,42,46],hole:[],holi:4,hollow:[37,46],hologram:15,holograph:15,home:15,honour:7,hood:46,hook:[3,7,15,26,27,36,37,38,40],hook_1:39,hook_2:39,hope:[4,15,36,46],hord:15,horizont:46,hornet:15,hors:[6,16],horsearch:[15,16],horseback:15,horsemen:15,horserarch:15,host:42,hostnam:42,hot:[32,37],hour:40,how:[1,3,4,7,8,10,14,15,16,24,26,29,32,33,34,35,36,37,38,41,42,43,44,45,46],howev:[5,8,34,35,36,37,44,45,46],href:[6,17,18,19,20,21,22,33,35,37,38,39,40,44,46],hsm:[0,1,3,7,15,16,33,35,37,38,39,45,46],hsm_queues_graph_g1_s01:0,hsm_queues_graph_g1_s1:0,hsm_queues_graph_g1_s2111:0,hsm_queues_graph_g1_s22:0,hsm_queues_graph_g1_s321:0,hsmevent:0,hsmeventprocessor:[8,35],hsmtester:3,hsmtoplogyexcept:35,hsmtopologyexcept:[7,8,35,39],hsmwithqueu:[15,16,34,35],html:[6,17,18,19,20,21,22,33,35,37,38,39,40,44,46],http:4,huge:33,hulagu:[15,16],human:[4,37,38,46],hung:15,hunt:15,hurri:36,hypothes:[],hypothesi:[],i_list:46,iaf:4,icon:[7,35,37,39,46],id_rsa:42,idea:[4,7,10,15,26,33,35,36,37,38,39,40,43,46],ideal:15,ident:45,identifi:[15,16,29,34,38,39,40,45,46],idiom:38,idiot:4,idl:35,idle_data_readi:35,idle_entri:35,idle_new_request:35,ids:36,ifram:[],iframe_api:[],ignor:[0,5,7,11,15,16,35,36,37,38,39,41,43,46],ihbarhasvad:[15,16],iir:35,ill:38,illeg:[7,35,41,42],illus:[4,45],illustr:46,imag:[7,14,15,37,39,40],imagin:[7,15,35,37,41,46],immedi:[4,12,15,16,26,35,38,39,40,46],immut:[5,38,39,46],impati:15,impedi:39,implement:[15,33,35,36,37,39,41,45,46],implemt:[],implicit:[],implment:7,importantli:[4,41,45],importerror:46,impos:15,imposs:35,imprecis:15,impress:[4,39],improv:[15,46],impuls:35,inabl:15,inadvert:38,inbox:15,incent:4,incid:[],incircl:7,includ:[3,15,33,37,38,39,42,46],incompet:15,incomprehens:15,inconveni:[3,35],incorpor:38,incorrect:[],incorrectli:[7,15],increas:[7,15,35,40,46],incred:[],increment:[15,35],independ:[15,35],index:[8,30],index_and_time_delai:39,indic:[7,8,29,35,39,40,46],indirect:45,individu:[15,16,34,35,36],industri:[4,36],ineffici:[],inevit:[35,40],inexpens:[14,39,40],infect:[],infer:41,infinit:[4,7,10,15,26,35,39,40],inflex:15,inform:[0,4,7,9,15,23,26,28,32,35,36,37,38,40,43,45,46],infra:[],infract:41,infrastructur:[33,42],infrequ:39,inherit:[0,7,8,15,34,35,36,37,39,43,46],init:[3,5,7,8,11,32,35,36,37,38,39,43,45,46],init_func:[],init_sign:[7,9,10,11,15,16,24,25,26,27,32,34,35,36,37,39,40,41,43,45,46],initi:[7,8,15,35,36,38,41,43,46],initial_condition_index:[],initial_st:8,initial_valu:35,inject:[7,15,34,35,39,45],inner:[7,10,11,15,26,35,36,37,39,40,43,46],inner_most:39,inner_st:35,innner:36,innocu:[15,45],innov:[4,15],input:[7,15,34,35,36,38,39,46],insert:15,insertbefor:[],insid:[7,15,34,37,46],insight:4,inspect:[32,35,46],inspir:35,instal:[15,30,33,34,46],instanc:[7,15,27,34,38,39,40,43,45,46],instanti:[35,38,39,45,46],instati:[],instead:[0,5,10,15,33,34,35,36,37,38,39,40,43,45,46],instruct:[15,33,41,42],instructor:4,instrument:[0,6,7,9,15,26,29,32,34,35,36,38,39,40,43,44,45,46],instrumentation_line_of_match:46,insur:46,intact:15,intang:15,integ:15,integr:[15,46],intellig:15,intend:[4,7,15,34,35,37,39,46],intent:[15,35,38,39,46],interact:[3,4,6,8,14,15,33,36,37,39,40,43,46],intercept:35,interconnect:[37,46],interest:[4,15,32,34,37,46],interfac:[5,15,34,37,39,46],interleav:[14,39,40,46],intermedi:[38,46],intern:[0,5,6,7,15,17,18,19,20,21,22,26,33,35,37,38,39,40,43,44,46],internet:[34,39,42],interplai:43,interpret:[38,39,46],interrel:46,interrupt:[4,35,38,43],interv:[],intervent:40,intial_condition_index:[],intimid:[37,46],intric:15,intrins:37,introduc:[15,26,34,35,39,40,46],introduct:[30,37,42],introspect:[15,16],intuit:[15,39],invent:[4,7,15,33,35,37,38,39,46],invers:[4,36,37,45,46],invert:8,invest:[38,46],investig:36,involv:[15,32,35,46],inward:46,iot:33,ips:[15,16],is_fil:15,is_in:8,is_this_piston_readi:35,ish:15,isn:[4,5,12,15,16,37,38,39,43,46],isol:[40,46],isra:4,issu:[7,15,16,27,28,34,35,37,39,40,43,45,46],item:[0,5,7,8,15,16,25,29,34,35,36,37,39,40,41,43,46],iter1:[17,18,46],iter2:[18,19,46],iter3:[19,20,46],iter4:[20,21,46],iter5:[21,22,46],iter6:[22,46],iter:[15,35],its:[0,3,4,7,8,14,26,29,32,33,35,36,37,38,39,40,42,43,45,46],itself:[7,15,34,35,36,37,38,39,40,41,43,45,46],jack:4,jacket:46,java:46,javascript:4,jersei:4,jet:4,jinja2:[7,42],jinja:7,jitter:46,job:[28,36,37,39,40,42,46],john:33,join:[15,37,38,46],joke:15,journal:36,journei:[37,46],json:[4,5,46],json_ev:5,juggl:46,jump:[8,15,36,37,46],junior:15,jupyt:46,just:[4,5,8,10,15,25,27,28,32,34,35,36,37,38,39,40,41,42,43,45,46],kai:[33,39],keep:[0,8,15,33,34,35,36,37,38,39,41,42,45,46],kei:[4,15,25,32,34,37,39,40,42],kept:[35,37,46],keygen:42,keyword:37,khan:15,kill:[0,4,15,36,39,43,46],kind:[7,12,15,35,36,37,38,39,43,46],knew:[34,35,37,43,46],knight:[15,16],know:[4,7,8,10,11,14,15,32,33,34,35,36,37,38,39,40,41,42,43,45,46],knowabl:46,knowledg:[15,46],korean:15,kwarg:[5,8],label:[8,14,36,39,40,43],laberg:35,lac:8,lack:[15,44],lag:15,lai:[36,37,46],lame:46,lamp:35,lamp_off:35,lamp_on:35,lan:15,lanchart:38,land:[37,46],languag:[4,7,15,33,35,37,38,39,42,45,46],lanreccechart:38,larg:[7,8,15,35,38,39,43],larger:[4,15],larri:46,last:[0,7,15,32,35,37,39,43,45,46],last_brothers_nam:15,lastli:37,late:[4,46],latenc:46,later:[8,15,34,35,36,37,39,46],latest:[4,15,39],latex:40,law:[4,37,46],layer:[15,37,39,45,46],lazi:[37,46],lca:[8,37,46],lead:[15,35,46],leader:15,leadership:[4,15],lean:[15,37,46],leap:39,learn:[4,6,7,15,32,33,35,37,38,39,43,46],least:[8,15,35,37,42,45,46],leav:[3,7,8,11,15,35,36,37,38,39,43,46],left:[7,15,16,34,37,38,45,46],left_wal:[],leftmost:0,legend:46,legibl:[15,37,46],leisur:15,len:[15,25,34,39,40],length:8,less:[15,16,35,37,39,43,45,46],let:[4,9,15,16,32,33,34,35,36,37,38,39,41,43,45,46],level:[4,7,15,28,29,35,36,37,39,43,46],lib:[],librari:[1,4,7,15,31,32,33,35,36,37,38,39,42,43,45,46],licenc:[],lie:15,life:[35,39,46],lifetim:[4,44],lifo:[0,7,11],lifo_queu:0,lifo_subscript:0,light:[9,15,33,37,38,41,46],light_off:46,light_on:46,like:[4,7,8,10,11,12,14,15,25,26,28,29,32,33,34,35,36,37,38,39,40,41,43,45,46],likewis:[15,37,38,43,46],limbo:41,limit:[8,15,34,37,38,46],limp:38,line:[7,15,27,28,29,32,34,35,36,38,39,40,41,43,45,46],linear:15,linearsegmentedcolormap:[],lineno:[],ling:[],linger:15,link:[15,32,33,35,36,37,39,40,42,43,45,46],lint:4,linux:[34,46],lion:33,lip:[],liquid:35,list:[0,5,8,15,16,35,36,37,41,46],list_spi:46,listen:[15,34,39],listless:[37,46],liter:45,lithium:35,litter:37,littl:[4,14,15,32,35,36,37,38,39,40,41,46],live:[4,7,15,34,35,37,46],live_spi:[15,34,37,39,40,46],live_trac:[9,15,34,37,39,40,46],load:[5,15,16,37,41,46],load_dotenv:15,lobotom:15,local:[7,15,16,34,35,38,42],local_consum:34,localconsum:34,localhost:42,locat:[0,7,8,15,34,35,37,39,46],lock:[0,4,15,38,40,46],lockhe:4,lockingdequ:0,log:[7,10,15,24,26,29,35,36,37,38,39,40,41,42,43,45,46],logic:[15,39,41,46],login:42,longer:[15,35,37,38,41,46],look:[4,7,11,15,27,28,29,32,33,34,35,36,37,38,39,40,41,42,43,45,46],lookuperror:39,loop:[0,14,15,36,39,40,43,46],loos:[7,15,35],loosen:15,lorenz:15,lose:[15,40,46],loss:15,lost:[15,33,45],lot:[4,7,14,15,32,35,36,37,38,39,40,42,43,45,46],lotteri:37,loud:15,love:[35,37,38,46],low:[15,16,36,39],lower:[0,4,15,37,39,46],lowest:[39,46],luck:[4,37,46],lure:[15,16],mac:[],machin:[5,6,7,9,15,23,33,34,35,36,37,38,39,41,42,46],machine_cl:[],macho:39,made:[4,7,15,32,35,37,38,39,42,45,46],magnet:35,mai:[15,37,39,40,46],maim:15,main:[0,9,15,34,36,37,39,46],mainli:15,maintain:[4,15,34,38,45],mainten:[4,45,46],maintenc:7,major:4,make:[4,5,7,9,10,12,14,15,16,25,32,33,35,36,37,38,39,40,42,43,45,46],make_and_start_left_wall_machin:[],make_and_start_right_wall_machin:[],make_generation_coroutin:[],make_test_spec:46,make_unique_name_based_on_start_at_funct:0,malevol:15,malform:8,man:[4,15],manag:[0,3,4,7,15,28,32,36,37,38,39,40,41,42,43,45,46],mandatori:8,maneuv:[15,16],mani:[4,7,10,15,27,35,36,37,38,39,40,42,43,46],manifest:[7,33,39,46],manipul:[37,38],manner:[7,39,40,46],manoeuvr:15,manual:[14,35,39,40],manufactur:7,map:[7,9,15,16,28,32,37,38,39,40,45,46],marbl:[37,38,39],march:[37,46],marcu:[],margin:[],mari:[5,37,39,46],mark:[10,14,15,32,35,36,37,38,39,40,42,46],markdown:40,marker:[37,39],market:[15,37],markup:[7,39],marshal:[15,16],marshal_entri:[15,16],marshal_readi:[15,16],martin:[4,38],marvel:[37,46],mass:[4,15],massiv:[15,37],master:35,match:[15,37,46],materi:43,math:[],mathemat:15,mathematica:[],mathematician:33,matlab:[],matplot:[],matplotlib:[],matrix:[],matter:[5,15,46],max:[25,39,40],max_index:8,max_name_len:[25,39,40],max_number_len:[25,39,40],maxim:15,maximum:[8,35],maximum_arrow_capac:[15,16],maxlen:[0,39],mayb:[15,35,37,38,41,46],mba:15,meali:[7,38],mean:[4,7,8,15,25,26,33,34,35,36,37,38,39,40,41,43,45,46],meaning:[15,39],meaningless:[37,46],meant:[7,15,43],meanwhil:46,measur:[7,35],meat:15,mechan:[4,15,35,38,40,46],media:[],mediev:15,meet:[15,34,37,46],member:[15,37,46],memori:[4,15,26,33,35,37,39,40,45,46],men:15,menac:15,mental:[15,37,46],mention:[36,43,46],merv:[37,46],mesh_encryption_kei:15,mess:46,messag:[0,7,11,14,15,24,35,37,39,40,46],met:[35,46],meta:46,metal:35,metaphor:[15,36,37,46],metaprogram:[39,45],method:[0,3,5,7,8,9,15,24,25,29,32,34,35,36,37,38,40,41,43,46],michel:35,micro:15,micromanag:[15,46],microsoft:[37,40],middl:[4,10,11,26,36,39,40,41,43],might:[4,7,11,15,26,27,28,34,35,36,37,38,39,40,45,46],militari:[4,15],millisecond:46,mind:[38,41],mine:37,minecraft:7,miner:[9,37],mingu:[],mini:[],minim:[15,42,46],minimalist:46,minimum:35,minion:[37,46],minor:[],minut:[15,38,46],miracl:15,miro:[1,3,4,7,8,9,15,16,25,26,28,31,32,33,34,35,36,37,39,40,41,43,44,45,46],miros_rabbitmq:15,mirror:15,misbehav:46,miss:[15,37,38,43,45,46],mistak:[15,33,38,46],mistakenli:15,mix:35,mixtur:[37,39],mkdir:42,mnemon:[8,37,38,46],mobil:15,mock:46,mockup:[],mode:[3,35,46],mode_control:3,model:[7,33,35,36,37,38],model_control:3,moder:40,modern:15,modifi:35,modul:[1,30,45],modular:46,modulo_bas:46,molten:35,momen:7,moment:[0,15,35,37,39,45,46],momentarili:39,momentum:33,monei:[4,40,46],mongol:6,monitor:[4,15,23,34,37,39,46],month:4,moor:[7,38],moot:40,mordecai:4,more:[0,4,6,7,8,15,29,32,33,34,35,36,37,38,39,40,41,43,45,46],moreov:41,most:[4,8,15,32,33,35,36,37,39,42,46],mostli:[34,39,42,46],motiv:[37,46],mount:15,mous:38,mouse_click:38,mouse_click_evt:38,mousecoordin:38,move:[2,8,15,34,36,37,38,39,41,43,46],movement:[15,33,46],movi:[],mp4:[],much:[4,7,8,15,35,38,39,41,45,46],mud:15,multi:[7,10,15],multi_shot_thread:[10,36,39],multipl:[15,29,34,35,37,38,40,42,45,46],multishot:[7,46],multitask:4,multithread:[],multivers:[37,46],munger:46,must:[5,7,8,15,34,36,37,39,43,44,46],mutabl:38,mute:3,mutex:4,mutual:8,my_ev:38,my_event_with_payload:38,my_hook:39,mypayload:39,myself:[15,41,46],n_angl:[],n_mask:[],nag:41,nai:[],name:[0,4,5,7,8,10,13,15,16,25,29,32,33,34,35,36,37,38,40,41,42,43,45,46],name_for_sign:[5,25,39,40],name_of_item2:39,name_of_item_1:39,name_of_item_2:39,name_of_sign:39,name_of_subclass:5,namedtupl:[38,39,46],namespac:36,nametupl:46,napkin:33,napoleon:15,narankhuu:[15,16],narantuyaa:[15,16],narrow:[],nassim:[32,41],nasti:46,nativ:[],natur:[5,35,38,39,41,44],navig:[8,35],nearbi:46,neat:34,necessari:15,necessarili:[],neck:[15,46],need:[0,4,7,8,10,11,14,15,26,27,32,33,34,35,36,37,38,39,40,41,42,43,45,46],needlessli:[11,39],neg:46,neighbor:[],neither:39,neovim:4,nergui:[15,16],nervou:[15,37,46],ness:15,nest:[7,15,16,32,34,35,39,45],net:8,netscap:4,network:[5,8,14,16,33,39,40],networked_horse_arch:15,networkedactiveobject:15,networkedfactori:15,never:[4,15,33,35,36,39,46],new_machin:[],new_nam:46,new_named_attribut:5,new_request:35,newest:35,newli:[34,42],newlin:34,next:[6,7,15,16,17,18,19,20,21,22,27,31,33,35,36,37,38,39,40,41,43,44,45,46],next_gener:[],next_rtc:0,nice:[38,45,46],nichola:[32,41],nietzsch:36,no_ack:34,noam:42,nobodi:[15,37,46],node:[15,34,45],noisi:15,non:[9,37,39,40,46],nondetermin:4,none:[0,5,7,8,9,15,16,32,34,35,36,37,39,41,43,45,46],nonexist:46,nonsens:34,noob:[],normal:3,norman:4,north:15,not_wait:[15,16],note:[15,34,37,39,41,46],noth:[0,3,4,7,35,36,37,38,39,43,44,46],nothing_angl:[],nothing_at_row:[],nothing_mask:[],notic:[7,14,15,29,35,36,37,38,39,40,41,45,46],notifi:[15,46],notion:15,now:[4,8,11,14,15,32,34,35,36,37,38,39,40,41,42,43,45,46],nuanc:39,nuclear:35,number:[5,7,10,14,15,25,26,29,32,35,37,38,39,40,43,46],numer:15,numpi:35,nutshel:46,nvu8m8a73jg:[15,34],oadp1sh69j:[],obei:15,obj:5,object:[1,4,5,6,7,8,10,14,15,25,26,27,28,29,32,33,35,36,37,38,40,41,45,46],oblivion:[37,46],obscur:4,observ:41,obtain:[14,34,39,40],obviou:[15,32],obvious:37,occur:[7,8,15,26,29,35,36,37,39,40,43,46],occurr:38,od647c:[],oddli:[37,46],off:[9,11,12,15,35,36,37,38,39,45,46],off_entri:35,offer:[34,46],offic:[15,16],officer_lur:[15,16],offset:46,often:[7,15,35,38,39,46],oha:[15,16],oha_1:15,old:[0,15,26,37,39,40,43,45,46],old_left_machin:[],old_machin:[],old_right_machin:[],oldest:[7,35,36,39],onc:[5,7,8,10,15,16,26,33,35,36,37,39,40,42,43,46],one:[0,4,5,7,8,10,11,12,14,15,17,23,29,33,34,35,36,37,38,39,40,42,43,44],onedcellularautomatawithanglediscoveri:[],onedcellularautonomata:[],ones:45,oneshot:46,onli:[0,4,8,10,13,15,28,29,31,33,34,35,36,37,38,39,40,41,42,43,46],onlin:39,onplayerreadi:[],onplayerstatechang:[],onreadi:[],onstatechang:[],onto:[0,4,7,14,15,32,34,35,36,37,38,39,40,42,46],onyoutubeiframeapireadi:[],onyoutubeplayerapireadi:[],oop:41,open:[9,35,37,38,39,42,46],oper:[4,7,15,35,37,43,46],oppon:15,opportun:[15,45,46],oppos:[4,15],opposit:[4,15],optim:[],option:[7,8,15,37,38,39,42,46],orang:[],orb:[37,46],order:[7,15,16,35,37,40,41,46],ordereddict:5,ordereddictionari:[25,39,40],ordereddictwithparam:5,organ:[6,35,37,40,45,46],orient:[33,35,38],origin:[0,7,11,15,35,39,41,45,46],orthogon:[3,7,15,46],oscil:15,oscilloscop:46,other:[0,4,7,8,10,14,15,16,25,26,27,32,33,34,35,36,37,38,42,43,44,45,46],other_advance_war_cri:[15,16],other_archer_nam:15,other_arrival_on_field:15,other_inner_most:39,other_ready_war_cri:[15,16],other_retreat_ready_war_cri:[15,16],other_retreat_war_cri:[15,16],other_skirmish_war_cri:[15,16],otherhorsearch:[15,16],otherwis:[7,8,15,27,35,39,40,41,45],our:[0,4,8,9,11,12,27,28,32,33,35,36,37,38,39,40,42,43,44,45,46],ourselv:[15,35,39],out:[0,4,5,7,8,9,12,15,16,26,28,32,34,35,36,37,38,39,40,41,42,43,45,46],out_of_arrow:[15,16],outcom:4,outer:[7,10,11,15,26,35,36,37,38,39,40,43,46],outer_st:35,outermost:[37,39,46],output:[0,7,8,14,15,25,26,27,28,29,32,35,36,37,38,39,41,43,45,46],outsid:[7,8,11,12,15,16,35,36,37,38,39,41,43,46],outsourc:37,outward:[7,8,15,35,37,38,39,46],outweigh:46,oval:46,oven:[9,35,38],oven_off:5,over:[0,3,4,7,8,15,27,28,32,34,35,36,37,38,39,40,41,42,45,46],over_off:5,overal:[15,33],overflow:[34,35],overli:39,overload:35,overrid:35,overtak:[],overwhelm:[15,36],overwrit:[35,40],overwritten:[8,36],own:[2,4,7,15,33,35,36,37,38,39,41,42,45,46],p27:[],pack:[4,15,32,38,39,43,45,46],packag:[7,15,33,37,38,39,46],packet:38,pact:[],page:[4,15,30,32,38,41,42,46],paglia:43,pai:[3,4,15,32,35,36,38,39,46],paid:4,pain:[4,42],paint:[37,46],pair:46,pale:4,pantri:35,paper:[7,35,36,39,43],paradigm:36,paradox:15,paragraph:[43,46],parallel:[36,39,40],paramet:[5,34,46],parameter:46,parameteriz:[],parametr:15,paramount:15,parent:[7,8,15,16,32,34,35,37,43,45,46],parent_callback:[7,45],parent_state_of_this_state_method:39,parentnod:[],pariti:5,pars:[39,46],part:[0,3,8,9,10,15,16,33,34,35,36,37,38,39,41,42,43,45,46],partial:39,particip:[15,40,46],particular:[4,39,40],particularli:[37,41,46],pass:[5,7,11,15,16,34,35,36,37,38,41,43,46],passphras:42,password:42,past:[14,37,39,40,41],patch:38,path:[7,8,15,37],pathlib:15,pathwai:15,patient:[37,46],pattern:[3,6,7,15,30,34,36,37,38,39,43,44,46],paus:[],payload:[5,7,15,16,29,32,35,37,40],pcolormesh:[],pdb:[27,39,40],pdf:[37,46],peachi:[28,39,40],pedant:4,pencil:39,pend:[0,5,15,28,37,39,40,43,45,46],pending_on_piston:35,pending_on_pistons_timeout:35,pending_optimal_condit:35,pentagon:4,peopl:[4,15,33,35,37,38,46],pepper:[15,36,37,38,46],per:[7,15,16,36,44,46],percent:[4,15,16,46],perfect:[15,39],perfectli:[],perform:[4,8,15,16,33,35,36,37,38,41,42,45,46],peril:[4,37],period:[0,7,10,11,15,16,35,36,39,46],peripher:15,permiss:[41,42],permit:[15,37,46],permut:[],pernici:39,perpetu:[],persist:46,person:[15,33,37,38,41,44,45,46],peter:[15,46],pgn:[],phase:[39,43,46],phenomenon:15,philosoph:41,philosophi:46,phoenix:43,phrase:[37,46],phsysic:[],physic:[7,35,37,46],pic:34,pick:[4,15,37,46],pickl:5,pico:42,pictur:[14,15,32,33,34,37,38,39,40,43,44,46],piec:[4,37,43,46],pierr:[4,32],pigment:[],pika:[34,42],pilot:4,pin:46,pip3:34,pip:[31,46],piston:35,piston_1:35,piston_:35,piston_act:35,piston_manag:35,piston_numb:35,piston_readi:35,piston_slam:35,pitch:38,pivot:46,place:[0,3,7,8,12,14,15,28,32,34,35,36,37,38,39,40,42,43,45,46],plai:[3,15,37,39,46],plain:[7,15,38],plain_text:34,plaincredenti:34,plan:[15,35,43,46],plane:4,planet:4,plant:37,plasma:35,plastic:37,plate:46,platform:[34,37,46],playbook:42,player:37,player_api:[],playerstatu:[],playvideo:[],plenti:15,plod:15,ploi:37,plot:[],plt:[],pluck:15,plugin:[15,33,38,39],png:[],pocket:46,point:[4,7,8,14,15,16,27,28,33,35,37,39,40,43,46],pointless:[33,37,46],pole:35,polici:[15,35],poll:35,polling_ent:35,polling_init:35,polling_process:35,polling_time_out:35,polling_time_out_hook:35,polyamor:[35,39],poni:15,pool:[7,35],pop:[0,4,7,37],popleft:39,popul:8,popular:38,port:[4,7,33,34,35,36,37,39,42,46],portabl:46,portal:[37,46],portion:33,posit:[35,37,46],possess:41,possibl:[8,15,34,35,39,40,42,46],post:[0,5,6,7,11,12,15,26,32,35,38,40,43,45,46],post_act:3,post_def:[26,27,35,36,39,40],post_fifo:[0,7,9,10,11,15,16,26,32,34,35,36,37,39,40,41,43,45,46],post_id_1:0,post_id_2:0,post_lifo:[7,10,35,37,39,46],postul:4,potato:46,power:[4,15,35,37,40,46],practic:[4,7,8,32,35,37,38,41,46],practition:35,pragmat:38,pre:[7,15,28,39,40,45,46],pre_time_sec:46,preced:[],precis:[15,46],predatori:[],predefin:[37,46],predetermin:[15,35,46],predica:15,predict:[],preemption:4,preemptiv:4,prefer:15,prefix:15,preform:46,prei:15,preliminari:46,prematur:15,prepar:15,prepend:46,prepend_trace_timestamp:46,preprocessor:45,present:[4,7,15,35,43,46],press:[14,37,39,40,46],pressur:[12,35,39],presum:46,pretend:[15,35,36,46],pretti:[15,26,27,37,39,40,41,42,45,46],prev:[6,17,18,19,20,21,22,31,33,35,37,38,39,40,44,46],previou:[3,15,36,37,43,45,46],previous:[15,36,37,43],previous_gener:[],price:[36,38,39,46],prim:0,prime:[15,35],princip:43,principl:[14,39,40,44],print:[0,3,5,7,9,15,16,25,26,27,28,32,34,35,36,37,39,40,43,45,46],print_msg:[37,46],printer:[26,39,40],prion:[],prior:[5,7,11,32,34,35,36,39],priorit:[],prioriti:[0,4,7,15,32,39,46],priorti:[0,7],privat:42,privileg:36,probabilist:39,probabl:[14,15,35,36,37,38,39,40,46],problem:[4,7,15,28,33,35,37,38,39,40,41,42,45,46],proce:[15,37,46],procedur:42,process:[4,5,7,8,10,12,15,16,26,33,34,35,36,37,38,39,40,42,43,45,46],process_a_gener:35,process_a_specif:35,process_b_gener:35,processing_count:35,processing_entri:35,processing_exit:35,processing_init:35,processing_pol:35,processor:[4,7,8,15,26,33,34,35,36,37,39,40,41,43,45,46],produc:[7,15,23,35,36,38,46],producer_192:34,producer_out:34,producer_outer_b:34,producer_outer_init:34,product:[35,37,40,46],profession:35,profil:[],profit:4,program:[3,4,6,7,8,9,14,25,27,28,33,35,36,37,38,39,40,42,43,45,46],programat:40,programm:[15,33,35,46],progress:46,prohibit:[37,46],project:[4,15,29,35,37,39,40,46],promis:33,prompt:42,proof:[17,18,19,20,21,22],propag:[35,46],properli:[7,15,38,39,45],properti:[7,15,34],prophet:32,propos:35,protect:[4,15,46],protocol:46,prototyp:[35,38,46],protractor:[],prove:[15,46],proven:[4,46],provid:[0,4,5,7,8,10,15,25,32,33,34,35,37,38,39,40,42,43,45,46],pseudo:[],pseudost:[7,35,37,38,46],psycholog:[40,41],pub:[0,32,34,37,42,46],publish:[0,4,7,15,32,33,34,42,46],publish_bb:32,publishing_ao:39,pull:[4,5,15,16,33,36,37,41,43,46],puls:[35,46],pump:[15,35,36],purchas:4,purpl:[],purpos:[23,34,35,39,42,46],pursu:[4,15],pursuit:41,push:[0,15,35,41,45,46],put:[0,15,16,35,36,37,38,39,40,41,46],puzzl:[37,46],pycrypto:34,pydotenv:15,pyplot:[],python3:46,python:[3,4,7,15,25,31,33,34,35,37,38,39,40,41,42,45,46],qai9iicv3fkbfruakrm1gh8w51:[15,34],quad:46,quantum:[36,39],quarri:15,quarter:15,queri:[3,39,43,46],question:[14,15,17,18,19,20,21,22,32,37,39,40,45],queu:[3,26,27,32,33,34,35,36,37,39,40,41,43,45,46],queue:[0,7,12,15,32,34,35,36,37,38,39,42,43,46],queue_bind:34,queue_declar:34,queue_typ:[0,39],quick:[30,38],quicker:[],quickli:[15,33,36,38,40,46],quickstart:46,quieter:15,quit:[15,34,35],quiver:15,quot:[4,35],rabbit123:42,rabbit567:15,rabbit:[15,34,35,42],rabbit_guest_us:15,rabbit_heartbeat_interv:15,rabbit_instal:42,rabbit_nam:42,rabbit_password:[15,34,42],rabbit_port:15,rabbit_producer_192:34,rabbit_us:[15,34],rabbitfactori:15,rabbitmq:[15,33,38,39],rabbitproduc:34,race:[4,15,39],rage:38,raid:37,rain:[15,39],rais:[7,8,37,39,46],ran:[23,33,34,35,36,39,43,45,46],randint:[15,16,39],random:[15,16,34,35,39],random_numb:35,randomli:46,rang:[4,15,35,46],rank:15,rap:46,rare:[37,46],raspberri:[15,23,34,42,46],rate:[4,35],rather:[7,15,35,36,37,39,40,46],ratio:[],ravel:[],raw:[],reach:[7,15,35,36,37,39,46],reachabl:34,react:[3,7,11,15,26,35,36,37,38,39,40,43,45,46],reaction:[7,12,15,35,36,38,39,43,46],reactiv:[35,37,38,43],reactor:35,reactor_on:35,reactor_on_entri:35,reactor_on_init:35,reactor_on_prim:35,reactor_on_time_out:35,read:[4,7,8,15,25,26,35,36,37,38,39,40,42,43,45,46],readi:[15,16,27,35,36,39,40,41,46],real:[4,15,34,35,37,38,46],realiti:[15,41],realli:[4,15,33,35,37,38,39,41,43,46],rearm:36,reason:[5,15,29,34,37,38,39,40,42,43,46],rebuild:[27,39,40],recal:[7,12,26,35,36,40],receiv:[7,15,25,26,32,34,35,36,37,38,39,40,41,42,43,46],receiving_entri:35,receiving_receiv:35,recent:[35,37],recip:[30,36,40],reckless:33,recogn:[15,36,38],recommend:[4,34,39,40,42,43],reconnect:34,reconsid:[35,45],reconstruct:4,record:[37,46],rectangl:[15,37,39,41,43,46],recurs:[15,35,36,37,38,46],red:[9,37,38,39,46],red_light_off:[9,37],red_light_on:[9,37],redesign:35,redraw:35,reduc:[7,15,40,46],reduct:[],redund:[15,46],reef:[],ref:[],refact:7,refactor:[15,33,35,38],refer:[6,8,15,17,18,19,20,21,22,26,32,33,34,35,36,37,38,39,40,42,43,44,46],referenc:[7,8,14,15,37,38,39,40,46],refil:15,reflect:[7,15,25,30,33,35,36,37,39,43],reflection_sign:[25,39,40],refocu:15,refrain:[],refresh:[37,46],regard:[35,36,46],region:[7,15,35,37,38,46],regist:[34,39],register_live_spy_callback:34,register_live_trace_callback:34,register_par:[39,45],register_signal_callback:[39,45],registr:45,registri:0,regress:[15,28,39,40,46],regroup:15,rejoic:[37,46],rejoin:[37,46],rel:[7,46],relai:[37,38,46],relat:[4,7,8,15,34,35,36,37,38,39,45,46],relationship:[7,8,38],relax:[35,37,46],releas:[4,7,35,37,38,46],relentlessli:46,relev:35,reli:[15,35,46],reliabl:46,reliev:[12,39],religi:4,relinquish:46,reload:15,reluct:40,remain:[15,35,43,46],remark:[4,15],remedi:[],rememb:[4,15,35,36,37,38,39,41,43,46],remidi:7,remind:[7,15,42,46],reminder_pattern_needed_1:35,reminder_pattern_needed_2:35,remov:[15,28,34,35,37,39,40,45,46],renam:45,render:[15,38],rendit:36,reorgan:15,repeat:[7,10,35,37,38,39,43,45,46],repeatedli:36,repetit:[15,46],replac:[14,15,34,37,39,40,42,46],replic:[14,39,40],repo:2,report:[35,37,39,46],repost:[12,39],repres:[7,8,14,15,35,36,37,39,40,43,46],represent:38,reproduc:46,request:[0,35,39,46],requir:[5,8,15,32,35,36,37,38,39,42,43,45,46],reset:39,resetchart:43,resettact:15,resist:15,resolut:15,resourc:[4,15,37],respect:[15,46],respond:[7,15,16,32,36,37,39,40,43,45,46],respons:[15,35,37,39,43,46],rest:[15,34,35,36,37,39,43],restart:0,restor:43,restructuredtext:46,resubscrib:34,result:[15,16,27,28,34,35,36,37,39,40,43,45,46],resulting_funct:45,resurrect:43,ret_sup:5,ret_super_sub:5,ret_zz:5,retir:4,retreat:[15,16],retreat_ready_war:15,retreat_ready_war_cri:[15,16],retreat_war_cri:[15,16],return_st:[35,39,46],return_statu:[9,15,16,24,25,32,35,37,39,40,41,43,45,46],returncod:5,returnstatussourc:1,reus:35,reusabl:35,reveal:[4,15,39,41],rever:[37,46],revis:42,rewind:43,rich:[4,46],richard:44,richest:4,richli:[],rid:46,ride:[15,32],right:[4,7,15,34,35,37,38,41,45,46],right_wal:[],rightfulli:38,rigid:35,rigor:[4,15,46],ring:[7,26,35,39,40,46],risk:15,ritual:[37,46],robust:[15,33,34],roll:[37,38,39],roman:[],ronach:7,room:[26,38,39,40],root:[],rosetta:[37,46],rotat:[15,35],rough:46,roughli:[4,46],round:[37,39,46],rout:[15,34,42],routin:[8,35,45],routing_kei:34,row:45,row_to_check:[],rpc:42,rtc:[0,4,7,8,26,35,37,38,39,40,43,46],rubbl:[],rubi:46,rule:[4,7,15,32,33,37,38,43,46],rule_30:[],rule_30_black_walls_200_gener:[],rule_30_white_walls_100_generations_width_30:[],rule_30_white_walls_200_gener:[],rulebook:37,run:[0,3,4,7,8,9,14,15,23,24,26,27,28,32,33,34,35,36,37,38,39,40,42,43,45,46],run_anim:[],run_ev:0,runtim:39,rush:[],ruthlessli:41,rx_routing_kei:15,s11:[3,41],s11_state:41,s1_state:41,s211:3,s21:[3,8,41],s21_state:[24,39,41],s2_state:[24,39,41],s_state:[24,39,41],safe:[4,15,35,38,41,46],safeti:[15,39],sai:[4,15,35,36,37,38,39,43,45,46],said:[35,37,43,46],sake:39,salari:4,salt:36,same:[0,3,4,5,6,8,10,11,15,25,28,33,34,35,36,37,38,39,40,41,42,43,45,46],samek:[4,7,8,15,33,35,36,37,38,41,45,46],sampl:[35,46],sandwich:[],satisfact:[37,41,46],satisfi:46,saturn:4,save:[10,15,35,36,37,39,40,42],savefig:[],saw:[15,39,43],scaffold:46,scalabl:42,scale:35,scan:[15,38,43],scare:[15,16],scenario:[37,46],scene:[37,46],scheme:[15,35,39],scienc:[35,38],scientif:[41,44],scimitar:[15,16],scipi:[],scope:34,score:4,scotti:42,scrambl:46,scratch:15,screen:[3,15,27,34,39,40,46],scribbl:[7,15,16,24,32,35,41,43,46],script:[34,42],scroll:[37,46],sculpt:15,search:[7,8,11,30,35,36,37,38,39,43,45,46],search_for_super_sign:[25,26,27,32,34,35,36,37,39,40,41,43,45,46],season:15,sec:[15,16],second:[7,11,15,16,29,35,36,37,39,40,41,45,46],secondari:7,secondli:46,secret:[15,37,42,46],secretli:35,section:[3,6,15,36,37,38,39,42,43,45,46],secur:[15,42],see:[0,3,4,5,7,13,14,15,24,25,29,32,33,34,35,36,37,38,40,42,43,45,46],seed:35,seek:41,seem:[4,15,34,35,37,39,43,45,46],seemingli:[],seen:[5,7,15,35,37,38,39,42,43,46],select:[14,39,40,46],self:[5,8,9,15,16,34,35,36,38,39,42,46],selfpayingtoasteroven:[9,37],semant:[35,36],semaphor:4,semblanc:15,send:[3,5,7,14,15,35,36,37,38,39,40,41,42,43,45,46],senior:[15,16],senior_advance_war_cri:[15,16],senior_retreat_war_cri:15,senior_skirmish_war_cri:[15,16],sens:[15,34,36,38,39,40,41,42,43,46],senseless:36,sensibl:15,sensit:[],sensor:[15,35,37],sent:[7,15,32,34,35,36,37,39,43,46],sentenc:[15,38,46],separ:[4,15,33,34,35,36,37,38,39,46],seper:7,sequenc:[7,8,14,15,29,32,34,35,40,41,46],sequence_diagram:38,seri:43,serial:5,seriou:[4,46],serious:4,serv:[15,39,46],server:[34,35,42,46],servic:[4,7],session:[27,39,40],set:[0,7,8,10,15,35,36,37,39,46],set_arrai:[],set_aspect:[],set_ticks_posit:[],set_titl:[],set_trac:[27,39,40],set_xticklabel:[],set_yticklabel:[],settl:[7,8,11,15,35,37,39,43,46],setup:[15,42],seventi:[],sever:[39,40],shadow:8,shake:46,shallow:46,shalt:43,shape:45,share:[4,7,8,15,25,32,33,35,36,37,38,39,40,46],she:[37,46],sheet:[15,37],shelf:35,shell:[15,42],shelv:35,shift:[26,37,39,40,46],shine:35,ship:[15,46],shoot:[15,38,45,46],shop:46,shortcode1:[],shortcode2:[],shorten:[],shorter:15,shorthand:[15,38,41,46],shortli:[35,37,42],shot:[7,10,11,15,16,35],should:[4,5,7,10,11,15,28,32,33,34,35,36,37,38,39,40,42,43,45,46],shoulder:[37,46],shouldn:[28,38,39,40,46],shout:15,show:[0,7,15,32,33,34,35,36,37,38,39,42,43,45,46],shown:[3,4,46],shrink:38,shut:[34,43,46],shutdown:40,side:[4,15,37,38,46],signal:[0,1,3,7,8,9,10,11,12,15,16,24,25,26,29,32,34,35,36,37,38,41,43,45,46],signal_callback:[7,45],signal_nam:[0,5,25,38,39,40],signal_numb:[25,39,40],signal_that_is_def:[12,39],signalsourc:[1,25,39,40],signatur:[34,36,37,39,45,46],signifi:38,signific:15,significantli:[4,34],silo:[],similar:[15,35,37,39,45,46],similarli:35,simpl:[6,14,15,17,26,33,34,35,37,38,39,40,42,44,45],simpleacyncexampl:39,simpleasyncexampl:39,simpler:[15,39],simpli:[4,35,38],simplic:[14,35,39,40],simplif:15,simplifi:[4,35,37,38,46],simul:[35,46],sinc:[4,5,8,11,14,15,26,32,33,34,35,36,37,38,39,40,41,42,43,44,46],singl:[6,15,35,36,39,46],singleton:[0,7,25,39,40],sissi:39,sisyphean:38,sit:[7,15,46],site:[8,42],situat:[12,15,24,35,39,41,46],sixti:15,size:[35,37,46],sketch:[7,15,28,39,40],skill:15,skip:[15,34,35,39,43],skirmish:[15,16],skirmish_ammunition_low:[15,16],skirmish_entri:[15,16],skirmish_exit:[15,16],skirmish_officer_lur:[15,16],skirmish_other_squirmish_war_cri:[15,16],skirmish_retreat_ready_war_cri:[15,16],skirmish_second:[15,16],skirmish_senior_squirmish_war_cri:[15,16],skirmish_war_cri:[15,16],sky:[37,46],slai:15,slam:35,slaughter:15,sleep:[9,15,32,34,35,36,37,39,41,43,45,46],slide:36,slight:15,slightli:[15,37,38,46],slip:46,slot:35,slow:[15,46],slower:7,slowest_tim:35,slowli:[15,37,46],small:[14,15,33,35,36,37,39,40,41,46],smaller:[15,38,39],smallest:40,smart:15,smarter:15,smear:46,smell:46,smile:[37,46],smurf:15,snail:[],snap:[15,46],snare:15,snippet:[15,36,46],snoop:15,snoop_kei:15,snoop_scribbl:15,snoop_spy_encryption_kei:15,snoop_trace_encryption_kei:15,snow:39,social:[15,44],societi:46,sock_dgram:34,socket:34,softwar:[4,7,15,32,33,35,37,38,39,42,45,46],soil:37,soldier:15,solid:38,solipsist:[37,46],solo:[],solut:[15,35],solv:[7,34,35,37,38,39,45],some:[4,7,11,14,25,32,33,35,36,37,38,39,40,41,43,44,45,46],some_event_the_system_has_never_seen:46,some_example_st:[25,39,40],some_st:46,some_state_funct:[37,46],some_state_to_prove_this_work:46,somebodi:36,somehow:[15,37,46],someon:[15,32,35,36,37,39,40,46],someth:[0,4,7,15,25,28,33,34,35,36,37,38,40,41,42,43,45,46],something_els:39,sometim:[8,15,16,37,46],somewai:37,somewhat:34,somewher:15,soon:[15,34,35],sorri:4,sort:[15,32,35,36,38,39],sound:[36,46],sourc:[2,7,8,14,15,36,37,38,40,41,42,46],source_st:38,space:[8,15,35,36,37,39,46],span:[34,46],spare:39,spawn:46,speak:[7,11,36,39],spec:[17,18,19,20,21,22,35,37,38,46],special:[3,15,32,35,36,37,43,46],specif:[14,15,26,27,28,33,35,36,37,38,40,41,43],specifi:[0,35,38,39,46],speed:[4,15,35,39],spell:45,spend:[4,15,38,46],spent:[4,15,33],sphere:35,spike:[37,46],spirit:[37,46],spit:34,split:[15,43,46],spoil:15,spooki:[],sporat:35,spot:[7,15,26,39,40,46],spread:15,spreadsheet:15,sprei:[4,32],sprinkler:37,spruce:34,spy:[0,3,7,15,23,24,26,27,32,35,36,37,41,43,45,46],spy_callback:34,spy_ful:[36,43],spy_lin:46,spy_liv:34,spy_of_trac:46,spy_on:[3,9,10,11,13,15,16,24,35,36,37,39,40,41,43,45,46],spy_on_buzz:46,spy_on_heater_off:46,spy_on_heater_on:46,spy_on_light_off:46,spy_on_light_on:46,spy_or_trac:46,spy_queue_nam:34,spy_result:34,squar:[29,35,39,40,41],squirrel:43,squish:[],src:[],ssh:42,stabil:[37,46],stabl:46,stack:34,stadium:37,staff:4,stage:[12,15,35,37,39,46],stai:[15,35,37,38,39,46],stair:[37,46],staircas:[37,46],stamp:[29,35,39,40,46],stand:[37,43,45,46],standard:[14,31,33,34,38,39,40],star:[35,37,38,46],stare:[],start:[0,7,8,9,15,16,26,27,29,30,32,33,34,35,36,39,40,41,43,45,46],start_at:[0,8,9,14,15,16,28,29,32,34,35,36,37,39,40,41,43,45,46],start_consum:34,start_thread_if_not_run:0,start_tim:46,startchart:[12,39],starting_st:35,starting_state_funct:8,startup:[37,46],starvat:4,stash:[15,16],statchart:7,statchmachin:46,state:[0,3,4,5,7,8,9,10,11,12,13,14,15,16,24,26,29,32,33,34,35,36,37,43,46],state_chart_object:46,state_fn:[13,39,40],state_method_nam:39,state_method_templ:[7,39,45],state_nam:[0,13,15,16,39,40,46],state_return:5,state_to_transition_to:39,statecchart:[],statechart:[0,3,4,5,6,7,8,9,11,13,14,15,23,24,28,33,35,36,37,40,41,43,46],statechart_object:37,statehandl:39,stateless:39,statemachin:[3,23,34,37,38,39,46],statement:[3,15,37,39,43,46],statemethod:[13,39,40],staticmethod:[34,38,39,46],statu:[9,10,11,15,16,24,25,32,34,35,36,37,39,40,41,43,45,46],steadi:35,steam:35,step:[7,8,15,35,36,37,38,40,41,42,46],stephen:[],stick:[15,46],still:[0,4,15,35,36,38,41,45,46],stimul:[7,43],stimulu:35,stitch:[],stochast:35,stock:[37,38],stone:[37,46],stop:[0,7,15,16,34,35,36,37,38,39,43,46],stop_active_object:0,stop_consum:34,stop_fabr:[],store:[4,34,35,36,37,39],stori:[4,14,15,27,36,39,40,43],str:[15,16,25,35,39,40,46],straight:[33,39],straightforward:[34,35,37,42],strand:15,strang:[15,36,37,39,41,45,46],strateg:15,strategi:[4,15,34,36,37,39],straw:15,stream:[3,5,15,34,46],stretch:[],strftime:[35,39,46],strike:35,string:[5,7,8,13,25,28,34,35,37,38,39,40,45,46],strip:[15,28,37,39,40,46],strip_trac:34,stripped_spec:37,stripped_target:[15,28,39,40,46],stripped_trace_result:[15,28,37,39,40,46],stroke:15,strong:15,strongli:[4,35],structur:[1,7,15,32,33,35,36,37,41,42,43,45,46],struggl:36,stub:[],studi:[15,37,46],studio:37,stuff:[37,39,46],stupid:15,stupidli:15,style:[7,39,46],sub:[0,34,37,42],sub_row_to_check:[],subclass:[5,35,38,46],subject:[],suboptim:35,subordin:15,subplot:[],subscrib:[0,4,7,15,32,34,38,42],subscribing_ao:39,subscript:[0,7,15,39],subservi:[37,46],subset:[4,7,15],substat:[7,8,15,35],subsystem:46,subtl:[35,39],subvers:46,succe:[37,42],succeed:34,success:[4,35],successfulli:15,suck:15,sudo:42,suffici:15,suffix:[],suggest:[37,39],suicid:[],suit:[37,46],sum:15,summar:[34,40,43],summari:43,sunk:38,sunni:39,superior:15,supernatur:[37,46],superst:[7,35,46],suppli:15,support:[0,8,14,34,35,37,38,39,40,42,46],suppos:[14,15,29,35,37,39,40,41,45,46],sure:[15,16,34,35,38,39,45,46],surpris:[35,44,45,46],surround:[4,15],surviv:[15,37],suspens:46,sustain:15,svg:39,swap:4,swarm:15,swell:[],swing:[15,35],symmetr:15,synchron:[15,35,39],synonym:7,syntact:[15,35],syntax:[25,33,35,36,39,40,42,45],synthes:39,system:[4,5,6,7,8,11,14,26,27,32,33,35,36,37,38,40,42,43,45,46],t_question:41,tabl:39,tack:37,tactic:16,tag:[37,46],tail:[26,35,39,40,43],taint:38,take:[0,4,7,15,34,35,36,37,39,41,43,46],takeawai:[],taken:[7,15],taleb:[32,41],talk:[4,15,35,36,37,38,39,40,42,46],tar:4,tara:[37,46],target:[7,8,11,15,27,28,35,37,40,41,46],target_st:38,targetandtolerancespec:46,tart_at:[14,39,40],task:[0,4,15,39,43,46],task_ev:0,tatechart:[],taught:4,taxat:15,tazor:[14,27,28,29,36,39,40],tazor_oper:[27,36,39,40],tc1:45,tc2:45,tc2_s1:39,tc2_s2:39,tc2_s3:39,teach:4,team:[15,32,34,38,40],teammat:[15,40],tear:46,technic:[4,37,41,46],techniqu:[0,7,15,34,35,37,39,46],technolog:[4,33,34,37,38,46],tediou:46,tell:[4,8,14,15,27,33,35,36,37,39,40,42,43,46],tem:46,temp:[8,9,10,11,15,16,24,35,36,37,39,41,43,45,46],temperatur:[7,35,37,46],templat:[7,38,42],temporari:[5,40,46],tempt:[15,46],ten:[15,42],tend:38,tension:[37,46],term:[7,26,39,40,46],termin:[3,14,26,34,35,36,37,39,40,45,46],terminolog:[34,37,38],terrac:[37,46],terrain:15,terribl:15,test:[0,4,8,9,14,15,27,28,30,31,33,34,35,41,42],test_baking_buzz_one_shot_tim:46,test_buzz_ev:46,test_buzz_tim:46,test_toaster_buzz_one_shot_tim:46,test_typ:46,testabl:46,text:[4,7,14,38,39,40,46],textil:[],than:[4,7,9,14,15,16,23,32,34,35,36,37,39,40,45,46],thankfulli:[15,46],thei:[3,4,7,8,11,14,15,16,32,33,34,35,36,37,38,39,40,41,42,43,45,46],theirs:15,them:[4,5,7,8,10,11,15,16,32,33,34,35,36,37,38,39,41,42,43,45,46],theme:46,themselv:[7,15,16,34,37,38,39,46],theo:[37,46],theoret:[],theori:[15,33,41,44],therebi:[7,15,34],therefor:[15,36],thi:[0,2,3,4,5,7,8,9,10,11,12,13,14,15,16,25,26,27,28,29,32,33,34,35,36,37,38,39,40,41,42,43,45,46],thickest:[],thiel:46,thin:[],thing:[4,5,7,8,12,14,15,27,34,35,36,37,38,39,40,41,42,45,46],thing_subscribing_ao_cares_about:39,think:[11,15,25,33,34,35,36,37,38,39,40,41,42,43,46],thinner:[],thinnest:[],third:[15,35],thirti:[],thoma:38,those:[7,15,32,36,38,45,46],thou:43,though:[7,11,15,36,37,39,42,43,45,46],thought:[15,16,35,37,39,46],thread:[0,3,4,7,9,15,32,33,34,35,36,37,38,39,41,43,45,46],thread_runner_fifo:0,thread_runner_lifo:0,thread_safe_queu:39,threadsaf:39,thredo:46,three:[15,35,36,37,39,42,43,45,46],three_puls:[10,39],threshold:[35,38],throb:[37,46],throe:7,through:[4,5,7,8,14,15,28,33,34,35,36,37,40,41,42,43,45,46],throughput:15,thrown:40,tick:[15,16],ticket:37,tie:[15,35,36,46],tied:[7,15,41],ties:37,tight:[33,46],tight_layout:[],tighten:41,tightli:[27,39,40,46],till:37,timat:7,time:[0,3,4,7,9,10,11,15,16,28,32,33,34,35,36,37,38,40,41,43,45],time_1:46,time_1_str:46,time_2:46,time_2_str:46,time_compress:[15,16],time_differ:46,time_in_sec:46,time_in_second:[15,16],time_keep:8,time_out:35,timeout:34,timeout_callback:34,timer:[34,37,46],timestamp:[28,39,40,43,46],timestamp_str:46,tini:[4,41,46],tip:43,titl:[4,8,36,41,46],to_b1:39,to_cod:[7,15,39,45],to_method:[15,16,32,34,35,39,45],to_tim:[15,16],toast:[9,35,37,46],toast_tim:46,toast_time_in_sec:46,toaster:[9,35,38],toaster_142x5:37,toaster_:[9,37],toaster_baking_to_toast_spec:37,toaster_off_to_baking_trace_spec:37,toaster_oven:38,toaster_oven_1:46,toaster_oven_2:46,toasteroven:[35,38,46],toasterovenmock:46,toasting_buzz_test_spec:46,toasting_entri:35,toasting_time_m:46,toateroven:[38,46],todai:15,togeth:[14,15,33,38,39,40,44,46],toggl:46,told:[37,46],toler:[15,46],toleranc:46,tolern:46,tolernance_in_m:46,tonsil:46,too:[0,7,8,14,15,33,34,35,36,37,38,39,40,41,45,46],took:[15,32,37,43,46],tool:[4,7,15,32,33,34,37,38,39,40,42,46],top:[0,6,7,8,9,14,15,16,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],top_bound:46,topic:[15,42],topolog:[8,32,35,36,37,38,39,45,46],topology_a:8,topology_h:8,total:41,totalitarian:35,touch:[4,37,39,46],toward:[8,15,35,37,46],tpath:8,trace:[0,3,7,14,15,23,27,28,29,32,35,36,37,38,43,46],trace_callback:34,trace_l:34,trace_lin:46,trace_queue_nam:34,trace_result:34,trace_target:46,trace_through_all_st:46,track:[15,16,34,35,37,38,39,40,43,46],tracker:39,trade:[35,36,37,38,45,46],tradit:[4,15,36,46],traffic:15,train:[15,39],tran:[7,8,9,10,11,15,16,24,32,34,35,36,37,39,41,43,45,46],tranduc:35,trans_:8,trans_to_c2_s1:39,trans_to_c2_s2:39,trans_to_c2_s3:39,trans_to_fb11:32,trans_to_fb1:32,trans_to_fb:32,trans_to_fc1:[32,39,45],trans_to_fc2:[32,39,45],trans_to_fc:[32,39,45],trans_to_tc1:45,trans_to_tc2:45,trans_to_tc:45,transact:40,transduc:[7,15,35],transfer:[35,36,39,41],transform:[],transit:[0,3,7,8,10,11,15,16,29,32,36,37,38,40,41,43,45,46],transitori:46,translat:[33,35,37,40,46],transmit:[15,34,42],transpar:37,transpir:[37,46],travel:[],travers:36,treat:[8,38,39,46],tremend:15,tri:[7,15,33,35,39,45,46],trial:35,triangl:[],tribe:36,trick:15,tricki:[37,38],trickl:39,trigger:[7,8,15,16,35,36,37,38,41,45,46],trigger_pul:36,trip:15,trivial:[15,32,39,46],troop:15,troubl:[4,15,36,38,45],troubleshoot:[3,33,37],troublesom:4,truck:35,truli:15,trust:[15,46],truth:15,tube:[],tunabl:[35,46],tune:[15,35],tupl:38,turbin:35,turn:[4,5,7,9,14,15,28,32,33,35,36,37,39,40,41,42,43,45,46],tutori:[34,42],twain:15,tweak:[15,39],twice:46,two:[0,3,4,7,12,14,15,34,35,36,37,38,39,40,41,42,43,45,46],twodcellularautomatawithanglediscoveri:[],twodcellularautonomata:[],tx_routing_kei:15,type:[3,5,10,15,29,32,33,35,37,39,40,42,43,45,46],typic:[0,15,32,38,39,46],u3uc:[15,34],ubuntu:[],ugli:46,ultim:[3,7,36,37,38,43,46],ultimate_hook_exampl:35,ultisnip:46,uml:[4,7,14,15,32,33,34,35,37,38,39,40,41,46],umlet:[14,15,33,38,39,40],umletino:39,uncom:[27,39,40],uncomfort:[37,46],undefin:[39,46],under:[4,15,42,46],underl:[37,46],underli:[7,46],understand:[7,8,15,26,32,33,35,36,37,38,39,40,41,43,44,45,46],understood:[],underworld:[37,46],unexcept:15,unexpect:15,unfamiliar:41,unfold:15,unforeseen:15,unfortun:[4,38],ungodli:4,unhandl:[5,9,10,11,15,16,24,32,35,36,37,38,39,41,43,45,46],unhanld:[25,39,40],unifi:38,uniform:35,uniqu:[5,15,29,39,40,45,46],unison:[15,34,35],unit:[4,7,14,16,35,39,40,46],univers:[7,15,33,37,44,46],unives:[],unless:[7,15],unlik:[4,7,15,36,37,44,46],unlink:15,unload:36,unlock:38,unmanag:7,unnecessari:[10,39],unneed:46,unorgan:15,unpredict:35,unprocess:39,unprotect:[4,15],unreason:[],unreli:[],unrespons:[37,46],unseen:5,unstabl:43,unstart:[],unsupport:44,unsuspect:36,untest:46,until:[4,7,8,15,34,35,36,37,38,39,43,46],unus:46,unusu:15,unwind:[6,7,39,40],upcom:46,updat:[14,15,28,39,40,46],update_angl:[],upon:[4,7,12,15,16,25,31,32,33,35,36,37,38,39,40,43,45,46],upper:[15,46],upward:[],usag:46,use:[0,4,7,10,11,14,15,24,25,26,28,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],used:[0,2,4,5,7,8,9,10,11,14,15,29,34,35,36,37,38,39,40,41,42,43,45,46],useful:[8,10,15,33,34,35,36,37,38,39,46],useless:46,uselessli:15,user:[0,7,34,35,36,37,39,40,42,43,46],uses:[0,3,5,7,15,33,35,36,37,38,39,42,45,46],using:[0,3,4,5,7,8,14,15,26,28,29,32,33,34,35,36,37,38,39,40,42,43,45,46],usual:[39,46],util:[14,39,40],uuid5:0,uuid:0,vain:4,valid:8,valour:15,valu:[5,7,15,25,35,39,40,46],valuabl:[37,46],vantag:[15,37,46],variabl:[4,7,8,15,28,32,35,36,37,38,39,40,42,43,46],varient:37,varieti:34,variou:[7,15,36,37,39,43,46],veer:15,veloc:[],vent:39,venv:46,veri:[0,4,14,15,26,29,32,35,36,37,38,39,40,41,43,45,46],verifi:[35,46],vers:40,version:[3,34,37,39,42,45,46],versu:46,vertic:[39,46],vestigi:46,via:[35,37,42,46],victim:36,victori:[4,15],video:[15,39],videoid:[],view:[4,7,15,33,34,35,36,37,38,41,43,44,46],vigil:15,vim:[32,39,46],virtual:[],visibl:[38,39],visio:40,vision:[15,32],visit:39,visual:[32,37,46],vitamin:38,vnc:[],voic:15,voltag:[36,46],voodoo:15,vortex:35,wai:[0,4,7,10,12,15,16,32,33,34,35,36,37,38,39,40,41,42,43,45,46],waist:4,wait:[0,4,9,10,15,16,34,35,36,37,38,39,41,43,46],waitcomplet:43,waiting_to_adv:[15,16],waiting_to_lur:[15,16],wake:[7,35,37,46],walk:[35,37,45,46],walker:46,wall_cl:[],wallleftblackrightblack:[],wallleftblackrightwhit:[],wallleftwhiterightblack:[],wallleftwhiterightwhit:[],want:[8,11,12,15,25,26,28,33,34,35,36,37,38,39,40,42,43,45,46],war:[4,15,16],warbot:15,ward:45,warhors:15,warn:[37,46],wasn:[15,27,35,37,39,40,43,46],wast:[7,15,35,36,37,40,46],watch:[0,4,15,34,36,37,43,45,46],watch_external_weather_api:39,watch_external_weather_api_entri:39,watch_external_weather_api_weather_report:39,water:[15,16],wave:[15,35,46],weak:15,weaken:15,weapon:[4,15,32],wear:15,weather:[37,39],weather_read:39,weather_report:39,weather_track:39,weatherreport:39,weav:15,web:[42,46],websit:42,weekend:38,weigh:4,weight:[4,32],weirder:39,well:[0,4,5,8,15,33,36,37,38,41,42,45,46],went:[33,42],wenzel:42,were:[0,3,4,7,15,28,33,34,35,36,37,39,40,43,45,46],weren:[4,15,45,46],western:15,what:[4,7,8,13,15,26,27,28,29,32,33,34,35,36,37,38,41,42,43,44,45,46],whatev:[15,33,38,39,41,42,46],whatever_name_you_w:46,when:[3,4,7,8,10,12,14,15,16,26,27,28,32,34,35,36,37,38,40,41,42,43,45,46],whenev:35,where:[0,4,7,8,12,15,23,32,34,35,36,37,38,39,42,43,46],wherea:40,wherev:[37,46],whether:[45,46],which:[0,4,5,7,8,12,14,15,25,26,27,28,32,34,35,36,37,38,39,40,41,42,43,45,46],whichev:35,whine:36,whisper:[37,46],white:[9,37,46],white_light_off:[9,37],white_light_on:[9,37],white_mask:[],who:[4,7,15,33,34,35,36,37,38,39,40,45,46],whole:[4,15,25,34,36,37,39,40,46],whose:15,why:[14,15,32,33,35,37,38,39,40,43,44,46],wide:[],widget:38,width:[],wiki:35,wikipedia:46,willing:15,wilt:[],win:4,window:[15,23,34,46],wipe:[],wire:[15,34,37],within:[0,3,4,5,7,8,11,15,16,24,32,33,34,35,36,37,38,39,40,41,43,45,46],without:[4,7,14,15,26,33,35,37,38,39,40,45,46],woke:43,wolfram:[],won:[4,10,12,33,35,36,37,38,39,40,46],wonder:35,word:[4,7,15,37,40,42,46],work2:39,work:[0,3,4,7,8,9,12,13,14,15,28,32,33,34,35,36,37,38,40,42,43,44,45,46],worker1:39,worker2:39,worker:[4,9,37,38,46],workflow:15,world:[4,7,12,15,33,35,37,38,39,42,43,46],worri:[36,37,39,43,45,46],wors:[4,15,39],worst:[15,46],worth:[15,33,35,45],worthwhil:46,would:[0,4,7,8,10,11,12,14,15,25,26,27,28,29,32,33,34,35,36,37,38,39,40,41,43,44,45,46],wouldn:[15,36,37,39,41,45,46],wound:[15,16],wrap:[5,8,13,15,16,34,37,38,39,40,45,46],wrapper:8,wrestl:[15,42,45],write:[3,4,7,14,15,26,27,32,33,34,35,36,37,38,39,40,42,43,46],written:[3,4,7,8,15,32,33,34,35,36,37,38,39,42,45,46],wrong:[8,15,33,36,45],wrote:[4,15,34,35,36,41,42,45,46],wta_entri:[15,16],wta_exit:[15,16],wtl_entri:[15,16],wtl_exit:[15,16],wtl_second:[15,16],www:[],x15:46,x_px:38,xaxi:[],xml:7,xor:[],y_px:38,yaml:7,yaxi:[],year:4,yell:[15,16,46],yellow:[],yes:[15,38,46],yet:[4,7,11,14,15,35,36,37,38,39,40,41,45,46],yield:35,yml:[7,42],you:[0,2,3,4,5,7,8,10,11,12,13,14,15,24,25,26,27,28,29,32,33,34,35,36,37,38,40,41,42,43,44,45,46],your:[0,3,4,5,6,7,8,10,11,12,13,14,24,25,26,27,28,29,32,33,34,35,36,37,38,41,42,43,44,45,46],your_parent_state_method:39,your_signal_nam:39,your_state_method_nam:39,yourself:[7,15,35,36,38,39,44,45],youtub:39,z_px:38,z_pz:38,zap:36,zero:[4,15,17,30,35,37],zero_to_on:[6,17,18,19,20,21,22,38,46],zeromq:46,zip:[15,28,37,39,40,46],zoologi:4,zoom:39,zuvk:[]},titles:["Active Object","Architecture","Cellular Automata","Comprehensive","Concurrency: the Good Parts","Events","Examples","Glossary","Hsm","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","Mongol Horse Archer","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","Python Statecharts","Installation","Interacting Statecharts (Same Machine)","Introduction","Spy and Trace Across a Network","Patterns","Simple Posting Example","Quick Start","Diagrams","Recipes","Reflection","Hacking to Learn","Setting Up RabbitMQ","Active Object Example","Testing","Using and Unwinding a Factory","Zero To One"],titleterms:{"abstract":46,"catch":39,"class":[34,38,39,45],"final":38,"function":[34,41],"import":[34,41],Adding:39,And:39,For:15,Going:39,Has:39,One:[39,46],The:[15,34,37,40],Using:[39,40,45],abil:34,about:38,across:34,activ:[0,39,43],add:[34,39,41],analog:37,anoth:39,ansibl:42,answer:41,anyth:41,approach:45,archer:15,architectur:1,arrow:38,attach:[15,38],augment:39,automata:2,basic:[42,46],behavior:40,better:41,boiler:[34,39],build:15,callback:[34,45],can:34,cancel:39,canva:[],cellular:2,challeng:41,chart:40,close:34,code:[34,37,39,41,46],common:41,compon:35,comprehens:3,concurr:4,connect:34,construct:38,consum:34,context:[15,34],count:34,creat:[34,39,45],current:39,deceit:15,decrypt:34,deep:38,defer:[35,39],describ:39,descript:40,design:[15,34,37,40,46],detail:[15,38,40],determin:39,diagram:[38,39],docstr:34,doe:39,draw:[34,39],dynam:37,els:38,embed:37,enter:39,entropi:[],event:[5,34,35,38,39,41,45,46],exampl:[6,15,32,34,36,43,45,46],exit:39,experienc:37,explain:40,extend:38,extrem:40,fabric:0,factori:[39,45],fall:38,feder:38,fifo:39,first:[15,41],flat:39,foreignhsm:34,frame:41,from:[39,40],game:37,gener:[],get:[34,39],glossari:7,good:4,guard:[39,41],hack:41,hardwar:46,have:[34,39,40],hiearchi:41,high:[38,40],highlevel:[],hint:[37,46],histor:15,histori:[35,38,46],hook:[35,39,46],hors:15,horseman:15,how:[39,40],hsm:[8,34],hypothesi:41,icon:38,indic:30,inform:[34,39],inherit:38,init:41,initi:39,insid:39,instal:[31,42],instrument:[3,37],interact:32,intern:41,introduct:33,iter:46,its:[15,34],learn:[41,42],level:[38,40],librari:34,lifo:39,link:34,linux:42,live:[39,40],log:34,machin:32,make:[34,41],mechan:37,medium:38,mesh:15,messag:[34,42],method:[39,45],mind:15,miro:38,mistak:41,model:15,modul:5,mongol:15,multi:[39,46],multichart:35,multipl:39,multishot:39,name:39,need:[],network:[15,34,42],newbi:37,noth:[],number:[],object:[0,34,39,43],off:34,one:46,onedcellularautomata:[],organ:15,orthogon:35,other:[39,40,41],our:[15,34,41],output:[34,40],oven:[37,46],overview:15,pai:37,parent:39,part:4,partial:41,pass:39,pattern:[35,42],payload:[38,39,46],pend:35,phenomenon:[],pictur:41,plate:[34,39],point:38,post:[36,39],processor:38,produc:34,program:[15,34],proof:46,pub:38,publish:[38,39],python:30,question:[41,46],quick:37,rabbitmq:[34,42],race:35,random:[],react:34,recal:39,recip:39,reflect:40,regist:45,releas:39,remind:35,requir:[34,41],returnstatussourc:5,rule30:[],rule:[],run:41,same:32,scott:[37,46],scribbl:39,see:[39,41],self:37,send:34,sequenc:[38,39],set:[34,42],setup:46,shot:[39,46],shutdown:34,signal:[5,39,40],signalsourc:5,simpl:[32,36,46],sketch:[],small:[],some:[15,34],someth:39,sourc:39,specif:[34,39,45,46],spy:[34,39,40],standard:45,start:37,state:[38,39,40,41,45],statechart:[30,32,34,38,39,45],statemachin:[],stori:[37,46],structur:[38,39],sub:38,subscrib:39,subscript:38,subsect:[],summari:45,system:[15,39],tabl:30,tactic:15,target:39,technic:15,templat:[39,45],termin:38,test:[37,39,40,44,46],thought:40,through:[38,39],time:[39,46],titl:[],toaster:[37,46],trace:[34,39,40],transit:[35,39],turn:34,twodcellularautomata:[],ultim:35,unit:15,unwind:45,view:40,visual:[],volk:[37,46],wall:[],warn:38,what:[39,40],when:39,why:45,window:42,work:[39,41],write:45,you:39,your:[15,39,40],zero:46}}) \ No newline at end of file +Search.setIndex({docnames:["activeobject","architecture","cellular_automata","comprehensive","concurrency_essay","event","examples","glossary","hsm","i_bitcoin_miner_toaster_oven","i_create_a_multishot","i_create_a_one_shot","i_defer_and_recall","i_determining_the_current_state","i_making_sequence_diagrams_from_trace","i_mongol_example","i_mongol_with_empathy_code_listing","i_navigation_1","i_navigation_2","i_navigation_3","i_navigation_4","i_navigation_5","i_navigation_6","i_networking_instrumentation_file_table","i_scribble_on_the_spy","i_seeing_your_signals","i_spy_reactive","i_test_with_spy","i_test_with_trace","i_trace_reactive","index","installation","interactingcharts","introduction","networked_instrumentation","patterns","postingexample","quickstart","reading_diagrams","recipes","reflection","scribbleexample","setting_up_rabbit_mq","singlechartexample","testing","towardsthefactoryexample","zero_to_one"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:55},filenames:["activeobject.rst","architecture.rst","cellular_automata.rst","comprehensive.rst","concurrency_essay.rst","event.rst","examples.rst","glossary.rst","hsm.rst","i_bitcoin_miner_toaster_oven.rst","i_create_a_multishot.rst","i_create_a_one_shot.rst","i_defer_and_recall.rst","i_determining_the_current_state.rst","i_making_sequence_diagrams_from_trace.rst","i_mongol_example.rst","i_mongol_with_empathy_code_listing.rst","i_navigation_1.rst","i_navigation_2.rst","i_navigation_3.rst","i_navigation_4.rst","i_navigation_5.rst","i_navigation_6.rst","i_networking_instrumentation_file_table.rst","i_scribble_on_the_spy.rst","i_seeing_your_signals.rst","i_spy_reactive.rst","i_test_with_spy.rst","i_test_with_trace.rst","i_trace_reactive.rst","index.rst","installation.rst","interactingcharts.rst","introduction.rst","networked_instrumentation.rst","patterns.rst","postingexample.rst","quickstart.rst","reading_diagrams.rst","recipes.rst","reflection.rst","scribbleexample.rst","setting_up_rabbit_mq.rst","singlechartexample.rst","testing.rst","towardsthefactoryexample.rst","zero_to_one.rst"],objects:{"":{activeobject:[0,0,0,"-"],event:[5,0,0,"-"],hsm:[8,0,0,"-"]},"activeobject.ActiveFabricSource":{clear:[0,3,1,""],publish:[0,3,1,""],start:[0,3,1,""],stop:[0,3,1,""],subscribe:[0,3,1,""],thread_runner_fifo:[0,3,1,""],thread_runner_lifo:[0,3,1,""]},"activeobject.ActiveObject":{append_publish_to_spy:[0,3,1,""],append_subscribe_to_spy:[0,3,1,""],cancel_event:[0,3,1,""],cancel_events:[0,3,1,""],make_unique_name_based_on_start_at_function:[0,3,1,""],run_event:[0,3,1,""],start_thread_if_not_running:[0,3,1,""],stop:[0,3,1,""],trace:[0,3,1,""]},"event.Event":{dumps:[5,4,1,""],has_payload:[5,3,1,""],loads:[5,4,1,""]},"event.SignalSource":{name_for_signal:[5,3,1,""]},"hsm.HsmEventProcessor":{augment:[8,3,1,""],child_state:[8,3,1,""],dispatch:[8,3,1,""],init:[8,3,1,""],is_in:[8,3,1,""],start_at:[8,3,1,""],top:[8,3,1,""],trans:[8,3,1,""],trans_:[8,3,1,""]},activeobject:{ActiveFabric:[0,1,1,""],ActiveFabricSource:[0,2,1,""],ActiveObject:[0,2,1,""]},event:{Event:[5,2,1,""],OrderedDictWithParams:[5,2,1,""],ReturnStatusSource:[5,2,1,""],Signal:[5,1,1,""],SignalSource:[5,2,1,""]},hsm:{HsmEventProcessor:[8,2,1,""]}},objnames:{"0":["py","module","Python module"],"1":["py","attribute","Python attribute"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","staticmethod","Python static method"]},objtypes:{"0":"py:module","1":"py:attribute","2":"py:class","3":"py:method","4":"py:staticmethod"},terms:{"0bmhjf0rke8":[],"100m":[35,46],"13th":15,"142x5zhqemk5lljxgzeitbwpv2oxqpfahj":[9,37],"1980s":[],"1990s":[33,38],"1st":[43,46],"2000s":33,"257m":4,"2nd":[37,38,43,46],"2onedcellularautomata":[],"2twodcellularautomata":[],"33691e":[],"37474f":[],"3nd":43,"3rd":34,"3th":43,"4nd":43,"4th":43,"70s":4,"75c8c":[14,29,36,39,40],"8ahweo_dgs0":[],"90s":[],"95a8c":[14,39,40],"abstract":[15,35,37,45],"break":[4,14,15,35,36,37,39,40,43,45,46],"case":[11,15,36,37,39,43,46],"catch":[7,9,15,16,32,34,35,37,38,45,46],"class":[0,5,6,7,8,9,13,15,16,17,18,19,20,21,22,25,33,35,36,37,40,41,44,46],"default":[0,15,35,39,42,46],"enum":5,"final":[7,8,15,34,35,36,37,43,46],"float":[4,46],"function":[0,3,5,7,8,10,13,32,35,36,37,38,39,40,45,46],"import":[4,9,11,15,16,25,26,27,28,32,35,36,37,38,39,40,43,45,46],"int":[25,39,40,46],"long":[15,32,35,36,37,46],"new":[0,4,5,7,8,15,26,27,28,34,35,36,37,38,39,40,41,42,43,45,46],"public":[42,43],"return":[0,5,7,8,9,10,11,15,16,24,32,34,35,36,37,38,39,41,43,45,46],"short":[15,35,37,38,41,46],"static":[5,15,34,36],"super":[4,8,9,10,11,15,16,24,34,35,36,37,39,41,43,45,46],"switch":[3,35,46],"throw":[14,15,37,38,39,40,46],"true":[0,5,7,8,9,10,11,15,16,34,35,36,37,38,39,40,41,43,46],"try":[4,8,15,34,35,36,37,38,39,41,43,45,46],"var":[],"while":[3,4,7,10,14,15,16,33,34,35,36,37,38,39,40,42,43,45,46],Adding:34,And:[15,16,46],Are:46,Being:[37,46],But:[15,33,34,35,36,37,38,39,40,41,42,45,46],Eve:[37,46],For:[0,5,7,27,34,35,37,38,39,40,43,45,46],Going:37,His:[4,15,46],Its:37,NOT:[0,42,43],Not:[7,37,46],One:[7,15,30,36,37,41],Such:[15,46],That:[4,15,28,32,35,36,37,39,40,41,45,46],The:[0,2,3,4,5,7,8,9,10,11,14,16,25,26,28,29,32,33,35,36,38,39,41,42,43,44,45,46],Their:[4,8,15,45],Then:[4,8,14,15,32,33,35,36,37,38,39,40,41,43,45,46],There:[0,4,7,8,12,15,29,32,34,35,36,37,38,39,40,41,42,46],These:[4,8,15,33,35,37,38,39,42,45,46],Use:[4,34,35,38,46],Used:8,Useful:8,Using:[6,15,37],WLS:[],With:[15,28,36,37,38,39,40,45],Yes:46,__add__:[15,16],__getattr__:[25,39,40],__init__:[5,9,15,16,34,35,37,38,39,46],__main__:[9,15,34,37,39,41,46],__name__:[9,15,34,37,39,41,45,46],__post_ev:0,_decrypt:34,_encrypt:34,_fake_new:35,_fake_news_gener:35,_gener:[],_static:[],_strip_trac:34,a1_entri:39,a1_to_b1:39,a53:46,aa00ff:[],abandon:[38,39],abil:[7,15,33,36,37,46],abl:[7,15,34,35,38,40,46],about:[0,4,7,8,10,11,14,15,26,27,29,33,34,35,36,37,39,40,41,42,43,45,46],abov:[3,8,14,15,28,34,35,36,37,38,39,40,41,42,43,45,46],abs:[],absent:15,absolut:[15,39],acceler:7,acceleromet:[],acceller:[],accept:[34,44],accerer:[],access:[4,7,15,25,26,34,35,37,38,39,40,46],accident:[15,38,45,46],accomod:46,accord:[7,15,37,38],account:[4,9,36,37,46],accumul:[38,46],accur:15,achiev:[4,15],acquisit:35,acronym:[37,46],across:[5,8,15,25,33,35,36,37,39,40,42,45,46],act:[4,8,12,14,15,16,34,35,36,37,38,39,40,46],action:[0,7,8,15,33,36,37,38,41,43,45,46],activ:[1,3,4,6,7,10,14,15,24,26,27,28,29,32,34,35,36,37,38,40,41,45,46],active_object:45,active_object_input_queu:0,activefabr:[0,39,43],activefabricsourc:0,activefactori:38,activeobect:[39,46],activeobject:[0,9,15,35,36,37,38,40,41,43,45,46],actual:[4,7,8,14,15,16,27,29,32,35,37,38,39,40,41,43,45,46],adapt:35,add:[4,5,7,8,11,15,24,32,35,36,38,42,43,46],add_member_if_need:15,add_timeout:34,added:[5,15,34,36,37,39,45,46],adding:[7,15,33,35,37,46],addit:[3,7,15,34,37,38,40,46],address:[15,16,34,37,42,46],adher:[7,15],adjac:8,adjust:[3,14,15,16,34,35,36,39,40,41],admistr:7,advanc:[8,15,16,38],advance_close_enough_for_circl:[15,16],advance_entri:[15,16],advance_exit:[15,16],advance_other_advanced_war_cri:[15,16],advance_senior_advanced_war_cri:[15,16],advance_war_cri:[15,16],advantag:15,adventur:[37,46],advertis:46,advic:46,advis:46,advoc:[],aesthet:[37,46],af_inet:34,affair:15,affect:37,afford:37,after:[3,4,7,15,26,27,33,35,36,37,38,39,40,41,42,43,45,46],afternoon:38,again:[0,8,15,32,35,36,37,39,41,43,45,46],against:[7,15,25,28,34,36,39,40,41,46],agent:15,aggreg:[23,34,35,38],aggress:35,aggression_max:35,agil:15,ago:[],agre:35,agress:35,ahead:[10,39],aim:[8,15],ain:15,air:4,aircraft:4,airforc:[],alan:[33,39],alarm:8,albert:38,alcohol:[37,46],alert:[],alexand:[7,35],algebra:15,algorithm:[7,8,33,35,36,37,38,39,41,45,46],align:[],aliv:15,all:[0,3,4,5,7,8,10,14,15,16,23,26,32,34,35,36,37,38,39,40,42,43,45,46],all_readi:35,alli:[],allow:[3,7,15,33,34,35,36,37,42,43,46],allowfullscreen:[],allur:15,almost:[15,36,38,44,45,46],alon:[15,37,46],along:[38,46],alpha:[],alreadi:[4,8,15,16,35,37,38,42,43,46],also:[3,4,5,7,8,10,14,15,34,35,36,37,38,39,40,41,42,45,46],altan:[15,16],altan_192:15,alter:15,alwai:[4,7,8,15,35,36,37,39,42,46],alzheim:[],ambiti:[35,40],american:4,ammunit:[15,16],ammunition_low:[15,16],amoungst:[],amount:[4,15,26,35,38,39,40,46],amplifi:[36,40],analog:41,analysi:[],analyz:[],ancestor:[8,15,37,46],ancestr:15,anchor:[7,39],angl:7,angle_in_radian:[],angri:15,ani:[0,3,4,5,7,8,11,15,25,34,35,36,37,38,39,40,41,43,44,46],anim:[],annihil:46,annoi:46,announc:[37,46],anoth:[3,4,5,7,8,14,15,16,29,32,34,35,36,37,38,40,41,42,43,45,46],answer:[4,15,37,44,45,46],anti:[38,39,46],anymor:[15,36,37,46],anyon:[15,36,37,40,46],anyth:[4,36,37,38,39,40,45,46],anytim:[7,15,34,35,37,39,43,46],anywai:[37,46],anywher:[15,38,46],ao1:[39,40],ao2:39,aos:[10,36,39],apart:[4,35,46],api:[0,10,11,15,24,34,39,43,45,46],app:[42,46],appear:[15,37,46],append:[0,5,8,15,16,34,39],append_publish_to_spi:0,append_subscribe_to_spi:0,append_to_spi:34,append_to_trac:34,appendix:46,appli:[7,15,37,39,43,46],applic:[4,15,33,37,38,39,45,46],approach:[0,4,7,8,15,35,37,39,41,46],approxim:[],apt:42,arab:4,arbitrari:15,archer:[6,16],architect:[7,15,35],architectur:[15,30,35,36,37,46],area:[4,35],aren:[4,7,15,35,36,37,38,46],arg:[5,8,46],argu:15,argument:[7,8,10,34,36,37,39,43,45,46],aris:[15,35,46],arm:[14,15,27,28,29,33,35,36,39,40,46],armi:15,armin:7,armli:[],armour:15,around:[4,7,15,28,34,35,37,39,40,46],arrai:[8,35,46],arrang:[37,38,46],array_equ:[],arriv:[15,37,38,46],arrow:[7,8,15,16,34,35,36,37,39,41,43,46],art:[34,39,43],artifact:46,artifici:[7,12,35,39],ascii:[7,14,34,39,40,46],ask:[4,15,34,35,36,37,38,39,41,43,44,45,46],aspect:[35,37,39,46],assert:[0,5,8,15,27,28,35,37,39,40,46],assign:[0,8,39,45,46],assimil:[],assist:[14,39,40],associ:[0,36,37,41,46],assort:38,assum:[15,26,35,39,40,41,45],assumpt:35,asychron:[],asymetr:46,asynchron:[4,7,39],asyncio:46,at15:46,atan:[],atom:41,attach:[37,39,43,46],attack:[15,16,41],attempt:38,attent:[3,4,8,14,15,32,35,36,37,38,39,40,43,45,46],attractor:15,attribut:[5,8,9,15,34,35,36,37,38,39,43,46],audienc:[37,38,46],augment:[8,10,35,36,38],augustin:4,aureliu:[],australia:[],author:35,authorized_kei:42,authorizing_author:35,authorizing_entri:35,autist:15,auto:[39,45],autocorrel:[],autodoc:[],autom:42,automat:[15,35,37,39,42,45,46],automata:6,autonom:15,autonoma:[],autoplai:[],avail:[4,38,46],avalanch:15,avion:4,avoid:[4,10,15,36,38,39,40,41,45,46],awai:[14,15,16,33,35,36,38,39,40,43,46],await:[26,39,40],awaken:46,awar:[4,15,37,38,46],awesom:[],awkward:[7,41],axi:46,b11:39,b11_entri:39,b11_inner_most:39,b11_other_inner_most:39,b1_entri:39,b1_exit:39,b1_init:39,b27300:[],b_chart:32,babi:4,back:[2,3,7,8,15,32,34,35,36,37,38,39,41,43,45,46],background:[15,32,35,38,39,43,46],backward:[8,38],bad:[4,15,32,34,35,39,46],bafflingli:15,bait:15,bak:44,bake:[9,35,37,46],bake_tim:46,bake_time_in_sec:46,baking_buzz_test_spec:46,baking_entri:35,baking_st:37,baking_time_m:46,balanc:4,ball:[],balloon:46,ban:[37,46],bang:15,bank:35,bar:[37,38,46],barg:[0,7,10,39,46],barrag:15,barrier:[],bartend:[37,46],base:[0,7,8,15,34,35,37,39,40,41,43,46],base_state_method:45,basic:[5,15,25,35,37,39,40,43],basic_consum:34,basic_publish:34,bate:15,batteri:[14,36,39,40],battery_charg:[27,28,29,36,39,40],battl:[4,15,16],battle_entri:[15,16],battle_init:[15,16],battlefield:15,battleground:4,bb_handler:32,beagleboard:46,beat:[4,10,39],beauti:[38,40,45],beautifulli:8,beazlei:46,becam:[4,39],becaus:[4,5,7,12,15,27,32,33,34,35,36,37,38,39,40,41,43,45,46],becom:[4,7,14,15,28,33,36,37,38,39,40,45,46],been:[0,2,3,4,5,7,8,15,27,31,32,34,35,36,37,39,40,41,43,45,46],befor:[0,4,5,7,8,9,11,15,33,34,35,36,37,38,39,41,42,43,45,46],began:[36,46],begin:[0,4,7,8,14,15,16,32,34,35,36,37,38,39,40,41,43,46],beginn:4,behav:[3,11,14,15,16,33,35,36,37,39,40,43,45,46],behavior:[7,15,24,26,27,28,32,33,34,35,36,37,38,39,41,43,45,46],behavior_nam:35,behaviour:[15,34,37,46],behind:[33,38,45,46],being:[4,5,7,8,10,12,15,16,23,25,28,34,35,36,37,38,39,40,43,45,46],beings:46,belief:15,believ:[37,46],belong:[15,35],below:[15,25,32,39,40,42],benefit:[37,38,39,45,46],benifit:[],bernhard:42,besid:[7,37,38,39,46],best:[0,4,7,15,37,38,46],better:[4,15,35,37,38,39,43,46],between:[4,7,8,10,11,15,16,26,29,35,36,37,38,39,40,41,43,45,46],beyond:[8,15,38,46],bia:[],bias:15,big:[7,15,34,35,36,37,39,41,43,46],bigger:[3,4,36,40],billion:4,bin:46,binari:7,bind:[34,44],binocular:46,bird:[37,46],bit:[4,9,11,15,32,34,36,37,39,41,43,45,46],bitcoin:[9,37],bitcoin_address:[9,37],bitcoin_miner_off:[9,37],bitcoin_miner_on:[9,37],black:[7,15,36,37,38,39,41,43,46],black_mask:[],blast:15,blazingli:46,blind:[15,27,32,39,40],blit:[],block:[4,15,35,37,39,41,43,45,46],blockingconnect:34,blog:[42,46],blue:[7,37,39,46],blueprint:[15,38],blur:15,bluster:15,board:[37,38,46],bob:[34,42],bodi:[15,34],bog:15,boiler:46,boilerpl:34,bold:35,bomb:4,bombard:15,book:[4,8,35,36,37,38,41],bool:8,bordercolor:[],borg:[],boss:46,bot:[15,42],both:[0,4,7,15,32,34,35,37,38,39,43,46],bother:[14,15,39,40,46],botnet:15,bottl:15,bottom:[4,45,46],bottom_bound:46,bounc:46,bouncer:[37,46],bound:15,boundari:[7,39,41,46],bow:[15,16],box:[34,37,46],boyd:33,bracket:[29,35,39,40,41],brain:[],brake:[35,39],brand:[38,39,46],brass:37,brave:15,breach:7,bread:[36,46],breakpoint:37,brethren:15,brew:[],bridg:[37,46],briefest:45,briefli:[37,46],bring:[4,15,39,41],broad:15,broadcast:[14,39,40],broadcast_spi:34,broadcast_trac:34,broken:[4,15,34,35,39,46],broker:42,brother:15,brown:[],browser:[37,46],bubbl:[35,37,39,46],buffer:[7,26,35,36,39,40],bug:[15,36,39,45,46],bui:[4,40,46],build:[3,4,7,8,12,16,32,34,35,36,37,38,39,40,41,43,45,46],build_next_mask:[],build_piston:35,built:[3,7,15,29,32,34,35,37,38,39,40,41,46],bulk:[],bullet:46,bunch:[7,15,37,46],burden:46,buri:[],burst:[15,35],burst_ev:35,bus:46,busi:[4,7,15,32,34,35,37],busy_count:35,busy_entri:35,busy_time_out:35,busy_time_out_hook:35,butterfli:[],button:[37,46],buttress:46,buzz:[41,46],buzz_tim:46,buzz_time_m:46,buzzer:46,buzzspec:46,c11:39,c1_a:34,c2_a:34,c_chart:32,c_trace_consum:[23,34],c_trace_produc:[23,34],cachefilechart:38,caf_second:[15,16],calcium:[],calcul:[],calculu:15,call:[0,3,4,7,8,10,11,12,15,25,26,29,32,33,34,35,36,37,38,39,40,41,43,45,46],call_something_lat:[37,46],callback:[7,15,16,32,35,37,39,46],callback_method:34,caller:[7,35,39],came:[4,7,11,15,26,35,38,39,40,46],camera:15,camil:43,campaign:[37,46],can:[0,2,3,4,5,6,7,8,9,10,11,12,14,15,16,24,25,26,27,28,29,32,33,35,36,37,38,39,40,41,42,43,44,45,46],cancel:[0,10,11,15,36,46],cancel_ev:[0,10,11,15,16,36,39,46],cancel_sourc:39,cannot:35,capabl:[15,34],capacitor:36,capacitor_charg:[27,36,39,40],captur:[10,11,15,35,39],card:15,care:[0,7,11,14,15,37,38,39,40,41,43,45,46],career:[4,15],carefulli:[27,39,40,46],cargo:4,carpet:[37,46],carri:[7,15,37,39,46],cascad:36,cast:46,casual:38,cat:42,catagor:7,caught:[7,15,35,37,39,46],caus:[3,4,15,29,32,35,36,37,38,39,40,43,45,46],causal:[],ccceler:[],cell:[],cells_per_gener:[],cellular:6,celsiu:35,cement:[],center:43,centr:35,centuri:15,ceo:4,certain:[15,37,38,45,46],certainli:[15,37],ceullular:[],chain:15,challeng:[37,46],chamber:35,chanc:[15,16,39,46],chang:[3,4,8,11,14,15,28,33,34,35,37,38,39,40,42,43,45,46],changebordercolor:[],channel:34,chao:[15,35],chaotic:15,chapter:[35,38],charact:[0,29,34,37,39,40,46],characterist:[8,15,35,46],charg:[14,15,16,36,39,40],charli:46,chart1:39,chart2:39,chart3:39,chart:[0,3,6,7,8,10,11,12,13,14,15,16,24,25,26,29,32,34,35,36,37,38,39,41,43,45,46],chart_b:32,chart_nam:34,chase:15,cheap:[40,46],check:[0,15,37,46],chicken:[15,16],child:[7,8,35,39,43],child_stat:8,child_state_graph_e1_s5:8,children:15,choa:[],choic:[39,46],chomski:42,choos:[15,37,46],chortl:4,chose:39,christoph:[7,35],chunk:[4,43],circl:[7,15,16,37,38,46],circle_and_fir:[15,16],circuit:[15,35,36],circular:46,claim:[35,46],clariti:5,classwithstatechartinit:39,claus:[7,35,37,39,46],clean:[5,45,46],clear:[0,8,15,28,37,39,40,43,46],clear_spi:[34,41,43,46],clear_trac:[15,34,37,43,46],clearer:[41,45],click:[3,7,15,35,37,38,46],client:[7,15,35],client_dequ:0,climb:[8,35,37,43,46],clip:[37,46],clobber:8,clock:[35,46],clone:[],close:[9,15,16,35,36,37,46],close_enough_for_circl:[15,16],closer:15,closest:15,closur:34,club:35,clue:[37,46],clumsi:34,cluster:[],clutter:[34,35,46],cmap:[],cod:[],code:[0,2,3,4,5,7,8,9,12,14,15,16,17,18,19,20,21,22,23,26,28,32,33,35,36,38,40,42,43,45],codebas:37,cognit:[15,36,41,45],cohes:15,collabor:[15,35],collect:[4,5,7,8,15,34,38,39,42,46],collegu:32,collis:41,color:[],color_numb:[],colour:[34,38],column:[],com:[],combin:[],come:[3,4,7,14,15,34,35,36,37,38,39,40,42,43,46],comfort:[15,34,37],command:[4,15,16,27,35,39,40,42],comment:[8,14,15,27,35,36,39,40,45,46],commerci:39,committe:38,commmon:7,common:[7,8,35,37,38,39,44,45,46],common_behavior:39,common_behaviors_entri:39,common_behaviors_hook_1:39,common_behaviors_hook_2:39,common_behaviors_init:39,common_behaviors_other_inner_most:39,common_behaviors_reset:39,common_featur:46,commonplac:[],commun:[0,4,7,15,32,35,37,38,39,44,45,46],comp:35,compact:[15,38,39,40,45],compani:[37,42,46],companion:[37,46],compar:[4,15,25,27,28,34,35,37,39,40,43,46],comparison:[4,46],compens:4,compet:15,compil:[33,46],complet:[4,7,8,15,34,35,36,37,38,43,44,45,46],complete_circuit:15,complex:[4,7,15,32,33,35,37,38,39,40,43,45,46],complianc:15,compliant:[14,39,40,46],complic:[4,15,35,38,39,40,45,46],complicit:15,compon:[3,15,46],composit:[35,38,41],comprehend:15,comprehens:6,comprehensive_no_instrument:3,compress:[15,16,35],compromis:15,comput:[7,15,23,33,34,35,37,38,39,42,46],concaten:42,conceiv:38,concentr:15,concept:[7,15,37,46],concern:[15,35,39,45],concert:39,concis:[32,45],conclud:15,conclus:15,concret:37,concurr:[32,33,38,39,46],condit:[3,4,7,15,16,35,36,37,38,39,41,46],conduct:15,cone:[],conf:42,confid:[15,46],config:42,configur:[7,8,14,39,40,41,42],confin:[33,35],confirm:[15,35,41,42,46],conflict:4,confus:[15,37,46],connect:[7,15,32,35,37,38,39,42,43,46],connection_attempt:15,connectionparamet:34,consciou:46,consequ:15,conserv:44,consid:[4,7,8,14,15,28,35,37,39,40,41,46],consider:37,consist:[15,34,35,37,46],constant:15,constraint:33,construct:[5,7,8,11,13,15,34,35,36,37,39,40,42,46],constructor:[],consult:42,consum:[7,15,23,38,39],consumpt:[15,37,46],contain:[3,4,5,7,15,26,28,29,32,34,35,36,37,38,39,40,41,43,45,46],contemporari:46,contemptu:15,content:[1,3,15,30,36,38,39],context:[4,7,28,35,37,38,39,40,41,45,46],contextu:38,continu:[4,7,15,35,36,37,43,46],contract:[15,35],contractor:[4,15],contradict:39,contrari:41,contrast:[7,35],contribut:[7,38],control:[3,11,15,35,36,37,38,39,40,41,42,43,45,46],conu:[],conundrum:15,conveni:35,convent:[15,38,46],convers:40,convert:[7,15],convinc:[15,46],cook:46,cook_tim:46,cook_time_sec:46,cool:[4,35,46],cool_enough:35,copi:[4,14,27,28,35,37,38,39,40,42,45,46],core:[33,35,46],core_color:[],corner:[15,46],coroutin:[],correct:[4,8,15,16,32,39,40,42,45,46],correctli:8,correspond:41,corrupt:4,cortext:46,cosmologist:44,cost:[4,7,35,37,38,40,46],couch:4,could:[4,10,14,15,16,28,32,34,35,36,37,38,39,40,41,43,45,46],couldn:[15,39],count:[15,35],countdown:37,counter:[15,39],countri:[4,35],coupl:[27,35,39,40,46],cours:[15,41],cover:15,coward:15,cpu:[15,35,46],cpython:46,crack:[],craft:7,crank:46,crash:[8,34],creat:[0,4,5,7,10,11,14,15,16,29,32,33,35,36,37,38,40,41,42,43,46],create_burst:35,createel:[],creation:46,creativ:[],credenti:[15,34],cri:[15,16],criteria:35,criterion:35,critic:4,crockford:4,crucial:15,crumb:36,crush:4,cry:[15,16],crypto:34,cryptographi:34,crystal:[],cscope:38,ctag:38,ctor:39,ctrl:[14,39,40],cued:[],cult:4,cultur:[4,15],cunningham:45,curat:[4,39],curiou:[],current:[0,7,8,15,35,37,38,40,43,46],current_numb:35,curs:40,custom:[5,36,37,38,39,40,43,46],cut:15,cyan:[],cycl:[7,10,12,15,35,36,37,39,46],cyphertext:34,daemon:[36,43,46],dag:46,dai:4,damag:[15,35],damn:39,danc:15,danger:[15,39],dark:[15,33],data:[7,8,14,15,26,35,38,39,40,42,45,46],data_readi:35,date:[15,28,37,39,40],datetim:[29,35,39,40,46],daunt:4,dave:38,david:[4,7,15,33,35,38,46],daydream:[37,46],dd2c00:[],dead:[15,16],deaden:15,deadlin:34,deadlock:[4,46],deal:[35,36],dean:46,debt:46,debug:[10,15,27,34,37,38,39,40,41,43,45,46],debugg:[37,38,46],deceit:16,deceit_in_detail:[15,16],deceit_in_detail_tact:15,decent:[15,28,38,39,40],decid:[15,34,36,37,43,46],decim:46,decis:[15,33,38,46],declar:[34,39],decod:34,decomposit:38,decor:[3,13,34,36,37,39,40,43,45,46],decoupl:[4,46],deep:[7,35,37,46],deeper:[38,39,46],deepest:[],deepli:[38,41],deer:37,def:[5,8,9,10,11,15,16,24,25,32,34,35,36,37,38,39,40,41,43,45,46],default_nam:39,defeat:15,defeat_in_detail_tact:15,defend:4,defens:4,defer:[0,3,7,10,11,12,15,16,26,27,32,34,36,37,40,41,43,45,46],defi:[],defin:[5,7,8,10,11,15,28,34,35,36,37,38,39,40,42,43,45,46],degre:35,deisgn:[],del:39,delai:[7,11,39,45,46],delay_in_m:46,delay_one_second:[11,39],delay_tim:[15,16],delayed_one_second:[11,39],delet:35,delic:4,deliv:15,deliver:15,delv:15,demo:[],demonstr:[4,15,34,35,38,39,45,46],depend:[4,15,31,33,38,45,46],deploi:[41,42],deploy:42,depth:8,dequ:[0,7,35,37,39,46],deriv:[15,37,46],desc:46,descend:[35,37,46],descent:46,describ:[3,4,7,8,15,27,28,29,32,33,35,36,37,38,40,41,43,45,46],descript:[14,15,26,35,37,38,39,45,46],deseri:5,design:[3,4,7,8,9,14,17,18,19,20,21,22,28,33,35,36,38,39,43,44,45],desir:[11,15,35,39],desktop:[],despit:[4,35,37,46],destination_ip:34,destination_port:34,destroi:[15,34,38,41,46],destruct:[],destructor:[14,39,40,41],detail:[7,16,26,32,33,35,36,37,39,43,46],detect:[14,35,37,39,40,41],deterim:35,determin:[7,8,15,25,27,35,36,40,43,46],determinist:[],deterministicli:39,develop:[4,15,33,36,37,38,39,45,46],deviat:46,devic:[7,15,36,39],diagram:[3,7,8,9,14,15,29,30,32,33,34,35,36,37,40,41,43,45,46],diamond:38,dict:[25,39,40],dictionari:[5,15,25,39,40],did:[3,4,15,32,35,36,37,38,39,43,45,46],didn:[7,15,34,35,36,37,38,39,42,43,46],didt_advance_war_cri:[15,16],didt_entri:[15,16],didt_exit:[15,16],didt_init:[15,16],didt_other_advance_war_cri:[15,16],didt_other_ready_war_cri:[15,16],didt_other_retreat_ready_war_cri:[15,16],didt_other_retreat_war_cri:[15,16],didt_other_skirmish_war_cri:[15,16],didt_retreat_war_cri:[15,16],didt_second:[15,16],didt_senior_advance_war_cri:[15,16],didt_skirmish_war_cri:[15,16],die:15,diff:[15,46],differ:[0,3,4,7,8,9,10,14,15,23,33,34,35,36,37,38,39,40,41,42,43,45,46],differenti:15,difficult:[7,33,35,43,46],difficulti:45,difficultli:35,dig:[35,37,40],digit:[39,46],dimens:[15,37,46],dimension:15,diminish:15,direct:[15,16,37,38,46],directli:[7,15,32,35,36,37,38,39,41,46],directori:[8,15,42],disarm:35,discard:4,disciplin:40,disconnect:34,discov:[7,8,15,16,37,39,45,46],discoveri:[4,15,46],discuss:[35,46],disk:[],disord:15,disorgan:15,dispatch:[0,3,7,8,15,16,34,35,39,43],dispatch_graph_a1_s1:8,dispatch_graph_f1_s0:8,dispatch_graph_f1_s22:8,dispatch_to_all_empathi:15,dispatch_to_empathi:15,displai:[39,43,46],disprov:41,disregard:39,distanc:15,distil:38,distinct:[15,35],distinguish:[5,29,37,39,40,45],distort:4,distract:15,distribut:[15,35],div:[],dive:[],divid:[],do_noth:45,dobb:[34,42],doc:[34,35,38,42],doc_process:38,dock:[37,46],docstr:[8,46],document:[4,7,8,14,15,32,33,34,35,37,39,40,42,46],dodg:15,doe:[0,7,8,15,27,28,35,36,37,38,40,41,42,43,45,46],doesn:[4,5,7,8,10,15,34,35,36,37,38,39,40,41,43,46],dogfight:4,dogmat:4,doh:15,doing:[7,15,27,29,35,36,37,38,39,40,41,43,46],dollar:4,domain:46,domin:4,don:[7,8,10,11,14,15,26,34,36,37,38,39,40,41,42,43,44,45,46],done:[4,15,35,36,37,38,39,42,43,45,46],done_buzz_period_sec:46,doom:15,door:[9,35,37,46],door_clos:[9,35,37,46],door_closed_bak:35,door_closed_init:35,door_closed_off:35,door_closed_open:35,door_closed_toast:35,door_open:[9,35,37,46],door_open_clos:35,door_open_entri:35,door_open_exit:35,dot:[7,15,35,36,37,38,39,41,43,46],dotenv:15,doubl:[],doubt:15,dougla:4,dove:4,down:[11,15,34,35,36,37,38,39,40,43,45,46],downward:46,draconian:15,dragon:37,draw:[7,8,15,32,33,35,37,38,41,43,46],drawit:39,drawn:[8,34,37,38,46],dreari:40,drew:33,drift:[37,46],drill:[7,35],drink:[15,16,37,46],drive:[15,35,37,38,46],driven:[8,35,37,38,46],driver:46,drop:[4,15,27,37,38,39,40,46],drown:15,drum:15,drunk:[37,46],dry:[7,14,15,39,40,42],dtdakkeosog:[],dtype:[],due:[5,15,46],dumber:15,dump:[5,37],durat:[36,46],dure:[5,7,8,15,37,38,39],duti:[35,37,46],dynam:[5,15,27,35,36,39,40,43,46],e_funct:41,each:[0,4,5,7,8,14,15,16,26,28,29,34,35,36,37,39,40,41,43,45,46],ear:[37,46],earli:[33,46],earshot:15,earth:[37,46],easi:[7,15,28,32,33,35,36,37,38,39,40,41,43,45,46],easier:[4,14,15,25,35,36,39,40,45,46],easiest:[39,44],easili:[15,35,37,39],easy_bak:35,eat:[],eco1:[],eco2:[],eco:[],ecosystem:46,edg:[37,39,46],edit:[4,7,35,37,38,39,41],editor:[4,14,38,39,40,46],educ:43,edward:15,effect:[7,14,15,35,37,38,39,40,46],effort:[14,15,35,38,39,40,42,46],effortless:[],effortlessli:39,eight:[],einstein:38,either:[4,7,15,16,35,37,38,39,41,43,46],elabor:46,elaps:46,electr:[7,35,37],element:[7,8,9,35,36,37,46],elev:39,elif:[7,8,9,10,11,15,16,24,35,36,37,39,41,43,45,46],ellison:46,els:[7,9,10,11,15,16,24,34,35,36,37,39,40,41,43,45,46],elsewher:[34,39,46],email:[39,46],emb:38,embed:[4,8,35,36,38,39,40,46],emerg:[15,37],emit:34,emot:38,emotion:38,empath:15,empathet:15,empathi:[15,16],empathy_for_first_broth:15,empathy_nam:[15,16],emphas:[33,36,38],emphasi:[],employe:15,empt:7,empti:[15,43],enabl:[3,15],enable_snoop_spi:15,enable_snoop_trac:15,enact:[],enammour:[],enamor:33,enclos:[34,38,46],encod:34,encompass:15,encount:[4,15],encourag:[37,46],encrypt:[15,34,42],end:[0,7,15,26,29,35,36,37,39,40,43,46],enemi:[4,15,16],energi:35,energy_gener:35,energy_generation_init:35,engag:[15,46],engin:[4,8,15,35,40,45],english:[15,35,38,46],enjoi:[37,46],enlist:35,enough:[8,15,16,33,34,35,36,37,38,39,41,43,45,46],enrag:15,ensur:[0,15,32,34,36,39,45,46],enter:[8,11,15,16,32,35,36,37,41,42,43,46],enthusiast:[37,46],entir:[15,37,39,45,46],entireti:40,entiti:[],entri:[3,7,8,10,15,32,35,36,37,38,39,41,43,45,46],entropi:[],entry_sign:[5,7,9,10,11,15,16,24,25,26,27,32,34,35,36,37,39,40,41,43,45,46],enumer:[5,7,46],env:[15,42],env_path:15,enviro:[],environ:[15,42,46],envis:15,equal:[],equat:15,equip:[15,37,46],equival:[15,36,46],era:43,ergod:15,ergot:15,erlang:42,erron:15,error:35,escap:[15,35],especi:[15,35,37,46],essenc:35,essenti:[],estim:[],etc:[7,42,46],etho:46,evalu:[32,35,41],even:[11,15,35,36,37,39,42,43,45,46],event:[0,1,3,4,7,8,9,10,11,12,14,15,16,25,26,27,29,32,33,36,37,40,43],event_1:39,event_2:39,event_a:0,event_b:0,event_or_sign:0,event_reset_chart:43,event_wait_complet:43,eventu:[37,46],ever:[4,15,34,35,38],everi:[3,4,7,15,16,34,35,37,38,39,46],everyon:[15,35,37,38,40,46],everyth:[0,15,28,32,37,38,39,40,46],everywher:42,evid:[15,37,39,41,46],evolv:46,evt_a:38,exact:[27,39,40,46],exactli:[4,8,15,32,37,38,41,45,46],examin:[36,41,46],exampl:[0,2,3,5,7,8,17,26,27,28,29,30,33,35,37,38,39,40,41,42],examplestatechart:3,exce:[],excel:[37,42],except:[4,7,15,34,36,37,42,46],exception:15,exchang:[4,34],exchange_declar:34,exchange_typ:34,excit:[37,46],exclud:35,exclus:34,execut:[0,4,8,15,41],exercis:15,exert:15,exhaust:[36,38,43,46],exist:[5,7,15,36,37,38,46],exit:[0,3,7,10,15,32,34,35,36,37,38,41,42,43,45,46],exit_sign:[7,9,10,11,15,16,24,25,26,32,34,35,36,37,39,40,41,43,45,46],expand:[],expans:[],expect:[15,32,33,34,35,36,37,39,41,43,45,46],expected_empathy_target_trac:15,expected_empathy_trac:15,expens:[4,7,35,40,46],experi:[15,35,40,41],experienc:[15,35,39,45],experiment:15,expertli:15,explain:[0,14,15,32,33,35,39,41,46],explan:[34,44,46],explicit:[7,35,37],explicitli:[7,15,35,37,39,46],explor:[37,46],exponenti:40,expos:15,express:[4,5,15,36,38,39,46],extend:[7,8,15,34,35,45],extens:[5,7,10,39,42],extern:[0,7,15,35,36,37,38,39,46],extract:[35,39],extraordinarili:[37,46],extrem:[4,15,37,38,39,46],extrud:[],eye:[37,46],eyebal:[],eyes:[15,37,38,41,43,46],fabric:[1,7,32,39,43],fabric_task_ev:0,face:[15,37,40,44,46],facil:[35,43],fact:[4,15,35,36,37,38,39,40,44,46],factor:[7,39],factori:[4,6,7,13,15,16,32,34,35,37,40,46],factory_class_exampl:[39,45],factory_class_recipe_exampl:39,factory_in_class:[],fad:38,fade:[37,46],fail:[8,27,35,39,40,46],fairli:[15,33,39],fake:[14,15,35,39,40,46],fake_black:[],fake_new:35,fake_transduc:35,fake_whit:[],fakenewsspec:35,fall:[37,39,46],fallaci:38,fallen:38,fals:[15,35,38,39,41,46],falsifi:44,fame:38,famili:15,familiar:[35,36,39,41],famous:4,fanout:34,far:[15,39,41,42,46],farc:46,fast:[15,35,37,38,46],faster:[15,39,46],fastest_tim:35,father:15,fathom:15,favor:[35,38],favour:15,fb11:32,fb1:32,fc1:[32,39,45],fc2:[32,39,45],featur:[7,8,14,15,33,34,35,37,38,39,40,46],fed:[15,35,46],feder:39,feed:[15,34,39],feedback:[4,15,37,46],feel:[4,15,34,35,36,37,41,46],feign:[15,16],feigned_retreat:[15,16],fellow:[37,46],fermet:34,fernet:34,few:[4,15,35,37,38,46],feynman:44,ff6d00:[],ff6doo:[],ffa501:[],ffff00:[],ffffff:[],ffmpeg:[],fiction:37,fidel:[15,46],field:[15,16,35,44],fifo:[0,7,11,15,32,36,38,46],fifo_queu:0,fifo_subscript:0,fig:[],fight:[15,39],fighter:4,figur:[15,32,35,36,37,39,42,43,46],file:[7,15,23,34,39,42,46],filenam:[],fill:[10,15,34,35,36,39,42],film:37,filter:[4,35],find:[2,4,7,8,15,33,35,36,37,38,39,45,46],findal:46,fine:40,finish:[7,15,35,36,37,38,39,46],finit:[7,38],fire:[10,11,15,16,35,36,37,39,43,46],firm:41,firmwar:[4,33],first:[0,5,7,8,12,14,28,29,34,35,36,37,38,39,40,43,44,45,46],first_brothers_nam:15,first_name_of_oth:15,firstscripttag:[],fit:[15,38,46],five:15,fix:[15,27,39,40,46],fixat:15,flank:15,flash:36,flashlight:33,flat:[7,15,35,45,46],flatten:[39,45],flavor:38,flexibl:[15,35],fli:[37,46],flip:46,float32:[],floor:36,flow:39,flower:[],floweri:[],fly:[37,39,46],fn_parent_state_handl:8,fn_state_handl:8,focu:[15,37,45,46],focus:[15,36],fodder:4,fog:15,folder:15,follow:[4,5,7,8,14,15,28,29,32,34,35,36,37,39,40,42,43,45,46],foo:3,food:[37,46],fool:[35,44],foot:38,footman:[15,16],footmen:15,footprint:46,forc:[4,15,35,43],forecast:37,foreign:[23,34],foreign_hsm:34,foreign_spy_item:34,foreign_trace_item:34,foreseen:15,forev:[0,26,39,40],forget:[36,41],forgot:32,fork:38,form:[7,15,34,35,39],formal:[4,7,15,33,35,36,37,38,39,40,45,46],format:[7,9,15,16,25,34,35,37,39,40,46],former:4,forth:[15,46],forward:[33,35,39],found:[2,3,6,8,15,35,37,42,43,46],foundat:46,four:[41,45],fowler:38,fr_entri:[15,16],fr_exit:[15,16],fr_other_retreat_war_cri:[15,16],fr_out_of_arrow:[15,16],fr_retreat_war_cri:[15,16],fr_second:[15,16],fragil:[15,38],frai:15,frame:[15,34,39,45],framebord:[],framework:[4,7,15,33,35,36,37,39,40,45,46],free:[4,15,35,39],freez:46,frequenc:36,fresh:35,fridai:38,friedrich:36,friendli:35,frighten:36,from:[0,3,4,5,7,8,9,11,14,15,16,23,25,26,28,29,32,33,34,35,36,37,38,41,43,45,46],from_list:[],front:[0,7,15,39,46],frustrat:[15,37,46],fsm:[7,38],fuck:4,fuel:[4,35],full:[0,3,15,16,26,27,33,34,35,36,37,39,40,43,46],fun:[8,9,10,11,15,16,24,35,36,37,39,41,43,45,46],funcanim:[],functool:34,further:[7,35,38],furthermor:[15,35],fusion:35,fusion_act:35,fusion_active_cool_enough:35,fusion_active_entri:35,fusion_and_heat_transf:35,fusion_and_heat_transfer_fir:35,fusion_reactor:35,fusionreactor:35,futil:[37,46],futur:[7,15,27,28,34,39,40,46],fuzzier:15,gain:[7,33,34,37,38],gallop:[15,16],game:38,ganbaatar:[15,16],gandbold:[15,16],gang:[14,39,40],ganssl:4,gantulga:[15,16],garbag:[5,8,46],garden:37,gather:39,gave:46,gaze:[37,46],gear:35,gearbox:35,gem:[],gener:[4,7,11,14,15,28,29,34,35,36,37,38,39,40,42,45,46],general_state_method:45,genghi:15,geniu:40,geometri:7,geopolit:43,gestur:[37,46],get:[4,5,7,8,15,25,28,35,36,37,38,40,41,42,43,45,46],get_100ms_from_timestamp:46,get_a_nam:15,get_composite_read:35,get_ip:34,get_my_m:46,get_nam:15,get_readi:46,get_ready_sec:46,get_temperature_read:35,get_weath:39,getelementbyid:[],getelementsbytagnam:[],getenv:15,getsocknam:34,gibberish:42,gift:4,gil:46,gist:[],git:15,give:[14,15,16,36,37,38,39,40,41,43,45,46],given:[0,7,8,11,12,15,25,29,32,35,36,37,39,40,45,46],glanc:[37,38,46],glee:4,global:[4,5,15,38,39,40,46],glossari:30,glow:37,glyph:[7,15,35,46],goal:[15,33,34,37,46],god:[37,46],goddess:[37,46],goe:[15,35,46],going:[8,15,34,35,36,37,38,39,44,46],gone:[11,34,39,46],good:[15,32,35,37,38,39,40,41,44,46],got:[14,15,35,36,38,39,40,41,42,43,46],gotten:[15,28,37,39,40,46],govern:[4,37],grab:[],grade:[],graffiti:39,grai:[],granit:15,grap:[],graph:[7,8,37,38,45,46],graph_e1_s1:8,graph_e1_s2:8,graph_e1_s3:8,graph_e1_s4:8,graph_e1_s5:8,graphic:[38,46],great:[4,14,15,32,35,37,39,40,42,46],greater:[4,15,36,39,43,46],greedi:0,green:[38,39],greeter:[37,46],grid:[],grind:40,grok:41,groov:[37,38],ground:[15,37],group:[15,33,46],grown:[],guarante:[4,5,15],guard:[7,38],guess:[15,37],guest:[37,42,46],guest_password:42,gui:[15,37,42,44,46],guid:[33,42],guidanc:[],guidenc:[],gun:[15,46],gusto:[37,46],gyroscop:[],hack:[6,32,37,39,46],hacker:41,had:[4,15,26,32,34,36,37,38,39,40,41,43,45,46],hadan:[15,16],hadn:4,hal:46,half:4,hall:46,halt:[15,16],hand:[4,7,15,37,38,39,41,45,46],handi:34,handl:[7,9,10,11,15,16,24,32,35,36,37,38,39,41,43,45,46],handler:[8,10,15,16,32,34,35,36,37,38,39,43,45,46],handwav:15,hang:[41,46],happen:[4,5,7,8,15,26,27,32,34,35,36,37,39,40,41,43,46],happi:[37,46],hard:[15,34,37,38,39,41,45,46],harden:46,harder:[15,38,45,46],hardli:45,hardwar:[4,38],harel:[4,7,15,33,35,36,37,38,39,40,45,46],harm:[4,15],has:[0,4,5,7,8,11,15,16,26,27,28,29,31,32,34,35,36,37,38,39,40,41,43,45,46],has_payload:[5,39],hasn:[0,3,5,7,11,15,37,39,46],hast:4,hate:[7,35],have:[0,2,3,4,5,7,8,11,12,13,14,15,25,26,27,28,29,32,33,35,36,37,38,41,42,43,45,46],haven:[4,15,29,34,35,36,37,38,39,40,41,42,43,46],hawk:4,hazard:38,head:[15,35,38,40,45,46],hear:[15,37,46],heard:[15,16,43],heart:[10,15,35,39],heat:[9,15,35,37,46],heater:[35,46],heater_off:[35,46],heater_on:[35,46],heating_element_off:[9,37],heating_element_on:[9,37],heating_entri:35,heating_exit:35,heating_st:46,heaven:[37,46],heavi:[4,15,35],heavili:[15,46],heed:4,heehaw:46,hei:[],height:[],heirach:[],held:[37,39,46],hello:[37,42,43,46],helmet:15,help:[4,15,33,35,37,38,40,43,46],helper:[8,46],helpless:15,her:[37,46],here:[2,3,4,5,7,10,11,15,26,27,29,32,33,34,35,36,37,38,39,40,41,42,43,45,46],herself:[37,46],hesit:39,heurist:15,hidden:[15,35,45],hide:[34,35,38,39,45],hierarch:[7,15,33,34,36,37,38],hierarchi:[7,8,15,34,36,37,38,39,41],high:[0,4,7,15,28,29,35,36,37,39,43,46],higher:[4,15,37,39,46],highest:[0,15,39],highli:[],highlight:[3,15,32,34,35,36,37,39,45,46],him:[4,15,16,35,37,46],himself:15,hint:[15,36],hire:4,his:[4,7,8,15,16,35,36,37,41,45,46],histor:[],histori:[9,15,37],hit:[11,15,35,39,42],hmm:41,hod:4,hold:[9,12,15,36,37,38,39,42,46],hole:[],holi:4,hollow:[37,46],hologram:15,holograph:15,home:15,honour:7,hood:46,hook:[3,7,15,26,27,36,37,38,40],hook_1:39,hook_2:39,hope:[4,15,36,46],hord:15,horizont:46,hornet:15,hors:[6,16],horsearch:[15,16],horseback:15,horsemen:15,horserarch:15,host:42,hostnam:42,hot:[32,37],hour:40,how:[1,3,4,7,8,10,14,15,16,24,26,29,32,33,34,35,36,37,38,41,42,43,44,45,46],howev:[5,8,34,35,36,37,44,45,46],href:[6,17,18,19,20,21,22,33,35,37,38,39,40,44,46],hsm:[0,1,3,7,15,16,33,35,37,38,39,45,46],hsm_queues_graph_g1_s01:0,hsm_queues_graph_g1_s1:0,hsm_queues_graph_g1_s2111:0,hsm_queues_graph_g1_s22:0,hsm_queues_graph_g1_s321:0,hsmevent:0,hsmeventprocessor:[8,35],hsmtester:3,hsmtoplogyexcept:35,hsmtopologyexcept:[7,8,35,39],hsmwithqueu:[15,16,34,35],html:[6,17,18,19,20,21,22,33,35,37,38,39,40,44,46],http:4,huge:33,hulagu:[15,16],human:[4,37,38,46],hung:15,hunt:15,hurri:36,hypothes:[],hypothesi:[],i_list:46,iaf:4,icon:[7,35,37,39,46],id_rsa:42,idea:[4,7,10,15,26,33,35,36,37,38,39,40,43,46],ideal:15,ident:45,identifi:[15,16,29,34,38,39,40,45,46],idiom:38,idiot:4,idl:35,idle_data_readi:35,idle_entri:35,idle_new_request:35,ids:36,ifram:[],iframe_api:[],ignor:[0,5,7,11,15,16,35,36,37,38,39,41,43,46],ihbarhasvad:[15,16],iir:35,ill:38,illeg:[7,35,41,42],illus:[4,45],illustr:46,imag:[7,14,15,37,39,40],imagin:[7,15,35,37,41,46],immedi:[4,12,15,16,26,35,38,39,40,46],immut:[5,38,39,46],impati:15,impedi:39,implement:[15,33,35,36,37,39,41,45,46],implemt:[],implicit:[],implment:7,importantli:[4,41,45],importerror:46,impos:15,imposs:35,imprecis:15,impress:[4,39],improv:[15,46],impuls:35,inabl:15,inadvert:38,inbox:15,incent:4,incid:[],incircl:7,includ:[3,15,33,37,38,39,42,46],incompet:15,incomprehens:15,inconveni:[3,35],incorpor:38,incorrect:[],incorrectli:[7,15],increas:[7,15,35,40,46],incred:[],increment:[15,35],independ:[15,35],index:[8,30],index_and_time_delai:39,indic:[7,8,29,35,39,40,46],indirect:45,individu:[15,16,34,35,36],industri:[4,36],ineffici:[],inevit:[35,40],inexpens:[14,39,40],infect:[],infer:41,infinit:[4,7,10,15,26,35,39,40],inflex:15,inform:[0,4,7,9,15,23,26,28,32,35,36,37,38,40,43,45,46],infra:[],infract:41,infrastructur:[33,42],infrequ:39,inherit:[0,7,8,15,34,35,36,37,39,43,46],init:[3,5,7,8,11,32,35,36,37,38,39,43,45,46],init_func:[],init_sign:[7,9,10,11,15,16,24,25,26,27,32,34,35,36,37,39,40,41,43,45,46],initi:[7,8,15,35,36,38,41,43,46],initial_condition_index:[],initial_st:8,initial_valu:35,inject:[7,15,34,35,39,45],inner:[7,10,11,15,26,35,36,37,39,40,43,46],inner_most:39,inner_st:35,innner:36,innocu:[15,45],innov:[4,15],input:[7,15,34,35,36,38,39,46],insert:15,insertbefor:[],insid:[7,15,34,37,46],insight:4,inspect:[32,35,46],inspir:35,instal:[15,30,33,34,46],instanc:[7,15,27,34,38,39,40,43,45,46],instanti:[35,38,39,45,46],instati:[],instead:[0,5,10,15,33,34,35,36,37,38,39,40,43,45,46],instruct:[15,33,41,42],instructor:4,instrument:[0,6,7,9,15,26,29,32,34,35,36,38,39,40,43,44,45,46],instrumentation_line_of_match:46,insur:46,intact:15,intang:15,integ:15,integr:[15,46],intellig:15,intend:[4,7,15,34,35,37,39,46],intent:[15,35,38,39,46],interact:[3,4,6,8,14,15,33,36,37,39,40,43,46],intercept:35,interconnect:[37,46],interest:[4,15,32,34,37,46],interfac:[5,15,34,37,39,46],interleav:[14,39,40,46],intermedi:[38,46],intern:[0,5,6,7,15,17,18,19,20,21,22,26,33,35,37,38,39,40,43,44,46],internet:[34,39,42],interplai:43,interpret:[38,39,46],interrel:46,interrupt:[4,35,38,43],interv:[],intervent:40,intial_condition_index:[],intimid:[37,46],intric:15,intrins:37,introduc:[15,26,34,35,39,40,46],introduct:[30,37,42],introspect:[15,16],intuit:[15,39],invent:[4,7,15,33,35,37,38,39,46],invers:[4,36,37,45,46],invert:8,invest:[38,46],investig:36,involv:[15,32,35,46],inward:46,iot:33,ips:[15,16],is_fil:15,is_in:8,is_this_piston_readi:35,ish:15,isn:[4,5,12,15,16,37,38,39,43,46],isol:[40,46],isra:4,issu:[7,15,16,27,28,34,35,37,39,40,43,45,46],item:[0,5,7,8,15,16,25,29,34,35,36,37,39,40,41,43,46],iter1:[17,18,46],iter2:[18,19,46],iter3:[19,20,46],iter4:[20,21,46],iter5:[21,22,46],iter6:[22,46],iter:[15,35],its:[0,3,4,7,8,14,26,29,32,33,35,36,37,38,39,40,42,43,45,46],itself:[7,15,34,35,36,37,38,39,40,41,43,45,46],jack:4,jacket:46,java:46,javascript:4,jersei:4,jet:4,jinja2:[7,42],jinja:7,jitter:46,job:[28,36,37,39,40,42,46],john:33,join:[15,37,38,46],joke:15,journal:36,journei:[37,46],json:[4,5,46],json_ev:5,juggl:46,jump:[8,15,36,37,46],junior:15,jupyt:46,just:[4,5,8,10,15,25,27,28,32,34,35,36,37,38,39,40,41,42,43,45,46],kai:[33,39],keep:[0,8,15,33,34,35,36,37,38,39,41,42,45,46],kei:[4,15,25,32,34,37,39,40,42],kept:[35,37,46],keygen:42,keyword:37,khan:15,kill:[0,4,15,36,39,43,46],kind:[7,12,15,35,36,37,38,39,43,46],knew:[34,35,37,43,46],knight:[15,16],know:[4,7,8,10,11,14,15,32,33,34,35,36,37,38,39,40,41,42,43,45,46],knowabl:46,knowledg:[15,46],korean:15,kwarg:[5,8],label:[8,14,36,39,40,43],laberg:35,lac:8,lack:[15,44],lag:15,lai:[36,37,46],lame:46,lamp:35,lamp_off:35,lamp_on:35,lan:15,lanchart:38,land:[37,46],languag:[4,7,15,33,35,37,38,39,42,45,46],lanreccechart:38,larg:[7,8,15,35,38,39,43],larger:[4,15],larri:46,last:[0,7,15,32,35,37,39,43,45,46],last_brothers_nam:15,lastli:37,late:[4,46],latenc:46,later:[8,15,34,35,36,37,39,46],latest:[4,15,39],latex:40,law:[4,37,46],layer:[15,37,39,45,46],lazi:[37,46],lca:[8,37,46],lead:[15,35,46],leader:15,leadership:[4,15],lean:[15,37,46],leap:39,learn:[4,6,7,15,32,33,35,37,38,39,43,46],least:[8,15,35,37,42,45,46],leav:[3,7,8,11,15,35,36,37,38,39,43,46],left:[7,15,16,34,37,38,45,46],left_wal:[],leftmost:0,legend:46,legibl:[15,37,46],leisur:15,len:[15,25,34,39,40],length:8,less:[15,16,35,37,39,43,45,46],let:[4,9,15,16,32,33,34,35,36,37,38,39,41,43,45,46],level:[4,7,15,28,29,35,36,37,39,43,46],lib:[],librari:[1,4,7,15,31,32,33,35,36,37,38,39,42,43,45,46],licenc:[],lie:15,life:[35,39,46],lifetim:[4,44],lifo:[0,7,11],lifo_queu:0,lifo_subscript:0,light:[9,15,33,37,38,41,46],light_off:46,light_on:46,like:[4,7,8,10,11,12,14,15,25,26,28,29,32,33,34,35,36,37,38,39,40,41,43,45,46],likewis:[15,37,38,43,46],limbo:41,limit:[8,15,34,37,38,46],limp:38,line:[7,15,27,28,29,32,34,35,36,38,39,40,41,43,45,46],linear:15,linearsegmentedcolormap:[],lineno:[],ling:[],linger:15,link:[15,32,33,35,36,37,39,40,42,43,45,46],lint:4,linux:[34,46],lion:33,lip:[],liquid:35,list:[0,5,8,15,16,35,36,37,41,46],list_spi:46,listen:[15,34,39],listless:[37,46],liter:45,lithium:35,litter:37,littl:[4,14,15,32,35,36,37,38,39,40,41,46],live:[4,7,15,34,35,37,46],live_spi:[15,34,37,39,40,46],live_trac:[9,15,34,37,39,40,46],load:[5,15,16,37,41,46],load_dotenv:15,lobotom:15,local:[7,15,16,34,35,38,42],local_consum:34,localconsum:34,localhost:42,locat:[0,7,8,15,34,35,37,39,46],lock:[0,4,15,38,40,46],lockhe:4,lockingdequ:0,log:[7,10,15,24,26,29,35,36,37,38,39,40,41,42,43,45,46],logic:[15,39,41,46],login:42,longer:[15,35,37,38,41,46],look:[4,7,11,15,27,28,29,32,33,34,35,36,37,38,39,40,41,42,43,45,46],lookuperror:39,loop:[0,14,15,36,39,40,43,46],loos:[7,15,35],loosen:15,lorenz:15,lose:[15,40,46],loss:15,lost:[15,33,45],lot:[4,7,14,15,32,35,36,37,38,39,40,42,43,45,46],lotteri:37,loud:15,love:[35,37,38,46],low:[15,16,36,39],lower:[0,4,15,37,39,46],lowest:[39,46],luck:[4,37,46],lure:[15,16],mac:[],machin:[5,6,7,9,15,23,33,34,35,36,37,38,39,41,42,46],machine_cl:[],macho:39,made:[4,7,15,32,35,37,38,39,42,45,46],magnet:35,mai:[15,37,39,40,46],maim:15,main:[0,9,15,34,36,37,39,46],mainli:15,maintain:[4,15,34,38,45],mainten:[4,45,46],maintenc:7,major:4,make:[4,5,7,9,10,12,14,15,16,25,32,33,35,36,37,38,39,40,42,43,45,46],make_and_start_left_wall_machin:[],make_and_start_right_wall_machin:[],make_generation_coroutin:[],make_test_spec:46,make_unique_name_based_on_start_at_funct:0,malevol:15,malform:8,man:[4,15],manag:[0,3,4,7,15,28,32,36,37,38,39,40,41,42,43,45,46],mandatori:8,maneuv:[15,16],mani:[4,7,10,15,27,35,36,37,38,39,40,42,43,46],manifest:[7,33,39,46],manipul:[37,38],manner:[7,39,40,46],manoeuvr:15,manual:[14,35,39,40],manufactur:7,map:[7,9,15,16,28,32,37,38,39,40,45,46],marbl:[37,38,39],march:[37,46],marcu:[],margin:[],mari:[5,37,39,46],mark:[10,14,15,32,35,36,37,38,39,40,42,46],markdown:40,marker:[37,39],market:[15,37],markup:[7,39],marshal:[15,16],marshal_entri:[15,16],marshal_readi:[15,16],martin:[4,38],marvel:[37,46],mass:[4,15],massiv:[15,37],master:35,match:[15,37,46],materi:43,math:[],mathemat:15,mathematica:[],mathematician:33,matlab:[],matplot:[],matplotlib:[],matrix:[],matter:[5,15,46],max:[25,39,40],max_index:8,max_name_len:[25,39,40],max_number_len:[25,39,40],maxim:15,maximum:[8,35],maximum_arrow_capac:[15,16],maxlen:[0,39],mayb:[15,35,37,38,41,46],mba:15,meali:[7,38],mean:[4,7,8,15,25,26,33,34,35,36,37,38,39,40,41,43,45,46],meaning:[15,39],meaningless:[37,46],meant:[7,15,43],meanwhil:46,measur:[7,35],meat:15,mechan:[4,15,35,38,40,46],media:[],mediev:15,meet:[15,34,37,46],member:[15,37,46],memori:[4,15,26,33,35,37,39,40,45,46],men:15,menac:15,mental:[15,37,46],mention:[36,43,46],merv:[37,46],mesh_encryption_kei:15,mess:46,messag:[0,7,11,14,15,24,35,37,39,40,46],met:[35,46],meta:46,metal:35,metaphor:[15,36,37,46],metaprogram:[39,45],method:[0,3,5,7,8,9,15,24,25,29,32,34,35,36,37,38,40,41,43,46],michel:35,micro:15,micromanag:[15,46],microsoft:[37,40],middl:[4,10,11,26,36,39,40,41,43],might:[4,7,11,15,26,27,28,34,35,36,37,38,39,40,45,46],militari:[4,15],millisecond:46,mind:[38,41],mine:37,minecraft:7,miner:[9,37],mingu:[],mini:[],minim:[15,42,46],minimalist:46,minimum:35,minion:[37,46],minor:[],minut:[15,38,46],miracl:15,miro:[1,3,4,7,8,9,15,16,25,26,28,31,32,33,34,35,36,37,39,40,41,43,44,45,46],miros_rabbitmq:15,mirror:15,misbehav:46,miss:[15,37,38,43,45,46],mistak:[15,33,38,46],mistakenli:15,mix:35,mixtur:[37,39],mkdir:42,mnemon:[8,37,38,46],mobil:15,mock:46,mockup:[],mode:[3,35,46],mode_control:3,model:[7,33,35,36,37,38],model_control:3,moder:40,modern:15,modifi:35,modul:[1,30,45],modular:46,modulo_bas:46,molten:35,momen:7,moment:[0,15,35,37,39,45,46],momentarili:39,momentum:33,monei:[4,40,46],mongol:6,monitor:[4,15,23,34,37,39,46],month:4,moor:[7,38],moot:40,mordecai:4,more:[0,4,6,7,8,15,29,32,33,34,35,36,37,38,39,40,41,43,45,46],moreov:41,most:[4,8,15,32,33,35,36,37,39,42,46],mostli:[34,39,42,46],motiv:[37,46],mount:15,mous:38,mouse_click:38,mouse_click_evt:38,mousecoordin:38,move:[2,8,15,34,36,37,38,39,41,43,46],movement:[15,33,46],movi:[],mp4:[],much:[4,7,8,15,35,38,39,41,45,46],mud:15,multi:[7,10,15],multi_shot_thread:[10,36,39],multipl:[15,29,34,35,37,38,40,42,45,46],multishot:[7,46],multitask:4,multithread:[],multivers:[37,46],munger:46,must:[5,7,8,15,34,36,37,39,43,44,46],mutabl:38,mute:3,mutex:4,mutual:8,my_ev:38,my_event_with_payload:38,my_hook:39,mypayload:39,myself:[15,41,46],n_angl:[],n_mask:[],nag:41,nai:[],name:[0,4,5,7,8,10,13,15,16,25,29,32,33,34,35,36,37,38,40,41,42,43,45,46],name_for_sign:[5,25,39,40],name_of_item2:39,name_of_item_1:39,name_of_item_2:39,name_of_sign:39,name_of_subclass:5,namedtupl:[38,39,46],namespac:36,nametupl:46,napkin:33,napoleon:15,narankhuu:[15,16],narantuyaa:[15,16],narrow:[],nassim:[32,41],nasti:46,nativ:[],natur:[5,35,38,39,41,44],navig:[8,35],nearbi:46,neat:34,necessari:15,necessarili:[],neck:[15,46],need:[0,4,7,8,10,11,14,15,26,27,32,33,34,35,36,37,38,39,40,41,42,43,45,46],needlessli:[11,39],neg:46,neighbor:[],neither:39,neovim:4,nergui:[15,16],nervou:[15,37,46],ness:15,nest:[7,15,16,32,34,35,39,45],net:8,netscap:4,network:[5,8,14,16,33,39,40],networked_horse_arch:15,networkedactiveobject:15,networkedfactori:15,never:[4,15,33,35,36,39,46],new_machin:[],new_nam:46,new_named_attribut:5,new_request:35,newest:35,newli:[34,42],newlin:34,next:[6,7,15,16,17,18,19,20,21,22,27,31,33,35,36,37,38,39,40,41,43,44,45,46],next_gener:[],next_rtc:0,nice:[38,45,46],nichola:[32,41],nietzsch:36,no_ack:34,noam:42,nobodi:[15,37,46],node:[15,34,45],noisi:15,non:[9,37,39,40,46],nondetermin:4,none:[0,5,7,8,9,15,16,32,34,35,36,37,39,41,43,45,46],nonexist:46,nonsens:34,noob:[],normal:3,norman:4,north:15,not_wait:[15,16],note:[15,34,37,39,41,46],noth:[0,3,4,7,35,36,37,38,39,43,44,46],nothing_angl:[],nothing_at_row:[],nothing_mask:[],notic:[7,14,15,29,35,36,37,38,39,40,41,45,46],notifi:[15,46],notion:15,now:[4,8,11,14,15,32,34,35,36,37,38,39,40,41,42,43,45,46],nuanc:39,nuclear:35,number:[5,7,10,14,15,25,26,29,32,35,37,38,39,40,43,46],numer:15,numpi:35,nutshel:46,nvu8m8a73jg:[15,34],oadp1sh69j:[],obei:15,obj:5,object:[1,4,5,6,7,8,10,14,15,25,26,27,28,29,32,33,35,36,37,38,40,41,45,46],oblivion:[37,46],obscur:4,observ:41,obtain:[14,34,39,40],obviou:[15,32],obvious:37,occur:[7,8,15,26,29,35,36,37,39,40,43,46],occurr:38,od647c:[],oddli:[37,46],off:[9,11,12,15,35,36,37,38,39,45,46],off_entri:35,offer:[34,46],offic:[15,16],officer_lur:[15,16],offset:46,often:[7,15,35,38,39,46],oha:[15,16],oha_1:15,old:[0,15,26,37,39,40,43,45,46],old_left_machin:[],old_machin:[],old_right_machin:[],oldest:[7,35,36,39],onc:[5,7,8,10,15,16,26,33,35,36,37,39,40,42,43,46],one:[0,4,5,7,8,10,11,12,14,15,17,23,29,33,34,35,36,37,38,39,40,42,43,44],onedcellularautomatawithanglediscoveri:[],onedcellularautonomata:[],ones:45,oneshot:46,onli:[0,4,8,10,13,15,28,29,31,33,34,35,36,37,38,39,40,41,42,43,46],onlin:39,onplayerreadi:[],onplayerstatechang:[],onreadi:[],onstatechang:[],onto:[0,4,7,14,15,32,34,35,36,37,38,39,40,42,46],onyoutubeiframeapireadi:[],onyoutubeplayerapireadi:[],oop:41,open:[9,35,37,38,39,42,46],oper:[4,7,15,35,37,43,46],oppon:15,opportun:[15,45,46],oppos:[4,15],opposit:[4,15],optim:[],option:[7,8,15,37,38,39,42,46],orang:[],orb:[37,46],order:[7,15,16,35,37,40,41,46],ordereddict:5,ordereddictionari:[25,39,40],ordereddictwithparam:5,organ:[6,35,37,40,45,46],orient:[33,35,38],origin:[0,7,11,15,35,39,41,45,46],orthogon:[3,7,15,46],oscil:15,oscilloscop:46,other:[0,4,7,8,10,14,15,16,25,26,27,32,33,34,35,36,37,38,42,43,44,45,46],other_advance_war_cri:[15,16],other_archer_nam:15,other_arrival_on_field:15,other_inner_most:39,other_ready_war_cri:[15,16],other_retreat_ready_war_cri:[15,16],other_retreat_war_cri:[15,16],other_skirmish_war_cri:[15,16],otherhorsearch:[15,16],otherwis:[7,8,15,27,35,39,40,41,45],our:[0,4,8,9,11,12,27,28,32,33,35,36,37,38,39,40,42,43,44,45,46],ourselv:[15,35,39],out:[0,4,5,7,8,9,12,15,16,26,28,32,34,35,36,37,38,39,40,41,42,43,45,46],out_of_arrow:[15,16],outcom:4,outer:[7,10,11,15,26,35,36,37,38,39,40,43,46],outer_st:35,outermost:[37,39,46],output:[0,7,8,14,15,25,26,27,28,29,32,35,36,37,38,39,41,43,45,46],outsid:[7,8,11,12,15,16,35,36,37,38,39,41,43,46],outsourc:37,outward:[7,8,15,35,37,38,39,46],outweigh:46,oval:46,oven:[9,35,38],oven_off:5,over:[0,3,4,7,8,15,27,28,32,34,35,36,37,38,39,40,41,42,45,46],over_off:5,overal:[15,33],overflow:[34,35],overli:39,overload:35,overrid:35,overtak:[],overwhelm:[15,36],overwrit:[35,40],overwritten:[8,36],own:[2,4,7,15,33,35,36,37,38,39,41,42,45,46],p27:[],pack:[4,15,32,38,39,43,45,46],packag:[7,15,33,37,38,39,46],packet:38,pact:[],page:[4,15,30,32,38,41,42,46],paglia:43,pai:[3,4,15,32,35,36,38,39,46],paid:4,pain:[4,42],paint:[37,46],pair:46,pale:4,pantri:35,paper:[7,35,36,39,43],paradigm:36,paradox:15,paragraph:[43,46],parallel:[36,39,40],paramet:[5,34,46],parameter:46,parameteriz:[],parametr:15,paramount:15,parent:[7,8,15,16,32,34,35,37,43,45,46],parent_callback:[7,45],parent_state_of_this_state_method:39,parentnod:[],pariti:5,pars:[39,46],part:[0,3,8,9,10,15,16,33,34,35,36,37,38,39,41,42,43,45,46],partial:39,particip:[15,40,46],particular:[4,39,40],particularli:[37,41,46],pass:[5,7,11,15,16,34,35,36,37,38,41,43,46],passphras:42,password:42,past:[14,37,39,40,41],patch:38,path:[7,8,15,37],pathlib:15,pathwai:15,patient:[37,46],pattern:[3,6,7,15,30,34,36,37,38,39,43,44,46],paus:[],payload:[5,7,15,16,29,32,35,37,40],pcolormesh:[],pdb:[27,39,40],pdf:[37,46],peachi:[28,39,40],pedant:4,pencil:39,pend:[0,5,15,28,37,39,40,43,45,46],pending_on_piston:35,pending_on_pistons_timeout:35,pending_optimal_condit:35,pentagon:4,peopl:[4,15,33,35,37,38,46],pepper:[15,36,37,38,46],per:[7,15,16,36,44,46],percent:[4,15,16,46],perfect:[15,39],perfectli:[],perform:[4,8,15,16,33,35,36,37,38,41,42,45,46],peril:[4,37],period:[0,7,10,11,15,16,35,36,39,46],peripher:15,permiss:[41,42],permit:[15,37,46],permut:[],pernici:39,perpetu:[],persist:46,person:[15,33,37,38,41,44,45,46],peter:[15,46],pgn:[],phase:[39,43,46],phenomenon:15,philosoph:41,philosophi:46,phoenix:43,phrase:[37,46],phsysic:[],physic:[7,35,37,46],pic:34,pick:[4,15,37,46],pickl:5,pico:42,pictur:[14,15,32,33,34,37,38,39,40,43,44,46],piec:[4,37,43,46],pierr:[4,32],pigment:[],pika:[34,42],pilot:4,pin:46,pip3:34,pip:[31,46],piston:35,piston_1:35,piston_:35,piston_act:35,piston_manag:35,piston_numb:35,piston_readi:35,piston_slam:35,pitch:38,pivot:46,place:[0,3,7,8,12,14,15,28,32,34,35,36,37,38,39,40,42,43,45,46],plai:[3,15,37,39,46],plain:[7,15,38],plain_text:34,plaincredenti:34,plan:[15,35,43,46],plane:4,planet:4,plant:37,plasma:35,plastic:37,plate:46,platform:[34,37,46],playbook:42,player:37,player_api:[],playerstatu:[],playvideo:[],plenti:15,plod:15,ploi:37,plot:[],plt:[],pluck:15,plugin:[15,33,38,39],png:[],pocket:46,point:[4,7,8,14,15,16,27,28,33,35,37,39,40,43,46],pointless:[33,37,46],pole:35,polici:[15,35],poll:35,polling_ent:35,polling_init:35,polling_process:35,polling_time_out:35,polling_time_out_hook:35,polyamor:[35,39],poni:15,pool:[7,35],pop:[0,4,7,37],popleft:39,popul:8,popular:38,port:[4,7,33,34,35,36,37,39,42,46],portabl:46,portal:[37,46],portion:33,posit:[35,37,46],possess:41,possibl:[8,15,34,35,39,40,42,46],post:[0,5,6,7,11,12,15,26,32,35,38,40,43,45,46],post_act:3,post_def:[26,27,35,36,39,40],post_fifo:[0,7,9,10,11,15,16,26,32,34,35,36,37,39,40,41,43,45,46],post_id_1:0,post_id_2:0,post_lifo:[7,10,35,37,39,46],postul:4,potato:46,power:[4,15,35,37,40,46],practic:[4,7,8,32,35,37,38,41,46],practition:35,pragmat:38,pre:[7,15,28,39,40,45,46],pre_time_sec:46,preced:[],precis:[15,46],predatori:[],predefin:[37,46],predetermin:[15,35,46],predica:15,predict:[],preemption:4,preemptiv:4,prefer:15,prefix:15,preform:46,prei:15,preliminari:46,prematur:15,prepar:15,prepend:46,prepend_trace_timestamp:46,preprocessor:45,present:[4,7,15,35,43,46],press:[14,37,39,40,46],pressur:[12,35,39],presum:46,pretend:[15,35,36,46],pretti:[15,26,27,37,39,40,41,42,45,46],prev:[6,17,18,19,20,21,22,31,33,35,37,38,39,40,44,46],previou:[3,15,36,37,43,45,46],previous:[15,36,37,43],previous_gener:[],price:[36,38,39,46],prim:0,prime:[15,35],princip:43,principl:[14,39,40,44],print:[0,3,5,7,9,15,16,25,26,27,28,32,34,35,36,37,39,40,43,45,46],print_msg:[37,46],printer:[26,39,40],prion:[],prior:[5,7,11,32,34,35,36,39],priorit:[],prioriti:[0,4,7,15,32,39,46],priorti:[0,7],privat:42,privileg:36,probabilist:39,probabl:[14,15,35,36,37,38,39,40,46],problem:[4,7,15,28,33,35,37,38,39,40,41,42,45,46],proce:[15,37,46],procedur:42,process:[4,5,7,8,10,12,15,16,26,33,34,35,36,37,38,39,40,42,43,45,46],process_a_gener:35,process_a_specif:35,process_b_gener:35,processing_count:35,processing_entri:35,processing_exit:35,processing_init:35,processing_pol:35,processor:[4,7,8,15,26,33,34,35,36,37,39,40,41,43,45,46],produc:[7,15,23,35,36,38,46],producer_192:34,producer_out:34,producer_outer_b:34,producer_outer_init:34,product:[35,37,40,46],profession:35,profil:[],profit:4,program:[3,4,6,7,8,9,14,25,27,28,33,35,36,37,38,39,40,42,43,45,46],programat:40,programm:[15,33,35,46],progress:46,prohibit:[37,46],project:[4,15,29,35,37,39,40,46],promis:33,prompt:42,proof:[17,18,19,20,21,22],propag:[35,46],properli:[7,15,38,39,45],properti:[7,15,34],prophet:32,propos:35,protect:[4,15,46],protocol:46,prototyp:[35,38,46],protractor:[],prove:[15,46],proven:[4,46],provid:[0,4,5,7,8,10,15,25,32,33,34,35,37,38,39,40,42,43,45,46],pseudo:[],pseudost:[7,35,37,38,46],psycholog:[40,41],pub:[0,32,34,37,42,46],publish:[0,4,7,15,32,33,34,42,46],publish_bb:32,publishing_ao:39,pull:[4,5,15,16,33,36,37,41,43,46],puls:[35,46],pump:[15,35,36],purchas:4,purpl:[],purpos:[23,34,35,39,42,46],pursu:[4,15],pursuit:41,push:[0,15,35,41,45,46],put:[0,15,16,35,36,37,38,39,40,41,46],puzzl:[37,46],pycrypto:34,pydotenv:15,pyplot:[],python3:46,python:[3,4,7,15,25,31,33,34,35,37,38,39,40,41,42,45,46],qai9iicv3fkbfruakrm1gh8w51:[15,34],quad:46,quantum:[36,39],quarri:15,quarter:15,queri:[3,39,43,46],question:[14,15,17,18,19,20,21,22,32,37,39,40,45],queu:[3,26,27,32,33,34,35,36,37,39,40,41,43,45,46],queue:[0,7,12,15,32,34,35,36,37,38,39,42,43,46],queue_bind:34,queue_declar:34,queue_typ:[0,39],quick:[30,38],quicker:[],quickli:[15,33,36,38,40,46],quickstart:46,quieter:15,quit:[15,34,35],quiver:15,quot:[4,35],rabbit123:42,rabbit567:15,rabbit:[15,34,35,42],rabbit_guest_us:15,rabbit_heartbeat_interv:15,rabbit_instal:42,rabbit_nam:42,rabbit_password:[15,34,42],rabbit_port:15,rabbit_producer_192:34,rabbit_us:[15,34],rabbitfactori:15,rabbitmq:[15,33,38,39],rabbitproduc:34,race:[4,15,39],rage:38,raid:37,rain:[15,39],rais:[7,8,37,39,46],ran:[23,33,34,35,36,39,43,45,46],randint:[15,16,39],random:[15,16,34,35,39],random_numb:35,randomli:46,rang:[4,15,35,46],rank:15,rap:46,rare:[37,46],raspberri:[15,23,34,42,46],rate:[4,35],rather:[7,15,35,36,37,39,40,46],ratio:[],ravel:[],raw:[],reach:[7,15,35,36,37,39,46],reachabl:34,react:[3,7,11,15,26,35,36,37,38,39,40,43,45,46],reaction:[7,12,15,35,36,38,39,43,46],reactiv:[35,37,38,43],reactor:35,reactor_on:35,reactor_on_entri:35,reactor_on_init:35,reactor_on_prim:35,reactor_on_time_out:35,read:[4,7,8,15,25,26,35,36,37,38,39,40,42,43,45,46],readi:[15,16,27,35,36,39,40,41,46],real:[4,15,34,35,37,38,46],realiti:[15,41],realli:[4,15,33,35,37,38,39,41,43,46],rearm:36,reason:[5,15,29,34,37,38,39,40,42,43,46],rebuild:[27,39,40],recal:[7,12,26,35,36,40],receiv:[7,15,25,26,32,34,35,36,37,38,39,40,41,42,43,46],receiving_entri:35,receiving_receiv:35,recent:[35,37],recip:[30,36,40],reckless:33,recogn:[15,36,38],recommend:[4,34,39,40,42,43],reconnect:34,reconsid:[35,45],reconstruct:4,record:[37,46],rectangl:[15,37,39,41,43,46],recurs:[15,35,36,37,38,46],red:[9,37,38,39,46],red_light_off:[9,37],red_light_on:[9,37],redesign:35,redraw:35,reduc:[7,15,40,46],reduct:[],redund:[15,46],reef:[],ref:[],refact:7,refactor:[15,33,35,38],refer:[6,8,15,17,18,19,20,21,22,26,32,33,34,35,36,37,38,39,40,42,43,44,46],referenc:[7,8,14,15,37,38,39,40,46],refil:15,reflect:[7,15,25,30,33,35,36,37,39,43],reflection_sign:[25,39,40],refocu:15,refrain:[],refresh:[37,46],regard:[35,36,46],region:[7,15,35,37,38,46],regist:[34,39],register_live_spy_callback:34,register_live_trace_callback:34,register_par:[39,45],register_signal_callback:[39,45],registr:45,registri:0,regress:[15,28,39,40,46],regroup:15,rejoic:[37,46],rejoin:[37,46],rel:[7,46],relai:[37,38,46],relat:[4,7,8,15,34,35,36,37,38,39,45,46],relationship:[7,8,38],relax:[35,37,46],releas:[4,7,35,37,38,46],relentlessli:46,relev:35,reli:[15,35,46],reliabl:46,reliev:[12,39],religi:4,relinquish:46,reload:15,reluct:40,remain:[15,35,43,46],remark:[4,15],remedi:[],rememb:[4,15,35,36,37,38,39,41,43,46],remidi:7,remind:[7,15,42,46],reminder_pattern_needed_1:35,reminder_pattern_needed_2:35,remov:[15,28,34,35,37,39,40,45,46],renam:45,render:[15,38],rendit:36,reorgan:15,repeat:[7,10,35,37,38,39,43,45,46],repeatedli:36,repetit:[15,46],replac:[14,15,34,37,39,40,42,46],replic:[14,39,40],repo:2,report:[35,37,39,46],repost:[12,39],repres:[7,8,14,15,35,36,37,39,40,43,46],represent:38,reproduc:46,request:[0,35,39,46],requir:[5,8,15,32,35,36,37,38,39,42,43,45,46],reset:39,resetchart:43,resettact:15,resist:15,resolut:15,resourc:[4,15,37],respect:[15,46],respond:[7,15,16,32,36,37,39,40,43,45,46],respons:[15,35,37,39,43,46],rest:[15,34,35,36,37,39,43],restart:0,restor:43,restructuredtext:46,resubscrib:34,result:[15,16,27,28,34,35,36,37,39,40,43,45,46],resulting_funct:45,resurrect:43,ret_sup:5,ret_super_sub:5,ret_zz:5,retir:4,retreat:[15,16],retreat_ready_war:15,retreat_ready_war_cri:[15,16],retreat_war_cri:[15,16],return_st:[35,39,46],return_statu:[9,15,16,24,25,32,35,37,39,40,41,43,45,46],returncod:5,returnstatussourc:1,reus:35,reusabl:35,reveal:[4,15,39,41],rever:[37,46],revis:42,rewind:43,rich:[4,46],richard:44,richest:4,richli:[],rid:46,ride:[15,32],right:[4,7,15,34,35,37,38,41,45,46],right_wal:[],rightfulli:38,rigid:35,rigor:[4,15,46],ring:[7,26,35,39,40,46],risk:15,ritual:[37,46],robust:[15,33,34],roll:[37,38,39],roman:[],ronach:7,room:[26,38,39,40],root:[],rosetta:[37,46],rotat:[15,35],rough:46,roughli:[4,46],round:[37,39,46],rout:[15,34,42],routin:[8,35,45],routing_kei:34,row:45,row_to_check:[],rpc:42,rtc:[0,4,7,8,26,35,37,38,39,40,43,46],rubbl:[],rubi:46,rule:[4,7,15,32,33,37,38,43,46],rule_30:[],rule_30_black_walls_200_gener:[],rule_30_white_walls_100_generations_width_30:[],rule_30_white_walls_200_gener:[],rulebook:37,run:[0,3,4,7,8,9,14,15,23,24,26,27,28,32,33,34,35,36,37,38,39,40,42,43,45,46],run_anim:[],run_ev:0,runtim:39,rush:[],ruthlessli:41,rx_routing_kei:15,s11:[3,41],s11_state:41,s1_state:41,s211:3,s21:[3,8,41],s21_state:[24,39,41],s2_state:[24,39,41],s_state:[24,39,41],safe:[4,15,35,38,41,46],safeti:[15,39],sai:[4,15,35,36,37,38,39,43,45,46],said:[35,37,43,46],sake:39,salari:4,salt:36,same:[0,3,4,5,6,8,10,11,15,25,28,33,34,35,36,37,38,39,40,41,42,43,45,46],samek:[4,7,8,15,33,35,36,37,38,41,45,46],sampl:[35,46],sandwich:[],satisfact:[37,41,46],satisfi:46,saturn:4,save:[10,15,35,36,37,39,40,42],savefig:[],saw:[15,39,43],scaffold:46,scalabl:42,scale:35,scan:[15,38,43],scare:[15,16],scenario:[37,46],scene:[37,46],scheme:[15,35,39],scienc:[35,38],scientif:[41,44],scimitar:[15,16],scipi:[],scope:34,score:4,scotti:42,scrambl:46,scratch:15,screen:[3,15,27,34,39,40,46],scribbl:[7,15,16,24,32,35,41,43,46],script:[34,42],scroll:[37,46],sculpt:15,search:[7,8,11,30,35,36,37,38,39,43,45,46],search_for_super_sign:[25,26,27,32,34,35,36,37,39,40,41,43,45,46],season:15,sec:[15,16],second:[7,11,15,16,29,35,36,37,39,40,41,45,46],secondari:7,secondli:46,secret:[15,37,42,46],secretli:35,section:[3,6,15,36,37,38,39,42,43,45,46],secur:[15,42],see:[0,3,4,5,7,13,14,15,24,25,29,32,33,34,35,36,37,38,40,42,43,45,46],seed:35,seek:41,seem:[4,15,34,35,37,39,43,45,46],seemingli:[],seen:[5,7,15,35,37,38,39,42,43,46],select:[14,39,40,46],self:[5,8,9,15,16,34,35,36,38,39,42,46],selfpayingtoasteroven:[9,37],semant:[35,36],semaphor:4,semblanc:15,send:[3,5,7,14,15,35,36,37,38,39,40,41,42,43,45,46],senior:[15,16],senior_advance_war_cri:[15,16],senior_retreat_war_cri:15,senior_skirmish_war_cri:[15,16],sens:[15,34,36,38,39,40,41,42,43,46],senseless:36,sensibl:15,sensit:[],sensor:[15,35,37],sent:[7,15,32,34,35,36,37,39,43,46],sentenc:[15,38,46],separ:[4,15,33,34,35,36,37,38,39,46],seper:7,sequenc:[7,8,14,15,29,32,34,35,40,41,46],sequence_diagram:38,seri:43,serial:5,seriou:[4,46],serious:4,serv:[15,39,46],server:[34,35,42,46],servic:[4,7],session:[27,39,40],set:[0,7,8,10,15,35,36,37,39,46],set_arrai:[],set_aspect:[],set_ticks_posit:[],set_titl:[],set_trac:[27,39,40],set_xticklabel:[],set_yticklabel:[],settl:[7,8,11,15,35,37,39,43,46],setup:[15,42],seventi:[],sever:[39,40],shadow:8,shake:46,shallow:46,shalt:43,shape:45,share:[4,7,8,15,25,32,33,35,36,37,38,39,40,46],she:[37,46],sheet:[15,37],shelf:35,shell:[15,42],shelv:35,shift:[26,37,39,40,46],shine:35,ship:[15,46],shoot:[15,38,45,46],shop:46,shortcode1:[],shortcode2:[],shorten:[],shorter:15,shorthand:[15,38,41,46],shortli:[35,37,42],shot:[7,10,11,15,16,35],should:[4,5,7,10,11,15,28,32,33,34,35,36,37,38,39,40,42,43,45,46],shoulder:[37,46],shouldn:[28,38,39,40,46],shout:15,show:[0,7,15,32,33,34,35,36,37,38,39,42,43,45,46],shown:[3,4,46],shrink:38,shut:[34,43,46],shutdown:40,side:[4,15,37,38,46],signal:[0,1,3,7,8,9,10,11,12,15,16,24,25,26,29,32,34,35,36,37,38,41,43,45,46],signal_callback:[7,45],signal_nam:[0,5,25,38,39,40],signal_numb:[25,39,40],signal_that_is_def:[12,39],signalsourc:[1,25,39,40],signatur:[34,36,37,39,45,46],signifi:38,signific:15,significantli:[4,34],silo:[],similar:[15,35,37,39,45,46],similarli:35,simpl:[6,14,15,17,26,33,34,35,37,38,39,40,42,44,45],simpleacyncexampl:39,simpleasyncexampl:39,simpler:[15,39],simpli:[4,35,38],simplic:[14,35,39,40],simplif:15,simplifi:[4,35,37,38,46],simul:[35,46],sinc:[4,5,8,11,14,15,26,32,33,34,35,36,37,38,39,40,41,42,43,44,46],singl:[6,15,35,36,39,46],singleton:[0,7,25,39,40],sissi:39,sisyphean:38,sit:[7,15,46],site:[8,42],situat:[12,15,24,35,39,41,46],sixti:15,size:[35,37,46],sketch:[7,15,28,39,40],skill:15,skip:[15,34,35,39,43],skirmish:[15,16],skirmish_ammunition_low:[15,16],skirmish_entri:[15,16],skirmish_exit:[15,16],skirmish_officer_lur:[15,16],skirmish_other_squirmish_war_cri:[15,16],skirmish_retreat_ready_war_cri:[15,16],skirmish_second:[15,16],skirmish_senior_squirmish_war_cri:[15,16],skirmish_war_cri:[15,16],sky:[37,46],slai:15,slam:35,slaughter:15,sleep:[9,15,32,34,35,36,37,39,41,43,45,46],slide:36,slight:15,slightli:[15,37,38,46],slip:46,slot:35,slow:[15,46],slower:7,slowest_tim:35,slowli:[15,37,46],small:[14,15,33,35,36,37,39,40,41,46],smaller:[15,38,39],smallest:40,smart:15,smarter:15,smear:46,smell:46,smile:[37,46],smurf:15,snail:[],snap:[15,46],snare:15,snippet:[15,36,46],snoop:15,snoop_kei:15,snoop_scribbl:15,snoop_spy_encryption_kei:15,snoop_trace_encryption_kei:15,snow:39,social:[15,44],societi:46,sock_dgram:34,socket:34,softwar:[4,7,15,32,33,35,37,38,39,42,45,46],soil:37,soldier:15,solid:38,solipsist:[37,46],solo:[],solut:[15,35],solv:[7,34,35,37,38,39,45],some:[4,7,11,14,25,32,33,35,36,37,38,39,40,41,43,44,45,46],some_event_the_system_has_never_seen:46,some_example_st:[25,39,40],some_st:46,some_state_funct:[37,46],some_state_to_prove_this_work:46,somebodi:36,somehow:[15,37,46],someon:[15,32,35,36,37,39,40,46],someth:[0,4,7,15,25,28,33,34,35,36,37,38,40,41,42,43,45,46],something_els:39,sometim:[8,15,16,37,46],somewai:37,somewhat:34,somewher:15,soon:[15,34,35],sorri:4,sort:[15,32,35,36,38,39],sound:[36,46],sourc:[2,7,8,14,15,36,37,38,40,41,42,46],source_st:38,space:[8,15,35,36,37,39,46],span:[34,46],spare:39,spawn:46,speak:[7,11,36,39],spec:[17,18,19,20,21,22,35,37,38,46],special:[3,15,32,35,36,37,43,46],specif:[14,15,26,27,28,33,35,36,37,38,40,41,43],specifi:[0,35,38,39,46],speed:[4,15,35,39],spell:45,spend:[4,15,38,46],spent:[4,15,33],sphere:35,spike:[37,46],spirit:[37,46],spit:34,split:[15,43,46],spoil:15,spooki:[],sporat:35,spot:[7,15,26,39,40,46],spread:15,spreadsheet:15,sprei:[4,32],sprinkler:37,spruce:34,spy:[0,3,7,15,23,24,26,27,32,35,36,37,41,43,45,46],spy_callback:34,spy_ful:[36,43],spy_lin:46,spy_liv:34,spy_of_trac:46,spy_on:[3,9,10,11,13,15,16,24,35,36,37,39,40,41,43,45,46],spy_on_buzz:46,spy_on_heater_off:46,spy_on_heater_on:46,spy_on_light_off:46,spy_on_light_on:46,spy_or_trac:46,spy_queue_nam:34,spy_result:34,squar:[29,35,39,40,41],squirrel:43,squish:[],src:[],ssh:42,stabil:[37,46],stabl:46,stack:34,stadium:37,staff:4,stage:[12,15,35,37,39,46],stai:[15,35,37,38,39,46],stair:[37,46],staircas:[37,46],stamp:[29,35,39,40,46],stand:[37,43,45,46],standard:[14,31,33,34,38,39,40],star:[35,37,38,46],stare:[],start:[0,7,8,9,15,16,26,27,29,30,32,33,34,35,36,39,40,41,43,45,46],start_at:[0,8,9,14,15,16,28,29,32,34,35,36,37,39,40,41,43,45,46],start_consum:34,start_thread_if_not_run:0,start_tim:46,startchart:[12,39],starting_st:35,starting_state_funct:8,startup:[37,46],starvat:4,stash:[15,16],statchart:7,statchmachin:46,state:[0,3,4,5,7,8,9,10,11,12,13,14,15,16,24,26,29,32,33,34,35,36,37,43,46],state_chart_object:46,state_fn:[13,39,40],state_method_nam:39,state_method_templ:[7,39,45],state_nam:[0,13,15,16,39,40,46],state_return:5,state_to_transition_to:39,statecchart:[],statechart:[0,3,4,5,6,7,8,9,11,13,14,15,23,24,28,33,35,36,37,40,41,43,46],statechart_object:37,statehandl:39,stateless:39,statemachin:[3,23,34,37,38,39,46],statement:[3,15,37,39,43,46],statemethod:[13,39,40],staticmethod:[34,38,39,46],statu:[9,10,11,15,16,24,25,32,34,35,36,37,39,40,41,43,45,46],steadi:35,steam:35,step:[7,8,15,35,36,37,38,40,41,42,46],stephen:[],stick:[15,46],still:[0,4,15,35,36,38,41,45,46],stimul:[7,43],stimulu:35,stitch:[],stochast:35,stock:[37,38],stone:[37,46],stop:[0,7,15,16,34,35,36,37,38,39,43,46],stop_active_object:0,stop_consum:34,stop_fabr:[],store:[4,34,35,36,37,39],stori:[4,14,15,27,36,39,40,43],str:[15,16,25,35,39,40,46],straight:[33,39],straightforward:[34,35,37,42],strand:15,strang:[15,36,37,39,41,45,46],strateg:15,strategi:[4,15,34,36,37,39],straw:15,stream:[3,5,15,34,46],stretch:[],strftime:[35,39,46],strike:35,string:[5,7,8,13,25,28,34,35,37,38,39,40,45,46],strip:[15,28,37,39,40,46],strip_trac:34,stripped_spec:37,stripped_target:[15,28,39,40,46],stripped_trace_result:[15,28,37,39,40,46],stroke:15,strong:15,strongli:[4,35],structur:[1,7,15,32,33,35,36,37,41,42,43,45,46],struggl:36,stub:[],studi:[15,37,46],studio:37,stuff:[37,39,46],stupid:15,stupidli:15,style:[7,39,46],sub:[0,34,37,42],sub_row_to_check:[],subclass:[5,35,38,39,46],subject:[],suboptim:35,subordin:15,subplot:[],subscrib:[0,4,7,15,32,34,38,42],subscribing_ao:39,subscript:[0,7,15,39],subservi:[37,46],subset:[4,7,15],substat:[7,8,15,35],subsystem:46,subtl:[35,39],subvers:46,succe:[37,42],succeed:34,success:[4,35],successfulli:15,suck:15,sudo:42,suffici:15,suffix:[],suggest:[37,39],suicid:[],suit:[37,46],sum:15,summar:[34,40,43],summari:43,sunk:38,sunni:39,superior:15,supernatur:[37,46],superst:[7,35,46],suppli:15,support:[0,8,14,34,35,37,38,39,40,42,46],suppos:[14,15,29,35,37,39,40,41,45,46],sure:[15,16,34,35,38,39,45,46],surpris:[35,44,45,46],surround:[4,15],surviv:[15,37],suspens:46,sustain:15,svg:39,swap:4,swarm:15,swell:[],swing:[15,35],symmetr:15,synchron:[15,35,39],synonym:7,syntact:[15,35],syntax:[25,33,35,36,39,40,42,45],synthes:39,system:[4,5,6,7,8,11,14,26,27,32,33,35,36,37,38,40,42,43,45,46],t_question:41,tabl:39,tack:37,tactic:16,tag:[37,46],tail:[26,35,39,40,43],taint:38,take:[0,4,7,15,34,35,36,37,39,41,43,46],takeawai:[],taken:[7,15],taleb:[32,41],talk:[4,15,35,36,37,38,39,40,42,46],tar:4,tara:[37,46],target:[7,8,11,15,27,28,35,37,40,41,46],target_st:38,targetandtolerancespec:46,tart_at:[14,39,40],task:[0,4,15,39,43,46],task_ev:0,tatechart:[],taught:4,taxat:15,tazor:[14,27,28,29,36,39,40],tazor_oper:[27,36,39,40],tc1:45,tc2:45,tc2_s1:39,tc2_s2:39,tc2_s3:39,teach:4,team:[15,32,34,38,40],teammat:[15,40],tear:46,technic:[4,37,41,46],techniqu:[0,7,15,34,35,37,39,46],technolog:[4,33,34,37,38,46],tediou:46,tell:[4,8,14,15,27,33,35,36,37,39,40,42,43,46],tem:46,temp:[8,9,10,11,15,16,24,35,36,37,39,41,43,45,46],temperatur:[7,35,37,46],templat:[7,38,42],temporari:[5,40,46],tempt:[15,46],ten:[15,42],tend:38,tension:[37,46],term:[7,26,39,40,46],termin:[3,14,26,34,35,36,37,39,40,45,46],terminolog:[34,37,38],terrac:[37,46],terrain:15,terribl:15,test:[0,4,8,9,14,15,27,28,30,31,33,34,35,41,42],test_baking_buzz_one_shot_tim:46,test_buzz_ev:46,test_buzz_tim:46,test_toaster_buzz_one_shot_tim:46,test_typ:46,testabl:46,text:[4,7,14,38,39,40,46],textil:[],than:[4,7,9,14,15,16,23,32,34,35,36,37,39,40,45,46],thankfulli:[15,46],thei:[3,4,7,8,11,14,15,16,32,33,34,35,36,37,38,39,40,41,42,43,45,46],theirs:15,them:[4,5,7,8,10,11,15,16,32,33,34,35,36,37,38,39,41,42,43,45,46],theme:46,themselv:[7,15,16,34,37,38,39,46],theo:[37,46],theoret:[],theori:[15,33,41,44],therebi:[7,15,34],therefor:[15,36],thi:[0,2,3,4,5,7,8,9,10,11,12,13,14,15,16,25,26,27,28,29,32,33,34,35,36,37,38,39,40,41,42,43,45,46],thickest:[],thiel:46,thin:[],thing:[4,5,7,8,12,14,15,27,34,35,36,37,38,39,40,41,42,45,46],thing_subscribing_ao_cares_about:39,think:[11,15,25,33,34,35,36,37,38,39,40,41,42,43,46],thinner:[],thinnest:[],third:[15,35],thirti:[],thoma:38,those:[7,15,32,36,38,45,46],thou:43,though:[7,11,15,36,37,39,42,43,45,46],thought:[15,16,35,37,39,46],thread:[0,3,4,7,9,15,32,33,34,35,36,37,38,39,41,43,45,46],thread_runner_fifo:0,thread_runner_lifo:0,thread_safe_queu:39,threadsaf:39,thredo:46,three:[15,35,36,37,39,42,43,45,46],three_puls:[10,39],threshold:[35,38],throb:[37,46],throe:7,through:[4,5,7,8,14,15,28,33,34,35,36,37,40,41,42,43,45,46],throughput:15,thrown:40,tick:[15,16],ticket:37,tie:[15,35,36,46],tied:[7,15,41],ties:37,tight:[33,46],tight_layout:[],tighten:41,tightli:[27,39,40,46],till:37,timat:7,time:[0,3,4,7,9,10,11,15,16,28,32,33,34,35,36,37,38,40,41,43,45],time_1:46,time_1_str:46,time_2:46,time_2_str:46,time_compress:[15,16],time_differ:46,time_in_sec:46,time_in_second:[15,16],time_keep:8,time_out:35,timeout:34,timeout_callback:34,timer:[34,37,46],timestamp:[28,39,40,43,46],timestamp_str:46,tini:[4,41,46],tip:43,titl:[4,8,36,41,46],to_b1:39,to_cod:[7,15,39,45],to_method:[15,16,32,34,35,39,45],to_tim:[15,16],toast:[9,35,37,46],toast_tim:46,toast_time_in_sec:46,toaster:[9,35,38],toaster_142x5:37,toaster_:[9,37],toaster_baking_to_toast_spec:37,toaster_off_to_baking_trace_spec:37,toaster_oven:38,toaster_oven_1:46,toaster_oven_2:46,toasteroven:[35,38,46],toasterovenmock:46,toasting_buzz_test_spec:46,toasting_entri:35,toasting_time_m:46,toateroven:[38,46],todai:15,togeth:[14,15,33,38,39,40,44,46],toggl:46,told:[37,46],toler:[15,46],toleranc:46,tolern:46,tolernance_in_m:46,tonsil:46,too:[0,7,8,14,15,33,34,35,36,37,38,39,40,41,45,46],took:[15,32,37,43,46],tool:[4,7,15,32,33,34,37,38,39,40,42,46],top:[0,6,7,8,9,14,15,16,28,29,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],top_bound:46,topic:[15,42],topolog:[8,32,35,36,37,38,39,45,46],topology_a:8,topology_h:8,total:41,totalitarian:35,touch:[4,37,39,46],toward:[8,15,35,37,46],tpath:8,trace:[0,3,7,14,15,23,27,28,29,32,35,36,37,38,43,46],trace_callback:34,trace_l:34,trace_lin:46,trace_queue_nam:34,trace_result:34,trace_target:46,trace_through_all_st:46,track:[15,16,34,35,37,38,39,40,43,46],tracker:39,trade:[35,36,37,38,45,46],tradit:[4,15,36,46],traffic:15,train:[15,39],tran:[7,8,9,10,11,15,16,24,32,34,35,36,37,39,41,43,45,46],tranduc:35,trans_:8,trans_to_c2_s1:39,trans_to_c2_s2:39,trans_to_c2_s3:39,trans_to_fb11:32,trans_to_fb1:32,trans_to_fb:32,trans_to_fc1:[32,39,45],trans_to_fc2:[32,39,45],trans_to_fc:[32,39,45],trans_to_tc1:45,trans_to_tc2:45,trans_to_tc:45,transact:40,transduc:[7,15,35],transfer:[35,36,39,41],transform:[],transit:[0,3,7,8,10,11,15,16,29,32,36,37,38,40,41,43,45,46],transitori:46,translat:[33,35,37,40,46],transmit:[15,34,42],transpar:37,transpir:[37,46],travel:[],travers:36,treat:[8,38,39,46],tremend:15,tri:[7,15,33,35,39,45,46],trial:35,triangl:[],tribe:36,trick:15,tricki:[37,38],trickl:39,trigger:[7,8,15,16,35,36,37,38,41,45,46],trigger_pul:36,trip:15,trivial:[15,32,39,46],troop:15,troubl:[4,15,36,38,45],troubleshoot:[3,33,37],troublesom:4,truck:35,truli:15,trust:[15,46],truth:15,tube:[],tunabl:[35,46],tune:[15,35],tupl:38,turbin:35,turn:[4,5,7,9,14,15,28,32,33,35,36,37,39,40,41,42,43,45,46],tutori:[34,42],twain:15,tweak:[15,39],twice:46,two:[0,3,4,7,12,14,15,34,35,36,37,38,39,40,41,42,43,45,46],twodcellularautomatawithanglediscoveri:[],twodcellularautonomata:[],tx_routing_kei:15,type:[3,5,10,15,29,32,33,35,37,39,40,42,43,45,46],typic:[0,15,32,38,39,46],u3uc:[15,34],ubuntu:[],ugli:46,ultim:[3,7,36,37,38,43,46],ultimate_hook_exampl:35,ultisnip:46,uml:[4,7,14,15,32,33,34,35,37,38,39,40,41,46],umlet:[14,15,33,38,39,40],umletino:39,uncom:[27,39,40],uncomfort:[37,46],undefin:[39,46],under:[4,15,42,46],underl:[37,46],underli:[7,46],understand:[7,8,15,26,32,33,35,36,37,38,39,40,41,43,44,45,46],understood:[],underworld:[37,46],unexcept:15,unexpect:15,unfamiliar:41,unfold:15,unforeseen:15,unfortun:[4,38],ungodli:4,unhandl:[5,9,10,11,15,16,24,32,35,36,37,38,39,41,43,45,46],unhanld:[25,39,40],unifi:38,uniform:35,uniqu:[5,15,29,39,40,45,46],unison:[15,34,35],unit:[4,7,14,16,35,39,40,46],univers:[7,15,33,37,44,46],unives:[],unless:[7,15],unlik:[4,7,15,36,37,44,46],unlink:15,unload:36,unlock:38,unmanag:7,unnecessari:[10,39],unneed:46,unorgan:15,unpredict:35,unprocess:39,unprotect:[4,15],unreason:[],unreli:[],unrespons:[37,46],unseen:5,unstabl:43,unstart:[],unsupport:44,unsuspect:36,untest:46,until:[4,7,8,15,34,35,36,37,38,39,43,46],unus:46,unusu:15,unwind:[6,7,39,40],upcom:46,updat:[14,15,28,39,40,46],update_angl:[],upon:[4,7,12,15,16,25,31,32,33,35,36,37,38,39,40,43,45,46],upper:[15,46],upward:[],usag:46,use:[0,4,7,10,11,14,15,24,25,26,28,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],used:[0,2,4,5,7,8,9,10,11,14,15,29,34,35,36,37,38,39,40,41,42,43,45,46],useful:[8,10,15,33,34,35,36,37,38,39,46],useless:46,uselessli:15,user:[0,7,34,35,36,37,39,40,42,43,46],uses:[0,3,5,7,15,33,35,36,37,38,39,42,45,46],using:[0,3,4,5,7,8,14,15,26,28,29,32,33,34,35,36,37,38,39,40,42,43,45,46],usual:[39,46],util:[14,39,40],uuid5:0,uuid:0,vain:4,valid:8,valour:15,valu:[5,7,15,25,35,39,40,46],valuabl:[37,46],vantag:[15,37,46],variabl:[4,7,8,15,28,32,35,36,37,38,39,40,42,43,46],varient:37,varieti:34,variou:[7,15,36,37,39,43,46],veer:15,veloc:[],vent:39,venv:46,veri:[0,4,14,15,26,29,32,35,36,37,38,39,40,41,43,45,46],verifi:[35,46],vers:40,version:[3,34,37,39,42,45,46],versu:46,vertic:[39,46],vestigi:46,via:[35,37,42,46],victim:36,victori:[4,15],video:[15,39],videoid:[],view:[4,7,15,33,34,35,36,37,38,41,43,44,46],vigil:15,vim:[32,39,46],virtual:[],visibl:[38,39],visio:40,vision:[15,32],visit:39,visual:[32,37,46],vitamin:38,vnc:[],voic:15,voltag:[36,46],voodoo:15,vortex:35,wai:[0,4,7,10,12,15,16,32,33,34,35,36,37,38,39,40,41,42,43,45,46],waist:4,wait:[0,4,9,10,15,16,34,35,36,37,38,39,41,43,46],waitcomplet:43,waiting_to_adv:[15,16],waiting_to_lur:[15,16],wake:[7,35,37,46],walk:[35,37,45,46],walker:46,wall_cl:[],wallleftblackrightblack:[],wallleftblackrightwhit:[],wallleftwhiterightblack:[],wallleftwhiterightwhit:[],want:[8,11,12,15,25,26,28,33,34,35,36,37,38,39,40,42,43,45,46],war:[4,15,16],warbot:15,ward:45,warhors:15,warn:[37,46],wasn:[15,27,35,37,39,40,43,46],wast:[7,15,35,36,37,40,46],watch:[0,4,15,34,36,37,43,45,46],watch_external_weather_api:39,watch_external_weather_api_entri:39,watch_external_weather_api_weather_report:39,water:[15,16],wave:[15,35,46],weak:15,weaken:15,weapon:[4,15,32],wear:15,weather:[37,39],weather_read:39,weather_report:39,weather_track:39,weatherreport:39,weav:15,web:[42,46],websit:42,weekend:38,weigh:4,weight:[4,32],weirder:39,well:[0,4,5,8,15,33,36,37,38,41,42,45,46],went:[33,42],wenzel:42,were:[0,3,4,7,15,28,33,34,35,36,37,39,40,43,45,46],weren:[4,15,45,46],western:15,what:[4,7,8,13,15,26,27,28,29,32,33,34,35,36,37,38,41,42,43,44,45,46],whatev:[15,33,38,39,41,42,46],whatever_name_you_w:46,when:[3,4,7,8,10,12,14,15,16,26,27,28,32,34,35,36,37,38,40,41,42,43,45,46],whenev:35,where:[0,4,7,8,12,15,23,32,34,35,36,37,38,39,42,43,46],wherea:40,wherev:[37,46],whether:[45,46],which:[0,4,5,7,8,12,14,15,25,26,27,28,32,34,35,36,37,38,39,40,41,42,43,45,46],whichev:35,whine:36,whisper:[37,46],white:[9,37,46],white_light_off:[9,37],white_light_on:[9,37],white_mask:[],who:[4,7,15,33,34,35,36,37,38,39,40,45,46],whole:[4,15,25,34,36,37,39,40,46],whose:15,why:[14,15,32,33,35,37,38,39,40,43,44,46],wide:[],widget:38,width:[],wiki:35,wikipedia:46,willing:15,wilt:[],win:4,window:[15,23,34,46],wipe:[],wire:[15,34,37],within:[0,3,4,5,7,8,11,15,16,24,32,33,34,35,36,37,38,39,40,41,43,45,46],without:[4,7,14,15,26,33,35,37,38,39,40,45,46],woke:43,wolfram:[],won:[4,10,12,33,35,36,37,38,39,40,46],wonder:35,word:[4,7,15,37,40,42,46],work2:39,work:[0,3,4,7,8,9,12,13,14,15,28,32,33,34,35,36,37,38,40,42,43,44,45,46],worker1:39,worker2:39,worker:[4,9,37,38,46],workflow:15,world:[4,7,12,15,33,35,37,38,39,42,43,46],worri:[36,37,39,43,45,46],wors:[4,15,39],worst:[15,46],worth:[15,33,35,45],worthwhil:46,would:[0,4,7,8,10,11,12,14,15,25,26,27,28,29,32,33,34,35,36,37,38,39,40,41,43,44,45,46],wouldn:[15,36,37,39,41,45,46],wound:[15,16],wrap:[5,8,13,15,16,34,37,38,39,40,45,46],wrapper:8,wrestl:[15,42,45],write:[3,4,7,14,15,26,27,32,33,34,35,36,37,38,39,40,42,43,46],written:[3,4,7,8,15,32,33,34,35,36,37,38,39,42,45,46],wrong:[8,15,33,36,45],wrote:[4,15,34,35,36,41,42,45,46],wta_entri:[15,16],wta_exit:[15,16],wtl_entri:[15,16],wtl_exit:[15,16],wtl_second:[15,16],www:[],x15:46,x_px:38,xaxi:[],xml:7,xor:[],y_px:38,yaml:7,yaxi:[],year:4,yell:[15,16,46],yellow:[],yes:[15,38,46],yet:[4,7,11,14,15,35,36,37,38,39,40,41,45,46],yield:35,yml:[7,42],you:[0,2,3,4,5,7,8,10,11,12,13,14,15,24,25,26,27,28,29,32,33,34,35,36,37,38,40,41,42,43,44,45,46],your:[0,3,4,5,6,7,8,10,11,12,13,14,24,25,26,27,28,29,32,33,34,35,36,37,38,41,42,43,44,45,46],your_parent_state_method:39,your_signal_nam:39,your_state_method_nam:39,yourself:[7,15,35,36,38,39,44,45],youtub:39,z_px:38,z_pz:38,zap:36,zero:[4,15,17,30,35,37],zero_to_on:[6,17,18,19,20,21,22,38,46],zeromq:46,zip:[15,28,37,39,40,46],zoologi:4,zoom:39,zuvk:[]},titles:["Active Object","Architecture","Cellular Automata","Comprehensive","Concurrency: the Good Parts","Events","Examples","Glossary","Hsm","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","Mongol Horse Archer","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","<no title>","Python Statecharts","Installation","Interacting Statecharts (Same Machine)","Introduction","Spy and Trace Across a Network","Patterns","Simple Posting Example","Quick Start","Diagrams","Recipes","Reflection","Hacking to Learn","Setting Up RabbitMQ","Active Object Example","Testing","Using and Unwinding a Factory","Zero To One"],titleterms:{"abstract":46,"catch":39,"class":[34,38,39,45],"final":38,"function":[34,41],"import":[34,41],Adding:39,And:39,For:15,Going:39,Has:39,One:[39,46],The:[15,34,37,40],Using:[39,40,45],abil:34,about:38,across:34,activ:[0,39,43],activeobject:39,add:[34,39,41],analog:37,anoth:39,ansibl:42,answer:41,anyth:41,approach:45,archer:15,architectur:1,arrow:38,attach:[15,38],augment:39,automata:2,basic:[42,46],behavior:40,better:41,boiler:[34,39],build:15,callback:[34,45],can:34,cancel:39,canva:[],cellular:2,challeng:41,chart:40,close:34,code:[34,37,39,41,46],common:41,compon:35,comprehens:3,concurr:4,connect:34,construct:38,consum:34,context:[15,34],count:34,creat:[34,39,45],current:39,deceit:15,decrypt:34,deep:38,defer:[35,39],describ:39,descript:40,design:[15,34,37,40,46],detail:[15,38,40],determin:39,diagram:[38,39],docstr:34,doe:39,draw:[34,39],dynam:37,els:38,embed:37,enter:39,entropi:[],event:[5,34,35,38,39,41,45,46],exampl:[6,15,32,34,36,43,45,46],exit:39,experienc:37,explain:40,extend:38,extrem:40,fabric:0,factori:[39,45],fall:38,feder:38,fifo:39,first:[15,41],flat:39,foreignhsm:34,frame:41,from:[39,40],game:37,gener:[],get:[34,39],glossari:7,good:4,guard:[39,41],hack:41,hardwar:46,have:[34,39,40],hiearchi:41,high:[38,40],highlevel:[],hint:[37,46],histor:15,histori:[35,38,46],hook:[35,39,46],hors:15,horseman:15,how:[39,40],hsm:[8,34],hypothesi:41,icon:38,indic:30,inform:[34,39],inherit:38,init:41,initi:39,insid:39,instal:[31,42],instrument:[3,37],interact:32,intern:41,introduct:33,iter:46,its:[15,34],learn:[41,42],level:[38,40],librari:34,lifo:39,link:34,linux:42,live:[39,40],log:34,machin:32,make:[34,41],mechan:37,medium:38,mesh:15,messag:[34,42],method:[39,45],mind:15,miro:38,mistak:41,model:15,modul:5,mongol:15,multi:[39,46],multichart:35,multipl:39,multishot:39,name:39,need:[],network:[15,34,42],newbi:37,noth:[],number:[],object:[0,34,39,43],off:34,one:46,onedcellularautomata:[],organ:15,orthogon:35,other:[39,40,41],our:[15,34,41],output:[34,40],oven:[37,46],overview:15,pai:37,parent:39,part:4,partial:41,pass:39,pattern:[35,42],payload:[38,39,46],pend:35,phenomenon:[],pictur:41,plate:[34,39],point:38,post:[36,39],processor:38,produc:34,program:[15,34],proof:46,pub:38,publish:[38,39],python:30,question:[41,46],quick:37,rabbitmq:[34,42],race:35,random:[],react:34,recal:39,recip:39,reflect:40,regist:45,releas:39,remind:35,requir:[34,41],returnstatussourc:5,rule30:[],rule:[],run:41,same:32,scott:[37,46],scribbl:39,see:[39,41],self:37,send:34,sequenc:[38,39],set:[34,42],setup:46,shot:[39,46],shutdown:34,signal:[5,39,40],signalsourc:5,simpl:[32,36,46],sketch:[],small:[],some:[15,34],someth:39,sourc:39,specif:[34,39,45,46],spy:[34,39,40],standard:45,start:37,state:[38,39,40,41,45],statechart:[30,32,34,38,39,45],statemachin:[],stori:[37,46],structur:[38,39],sub:38,subscrib:39,subscript:38,subsect:[],summari:45,system:[15,39],tabl:30,tactic:15,target:39,technic:15,templat:[39,45],termin:38,test:[37,39,40,44,46],thought:40,through:[38,39],time:[39,46],titl:[],toaster:[37,46],trace:[34,39,40],transit:[35,39],turn:34,twodcellularautomata:[],ultim:35,unit:15,unwind:45,view:40,visual:[],volk:[37,46],wall:[],warn:38,what:[39,40],when:39,why:45,window:42,work:[39,41],write:45,you:39,your:[15,39,40],zero:46}}) \ No newline at end of file