From d1e9ee60be102a71ba2a7b0665cd9fb4f9071324 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action One way to implement a dynamic MUD is by using “tickers”, also known as “heartbeats”. A ticker is a
-timer that fires (“ticks”) at a given interval. The tick triggers updates in various game systems. Tickers are very common or even unavoidable in other mud code bases. Certain code bases are even
-hard-coded to rely on the concept of the global ‘tick’. Evennia has no such notion - the decision to
-use tickers is very much up to the need of your game and which requirements you have. The “ticker
-recipe” is just one way of cranking the wheels. The most fine-grained way to manage the flow of time is of course to use Scripts. Many
-types of operations (weather being the classic example) are however done on multiple objects in the
-same way at regular intervals, and for this, storing separate Scripts on each object is inefficient.
-The way to do this is to use a ticker with a “subscription model” - let objects sign up to be
-triggered at the same interval, unsubscribing when the updating is no longer desired. Evennia offers an optimized implementation of the subscription model - the TickerHandler. This is
-a singleton global handler reachable from One way to implement a dynamic MUD is by using “tickers”, also known as “heartbeats”. A ticker is a timer that fires (“ticks”) at a given interval. The tick triggers updates in various game systems. Tickers are very common or even unavoidable in other mud code bases. Certain code bases are even hard-coded to rely on the concept of the global ‘tick’. Evennia has no such notion - the decision to use tickers is very much up to the need of your game and which requirements you have. The “ticker recipe” is just one way of cranking the wheels. The most fine-grained way to manage the flow of time is to use utils.delay (using the TaskHandler). Another is to use the time-repeat capability of Scripts. These tools operate on individual objects. Many types of operations (weather being the classic example) are however done on multiple objects in the same way at regular intervals, and for this, it’s inefficient to set up separate delays/scripts for every such object. The way to do this is to use a ticker with a “subscription model” - let objects sign up to be
+triggered at the same interval, unsubscribing when the updating is no longer desired. This means that the time-keeping mechanism is only set up once for all objects, making subscribing/unsubscribing faster. Evennia offers an optimized implementation of the subscription model - the TickerHandler. This is a singleton global handler reachable from evennia.TICKER_HANDLER. You can assign any callable (a function or, more commonly, a method on a database object) to this handler. The TickerHandler will then call this callable at an interval you specify, and with the arguments you supply when adding it. This continues until the callable un-subscribes from the ticker. The handler survives a reboot and is highly optimized in resource usage. Here is an example of importing That’s it - from now on, You can also import function and tick that: Important Everything you supply to You can also import a function and tick that: Note that you have to also supply Note that you have to also supply The full definition of the Here Tickers are identified and stored by making a key of the callable itself, the ticker-interval, the
- Since the arguments are not included in the ticker’s identification, the
diff --git a/docs/1.0/Components/TickerHandler.html b/docs/1.0/Components/TickerHandler.html
index 665e53bc5b..31780e3fe4 100644
--- a/docs/1.0/Components/TickerHandler.html
+++ b/docs/1.0/Components/TickerHandler.html
@@ -62,7 +62,7 @@
Table of Contents
-
+
TickerHandler¶
-About Tickers¶
-evennia.TICKER_HANDLER. You can assign any callable (a
-function or, more commonly, a method on a database object) to this handler. The TickerHandler will
-then call this callable at an interval you specify, and with the arguments you supply when adding
-it. This continues until the callable un-subscribes from the ticker. The handler survives a reboot
-and is highly optimized in resource usage.Usage¶
TICKER_HANDLER and using it: # we assume that obj has a hook "at_tick" defined on itself
from evennia import TICKER_HANDLER as tickerhandler
@@ -136,7 +126,11 @@ and is highly optimized in resource usage.
obj.at_tick() will be called every 20 seconds.TickerHandler.add will need to be pickled at some point to be saved into the database - also if you use persistent=False. Most of the time the handler will correctly store things like database objects, but the same restrictions as for Attributes apply to what the TickerHandler may store. from evennia import TICKER_HANDLER as tickerhandler
from mymodule import myfunc
@@ -148,75 +142,45 @@ and is highly optimized in resource usage.
tickerhandler.remove(30, myfunc)
interval to identify which subscription to remove. This is
-because the TickerHandler maintains a pool of tickers and a given callable can subscribe to be
-ticked at any number of different intervals.interval to identify which subscription to remove. This is because the TickerHandler maintains a pool of tickers and a given callable can subscribe to be ticked at any number of different intervals.tickerhandler.add method is tickerhandler.add(interval, callback,
idstring="", persistent=True, *args, **kwargs)
*args and **kwargs will be passed to callback every interval seconds. If persistent
-is False, this subscription will not survive a server reload.persistent flag and the idstring (the latter being an empty string when not given explicitly).idstring must be used to
-have a specific callback triggered multiple times on the same interval but with different arguments:False, this subscription will be wiped by a server shutdown (it will still survive a normal reload).
Tickers are identified and stored by making a key of the callable itself, the ticker-interval, the persistent flag and the idstring (the latter being an empty string when not given explicitly).
Since the arguments are not included in the ticker’s identification, the idstring must be used to have a specific callback triggered multiple times on the same interval but with different arguments:
tickerhandler.add(10, obj.update, "ticker1", True, 1, 2, 3)
tickerhandler.add(10, obj.update, "ticker2", True, 4, 5)
-Note that, when we want to send arguments to our callback within a ticker handler, we need to -specify
+idstringandpersistentbefore, unless we call our arguments as keywords, which would -often be more readable:Note that, when we want to send arguments to our callback within a ticker handler, we need to specify
idstringandpersistentbefore, unless we call our arguments as keywords, which would often be more readable:tickerhandler.add(10, obj.update, caller=self, value=118)If you add a ticker with exactly the same combination of callback, interval and idstring, it will -overload the existing ticker. This identification is also crucial for later removing (stopping) the -subscription:
+overload the existing ticker. This identification is also crucial for later removing (stopping) the subscription:-tickerhandler.remove(10, obj.update, idstring="ticker1") tickerhandler.remove(10, obj.update, idstring="ticker2")The
-callablecan be on any form as long as it accepts the arguments you give to send to it in -TickerHandler.add.--Note that everything you supply to the TickerHandler will need to be pickled at some point to be -saved into the database. Most of the time the handler will correctly store things like database -objects, but the same restrictions as for Attributes apply to what the TickerHandler -may store.
-When testing, you can stop all tickers in the entire game with
+tickerhandler.clear(). You can also -view the currently subscribed objects withtickerhandler.all().The
+callablecan be on any form as long as it accepts the arguments you give to send to it inTickerHandler.add.When testing, you can stop all tickers in the entire game with
tickerhandler.clear(). You can also view the currently subscribed objects withtickerhandler.all().See the Weather Tutorial for an example of using the TickerHandler.
diff --git a/docs/1.0/_sources/Components/TickerHandler.md.txt b/docs/1.0/_sources/Components/TickerHandler.md.txt index 6362f03243..329132d940 100644 --- a/docs/1.0/_sources/Components/TickerHandler.md.txt +++ b/docs/1.0/_sources/Components/TickerHandler.md.txt @@ -1,28 +1,20 @@ # TickerHandler -One way to implement a dynamic MUD is by using "tickers", also known as "heartbeats". A ticker is a -timer that fires ("ticks") at a given interval. The tick triggers updates in various game systems. +One way to implement a dynamic MUD is by using "tickers", also known as "heartbeats". A ticker is a timer that fires ("ticks") at a given interval. The tick triggers updates in various game systems. -## About Tickers +Tickers are very common or even unavoidable in other mud code bases. Certain code bases are even hard-coded to rely on the concept of the global 'tick'. Evennia has no such notion - the decision to use tickers is very much up to the need of your game and which requirements you have. The "ticker recipe" is just one way of cranking the wheels. -Tickers are very common or even unavoidable in other mud code bases. Certain code bases are even -hard-coded to rely on the concept of the global 'tick'. Evennia has no such notion - the decision to -use tickers is very much up to the need of your game and which requirements you have. The "ticker -recipe" is just one way of cranking the wheels. +The most fine-grained way to manage the flow of time is to use [utils.delay](evennia.utils.utils.delay) (using the [TaskHandler](evennia.scripts.taskhandler.TaskHandler)). Another is to use the time-repeat capability of [Scripts](./Scripts.md). These tools operate on individual objects. + +Many types of operations (weather being the classic example) are however done on multiple objects in the same way at regular intervals, and for this, it's inefficient to set up separate delays/scripts for every such object. -The most fine-grained way to manage the flow of time is of course to use [Scripts](./Scripts.md). Many -types of operations (weather being the classic example) are however done on multiple objects in the -same way at regular intervals, and for this, storing separate Scripts on each object is inefficient. The way to do this is to use a ticker with a "subscription model" - let objects sign up to be -triggered at the same interval, unsubscribing when the updating is no longer desired. +triggered at the same interval, unsubscribing when the updating is no longer desired. This means that the time-keeping mechanism is only set up once for all objects, making subscribing/unsubscribing faster. -Evennia offers an optimized implementation of the subscription model - the *TickerHandler*. This is -a singleton global handler reachable from `evennia.TICKER_HANDLER`. You can assign any *callable* (a -function or, more commonly, a method on a database object) to this handler. The TickerHandler will -then call this callable at an interval you specify, and with the arguments you supply when adding -it. This continues until the callable un-subscribes from the ticker. The handler survives a reboot -and is highly optimized in resource usage. +Evennia offers an optimized implementation of the subscription model - the *TickerHandler*. This is a singleton global handler reachable from [evennia.TICKER_HANDLER](evennia.utils.tickerhandler.TickerHandler). You can assign any *callable* (a function or, more commonly, a method on a database object) to this handler. The TickerHandler will then call this callable at an interval you specify, and with the arguments you supply when adding it. This continues until the callable un-subscribes from the ticker. The handler survives a reboot and is highly optimized in resource usage. + +## Usage Here is an example of importing `TICKER_HANDLER` and using it: @@ -32,10 +24,13 @@ Here is an example of importing `TICKER_HANDLER` and using it: tickerhandler.add(20, obj.at_tick) ``` - That's it - from now on, `obj.at_tick()` will be called every 20 seconds. -You can also import function and tick that: +```{important} +Everything you supply to `TickerHandler.add` will need to be pickled at some point to be saved into the database - also if you use `persistent=False`. Most of the time the handler will correctly store things like database objects, but the same restrictions as for [Attributes](./Attributes.md) apply to what the TickerHandler may store. +``` + +You can also import a function and tick that: ```python from evennia import TICKER_HANDLER as tickerhandler @@ -51,9 +46,7 @@ Removing (stopping) the ticker works as expected: tickerhandler.remove(30, myfunc) ``` -Note that you have to also supply `interval` to identify which subscription to remove. This is -because the TickerHandler maintains a pool of tickers and a given callable can subscribe to be -ticked at any number of different intervals. +Note that you have to also supply `interval` to identify which subscription to remove. This is because the TickerHandler maintains a pool of tickers and a given callable can subscribe to be ticked at any number of different intervals. The full definition of the `tickerhandler.add` method is @@ -63,74 +56,47 @@ The full definition of the `tickerhandler.add` method is ``` Here `*args` and `**kwargs` will be passed to `callback` every `interval` seconds. If `persistent` -is `False`, this subscription will not survive a server reload. +is `False`, this subscription will be wiped by a _server shutdown_ (it will still survive a normal reload). -Tickers are identified and stored by making a key of the callable itself, the ticker-interval, the -`persistent` flag and the `idstring` (the latter being an empty string when not given explicitly). +Tickers are identified and stored by making a key of the callable itself, the ticker-interval, the `persistent` flag and the `idstring` (the latter being an empty string when not given explicitly). -Since the arguments are not included in the ticker's identification, the `idstring` must be used to -have a specific callback triggered multiple times on the same interval but with different arguments: +Since the arguments are not included in the ticker's identification, the `idstring` must be used to have a specific callback triggered multiple times on the same interval but with different arguments: ```python tickerhandler.add(10, obj.update, "ticker1", True, 1, 2, 3) tickerhandler.add(10, obj.update, "ticker2", True, 4, 5) ``` -> Note that, when we want to send arguments to our callback within a ticker handler, we need to -specify `idstring` and `persistent` before, unless we call our arguments as keywords, which would -often be more readable: +> Note that, when we want to send arguments to our callback within a ticker handler, we need to specify `idstring` and `persistent` before, unless we call our arguments as keywords, which would often be more readable: ```python tickerhandler.add(10, obj.update, caller=self, value=118) ``` If you add a ticker with exactly the same combination of callback, interval and idstring, it will -overload the existing ticker. This identification is also crucial for later removing (stopping) the -subscription: +overload the existing ticker. This identification is also crucial for later removing (stopping) the subscription: ```python tickerhandler.remove(10, obj.update, idstring="ticker1") tickerhandler.remove(10, obj.update, idstring="ticker2") ``` -The `callable` can be on any form as long as it accepts the arguments you give to send to it in -`TickerHandler.add`. +The `callable` can be on any form as long as it accepts the arguments you give to send to it in `TickerHandler.add`. -> Note that everything you supply to the TickerHandler will need to be pickled at some point to be -saved into the database. Most of the time the handler will correctly store things like database -objects, but the same restrictions as for [Attributes](./Attributes.md) apply to what the TickerHandler -may store. - -When testing, you can stop all tickers in the entire game with `tickerhandler.clear()`. You can also -view the currently subscribed objects with `tickerhandler.all()`. +When testing, you can stop all tickers in the entire game with `tickerhandler.clear()`. You can also view the currently subscribed objects with `tickerhandler.all()`. See the [Weather Tutorial](../Howtos/Tutorial-Weather-Effects.md) for an example of using the TickerHandler. ### When *not* to use TickerHandler -Using the TickerHandler may sound very useful but it is important to consider when not to use it. -Even if you are used to habitually relying on tickers for everything in other code bases, stop and -think about what you really need it for. This is the main point: +Using the TickerHandler may sound very useful but it is important to consider when not to use it. Even if you are used to habitually relying on tickers for everything in other code bases, stop and think about what you really need it for. This is the main point: > You should *never* use a ticker to catch *changes*. -Think about it - you might have to run the ticker every second to react to the change fast enough. -Most likely nothing will have changed at a given moment. So you are doing pointless calls (since -skipping the call gives the same result as doing it). Making sure nothing's changed might even be -computationally expensive depending on the complexity of your system. Not to mention that you might -need to run the check *on every object in the database*. Every second. Just to maintain status quo -... +Think about it - you might have to run the ticker every second to react to the change fast enough. Most likely nothing will have changed at a given moment. So you are doing pointless calls (since skipping the call gives the same result as doing it). Making sure nothing's changed might even be computationally expensive depending on the complexity of your system. Not to mention that you might need to run the check *on every object in the database*. Every second. Just to maintain status quo ... -Rather than checking over and over on the off-chance that something changed, consider a more -proactive approach. Could you implement your rarely changing system to *itself* report when its -status changes? It's almost always much cheaper/efficient if you can do things "on demand". Evennia -itself uses hook methods for this very reason. +Rather than checking over and over on the off-chance that something changed, consider a more proactive approach. Could you implement your rarely changing system to *itself* report when its status changes? It's almost always much cheaper/efficient if you can do things "on demand". Evennia itself uses hook methods for this very reason. -So, if you consider a ticker that will fire very often but which you expect to have no effect 99% of -the time, consider handling things things some other way. A self-reporting on-demand solution is -usually cheaper also for fast-updating properties. Also remember that some things may not need to be -updated until someone actually is examining or using them - any interim changes happening up to that -moment are pointless waste of computing time. +So, if you consider a ticker that will fire very often but which you expect to have no effect 99% of the time, consider handling things things some other way. A self-reporting on-demand solution is usually cheaper also for fast-updating properties. Also remember that some things may not need to be updated until someone actually is examining or using them - any interim changes happening up to that moment are pointless waste of computing time. -The main reason for needing a ticker is when you want things to happen to multiple objects at the -same time without input from something else. \ No newline at end of file +The main reason for needing a ticker is when you want things to happen to multiple objects at the same time without input from something else. \ No newline at end of file diff --git a/docs/1.0/api/evennia.commands.default.admin.html b/docs/1.0/api/evennia.commands.default.admin.html index cbb9967b54..2d9fd92144 100644 --- a/docs/1.0/api/evennia.commands.default.admin.html +++ b/docs/1.0/api/evennia.commands.default.admin.html @@ -317,7 +317,7 @@ to accounts respectively. When not to use TickerHandler¶
-Using the TickerHandler may sound very useful but it is important to consider when not to use it. -Even if you are used to habitually relying on tickers for everything in other code bases, stop and -think about what you really need it for. This is the main point:
+Using the TickerHandler may sound very useful but it is important to consider when not to use it. Even if you are used to habitually relying on tickers for everything in other code bases, stop and think about what you really need it for. This is the main point:
-You should never use a ticker to catch changes.
Think about it - you might have to run the ticker every second to react to the change fast enough. -Most likely nothing will have changed at a given moment. So you are doing pointless calls (since -skipping the call gives the same result as doing it). Making sure nothing’s changed might even be -computationally expensive depending on the complexity of your system. Not to mention that you might -need to run the check on every object in the database. Every second. Just to maintain status quo -…
-Rather than checking over and over on the off-chance that something changed, consider a more -proactive approach. Could you implement your rarely changing system to itself report when its -status changes? It’s almost always much cheaper/efficient if you can do things “on demand”. Evennia -itself uses hook methods for this very reason.
-So, if you consider a ticker that will fire very often but which you expect to have no effect 99% of -the time, consider handling things things some other way. A self-reporting on-demand solution is -usually cheaper also for fast-updating properties. Also remember that some things may not need to be -updated until someone actually is examining or using them - any interim changes happening up to that -moment are pointless waste of computing time.
-The main reason for needing a ticker is when you want things to happen to multiple objects at the -same time without input from something else.
+Think about it - you might have to run the ticker every second to react to the change fast enough. Most likely nothing will have changed at a given moment. So you are doing pointless calls (since skipping the call gives the same result as doing it). Making sure nothing’s changed might even be computationally expensive depending on the complexity of your system. Not to mention that you might need to run the check on every object in the database. Every second. Just to maintain status quo …
+Rather than checking over and over on the off-chance that something changed, consider a more proactive approach. Could you implement your rarely changing system to itself report when its status changes? It’s almost always much cheaper/efficient if you can do things “on demand”. Evennia itself uses hook methods for this very reason.
+So, if you consider a ticker that will fire very often but which you expect to have no effect 99% of the time, consider handling things things some other way. A self-reporting on-demand solution is usually cheaper also for fast-updating properties. Also remember that some things may not need to be updated until someone actually is examining or using them - any interim changes happening up to that moment are pointless waste of computing time.
+The main reason for needing a ticker is when you want things to happen to multiple objects at the same time without input from something else.
@@ -348,7 +348,7 @@ to accounts respectively.
diff --git a/docs/1.0/api/evennia.commands.default.batchprocess.html b/docs/1.0/api/evennia.commands.default.batchprocess.html index a6a85545d6..03c4dcdd9c 100644 --- a/docs/1.0/api/evennia.commands.default.batchprocess.html +++ b/docs/1.0/api/evennia.commands.default.batchprocess.html @@ -138,7 +138,7 @@ skipping, reloading etc.
- -
+search_index_entry= {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶search_index_entry= {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶@@ -169,7 +169,7 @@ skipping, reloading etc.
diff --git a/docs/1.0/api/evennia.commands.default.building.html b/docs/1.0/api/evennia.commands.default.building.html index f97c182e7b..d67e80dc86 100644 --- a/docs/1.0/api/evennia.commands.default.building.html +++ b/docs/1.0/api/evennia.commands.default.building.html @@ -592,7 +592,7 @@ You can specify the /force switch to bypass this confirmation.
- -
+search_index_entry= {'aliases': 'batchcmd batchcommand', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcmd batchcommand', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶search_index_entry= {'aliases': 'batchcommand batchcmd', 'category': 'building', 'key': 'batchcommands', 'no_prefix': ' batchcommand batchcmd', 'tags': '', 'text': '\n build from batch-command file\n\n Usage:\n batchcommands[/interactive] <python.path.to.file>\n\n Switch:\n interactive - this mode will offer more control when\n executing the batch file, like stepping,\n skipping, reloading etc.\n\n Runs batches of commands from a batch-cmd text file (*.ev).\n\n '}¶@@ -633,7 +633,7 @@ You can specify the /force switch to bypass this confirmation.
@@ -1345,7 +1345,7 @@ server settings.
- -
+search_index_entry= {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶search_index_entry= {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
- -
+aliases= ['@update', '@parent', '@swap', '@typeclasses', '@type']¶aliases= ['@parent', '@type', '@typeclasses', '@swap', '@update']¶@@ -1376,7 +1376,7 @@ server settings.
@@ -1531,7 +1531,7 @@ If object is not specified, the current location is examined.
- -
+search_index_entry= {'aliases': '@update @parent @swap @typeclasses @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass update parent swap typeclasses type', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶search_index_entry= {'aliases': '@parent @type @typeclasses @swap @update', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass parent type typeclasses swap update', 'tags': '', 'text': "\n set or change an object's typeclass\n\n Usage:\n typeclass[/switch] <object> [= typeclass.path]\n typeclass/prototype <object> = prototype_key\n\n typeclasses or typeclass/list/show [typeclass.path]\n swap - this is a shorthand for using /force/reset flags.\n update - this is a shorthand for using the /force/reload flag.\n\n Switch:\n show, examine - display the current typeclass of object (default) or, if\n given a typeclass path, show the docstring of that typeclass.\n update - *only* re-run at_object_creation on this object\n meaning locks or other properties set later may remain.\n reset - clean out *all* the attributes and properties on the\n object - basically making this a new clean object. This will also\n reset cmdsets!\n force - change to the typeclass also if the object\n already has a typeclass of the same name.\n list - show available typeclasses. Only typeclasses in modules actually\n imported or used from somewhere in the code will show up here\n (those typeclasses are still available if you know the path)\n prototype - clean and overwrite the object with the specified\n prototype key - effectively making a whole new object.\n\n Example:\n type button = examples.red_button.RedButton\n type/prototype button=a red button\n\n If the typeclass_path is not given, the current object's typeclass is\n assumed.\n\n View or set an object's typeclass. If setting, the creation hooks of the\n new typeclass will be run on the object. If you have clashing properties on\n the old class, use /reset. By default you are protected from changing to a\n typeclass of the same name as the one you already have - use /force to\n override this protection.\n\n The given typeclass must be identified by its location using python\n dot-notation pointing to the correct module and class. If no typeclass is\n given (or a wrong typeclass is given). Errors in the path or new typeclass\n will lead to the old typeclass being kept. The location of the typeclass\n module is searched from the default typeclass directory, as defined in the\n server settings.\n\n "}¶@@ -1799,7 +1799,7 @@ the cases, see the module doc.
@@ -1833,7 +1833,7 @@ one is given.
- -
+search_index_entry= {'aliases': '@exam @ex', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine exam ex', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶search_index_entry= {'aliases': '@ex @exam', 'category': 'building', 'key': '@examine', 'no_prefix': 'examine ex exam', 'tags': '', 'text': '\n get detailed information about an object\n\n Usage:\n examine [<object>[/attrname]]\n examine [*<account>[/attrname]]\n\n Switch:\n account - examine an Account (same as adding *)\n object - examine an Object (useful when OOC)\n script - examine a Script\n channel - examine a Channel\n\n The examine command shows detailed game info about an\n object and optionally a specific attribute on it.\n If object is not specified, the current location is examined.\n\n Append a * before the search string to examine an account.\n\n '}¶@@ -1864,7 +1864,7 @@ one is given.
diff --git a/docs/1.0/api/evennia.commands.default.comms.html b/docs/1.0/api/evennia.commands.default.comms.html index c46610c6d8..2d9002254b 100644 --- a/docs/1.0/api/evennia.commands.default.comms.html +++ b/docs/1.0/api/evennia.commands.default.comms.html @@ -256,7 +256,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
- -
+search_index_entry= {'aliases': '@locate @search', 'category': 'building', 'key': '@find', 'no_prefix': 'find locate search', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶search_index_entry= {'aliases': '@search @locate', 'category': 'building', 'key': '@find', 'no_prefix': 'find search locate', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶@@ -781,7 +781,7 @@ don’t actually sub to yet.
@@ -934,7 +934,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
- -
+search_index_entry= {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry= {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶@@ -954,7 +954,7 @@ ban mychannel1,mychannel2= EvilUser : Was banned for spamming.
diff --git a/docs/1.0/api/evennia.commands.default.general.html b/docs/1.0/api/evennia.commands.default.general.html index c908af8fac..7455dba850 100644 --- a/docs/1.0/api/evennia.commands.default.general.html +++ b/docs/1.0/api/evennia.commands.default.general.html @@ -268,7 +268,7 @@ for everyone to use, you need build privileges and the alias command.
- -
+search_index_entry= {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry= {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶@@ -300,7 +300,7 @@ for everyone to use, you need build privileges and the alias command.
@@ -323,7 +323,7 @@ inv
- -
+search_index_entry= {'aliases': 'nickname nicks', 'category': 'general', 'key': 'nick', 'no_prefix': ' nickname nicks', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶search_index_entry= {'aliases': 'nicks nickname', 'category': 'general', 'key': 'nick', 'no_prefix': ' nicks nickname', 'tags': '', 'text': '\n define a personal alias/nick by defining a string to\n match and replace it with another on the fly\n\n Usage:\n nick[/switches] <string> [= [replacement_string]]\n nick[/switches] <template> = <replacement_template>\n nick/delete <string> or number\n nicks\n\n Switches:\n inputline - replace on the inputline (default)\n object - replace on object-lookup\n account - replace on account-lookup\n list - show all defined aliases (also "nicks" works)\n delete - remove nick by index in /list\n clearall - clear all nicks\n\n Examples:\n nick hi = say Hello, I\'m Sarah!\n nick/object tom = the tall man\n nick build $1 $2 = create/drop $1;$2\n nick tell $1 $2=page $1=$2\n nick tm?$1=page tallman=$1\n nick tm\\=$1=page tallman=$1\n\n A \'nick\' is a personal string replacement. Use $1, $2, ... to catch arguments.\n Put the last $-marker without an ending space to catch all remaining text. You\n can also use unix-glob matching for the left-hand side <string>:\n\n * - matches everything\n ? - matches 0 or 1 single characters\n [abcd] - matches these chars in any order\n [!abcd] - matches everything not among these chars\n \\= - escape literal \'=\' you want in your <string>\n\n Note that no objects are actually renamed or changed by this command - your nicks\n are only available to you. If you want to permanently add keywords to an object\n for everyone to use, you need build privileges and the alias command.\n\n '}¶@@ -354,7 +354,7 @@ inv
@@ -598,7 +598,7 @@ placing it in their inventory.
- -
+search_index_entry= {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶search_index_entry= {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶@@ -629,7 +629,7 @@ placing it in their inventory.
diff --git a/docs/1.0/api/evennia.commands.default.tests.html b/docs/1.0/api/evennia.commands.default.tests.html index 63dcf51c7d..9851e3199b 100644 --- a/docs/1.0/api/evennia.commands.default.tests.html +++ b/docs/1.0/api/evennia.commands.default.tests.html @@ -955,7 +955,7 @@ main test suite started with
- -
+search_index_entry= {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶search_index_entry= {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶Test the batch processor.
+
red_button= <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpie4_w030/a9bf05734e137435a2cc016c0d751f84064ce2dd/evennia/contrib/tutorials/red_button/red_button.py'>¶diff --git a/docs/1.0/api/evennia.commands.default.unloggedin.html b/docs/1.0/api/evennia.commands.default.unloggedin.html index 99a2c8456e..b86b914d72 100644 --- a/docs/1.0/api/evennia.commands.default.unloggedin.html +++ b/docs/1.0/api/evennia.commands.default.unloggedin.html @@ -242,7 +242,7 @@ version is a bit more complicated.
@@ -268,7 +268,7 @@ version is a bit more complicated.
@@ -341,7 +341,7 @@ for simplicity. It shows a pane of info.
- -
+search_index_entry= {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶search_index_entry= {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶@@ -367,7 +367,7 @@ for simplicity. It shows a pane of info.
diff --git a/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html b/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html index da259c00b1..474c99d3c3 100644 --- a/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html +++ b/docs/1.0/api/evennia.contrib.base_systems.email_login.email_login.html @@ -246,7 +246,7 @@ version is a bit more complicated.
- -
+search_index_entry= {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry= {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶@@ -272,7 +272,7 @@ version is a bit more complicated.
@@ -335,7 +335,7 @@ for simplicity. It shows a pane of info.
- -
+search_index_entry= {'aliases': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶search_index_entry= {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶@@ -361,7 +361,7 @@ for simplicity. It shows a pane of info.
diff --git a/docs/1.0/api/evennia.contrib.base_systems.ingame_python.commands.html b/docs/1.0/api/evennia.contrib.base_systems.ingame_python.commands.html index efe4445016..a7fdab240e 100644 --- a/docs/1.0/api/evennia.contrib.base_systems.ingame_python.commands.html +++ b/docs/1.0/api/evennia.contrib.base_systems.ingame_python.commands.html @@ -116,7 +116,7 @@
- -
+search_index_entry= {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry= {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶@@ -197,7 +197,7 @@ on user permission.
diff --git a/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html b/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html index 054293ba8d..3a5616a7ec 100644 --- a/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html +++ b/docs/1.0/api/evennia.contrib.full_systems.evscaperoom.commands.html @@ -211,7 +211,7 @@ the operation will be general or on the room.
- -
+search_index_entry= {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry= {'aliases': '@callback @callbacks @calls', 'category': 'building', 'key': '@call', 'no_prefix': 'call callback callbacks calls', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶@@ -235,7 +235,7 @@ set in self.parse())
@@ -371,7 +371,7 @@ shout
- -
+search_index_entry= {'aliases': 'q chicken out abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q chicken out abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry= {'aliases': 'quit q chicken out abort', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' quit q chicken out abort', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶@@ -400,7 +400,7 @@ set in self.parse())
@@ -490,7 +490,7 @@ looks and what actions is available.
- -
+search_index_entry= {'aliases': '; shout whisper', 'category': 'general', 'key': 'say', 'no_prefix': ' ; shout whisper', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry= {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶@@ -519,7 +519,7 @@ set in self.parse())
@@ -581,7 +581,7 @@ set in self.parse())
- -
+search_index_entry= {'aliases': 'unfocus examine e ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus examine e ex', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶search_index_entry= {'aliases': 'examine ex unfocus e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine ex unfocus e', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶@@ -605,7 +605,7 @@ set in self.parse())
diff --git a/docs/1.0/api/evennia.contrib.game_systems.barter.barter.html b/docs/1.0/api/evennia.contrib.game_systems.barter.barter.html index e0189ad670..4415ceb900 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.barter.barter.html +++ b/docs/1.0/api/evennia.contrib.game_systems.barter.barter.html @@ -745,7 +745,7 @@ try to influence the other part in the deal.
- -
+search_index_entry= {'aliases': 'give inventory inv i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give inventory inv i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry= {'aliases': 'give inventory i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' give inventory i inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶@@ -771,7 +771,7 @@ try to influence the other part in the deal.
diff --git a/docs/1.0/api/evennia.contrib.game_systems.clothing.clothing.html b/docs/1.0/api/evennia.contrib.game_systems.clothing.clothing.html index 62777d4604..91707d1395 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.clothing.clothing.html +++ b/docs/1.0/api/evennia.contrib.game_systems.clothing.clothing.html @@ -622,7 +622,7 @@ inv
- -
+search_index_entry= {'aliases': 'offers deal', 'category': 'trading', 'key': 'status', 'no_prefix': ' offers deal', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶search_index_entry= {'aliases': 'deal offers', 'category': 'trading', 'key': 'status', 'no_prefix': ' deal offers', 'tags': '', 'text': "\n show a list of the current deal\n\n Usage:\n status\n deal\n offers\n\n Shows the currently suggested offers on each sides of the deal. To\n accept the current deal, use the 'accept' command. Use 'offer' to\n change your deal. You might also want to use 'say', 'emote' etc to\n try to influence the other part in the deal.\n "}¶@@ -653,7 +653,7 @@ inv
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html index efca33993e..adae913770 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html +++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_basic.html @@ -672,7 +672,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶search_index_entry= {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶@@ -698,7 +698,7 @@ if there are still any actions you can take.
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html index 37ac87b8d3..c375bddf93 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html +++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_equip.html @@ -567,7 +567,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -587,7 +587,7 @@ if there are still any actions you can take.
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html index 357befc2ef..fd9a60204f 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html +++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_items.html @@ -690,7 +690,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -710,7 +710,7 @@ if there are still any actions you can take.
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html index 3a720e7003..55eb38bfae 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html +++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_magic.html @@ -469,7 +469,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -489,7 +489,7 @@ if there are still any actions you can take.
diff --git a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html index 09197d0a8a..cbbf27f645 100644 --- a/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html +++ b/docs/1.0/api/evennia.contrib.game_systems.turnbattle.tb_range.html @@ -929,7 +929,7 @@ if there are still any actions you can take.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -949,7 +949,7 @@ if there are still any actions you can take.
diff --git a/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html b/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html index 1fc5811ef0..1caf634e7b 100644 --- a/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html +++ b/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html @@ -701,7 +701,7 @@ a different language.
- -
+search_index_entry= {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry= {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶@@ -732,7 +732,7 @@ a different language.
diff --git a/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html b/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html index aad49b98bc..7e1fadaeba 100644 --- a/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html +++ b/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html @@ -256,7 +256,7 @@ set in self.parse())
- -
+search_index_entry= {'aliases': '\' "', 'category': 'general', 'key': 'say', 'no_prefix': ' \' "', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶search_index_entry= {'aliases': '" \'', 'category': 'general', 'key': 'say', 'no_prefix': ' " \'', 'tags': '', 'text': '\n speak as your character\n\n Usage:\n say <message>\n\n Talk to those in your current location.\n '}¶@@ -280,7 +280,7 @@ set in self.parse())
diff --git a/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html b/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html index cfac852e54..5f1b8860ca 100644 --- a/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html +++ b/docs/1.0/api/evennia.contrib.tutorials.red_button.red_button.html @@ -153,7 +153,7 @@ such as when closing the lid and un-blinding a character.
- -
+search_index_entry= {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶search_index_entry= {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶+
aliases= ['press', 'push', 'press button']¶@@ -182,7 +182,7 @@ check if the lid is open or closed.
@@ -252,7 +252,7 @@ check if the lid is open or closed.+
search_index_entry= {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' press push press button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶+
aliases= ['break lid', 'smash lid', 'smash']¶@@ -279,7 +279,7 @@ break.
@@ -379,7 +379,7 @@ be mutually exclusive.+
search_index_entry= {'aliases': 'break lid smash lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash lid smash', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶+
aliases= ['press', 'push', 'press button']¶@@ -408,7 +408,7 @@ set in self.parse())
@@ -506,7 +506,7 @@ be mutually exclusive.+
search_index_entry= {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' press push press button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶+
aliases= ['get', 'feel', 'ex', 'l', 'examine', 'listen']¶@@ -532,7 +532,7 @@ be mutually exclusive.
diff --git a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html index d2766bd8c5..0c458cff37 100644 --- a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html +++ b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.objects.html @@ -425,7 +425,7 @@ of the object. We overload it with our own version.+
search_index_entry= {'aliases': 'get feel ex l examine listen', 'category': 'general', 'key': 'look', 'no_prefix': ' get feel ex l examine listen', 'tags': '', 'text': "\n Looking around in darkness\n\n Usage:\n look <obj>\n\n ... not that there's much to see in the dark.\n\n "}¶@@ -452,7 +452,7 @@ to sit on a “lightable” object, we operate only on self.obj.
@@ -556,7 +556,7 @@ shift green root up/down
- -
+search_index_entry= {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶search_index_entry= {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶@@ -592,7 +592,7 @@ yellow/green - horizontal roots
@@ -609,7 +609,7 @@ yellow/green - horizontal roots
- -
+search_index_entry= {'aliases': 'move pull shiftroot push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' move pull shiftroot push', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶search_index_entry= {'aliases': 'shiftroot move push pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move push pull', 'tags': '', 'text': '\n Shifts roots around.\n\n Usage:\n shift blue root left/right\n shift red root left/right\n shift yellow root up/down\n shift green root up/down\n\n '}¶
- -
+aliases= ['button', 'press button', 'push button']¶aliases= ['push button', 'button', 'press button']¶@@ -635,7 +635,7 @@ yellow/green - horizontal roots
@@ -779,7 +779,7 @@ parry - forgoes your attack but will make you harder to hit on next
- -
+search_index_entry= {'aliases': 'button press button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button press button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry= {'aliases': 'push button button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶
- -
+aliases= ['thrust', 'chop', 'kill', 'fight', 'defend', 'bash', 'slash', 'stab', 'parry', 'pierce', 'hit']¶aliases= ['kill', 'thrust', 'bash', 'slash', 'defend', 'chop', 'parry', 'pierce', 'fight', 'stab', 'hit']¶@@ -805,7 +805,7 @@ parry - forgoes your attack but will make you harder to hit on next
diff --git a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html index 98125ac568..aee49eaa92 100644 --- a/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html +++ b/docs/1.0/api/evennia.contrib.tutorials.tutorial_world.rooms.html @@ -816,7 +816,7 @@ if they fall off the bridge.
- -
+search_index_entry= {'aliases': 'thrust chop kill fight defend bash slash stab parry pierce hit', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' thrust chop kill fight defend bash slash stab parry pierce hit', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶search_index_entry= {'aliases': 'kill thrust bash slash defend chop parry pierce fight stab hit', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' kill thrust bash slash defend chop parry pierce fight stab hit', 'tags': '', 'text': '\n Attack the enemy. Commands:\n\n stab <enemy>\n slash <enemy>\n parry\n\n stab - (thrust) makes a lot of damage but is harder to hit with.\n slash - is easier to land, but does not make as much damage.\n parry - forgoes your attack but will make you harder to hit on next\n enemy attack.\n\n '}¶@@ -842,7 +842,7 @@ if they fall off the bridge.
@@ -968,7 +968,7 @@ to find something.
- -
+search_index_entry= {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶search_index_entry= {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
- -
+aliases= ['feel', 'fiddle', 'feel around', 'l', 'search']¶aliases= ['search', 'feel', 'feel around', 'fiddle', 'l']¶@@ -996,7 +996,7 @@ random chance of eventually finding a light source.
diff --git a/docs/1.0/api/evennia.contrib.utils.git_integration.git_integration.html b/docs/1.0/api/evennia.contrib.utils.git_integration.git_integration.html index a728472d33..b0154c59bd 100644 --- a/docs/1.0/api/evennia.contrib.utils.git_integration.git_integration.html +++ b/docs/1.0/api/evennia.contrib.utils.git_integration.git_integration.html @@ -208,7 +208,7 @@ git evennia pull - Pull the latest evennia code.
- -
+search_index_entry= {'aliases': 'feel fiddle feel around l search', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel fiddle feel around l search', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry= {'aliases': 'search feel feel around fiddle l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel feel around fiddle l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
- -
+directory= '/tmp/tmp4kguhrm8/d10fad89ad2e90c9458b262b73fe6a77db4be97c/evennia'¶directory= '/tmp/tmpie4_w030/a9bf05734e137435a2cc016c0d751f84064ce2dd/evennia'¶@@ -269,7 +269,7 @@ git pull - Pull the latest code from your current branch.
- -
+directory= '/tmp/tmp4kguhrm8/d10fad89ad2e90c9458b262b73fe6a77db4be97c/evennia/game_template'¶directory= '/tmp/tmpie4_w030/a9bf05734e137435a2cc016c0d751f84064ce2dd/evennia/game_template'¶diff --git a/docs/1.0/api/evennia.utils.eveditor.html b/docs/1.0/api/evennia.utils.eveditor.html index 94d49b0ad9..e31e961e58 100644 --- a/docs/1.0/api/evennia.utils.eveditor.html +++ b/docs/1.0/api/evennia.utils.eveditor.html @@ -336,7 +336,7 @@ indentation.
- -
+aliases= [':j', ':S', ':u', ':wq', ':q', ':s', ':y', ':dd', ':!', ':p', ':uu', ':DD', ':q!', ':I', ':i', '::', ':x', ':fd', ':A', ':echo', ':=', ':::', ':', ':fi', ':h', ':w', ':r', ':dw', ':>', ':f', ':UU', ':<']¶aliases= ['::', ':f', ':wq', ':j', ':q!', ':p', ':!', ':<', ':fi', ':fd', ':r', ':dd', ':A', ':uu', ':DD', ':q', ':echo', ':>', ':UU', ':u', ':y', ':i', ':=', ':w', ':s', ':dw', ':x', ':::', ':h', ':', ':I', ':S']¶@@ -364,7 +364,7 @@ efficient presentation.
diff --git a/docs/1.0/api/evennia.utils.evmenu.html b/docs/1.0/api/evennia.utils.evmenu.html index f46d35ac1f..c18f51dbd6 100644 --- a/docs/1.0/api/evennia.utils.evmenu.html +++ b/docs/1.0/api/evennia.utils.evmenu.html @@ -931,7 +931,7 @@ single question.
- -
+search_index_entry= {'aliases': ':j :S :u :wq :q :s :y :dd :! :p :uu :DD :q! :I :i :: :x :fd :A :echo := ::: : :fi :h :w :r :dw :> :f :UU :<', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :j :S :u :wq :q :s :y :dd :! :p :uu :DD :q! :I :i :: :x :fd :A :echo := ::: : :fi :h :w :r :dw :> :f :UU :<', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry= {'aliases': ':: :f :wq :j :q! :p :! :< :fi :fd :r :dd :A :uu :DD :q :echo :> :UU :u :y :i := :w :s :dw :x ::: :h : :I :S', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :: :f :wq :j :q! :p :! :< :fi :fd :r :dd :A :uu :DD :q :echo :> :UU :u :y :i := :w :s :dw :x ::: :h : :I :S', 'tags': '', 'text': '\n Commands for the editor\n '}¶+
aliases= ['a', 'n', 'no', '__nomatch_command', 'abort', 'y', 'yes']¶@@ -957,7 +957,7 @@ single question.
diff --git a/docs/1.0/api/evennia.utils.evmore.html b/docs/1.0/api/evennia.utils.evmore.html index 4d1dd910b0..8a135a2a3f 100644 --- a/docs/1.0/api/evennia.utils.evmore.html +++ b/docs/1.0/api/evennia.utils.evmore.html @@ -137,7 +137,7 @@ the caller.msg() construct every time the page is updated.+
search_index_entry= {'aliases': 'a n no __nomatch_command abort y yes', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' a n no __nomatch_command abort y yes', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
- -
+aliases= ['e', 'end', 't', 'next', 'q', 'abort', 'n', 'p', 'top', 'a', 'previous', 'quit']¶aliases= ['next', 'end', 'a', 'e', 'q', 'n', 'previous', 't', 'abort', 'quit', 'p', 'top']¶@@ -163,7 +163,7 @@ the caller.msg() construct every time the page is updated.
diff --git a/docs/1.0/objects.inv b/docs/1.0/objects.inv index 6ef9e5b9a929c56ff5d2a633dd8d31ee13c3a3dc..b3823e03b262311e3380997c306606df0cc23c50 100644 GIT binary patch delta 66936 zcmV)0K+eCI)Cq*t34pW#V;Fzfco7_YCo9Gj1Ho`Yw=FjV5fk_{G~6}
- -
+search_index_entry= {'aliases': 'e end t next q abort n p top a previous quit', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' e end t next q abort n p top a previous quit', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry= {'aliases': 'next end a e q n previous t abort quit p top', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' next end a e q n previous t abort quit p top', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶qDd=Mx{skMPR;>L8X7O9wlgEu{1r1 z1DG(@2!hNYkJNU S7Q>1?sz@dNib5WLQfkvV0U5BSD?i=zDp{Et$Gd#m{0d}L|9Z4AEFpodF z)X}=@Dfwna&~IItbM!O0PfxEdEd2-f71mF1AwRi3zqw7Qs{zKe4v}pOYg|-(qu_AC z!A>joA>ft9aL$obU?kmR42{Avy1+2-G^8u(!Jl{BH1c4?7@dENILh@lF`9*i)vjxb z`5;qt4{U;3vbxIGB!5PNk<+tNUG1=E^-m!k*0xRmdj(n!Afzg~XFMcnFXnKv#6^ zW=6C!ZV)_3NKhB_75B|Ew_<~W54Nl0l(GU0>kswuD6?)dxV{E!?X5hPUdJbt7v~)W zNLT=V*j+4Cxix<*iwfI2DpT*k^dAnX{4ZV(6!gKoXa314_h%2Q8=uD1)SHxpx=>hU z4`_pW0!J(Kx~@BTo_3qQZL$rK!$xzPWC+dQW)~h{La*uw9HSH=0w}Sekj?@keb7|0 zMbxI08*vtmo7`9C9Lh1_*X(a7<*w^o%QJ3DF8rGP4WxfuWlcVjkcpnb|Dj}c>9~OC zCPUFP_&<;gtV>Uf850FN-=Q&k*fqGxN$07#>lBHbb^!90eJA`oP?a^QNCSIh-5z(u zNl7-&hZdYVS<&7xkK~4VB*G(9%cjVEH@e)4DFE;2Z^QL12mN1noBO(J>S`K!FaAHp zuR!8 jiI>aqLB4e;h;Zb6Z*))|OrO|{Z{V`x=*YNFK z8}nzK8T7tq_-zDX*N598CwO-U_5wjH-Oxb{?P2lY09>{HNpp2YOCg_ve42m=ULArR zNQ{H@d} h&TgTgSw=Swy{Eg68n9Vl>p{^{5crqrrVqVF2Jj@UO z!>Q@IE^|_q*}mQdXRs#o4nN-Ghn0otf`;?%Gq?ornW3v}Mp+iiL^>Mg>Ld0|R?(8* z^f`b2ECSuFcSU%nc;QkC2U)|Fykr5DBBT*JvnRgxDG~v#*mJ`k-;?HSc&Q0yv&nyE z9=$OfUM>fkw5}8X(qA^p?dWiQ9|qfG(P;8^$DecxfmQreHmtnOGB#Pg8uwXStU#Wh zR>3104`uxvs)!xnHTd)?!OnMpk5!pxEs=i%$a?{6f)^ceWEu5k8TJkyl6Yn=1_-`l zC9K%OZqC*-rIpx5!P7h!79?N?Xgi+lDzyC;64aO|VuPr7pBssxS96f_H6)yLqIBTh zPE8FT2w#dqe^kbPkJG6dX5>VT*pq)FMSi`#eDCIGhe3JCL98}P2a`P4gPkJfUZ{Uh z>(+(Ym|WLU3P>SkMesfS_E6!9BCJE*m%HXZj&UH%iEnWk5|*ye+09Q=1@jH((QHAC zPwApmalmk`c!-3BNZ2Em`*J*85ekZf;jr9_*OE7E2#0WiWy6DUE>5D?5A5dihK){{ zw?(ftyruK3w1{3UG>L!)a#QEU!(M+3rNuZfiqZ{nDSWYz3WIN-ol4 bBLvyYJ^8?9EROKk=i8Po|^*Ig(a5Bi$@HNq*!eJFbf>Oev{ z7DPXd9K|*in}@u(vSO9RL!5uQy1;w( &-$Ge)Wr-~u2h5w)Mh1Xic6rq~eYra9j2Fguck}d7*>@BEQGdJip`0{-a zHu6?{BNS%`7xAQsa&xbpuCxvCy7x)cD}ZXFQ5LH&cmo19?agDlK^XoVy>Lw6G=LqE z8*1iGr6e)Ic*5wbOsH`H)e6^x|sc@1YpBQ&n5wyldB3HSB@(;HMvME)xD>!sds3 zp^XoK?n8@H!O-~s-~Ypi+(+93$^zQs|CJ8VHb4FLcM)kY68SIgfHZ@&U_azr^Ol?% zgc6xX+X&(3z+~NxWBOpm7c!?SebQjWUqR!w;y!USx@b(K$X9 S-x3k`}w%tFUxnZ|AV_zN48plMjV&@ueO4tx;D5*ZWe~eJ8e7 zWf1B_tl9DRyH+v)uF#Oy!Jt{|<11iA1-D`0WV }K_k(5n(ewe-R`zq(m9KYM^Oi)qB0MKg91I2Px;Z4Jh)-U z9tw(7+6gs&(+4*JnXgC5&93YUai4huwkIGp&^7gpxXh}C0A4C#5(tBdtA**+ezzlS zXRfEri|?wyZ&*!cyJ>m|Xx-o!OE_E6R^asDX6y_0=+}Q+%~bVJ#bF@vC Gi*Ki= rE+F$QFrYcWtOzVG8N&vB9faz|y8z6iW)z_+*3>~O~ z4F8e;@FGvjP_wY$49ilA5u2x~i1OP?!QKjwkKRbm(IC >RG((&iIM~V#YCBtB^l-CvmRB_7>E;pmEyzXdHM_L)flUbWS zsoj5C7{#P ~favJ33=GU<(ownCaM{?8xEmE%R`*=N^MeIhnqrTF8MB9 sxCI46Q?(*!)in?j@P*e;mQ7>=aj8W}JbBCCNBe{R_ z^ymQZu~ vwR2?@~(lWvM813_Cl{C9s{S$1pC zhb1EZ9LOjG#DT#f#YjDlKmT4kPJHz&acF$ZI51$OTF-|8E(>hX{O>Z_PL)_NTlCSF zD(I;kLp)W2C4W(= 4Ss5Vjw69PV>lYm=NbZA1V^(s 1#J!_#$?-F z_rphA22F&Q9a*lTvxU<%QyCrcQ8^hvIz*VHNuTzjSqsY4fjT`(s>7&_#Sdqy*Dqtu zUS~}=I-6?>A`YUn;Ff>hhX=(|>F_J8<5LI*a=~;(PO=t9Gu3vLG7x_btHd^h3vkDw z&xfnCM7leb39qS|2H`D!&($|AMfFfeunh$J1_?f0j7Gaf4kF!j(I{ZIdgSMyYF{x_ zgNouv-I88jd4R+%jU|-2q|(Xy`iWl+JJccig{AXY8FzZu`Tl>wat_21Qhh>3M8X4( z8wz#jPtOq#7yD3m#)KM@h=*X9R`F~Dd2b|l4-cM{gAlxY!cPkZP7$`-at~KWsDn>) ziK 3bb8A zsx`jfRMd33x}Sfli~|T2yW#%H755KUvW-)v^%fpBHN)GXg~5oK9eyat=5v?g+eKMd zFbJtl&jL93RH-xN!_9;yF?11&`Dgt}%$cqcueJhp#fwQEi1c#-+oi@c+=L0_&t zk`k^lSsv@Mvkc^Z#n0qYKGJ35n^32Fk&t?fCs?<1&Y$5;Sxkuu+31G3)O=YYhh-=n zt%X;o(mZTxq^L9&z2Yv(8}8yD{@bpgEh8OyHxVt5D)cA#4HxkmR||xXkC50ht4ZNg zCB$2D;c0(@fO$|)A_Q*PUq3X(3kEOpS0TVnu?E9Tk;$Wr-Lfx#0 XY{YOZCMw^Bz@OP)6ErvDd`YUEXZ)*#6ysoS>v=<+JlM<-6!s9s zDkW^u!+IORN9}+*O}J0Oebk!>UIqC}d=R0~xrcvAITH+61H>QT>Y9lRmCEzG)ni?( zNLp{r2k`wGfn6pYqlZnnQ-Cha1Xj=-cC3Ud%q(Wvrn4hj;jj^ %vkk1e(QMO4}a zRbjo>h<}8@pH-C(L0VL+a@S7em$GN_X9%Zq?MF+)2_?{hrQRR9S2HK1M3N`c>^nTe z2WNj+?&+LUUN(u>(usC1J@GuuJ)!e+;TfRm!>%mTc6ZNOg{)0mvd!q&h1g!R@vG~H zd`m+lB18hy1|C9r!^Wq$XlYq%F+t5Cz&qYR^X~{1FrJfJK_iM#1`{Z}CFIMx@k$6m zz7!llRgo6X|Do2Vr{w*dBZLp=z~ao`mG^&X0f%)Sil*%*Ho^n>kGm$p&(LOA6k@iT z57%5u@^xx! 5z7%m8N9z)23z|LSruFVm{sL6iSw&vaIuU#xiwhv-(lw_b^4)f zRMc}qV5eF;X8?C_r=)`q>kaxR`k99MAuNU9_ m;qbnXZLFtg(|#$+lH@5CIRDnEuE$9DhB+j{ z!NAR)2?1mKxR39w{d!p52(ULrz;u6MT-O)~$qkK^i}+$_ARQu1&>^NxHE9sjvX0q< zikOL3nKKyHbKZz$30r>-LI9R+7__NN<4!jQLz~JglCnS^WhJmC6GRe`6FrMH`G2t! zfg*U%7Bs|1sbEJin9?GC&72c(PVfOMaJFj^lJz~QJHO92Sy86%nW0BVwkzTIbLHp& zCOvXtC(_c7siM#z_kzOoWJqT^RKSiiS+j^@G}0!bG7nfo4q< V<;a;20z |L`)!6onyMOi_4hR~a2_ z)%C`cQ8Jv!D0H}{4o*}yc5I7vm2Mx4vTp0` Ecy_3}PBVuZqUR zJ1P$coYV4 U_7F#;V9(C?8(dP4-1I#Be}zyPz)7uea);_<2=iX6JV;dDxX{ zOS;Z@z2Bpp8RR3{t!J)@aP=z04aDLZzO{dsZludd{)$_rg(HA#;||?G19`_Qmbw>| z_reThXt|sAj@RDiMGeUt819r qRXcstU4(SAkY;;gX8-KiUg}Z#xYk(hhmH z4%4)6qv@b1;QFvpL1hvyP_*m1-0_zHjqsGajH4Rywye7e$>#&SRs9n+G0}gl^4o%x z`9r~%q-}qVgABzRhOFHu@QFqoVJqGNj5US|q(T5+sq;i#Cp5`N>+k>{G)FhI&F)CZ z*{gvPCV;mW=kMPnx968v?@w>flmB)8mz!Tada&JcZ+kx=mr@`34 (;(hQ7=JH{4_fxTdwr)%m}43Z#H z5gXJYi4#+{%sPdaura$BS;P1{pF*z#+=$`(C;AnnKu|$95xa|fo!1>a*IKW>a08px z(yo66 yzBhH%C z2V=E}eS<+67bLsvi(mJdZ$n`~p$dkxg`|JckjR-n7Zvsjm)SObQ?y(0a<46=(VU z6}WaqokJMd%gL*vNH^3Gb{Dyowv-zsrY&;!kp3Z+r?OiaDkYoxuZ6E{TGTw4_4MZK z;v%8)$#<~(DUH){faKHd+w>1f50HpZ2?O{(G x}@V}zaCx9OlFfQ<+1QGK%lflHA#b}24~GxnHY?Yl?Ma9Rr~mik$l z=i|vlpjh^_G=%ha*VRptl~m`ftk*jd&OVkE+rI1zjd(&;Gc7InknoBwyF|oC59xD3 z+fd;sYjjwyI5iGsI_1}x#Bc_J!Nq?-bd zkKRzjVcRgeX;R}PSHH>Eq7x5*%#vRgWcl15IE%+brsan;O$AK|>^(E(LDs{57oz z$!Cd42#++11$&hkh>e^fQ1X9F5(qRYmQVs{ku4gfg#>%}a2-l*Ar6dW2n}3JW?}kP zm=;2au?RCcihS&_a11>x{mtvy
I7NO z@|-pJvR6aaS(CH3LsvVrK^UQ+=sg^0r^)Bj>kk(n-X+)P?@q7Zz^{Ls^RrLa7q@>2 z(X>AXkG+fenLEFVMi}KleeXI!sTmX+D-)pz-b &f_Xl+>QD75yWf>rGog@q@Yp(r^v3?7_YTk(qIZW0AFmrG8I$c{0y&`}Y}q6a zETn8mz#({x3TCJ?;lqEXh`mpsg8U6Lj8lrwZ|7v1enzA-<^eCDu@uBNymJzw-D6f% zB%fRd2l8j^Grac6Q5bs!PZ+;}+bQb9CsXta!Ih&u{!E{6uOHNRS3=^UKQ=jK&~1FR zQUVR$s|*}eYpStKnW3I|0HvzDP{h}noKzE x#^umb!=%Cm84ycT==& zfW;?=nktA;O>qlRhi^iN{rN2$7zSNJFe&DQJ7n=z++Jf3#`fKj*dv+JKzs1cg}2P# zen%y!0cXb>#b|$el7cz_J0K~)15{X(3F8eAT9c3wM*OCU$`i3yJYsGMfj6F@O@TL^ z;>m{qH-x|gQP2*-cZdqYx(YLI0$nLPWjH|@E0na@f-_k*eng)D1=)RaFw#idhPa8i zdLg|BfQ4KfRk80t6%LtL4dib{B7{z*@R(>rO1A1av7LV~f!r!?;Vr_{g;mwcE|>lk zz9c$io<7VrqNtig46l2e!H3N)EjYaa;>elhQ$`zCc$OO@C|mw$y(~C?7S5Pd!g;LM zWmdS4B0~Uq!Vqq?CQQWAn__U~P#<2R3+m@3kx@31Jh;D5S;M#0FS9M$TJ^jV)dyoK zcnL=pn1g={Q!bbVg3Iv2z5^fpvo&VC+)C%Acq{~tbp%mshJ&Hh<9U*Xc;8O2sbxcx z28E#x!C4M;4%V@^&O2E#6{5HB8=*o!Uxa8eBWRPAF@h;mPbfpotXjN+Y-a*5L1$Ge z&j}r@s||Oyk| <=_3=yHW2j24vfFTT|eLOuMejm zD^xt3=<3qhW V6%>nD9$!{>q%iXC`;t`WSy<{33ImJ z@*RlAMsLJBJ%;!|H7bqjwxKtjO-h(?0+W9PEL^AjwJ}d)pa*3Me@#*80Ph1{v=UxE z7G?ieT0a2G+rG#f6tLj%&0lFh0bPUCdZKefyZ{?`T-m78801tq$>Yl*+JLpqy2|`3 zIwma?;r?e3E3; m6gZ;)RdW$z*Z>b z9YHm9+erQBoUWWhIR!`2?3%iUs}<2?o3x2&vd7#dd-OD(l?$>zAxzkB!}dXbaN)2* zVTYZ5rXKNyqsqQ~*`;k!!t3^%Vp4yij4}T8kN@WbI3_o} Z3f!(;pGDYtC9ZR%__ zrC^v)@T5O`4o #ckg}ywISbYG)lILvEw4o& zKKiap!mVQ^_jrbwA;29NKH0PLMCOsk9JO&`BlNzQI-ty7d5VKdRA$wBN7EUb&gaLX z1yjuR{ll(ZG4h~-qH7R}`JR7=!-krNOO$Zd1s^p6O`o^8Sj55c8kD@A8=-s%-ofQb zB_W%D1uMIbTwGO&Ik`0msgpXXd$E&s{OJw-ph|^Jlr1v6fo{nzuTwV6Ncs^5JNLCN z+Rk+7*9HkyY6Dla{dTxqS}7nG;#ZUsTQyewxQU;3W3f6!zaaeClNNuAMxfyir}{b& zmNmQej%$*quXkPNxx(BB Qp5EhEXdHD)6F|Hcp~e}9 Z*atz z*Pa^N2V-f;zTecQF}@Nut_K~EMD?LMX{*O7oKg`Ck77uZIwW#8syAi*oSwr?KWC TEPsxm?PzGvl6Y)e%P*@d7*^k zyFt`}rp*&cK3tvItGX%|mp4Pkn0di~wG+Cg)pixw)Q#xPAfd_7WQFI^C>De#F8;Q` zsF#lWhr2rPd!(IE>Azi|aCwo$?c)9=FqHn4`@59HXHUIbSE_$9LgI}5b%Dc1Q%pQr z_!Io&!X;m~G-{9}c)>z$EOdPqh7o#z&V@I-s3Es1{CU65cHZ__RfL6q2miZZW9p`Y z9#btP7o8BT{P)#V8X 4hP5JC-A=ult!&9RxJM_z%{WO{7CS_#T84! z!runL;#I6R7My=ep*!BvYQ03;2FxvVMLd}ziGEk|+e;eF)do~K7LZkBwRw!@GC=UY z0b2pJX?5wt4<^UPR} n5}UqB)uV}IM!(Iwq!WPZZUh$6 =Dv@{RDq5;hC>~C>VH}rK$LlA?7Go zX#|2VHFT9i0H S4VbTVLQzrc@{Qki<6B!f7j1vshG2?|1x1M@<207p?u1O6W zlAaOxT7iH0)bgjQ_^Mtkv6X)%94q|bke0<4e0h_L?@f~iRWdH!hnz8qK49GmZN(WP zc5owB0UJzkVtmHqsTFD6v#358OKerlvgode$ipv18 FB1 zB)CQcO&{B>2;2V~a#}zxH0LC@Z4eGL3NO 4z1GncC@^9Z7%A1DaSBd?0w5z*q9~8*@9V65iLl z4(~;5v+nVssQicIbzYPFDLCTYiYw{p)Z)Gb6U;enl`8MuJdIu#e9gWR{BjcJ n;Wyj`Zu kIAx z_r6XAb;GaGDQ^;gs~L&)=K|Zp%&Lx#Yjb}B)h-QQfY6lDfzlz;h44
q&wvP1) zRmJe`PS+^Bud}du&sykw`A;!49ch}~wu^5uhoTqycOWff!$evpdZB+iY2g-Dd_%2B z!PTwO-#~*zbi{fgVEGUfnHD#!V_CQq(6AkEFHhHGRf}5))8aLf2Mgi1(lH>mbwz*D z=WHKeOm)GJ>?@#SXYWbHQE?IW0+k2;i8N0Id5*#tG9UR5C&RQpMv=M->pdDeL?can z#%OZa%7>G!BPD?*d EzjMQ#=`y!+ukA z9CzEH@TYBxhiKkNCnr6u8OnVxe6@d5%uNC{FavyMu56_o-~RN?V7~7E9!o7mLMBK& zY;529D&Y=3a9osvtf0RG_Wy_R7>UyWxSj=BNq-wp1hnb9U4g?V_o-tw9Dkpwms8FQ z!rdbb?_|PlP5GssNlb;jJMtrSyl{uATV{KhZPsAOmJ7wIXo7f;ZeR&f>f(P@rQO|c zijG^5n5c^p<3>70X!HD-b!pM2?XKv=Q 2PY>69)_4za40*T=`{TuL z$sJqNYGYaC5#}~gVZ4mp>XCnrP*$XE>*$zivihfwx6b!qSu9{gIHJ`=wJ#s(?%^Sp z3`OvNFE}&ebH}z+<4Cw!AQaVrJf!k@m^(B?6PtrlJQd<2K%W9--91LvaVaH!_*m+) zZtgZ&^JTY<%s>=Pg{TJPCEaZ4RL8r!I%bq|{ZB7fSg$^0;!=SPG97;@moSWtrV(QD zmyf8)9^zYmDJ6dRSa3(_4$K#U-M~mPb_ZJu55PRsd9jM*LkalLgG|8U+g&Nm$pjOi zAhWEJC?Gz%rz{6^f?#Pqj!qF&etYTKRkkHC6py9r1(n}EI{upZ-2_7M5IUn&fjp!S z+VkeYguR&j Gqm z_~qph-Qca|0ho_^{19+Bvo5QD`gpx-0V6h$Fs=jW$n43}JMUYmLwx0_)E>ga1v{8u z<7k-31^n*?$FjP~ws*PmYH9=%x8k`?h5Q&YOowg%ieoH27uA1&Jfs_86E&C%CE!0V z@;1oe+ZbQU^*?=FbOb%6FU8}MOs7m(*j~}p zIPxo>3`B{n1>Aq95*^aq_jfD9wU9R*lODpywT+w)fB^mHg$+4ZG{)vq;)jPN^orq- zN0pO5eOzVzeCJ=_9#Qr8;sk()sAHG9?kaxUEtrZ6!qu-t0rAnHje9X84qX8qFq<)8 zBj~K3cb{3;W;J~R?hB0gnT+L{z!0C%VQznCAcBMtep-J&Q9yij`YHWzwqCCP>E&X_ zg6{&(e~ 7hci2oH7JGq3U?@ORN+llzKeok)d-h(8kG~M6Pnb5DK+-gASn|jsS(9l!c z++gHgEq8yyAjBAu9Sq&n4M`tL+T_BP48G%mryq^UFd%e^pC;gy2ru>`2zpsG*%prd z?GdpIeR_4FpWo17k@0Uk>*b0eup0h#|JwpC7r$X_3RceW9Cf`4 IxubM)0ZHv35V!napn82EkDh;k4AG%e6?ooaAE(?%T6=~7Q;_=v zs4 gd!<55KeJIue*^S34vZ|&?4K4`hMH8p65kYE*2Q;{E!hOvu z^;JJC#nkX;vTbN>;EH2c%Oe26`QrqLZ#Ko#YVDrp+1DTq1|s4iHuh;@d7>i?I893v z9WH-4K9Mk{v6yg5q?3j5Ye&0E8aBKo9*CUtPgk4#NV42&k9UYK1OLi@m@(x^-yqOF zv^)ZAfvutwWFT@;`4gm|6Om$dUt5NwBL)nfV)zUE{ln|J%+1*0inEaK?P``q+l4|w z$oKHS8EUgv%V!wqQ08)fbK4ha3lUt53_^d$fN*uvjMEl5v8@RYp+wjl_SXVf@0t}I zIu&q{SH2h=1aFkQLDvLa`xl7K)E#?SDujy%y~RIfv|UrS4S669saEV6D>!7kEwfcv zbU;3}0eqsKKU_;scnu4lJV8&hI&`c=r-8*L?P$vsq<}8*Xa1GImz4rXYWPGhVXuEd z=449?VrD-RVqkTH{Fx8>cmNy~r~%Bn@kh{uR1jf5v%eO=hV@(6Uqg3^t90xnUPfo6 z!Ci0=&}SBijR^Wc>?{}$r0L0@uSDcWI&ZS8B44fS!@gr5;|UkrReK5sRf4|5-)2Y% zzy@4_19Q;@n#F*FjnLj$N8W-~4)uSmPx=iAb%9@*3u9BC?lY6*b>*uH2Buz0qkAKq z$DH*u4CdtEj+yhMSsavW9%;|~oDULH7^o{VbH$m>$-)0-x7ol0@Tw=D^0v%N*L4V@ zg>(R#U!EAD$zW&VEr}71NUKp68o<=BXX@7o7LH}nj>~*@Zj3w(j_;AtE>3?QnH%8e z8SSp%FyRUoB{pz%j5RN~NRj1F8SO*h1)q9+7Hh;F3HF8uPat^0f+ycWvxUnbB7DNb ze?QcHUDo$>%m{{DN&;3G&Gx@WYTD)Ap-&=x65%tX#_1}}#)o3 %71++>Q7(gi@cfcY~=RZ o! C4%MB*FTx)CmIx$3eMi#XY8+%-E`jKXKVGp_Y8XPXAfv*=qj`~83PCdr6GfiFMG z_KtRmrt=zBa+~y9crH@7!?Fr{_SU9EQPE03=dynnX^6)^9_sOF3#%qhhzrG&T{(gW zAeg63rwwV=Y{(j2u8pFX%rU5(S9El;uGw=DU$ 1|{g#a4BE0wsgDry1qQxu~0GT-%8eALAD z{(2j$`WWH(T?>-l*Ofg!19(;9wfy- mUE@62MBnqoYva0HL8V z&g<`Kd$3Owz$B%D04W1e$Rxvt^4}cEg! e34|EgolR6U}#@7HhaO>cDsiMY(a5&_I3wAu66 zBq)Kc_b^UWg4R@f=D0iZp{hJIW3^X|mNZZHK6wbrL*L*ZJ1AZbq=mdlD?+DLG&L~U z=wGO%Y<tM-xN*Q@dh#e zf_tcX>P*#c2zn}qbMQG`(+4`bd1OP@(I)Nzx(;AZ6LessU+VD3=?ZUldAcf#k@4pP zlvN;4lgockZxZ$~T}N2NPhsm7UVNlINIqX7FhHN;rUCBl(hdmvpf~4Jb-x$B;@H *DGww2PWZ2+x*|-P}85K5sojE381gK4=skD}#6DSsroP$=z z7Yv%V{|-6G17TAJrcGx~gLc&v+l7B4EI4HBZkWToG3g%1_h@F02&Y)0!G;Sb_&z*j zF?;_TiwPbw%*hhb@=?BL{;bqt`NL9~;919f!sz$SU$bgmr+?d#rXYuPq&k#XYUbxk z*}{i_Ze~M^d@Op~|y$3V!ZY@}+5-vtaTJm>SvX`Dci(iQYzj^pvTpx-)+rdY>oa z3i@gPdk)3>fz1+%tLXi>X%@vFX6lwrYWLW0#jiP3UN`k_%NDF?%R|6sg}iIMB25R! z*=#SJ%o49i1>W)C*b>U%?AkXEu0EJDLkg9Iw#%>p*1@TWXVQ@8x_n3%ND4Dk@}6}6 z`o}-pg!&}llSrR`{p0_eBZhzcCp&+__Ks 0($M`eJ~r=|k&Ss8ogvt`v4JJ=q@uqe zX!53L4%gUzOJ^SadvNjNhk2A%OD=8|&~%ACkQWydH{%iV$#j-?rnm`c{PV+{>cXwV z1yxQNKGPe1HV`uiJkmm1p=&dH6k(^45!zGik5lE5B#b{+Zk_qBY>se{*R$!zQ6c zPejK5C+PZ~Far_k?Vu1$?Uqb{tZNcSw)o`xkn>tb5_WKzbdPnO!le@2+ E?kny%dz%obxj7PB`+3@lFD)pUr;9VV$P`W!(188BUnPE_xltqVTuJ7482$^ zgB9Q%eTH)yUPXWJ_X!V(3j-K%_O#)}XTEdk-o!949$}cXsq^At&kx5hJjgL|T?)4) z1~@QPW)IExNtZ6%ySO+%(#bjcDOs7!-M6&-7%jgL1+Qn*O4gsLSS;pV;v0UZm!B1& zgIcK7{XvfT(%=~Vs?E~RY?0V)bAA@9EY&kH1zg}S>w15?Sk(N?pLmFbhER{<6krJe zLc}KnYwXg~^rq<8!>=FvnmTm~X#?dKh{gHG49q7M4c-=9WmVD^v|d*8#X-H3H_wu% zGh!nyaUE~+Jv>*$ VDNA=mecVUQVR7I4DWgGYtN*G$k4qav z9Mqr=OD2Cvs1D*XIuDn;`bC<)f`%CfRuFL66#7Ztk!L1OSu=9f1hS|wOrM`*`atr? z7H{t4nQJ-2mj*K}X}BUY=X}W>9n+j?HFeJ9iV_{ElXTa@`G^#~x;ov|Pb7VQL@Ueu z<@6=v8mIyVA<3>y;3NmWlHSz`1WPbj!h_A8I&y#VhHWuTf4CB~aB>(q`OFELu`_J% znESjD=Bb!+vqQ`FbR)7Gp4G56OygHg*hIbr8>JL*78?gcFgC=Zp EI_{`!J(_fhji=-6vzG8qyc zEIEI}VDqGgZen-KOWG2VH#1#oCVRQ-JW=CdGO4lJED|*{(}LBuA+#f!b0%br)|lm* zyYwbrXNnHKGN9IkS$1x0(Xz2!Gasd@P2R0BMROh-7UoDDY{bH(urLIK=1l4`$Cj&o zuA5~t#zFTNZh{C6sK8?^&^V&kzr{xt-RFNf^`%3}?i%NUpV^V- Gdu8|LK-ZfxQS(^yoG~J7vJ4iAbHf8JGe=ElI%6N~-IuvzG}rXs8=;xz|IX-$6TOe5EbCcJ8+d=B zWg-;EhJOV&cC=~cXg;Lk^_fK@*VD*fb4R48*prU%ieC#ISxaz~zi`B?v~QVD!hE1@ z0U!Ez?uggTCR?}-;T$LI?|0wN90m4LoqRV5&0es#8aFgpNfs`ge)_n3vr&hzXM=Op~^%u(R$ePDB*Syo*)+4iwm zEnL3sw0xlve3(_&fBoZs3(tT3 Qa6s+x^UuVhzP}w#UXF zpBv!SWrpkho>+RgKVl07-cV2R#RFbVr(N@Rr-M8>f|iT;vqlTY-^|$`Q~`fWNy2&N z_==S$p5UZu>Sp13Y^D^8T|8@<>+F$jTV@n)jZg4ld9yryHGiy~+*iyyk=|(DUB0R{ zZ#uvT4%d;P6{TwMvE8Eaw{YGtXVz@fC^P5D@#QCI@XEY;@b$p?wgFa|aEpn(d^af( zN0M--dg>Wi2RB}gfIHJ^*0FyV>EVKIQPH$3I#>yxCogT$_K~0BeeQ$~wS{-0c+Z^@ zs&i4b$k8sG0A|iJCEKOzQqhG2Hn236t{#grZ%B2dD35tXwBbk(uAm8@xuf3CaAq;4 z eUQ(Ifr0u@F89C$?d64 z(g<5!h2+;E8d7FmLEC(itsdFX?ZCV;#wdtaE=cm66JZhv!^V&EBmzEI=zbq}rf8d) z@YUXS_`dEeQR7_q`!s(mi|p_N`sQejS@>(g_xpsq%pM(azjf&dNuEAR@^0 -*5H3R@4T)EobG?j@|0BdZvD7GlzfaIVHp*!$x(lJ51Qb^&@@280(?J5 zwDDzj;X23BAX7{YB+FErU4=`oWtko&UQW7C!V`~~%GWysPCor)u@jYEm04AZqxB(; zm=}o~7_1TronhTNP(gM@0t|q(T@yQ24pVxFf2w`Xp?`n5eav9>fn-syIfbgP!Jooc za?QSGQ2w5D68!%s?(LT3wvlzw`}GvuF%c*1vxbsok7xGqMkBXmTW3kOM%^B-9nldT z>?%|>M=Y{TvifJP<~3HtUN1LKa*zpt1WEiPK$g~ptu7+-%P$ikh<_Yeb7b9#i^0?N zJ<)BY6Jvkh!T+RN&p)U%e7uI2!?ihU`=pT7zU39zMxFdX DSQDhZ@NjIC-{2}{#AOEKhqpfR6T azjP&FvdY`*m^z?~GaB9RZ6M&a6PPeQMA1?keC*@$U*$aZ6Rlj%Oe{Ktm4! z|5|}CHoDXEH5VrMVx%Fy>449}_m=sgw7q3t51X4Fa^FE_1mvi_Wkkkdd&_8Kao5+^ z{jPs6h`||%o2;x9epQ$9_hei)mz5VQtSmb#*3%AKJcDl9yZR*dZ#E3Z2dm?zP4@+E zCjRZjT4;{!U@HHven_`94yEw!-{zA@<<$spX)P{|?s)ueC6YInh?5`=jCua_;i63h zP9kt#CU1E=wf=p=k& YB$~&&6WG~9?u$?UC{41)VFQA zEp|H||Ehx< dez86105#NOM1OT>AeKHP uCUyi~g9C7Ag@T`Vt>wmh*pS zO7`WM<8@bTx144n&N_ppGE&a*G)~?X s$u(6nK#f6e!^Q_OZYOuLf*1C@V>l+ z;ITO7w?$cWPoE=OK7$vSeQ*ojU`Kyc957-g?DVIh@)}-zjHR7K+DX8USlle_BvU(Q z$z|mxdWZ+$09HV$zjSvPHZ~lSm-7F^8adv~%+szo;9OFUq70T^mGy%-5<~1J3!GYv z&DnD?hul<|g82d1aQh!*G8;xf6M+qz5b^}DA#-ySWw87VvGGK<9{Vgg2#vm7vA^qo z#J*E?L?$?z?tldTeK_& 2~@5vcGtprR;8 dZ31x;vZDvRo*Zkc!v6;ib=*;ahvaRtia zDL!9h&O-ThJ?yTMpnWR^KoeBPE&=o!Mb%fMuK=1zP|;Aq1vf2wd4|k_8Uk;7#!J)i z!nAs~OYve!-oL{e=a2hTj8tO1f~RX9g*
9Uy#5UbwmArY96qQ( zl8+yLNCXJhba*`IQOI+Ua|K^))`Ar$M_%5_;uCfnPU2c>xr1$2o> Y~6qu^U z7oDRj9cc5E<>v|bd8o^*!Ew!h9QWeOYs-`%6mkHE&p3i70$jcWFO#2}q^c8vo+u?~ zu$ARmbCG{|t362W%lcL{S?~ygp_`$eU~F)GV#i cp8nK{edeCHo8w=`)emb56nj zJ`uQyMA7;}>Ivp0uF32Yg$th#g?olP!);t@;V#x24-6Zo-0S 02{h%AJM`xcc?Y#gQE8vnG)378qXM=4Hh&VOn~BL1u`{n_ zd3*jwE1h-_Y0NVi{{dKk3_A2c1uVQWLmMGY060Nl{E%^A@lvvvVwy >c0`=rgc;CBZO)X;{~)do@iM)FP QjqdH_<7O-8=mY&U 6Zn}4$9FkC5zu}_?Y5o6dsY&)W^?JJkQG?GDcaz zeyHg2$gS0*)(DzN1`}$~PIYXt2?8b(X(B-rXUWuuLN4x>D?AtuEq9+GJ8YIAkdTHY zT&y&QnI1@6Jp#plPK^7>w+K)DkP{=hm^8u9Ui%5SBH=CDpukQJ-@?uY*70mR`z+bI zT;J~C`hb2M8BaBlGdelW=lnhaxCG%ueh9dv*vZjl*t8+x*3X!B=&Ye{Th?xx;)oTY z*d3zv37{0|0=z7#8%snZ ;i<>@nI%Q`f9e&D$a00cQB zfmCOOXN7FaV9kv{TnvB`36vnv>KSq1?Q=0tq+g!L8{ja~IvgjF9`BE5j&%r=_q_2x zlTC!IcECk{^2LYy59{~g!jEBziAR5C4&{)Xa3{{TsM+V&XIkOx_I{1!&OS#Mt$lXW zm)`+c!-NZ=Z~z5Qd~NFnheYz?^Q`K_ NvtewDV MWw9no783>bQXhsKy0@^*QJ#n`(V&Ts zXfMy2D@Ru4C9Z$w)%KR{SdMqQ^YV?OsW3x-mHu`rc#FDW?J<9-#6Ui;s*g?4o_+E9 zx?D&3(xX9}LZH1&J}9^Z;a( EV0Nd+`n2nhNK3aRji&Dt3UtwRNd)qu>&1lJWd2;Qoi5!_4o0 z$FapA6POogDua2o+;|wH0{h8eADTJR{>$XMr$iD+B!QR7rC`wSF5xm7h4U1bLdLVp zcf0hiU=1AX^E94g<1+WW`YFp?UC@D{X|<6eS;65oZ_wPvHGnB^wXx4pEY9x)W`7|w zAIv1ZnbE}IOBi~QcKQpJ(2h0?ChKp1y!fuSlYpJ|^B7(et<|m%-8K2H H$G}Dg4NK0L?xzZFf`H@Z?pV>JRW6oB<7)Z->GAHVEjAo2 zKOPy^KL7fy)#+mJu}F_|00E%|i>gVLi{;z6iobuV0Fwc5Ne2Cj+xTAB>Dv^4rPkR> zIYkvaDe)=1oo~6f`=VNtH*RlhVeJp@ZCG*Rp3#@7tyl0fQ9oDq>kNyT%}%Yqmf7S^ zTc;2Bn12t76iWiUEN9LztJTXIX12y9^Y`$wtzJI+&I^OJXY9QGPK{lu&W`xKvTJ=$ z0P9I?zMZ+O8ZGu+2&`Sj! tS#l%|RSLPdo$&2w`7|Q3+4bz__@Wi_<)LkzgNciC4>N{Kpg=56( zG6s6U3AC+NUf~Kov3d)}j^*>EPTl64Pq@oJtj|mFWCZ=4_G2k$Z52j;;AzYh+Ea9G zm4^TPWdiw{r*7npFZxom$SW&JE|F|r^itR{9Q>x=ROxpgE*XH!*>L46Tr;?K_8AO( z-#<#^qorPGH%-AEy{AogYS_w-m~Ffr-M=NDE_J6A=ZPGO$D%sRJ7qBNPMkf0kJfp! z=4%?(bz+Xc`X?s*FmDQf@t|Y8{UlFS(cul6>whvv(7*5>$(8sK$9d1H#Z3y1A=(o| zefUGa+BcdOwkM9q@@XheD}+*Uok72X-^2LFBHG4P&nt2_;;$b3xL&@Wd`zF-Llvgn zicYL44O|KD mmRU9d*-2ge4d?cMc#GMkZp$;5GMdbw}y1FzokkXbww24?&6rao2M z)!nmO5*}X4bly3CmFbB{U*u%NySMcr?O=*z)yjDc{1Ja8;@2X=Ew4pYA!zRy>((Sa z2fq|g#OxhBSw _4ohq8?n#9V$}wDny=Q?J z3VMCA+PHdBxq}IbN{H~N<_-30yKr1gf~d=+#cE;oG@g`y_`s)f!=*-aL40+pbMWQd zU!STytCw{OB!&p*>nHxbf(b(2yq3*XwoRl+G(X(yJRqk%a=O(Vh>x@Gg2&Lx4!-&A zR2&aXo`oBm1wD$$gdgFQ8Eo&V=L?95GfB5N_SReZRCNG$uR6e#U>}c DN1u>iJd8e~xZ)`Kgy)Kb=p)AWd0A|E^AF3~ z&8f}zD>sdl0W8<4F!0P^bsayjKf3;VIYa+j{~%f8C6z~?LK8A?4)w}k)*1S*_yAj| z_#m8rJ?>mw(%J_A(a`^iQxkJ;`l699K;X+bVq#FOGVGm(ZJ7&W+Y@)0Sl6eYwZ+e| z@s=3l@d5>m#~}LmN4aqEYJ}w_SEnffU&WPBjTrCJ@M?aIk;f4|9rj}Qdl}V!>^bM( zQaECvyAf;1Zz2}u`dyftQztp}=7te(xQrct4r`cETI8}C5mJW%;W3_pTLZn0+Krs& zT{z_XVzZ_L0`NWje-Sa*!N981y3rj#e_{{G8~AGxNwG;=7R2u9xbAyvK>t}BTq%wo z!AFbu%XS);vNgMwBRA|uWXlkX^1=?M?$jL 9S1xZ1QR^hTjg44jau%`TOg{gxP z%_;Q%fr;hsV5Rz9+`Iuk55F+a52an0_f00wUSr9gb@HOFFW6&_$56p{=gXzM ^q^}~9Mjp#p%hlzNY;KKzTzzZXG#le9g>v5mpe&j#J zt~&U+2H!iDm#dcS8FJ70NAX~PA#2D&tfN+C+@pRJKd>5HfhmkAi)DA~^VP5wYZ$K< z>-tvUE^a5=-se@fe8R)Pe}b=k5Z9Nf$4mUc^T6;n0rj0*x1^i#S8odF^;Wwc{W0vN zRu8sI$gVQ~sMB0J_c)~ni!eV`aOhrhT0Yo4XFA1~#9@W!f52mLy4(VPKh~K#)rc#= z=*iN{J9UtLY*QK$#(fZc6v;*JgS2;Hr~JF=O<)(2{iRc@$Cm`JN0HmL>aDgz5^JJf zVgW@lNwn3rWMbWS8o3Z3;;|EMOK0?OjbZ onVX9C(>ZRA1p(pe+VD^_Csld-+##D6bNo=dtma;?CnyvaYNoj>S06PG_pAM z{D<^3YyfAbqA z1CG$+$;r{%U2@^7#s5~~wD9|=JB*yiss5^ami904O0G yPXagu1Sv~$^ zV3 zQ?5(D}xgpQ-!NJMb#ivvHOKU!P%Pc7JT%83A1DcSQV4B;6 z=s7jRDgU-x5gmr-02grC&+FlVp94FbO0kknot)d%;@D;AUhNnw#rexQxAW=L)Q4b_ zVHQ#_@kXiiq3!DA9UR6C-Ma6&O7adahj@kIe*W?2_XJ0OwG=dTYHf$&IK45$#1;X( z DHX!9)nE{T3jYC_#cR8*#27PCW8L+ZA}38jB!r zMS9hz@RpE&p5mvssY}kGZUipQ4aoa|k5Anl|9uZfqwl(n7&{4LYy&qyU+AJ@LPFle z`vHZMdnm6$nBdi^?dpR#=LC1oLrg?S()Ow9^2cyr{E!!eh}e}sh$KS9&wR^kkFq|( zYIhzUbyH3#Su@J({wYLLtf42oje31{IJI}gYH`Yc$pRBwM^x-lyvN~8G}WK@pZJm! zEb=A FtODx3rJhuNb8SkvRBw9 zm3h@Yy5&JiQ3>FYnWv)MifU^(tIB@v2Z^8y^gEd}x{YCU@CSu;fALg2#~$KB{t;+j zdUdFOc>}K4*mo$9*_Z%_5b2NOm@duKDbkYc6K7tajJh4Ozp-@1au{Yup2UH#)hl_` zW`FPL3huTjv_G8FRf3KF92W5NhxhBa=v&i9b3#XXJzum&A;Kt?ZX7!=^qTcDtk>mv zxNqPdakvYqSj^uF39Ej2DZqq8O9 -dFni9tv?7S=%2@6@Sy^o4 =8G#{w?h=UV+9+K0jLG&U}O(?*auI%RPvy0oZxPIPsHS4IilbdxttVVPWY zlJi5p1Bs-UfNQ0s6H;PKTsAZLzje8-A1Z4`O$GbuP^c(Wn_MNfZX J744nd+Ni6G$Fu>2xT=+l3kX6$Mx+Rc zE70x>iYytt*cS2vL>Tz)f?0ci0cELEZ;BEC(yu^(#96d^Z%euJ$knL!khLK7jb@cH zZ86*F9rIH=9Cs=@L9mvq-7?-_2CZ4dj_*^!%Izvt1(Jy* zrkLq{XzIhU^S;DFZ1mY23YJK8;j2l#N48CQE{og1j)Q5p>zZ*Z3QX94>CclRk(7|@ zFZOAk0*d&Um>ubrWFv9|)7*tzBe+$A-0C%tikbx_GAnVQ7#rkUw#!dt=RVKa&dUMx zUL_?msV~!GcCV%4n@8TZeA6_wahBRDEBE2D?$lI?nBz;BK;eZ5dq1$o;88o_!;S?# zX+%l|QYw&O=2If2?9q0AREe7+5qLdE9`2stpbcDTRqabgcrC2ltysVEjwYPu0qgf5 zLFMtwF-7Pzr+9n1EoXa){^}WVLjukrZ}O5=+q}W~GyH6~M>g$C3 YIjeTZItC8D%Ld+yYUj4?UoN+%u;NPalr}?p~}{ z11Y%|PnAL?62`Uda!}f?!*-5l;H!ivjQh(u#EI)t0cUX0E|xGlWg6VlV%@S1$H`7d zEkZbPwItj@sFy-GIUTk5!(>KS_%)m26^bm_9vqFWc>Sma8e`D#Rv{b>50g61N`FGi zq 8BcA0KvFxmhz>aeVO=RN&~#L9yAMjp0R@9@Zh$tE`f&w@~_q6qtd*DH81 zT%4Dse8RtfWV Nvltojt#l^ zO>Xv(FLyXOGtT&85c!lstCk-xsC}g0@~waiKiRQ=i^)y`Xy2IR)teAe@0${#uop+P zINmWg&yl(~*M;_asX2b>oa-tWHv %E9j zVp9y&x=YlPfr=FUZdiT%o^9@o^`co+)Qj2@<$VE5;to8?XJxXM8Wq!nGCz0PLBN6& zO>1|5!t*vjyp3QpQvV)*B#_!tY|D8tP! azzQi4fD zmg3|-xF-Tn`-u&f4M|O;RdDeH9vtKi;Z+0I qTN=0iN&!5p1koJ_hI@$G!TMVX@BkDf zIzBAiNs_lbS)&fAESWkkj0qbtOg)HiWHNTeWiqx`Fqy`=Z|B6&>y`WF63M8V2*(v6 z@{8?i={iZ+!QRPPbzI`n-7!P+*FjQNHbWV)UhwE4Xa 3KPV0sv=AH3> z#4D57Xr>xgr^0HM9;2(p;XZrq>TDy*P*(v)s$sw+4jvg~JyP3Biw3z0_sY{FureGJ zVaeCD-EX$0yOOtf?Ma|n6M~-id5agN_=xNZ(UYkwaprR%i<$cO;z7b6V17{Tw+y@d zj^nKTB*qwuiF}G|yy3vT-%#e{V)mAQ!9rdZ%E$_X+sKE6L?!rm!S*5EDJxIg(Bi3U zUe$^EduH&pm^y_x!rJuoeSUP+9|mzzkHFaw{F^N={!I=XhPSTF!8d{Etqj~doF9+Y zew~Mm5vgxjK>hw6pHYd)esLrjrF|j(r5fd>n <&*9)99N7JYJm%*SLh z0m$R2=H??=IRGcKiBK9P44EzLugX(d5D^@Pcm4H?ovs6Mg<_A}Aev&kl;#`<_fqgD zIFKDeNgUlJ^Cptc7(*QQC9`x! SrV<@9%@F0I`!$Vgh{q@mR5f z2Qn|VZe!R4XxqAhNu#Rnd{zE`oWNB5mHe6DPrr4zuupV=1b=Aa;Gt 46 zh`nbGEWqemU-tBZefA^=^~jAZr<+u ULdn^Y-m7y|SRb_nQ~dOJzV~S1l*ZbDxu&8FMXWyZA_q% o9|-)p7b_gj>@KPV$I zKD0otAMyrk=L@|zZ3)a&wm+b))z+aWd9y!ZqvH2ac41! &?Hz$2SEs|R?Hm_B6Fc68NF1UDStb)nY}FokT0h0i zaE77w&09MsCMNr`z9n~<%tWRTKj7~$8nC8)8H)+RJNOyKq2CHUWNQQu1B%)`J(L#` zpQC)H*3@c65noXpD}+}x?O)Lt!ZBvfR(-Dp +dH< ZfhsZq(w`i-@B%5o0O9% zKTapv?NBg01UIyQ%6WO(n5~798R ayf5+C9UY ztE0%9p{{U0TfwXQvP{&|8M$AoEl2I-a;%HG n+-UA_&r%0HU$2&R4@>zQiGFXLiC1%_IPpcKizLlAG(0YOXf!GG*n zbNKq(KQ5tvZ3mSUe=q1mE8;(8QV{FYC~XMP64F-8RZ8U=VeK*OF~hdUtLCvk2G{l; z>Vop+>qm!`KF;rMi^gq6n|v =y@WZ(Wvw@f8FWmID6Gc z#{lzcm_EFO$GowwoyqE8Rq`x@nL*x?sJ8V3yvjU(pLwObKNY@tMH4*_-Yb=!{3_BD znVw*}pYWz+c?FY0a-JwWf^&omcmlIZ>WQC*@+xm0(=9tP{(e-Of`zlO0=<=S;nIno zK<0*R810RVV5LL6?H{T4Fo+55qvK?vAT%b{FUyq4WL6Q{H`vg}6NA->XQA9kpp!{U zC6tJNHSj{n&wrROlldX`CGbixn6(2cpsM{9Zo=gqkT<&>o{QzE( %rA0C=Ik2|n zZO>L5EcVf~NMs5#RPPTmMS+MT%={}?OvDJ7;nZ=CB5#Y0IK>+8V(8aBS)yjs8E@hg z6C5BW4*v!*^U@|O9>lTh^35<1fMo+8d3I}mP^c2XUnvRES%vcV??Pn0lY`*RaG)Jt zxNbl8ndpEKZ#WR|hyGzOOO6MFT6w#a-T-tVekJ%Tj1Xae0*%lJ$g(AYL pk0SO5)0(jVposu)xEG;dbJ_5s6592sWgKhWbtn)778w7Nvd@ z58N=csAM~Fe}t=#|Mk!R3+ey*=YPZO_(Q+53q^u_&=w~^q_#D0=$v-DH0>X)@Wrqh znVQhnLqN`K>jdSJRD41p_hP;uU}AZHEvTUYxi-B1Yguy-r?QedI&Lyks7w5<+NNPe zKwe9l%J0q+T2m-_(`h1qhtYzCA*?&r53E_E5E}7deaXM8r%{Egn+xG(F5@;~EN3q` zx!njSBZzwfABs Qu$WhM{owk ~Q-f{DRZCaOH~BF-F3FVAcf@ z$*8Y>*aKXJ*oIJ<>B{~B)Jbr?<}V-LwIt){P$71sI4c1U5hIR93Zqkqy)DxbkU2q7 ztYo*`-nKSzGN^usMNofax4dO=R4Dc%xI@1C7EA=}2(M*|2!`Q)g*lylQ}d3042`+w z5AcL$R_t;whl{lO_mg7Uto>Ghd)gNX7lnRI2AfL9;ut_+uB#2`VC#xMvm00UjUS4= z=ylQKZctTsl@E{XmesovmFGrf_5HQwygIKe 5Jz-D2EMxRH_D7|JGK$uof;f? KqEPYL9QW#5M~w7|3H+PFi$m?dD5t z96 Vr005QB=l1$-&lo5er{>4N1e%dL+RwygqkcrTOu=jFrUD80Gvkc0AIkbWOcI zZ6d$2BlWl14~lJn{ERKl9RZ?2;O8(rPmTqi5*YJZ_NpJ`9~66dKl+QbzU| u2`3$bd%Sp zo8+`t44HkCYQt@^8QRr&R*Us^O@hNdSaj{1OdrdWP1&x-BVl&hRhup+`mfH?_jLf$ zVET_(_ ljE#YZ?Q{%2M_dqlx ztpRaxFyahdSRMiKj7Dl$Rlq+H4UYF(X8L`!%t*ts1ejlxPXno8&mE57!d@8bmeHG` z^%SwA4+nb56e3MLh+hnz=SSKcgp;TP?_x-Ua%UTVBDRxdqm%~rSaKUtJS|X5-jIr8 zI+j5D7-{N1!AS0CxwG5yWYwl~yu?Mpgfm&}3D0Px#G*_ruM6KzGm==@iKV_ZzMDU? z@+ePr^?g)KqN2)#6uHvNST`Fr#f(E!upKPSf_|XgajWS$#H$1!B GoZ|`v8pALWP?(M`IL)hb4_$o+4+9-ybUf#z znQ!BP8{y hH7G>+gigLua}oSoy(U>_hnqfk+EAkJxjFFTEq`p 2>hNbyYrC{L#r-^*u|2ZIkhyjmM?mA-k(4XKH?CgLU4bh<@MoCIs8 b&X-r$m|<5PDx9SqY9Oy%Cm-^mC3tpWCh+X#bysrW!w z>0q2}Ry&ULdXabip94a@+Z7vFHmlwQe<^XO{4A6Dx5!Xn>Uk?b2glT(@q6B@@JhPb z@)k(rc$0ORtKn}Aq^?W5QzG>W{y$OSa@Ml5eIZqF z>Uw+reAD%@+ekqe(UyXCJCj9!HCyr2dgOtdiU&zsIHSDOPC9T?6oY!$MZc}P{=h!5 zNI#6D8%hopVz-|s_hvT+h}5uq`Y{Gi=Z?j zCvPXF#6D70pyb0CA41?SdKH*Fo;W7 _fx*!9yQdWA z2UWNb&cN)4CO@+KqGIk^x)<};)4iz6+O&$ 5X zGic4_Kmtyj=!j@}$#H^8MNiI!p_K$K?=1r#FE8C?fD8D`02eZ2Ps>0vJ!jf(aHgl1 z0iQu@-USkH;zUP8%Ri12R0eu-E)1; A0Ic1v^_AoI|20Jb3 zlegk&& %IqJF D+{kRZd$F%wd|y+i`sHzE`4xN6_+;i>(tJmgK0 zZ*Tk6bl8LiC!L*tW;2ZeHTA;6*4+0`mw$ct{5^=i{w^7bLZO* 6P(BcbHR1Toc(I68#K&UQZD%* ~Q&oc&xRHRHYkz85wUzfltK;zMon|wCh%yyZ9n1!w04bM Cvo{#d_-cP*3!;A*6W5CZf;;zJ&f128v;72A>1Ab;53Hw zm=oGeo+l)$I9S`ic5RT^sV)xr_OEN}HXK>ZH8pBsg_}aeCoZ~BOd$GDe^k#yGI{`u zjDZngpb{Q`mzZ~Wu01f|ru}cQR7 B5Bd*QS-{!Mm#5>gZn_jN z44XGf=0dVjf(eOC!0X2BxZ-qAe7tW8a|7LCXrw2Nl8v?Uajemiez3 mG~yTc1S+aqt**QeHYFqem5DE3>B&yp)tNPhZ%`9q=<;O0=JFzk =GLR&9_YZlqs_R6N#3q$VOYQyj5zk-j?Sn>&_%XzIr&LqVPk^T> zKp;T@JHF_9!cA|mCmB!LZ1D8|*|v7Kbvwu_yhjc;F5_XHeS(LR_ krX0CdN7k9#8^0Ci8DoqzobmngAqu6nEsJF%L2^Ztu-|>$} zAT=Ax1y8|Nkx0QM#ee(p=gTWMt>Nyb&8ZPbNz|K9IB*f0%S6cGk|+>MdNFg;-ppRj zv)~Ph7?- 9b2CzZjcuL_H*H%6G0}8W&{eH;iA6X3(C&+9 z%c!iIh6irju AMvSt*E~#4{rd_&u^cZkg||eNN+@Uc zKE9P;0Pe?AUoS{m=$pX%sET|q>vg6QyFKtZ{|@J(7J{_};vf}H!Zq^Za3=s+oqHsI zo#LPOJQ1~FQOUzvxPz1N7qd%U*$P8zR5U%9wT`)ZcPW_uJE?m4@s;~qFVp9rd6{5D zn|_(@a^Dw8H)B){F};`lh7D`FVu#ySTdHlN?hmrtp+B@*cWlB9i~|Abt$o+7FG|Og z@YK2X+D^`<{y{vSExaBf{j@KtM{AjX!_;|+`{{?bKm8}RVEal1PD8uAd}jck7C|@* z=@A>peeH!;Lpi@!0}(3LBEDOwgt+{kbu?1C!t1*F*FXQOOTNdS|I1>6b5zGt$s@F| zXbn{b$*vcL`>0N~QYUpm@$3aG>||GroGF^T?34|`l`$6!oW+qHv+_2Vky~4TWq#p- zV))z&s!tg8=eIu;|H#cNuPhd=5Nf8VKloidchXUX5?2Ekz2`(G2JOIb9P;WU1~d&v za=MLARo~<9;T&F<*@~CQ jm2B7IeD zo7yyFWRe;|;{Gh&=n_c|Y%HLE`8~_ceFUqaUg<*o>oKt_@X8(A+@#%%uK0Z+mUa)* zlQwgz^$r&*ogTw1PIOhf{|bN7>{@SZA=>s_*FxsN6LPHx#n8|oVv5$WVGaB3R6rdc znDb-R5Be{UQPq}@%7Uq~YU 0vb7NT@C_nu5kH*+$S2At0To9 z>j!At|B9QIoc5+i8E=PwqD-}Hfru&NFr2|#S#Z7+YsBGCSP&-B-ZHp>_IO}b7sNCI z9tKT%6>+>2mcL2%YARk2tA4iw+QmT*5wnQbg@UIl&w)4&mB@S|yg*_QY`A!Gn?fYJ zJ6<#Hqlyd(@Dhajb}e*GxKJX6Bzre+yl}hNrA3OJu!o%g4-avF3M)1a7`(T;*d=fK zuHCOZ749l|_v-4+<<-Cb`QI;19DgV}&*y?mn7 *8zQBG#&3dvFe_VuIc=( z|I=Y(a)%||&{R=>U3Te+81%?+za{QFW1b>Dkru@r9u_);w&laAEqj-mu6;v_mxcw3 zOzz6i0<{NXB0cYxQW~LC5L}YSHlM_&0h{d&gAbIyU18#51;aDw#JA<6_MA$wu68Fl z5DEtN%UW!Mf{Mp+I|rFD4f{fg!EAvNOTOS0-RMq_FNq$1={jj>PsHel6LE!NB5L1N zsG6Zfg&s+cXGjS%$uJShn`ftL8%fOo^iDm4+0+D|5oy6^WR-}SfZ)3n7p>vrAlEAH z@}i7<;VoEy)4o|)DdJ-yKlM#nC3H40^`Rn!@R#Gh$+x}_m6VcKdE*bc&VoG_;$(rs zGl-}lw4vXB`>+1|EvzMf@s-zooq(pF{y7y0=~sO_`TnbCe}48YEIfbl>?;qGlX3+& z;YwG+D&7$@0^Z{24L0;y?y|UTC~Y(gT@%#6RG%W3sbrEvzif8RF`eERWFR(l=-_r^ z!}zv-)si~TZGJzSWnkQ*+TXLJ&V$1n*KEecD6aW`h9$e*iIy7u?JrhxS|b(Q`Ipr< z4 Qmi%yw; z#YioFTL+xxHbxqRs!VLNI@)IY3 u_x=OP2x@ARWqa?`<=B!coUP?LbbV(JvSc$ z_;HY(H*8e )fEm+T(K Hpf; a4cC6w?V7FC{#YMS!>1iRoIO| zEb3zw$P=h6VYkMm#fVsxMnjjfV)2><5AS>sTXsm8nmk+yA^vn=hZG7;9 $G95WrL~7G8L}h!mh-Bw1wYE zFJ@;gui8 _kI6c|1=p4ek#Og97ktiz>$A^ zp2%iL+G(%;AL4QH1&;1MhcQcd{-vEp!*1=veMZxR#z*y+3*NCW%>u79K2CO>8R6B& zRyw@W=r_gM;YE)O`m}Pl3E9klTr=Q(?R(meWm r2a6@Ca5)}hFkwGcUH+J|rm34Y-HOHMB}^H5R;ic`lh7_vDiKnN zkV-(xuny%Cwy_o6Q~CiXE!BCjqe_1+BkO(nJoyoKo X%H{uRqm?Cltz6LfIpklZMc^cu+*#SXFq>-_{&5~1>?(>?q~GrTW? zH(a55f_owkc%wP?6gGK(!$Mr50piUREE!3O#ZRs1bbyqT_@}CV5M|OfplD+_(fkko zQ XwL>wCU`k@VBc@kVWOhZ#EZF*lq&zmG-`SCZo;ivJ^B$NGa{VU+4@AX_ z4IKMaMv=AYkpe!9vj8br`GnP^$Y~gkcMpP$iCBTs36dC`K|$EK3e~I-d=7%Mp%0xb zIj1IFaumNb=Kz0yC4c6|`>T?s1y4&?tpqj30PilWswj45Jbk~Pbx6iwVxnX^dSPy8 zUyGd+rRBg|lbw;y5AZ_{%~`FC*5=5Ctd*syX|ib5AFb<=i(jjuB|2v!3zrzI0;G~> z1C@qZ*_E@u9Jk`UYwJ+LR6;GE5KkxFgqbkJRy0Uti1;^u-Lpd7XwZ%FRy1JxM9~r$ ztu3ZAv#hlZp@l1MjhuK&Fd@r~dk7(%em4>t=HX3*e1~kAIT(&Go1CU)vgJNN%WTPY zf|$w1aL^St<6I{knhn|jhV!zpK{z?)&_soBWR{r%^}H;T(UW@S7$-1WooNQt0J!p= zH_Q8QrH5jFFY5i4&cKO+EBK**(C5gI`10R=sR|gXhE5zC?EoDmsC$dX4
)K=CvizaT_xH2Tbs)*9ml+F}2|+bBO-Rpw^3A3`RpWcUOz9&o{Zk_p9n%d? zw34~)n?hq@@Vi63J(c~;n*lJ8;%!X`0ti_G07-V_%x=%^bZ^n>Faib8IpkHoAMfgP z$ywZ$sZJA_)3)1h-MZCv1sBMU*9WCPuZ5V+eN1%WXD+)Q-v`Tf*9BMzvCLSHxT&}} zxN8`HdE~k^&MJKzVD;1p^=xz4iZQXqi#mv!4QK*BTbYlCF@!cI(`cGNW5^!!rlrM2 zNZP|9(mjSU4+n2dG#0LqNXQ7D>VkStG`N^O6ma>xLosvN^+rHhcDWB=5yS%Cl0n)T z24C?TL^1*=N^GbvjRqaXUAuC^87lFIElBczf(e&u=CthziDum%3<(#;ZaW{0b;(%* zAXA+t)Q5s>O3J%UDk+lbjKs~I7bbSrJek5T^kRD`Dth=p+7~>KAsEdFoQPrTS^0y8 z&`Y@A=H2E_E|ek1O;_@SPZy;#$>@A(F`Y5?hIV9V4fjq(xt;6?CMoy=EX8QnGa5gC zVo-I4{(ve23tbVPteeoPa;)YF>R330Pv()kz6q~K4b;8So x<0qO)|s4j7obMV1t}cD$Dac_@u2wY)Tz-|#@6)oRF(C9 z&$dNy@CQv={0I3!V*Xs1I1!W)6E~=Td7+tH&2j#K-gH4}U*tiCU^F9eA_lc* H=!RZ7UDyeDW OJ$N@MUk6tEG+7mXEAsEdFoM iB4tC0bJrIlE67^h&MA%`?=Y; zSokLdoo}Jxr86K > `)Yb>8%Ni|=B)sOH NpjU)L$Vyn?yM0!ORJjF`M zUXN9;2lweE%@+Vt(R1a0#^(xPc%5m`56*L9jbTs<%j1{|)aGAAmJ+Jb<#7p$$f8)p zMPbznY*UwYb92a>Pp4y8u^nj=3hYQekl1Q87m;4k1y316+3T_D^~imCk@E$BQ~+JM z@woyRUb7nXgY%qNgBX;;@;IhuwfPs3rG%Pwd0c`bvM3gDQCPWu0y`Y*idDg7R;iJS zsuB+2GyECLtp78J 86|CIG=A%>(%SEXa!;_wa zx?@rKr@I!Kd&>AZBXU=lTh|&qigsAO37rU%^jy=Nipn(2t wo)U-3*E8+wQ7GsokPr+~ zf%N3hXN%_=MK`(_#}{es?~wf0e=NxOsl&lJu1Ed+!3zJ%&a?ybmH6$Lsf6TZ%vaUy zS8( 1rdnxeZ^1IzTVayoT&>3FNTdKk5vhUbF2``4Ri3OV~^d}x3`;m z%a)LxVg<9GAuM*sQ``*N*RyEQiy$Q)q+;pIq|Y4Fl}g8=g0Tw!(BiOKL0F><#Abhd z RB}Od#6rPSs{f<_;ji**mDlGY`w+iN~>Q zy<>PK;nFo6+qONiZQGdGwz*^5wv&k`p4d(%wryvkZ=Z9X_uuz>@2k73@2+*Ps$N|y zi~o)XK$gQnRzPWVRZbhfmF$-e)1O8EL *{=SODr>_eof= zf-bd%i2zeUQ~T+Cy&B48T`^&-BW>5BzyZd}SdMG^7?rCVntqWCGv}Z1!aKABz!YMy z7{%wWJA_i4LHH3yt|5y{KpX0!n{+OEe8Ic_L$_komehaCHi0NKo!gPdszAhY+i%23 zaxot&@Rn8hml(p&A|4`*y!G7JaedjVPEj|ogC=^iq(<$wa6XN&??kmWqM}2a1(8&; z?O$0QI07~uSyf)q@oTg`Yb;$706Ia}zb6PIc#w3RPQ%#jS2uyVxxDxp1!|rlt{N52 z&&ugT9_owaXy3zR^7ZG87gA=Xh_i6Hr#onH{n zNGKk~?|TgiLw=Tz_H1KL6=&NUGBY6UI 1HIpgRuEtm(4i^+nhNF;*PR=BXyCNHmY!Tokj{9c?e`Vr zVRap(2r-_RdyyAC)wcZ$aH}T mRt|sgl%YHI)ux>w(g~4^B3G=D3HcBAQ%F0D~r#^yP%(<+WCGkof$|#nb z&cl1LoY%BK*L2QIFYG|!J{Kco6# KkQfZ z<3|I)p?0BVlO(`-i!t;t?2WH$)iSxwIRMJ1eFndm_TqZRd+@hdlyY4vP2RYuEb3-@ z;$tdwv)W^^u}6%$>~Z-lR_yJ%buC`9)=--}z0!19=Ff>;S?w |*GO z2yI1oKlz@1FjQlxFi}~gt3u8{Rgs+!56L5F%;H $ zp;gB4%ni{LQ1dVB)!HzF{Of4bA`lvNdOgWztV_y%KJKvUMn^rx<63t0hlKT
s`g z-|~Tx;fjs$wa#yI1>a6YI=4SqMcq$Lpk`QqqsiJ6t1BW`b4xO?a(qjJO<4gm4WTP$ z=v#%kZkHA**F_T8LX1 z%7gJ67Hgk?1nZQ0U*_M{DSI3 Mv?>Wz`c#W&&eV&vMfqrcv3HDP^%~n7 zYHOIlsS98k>Q+9fF6`3KDnG*v*q1b{-r=GL*8-akoH8_X>Dgz9t0VF3stGe|7Tf%) z(GpWs0KaqQf9-CTEV{=8iy#jMgABFzm|(i`e;yE<@6Hu2l43~G%9J-oDl-4F^2rZ2 zb_qA&mcLGf8(X~e7DX|LiDL(MiFh4|ABy5ZSF@eof| zfCvhO)$j-)VD#A2jkfyGH}NOY$`XicdqrMr5x zt$5(IZ}$pnn1?svaF~OVL}gZLL+vYGW=|vhIyR8>CJ)hr zbF%2K(OpL7x@ *YpYBi zL~jB57jdZxMwC9U-C0*9IK5yOU#ysyN9Mb@wcRO8h3mJjxooF@cIn_$RUf;Ln{Y-Z ze}rmdyn`-%YezhqyxEL47QTeRRlg&;McpLT93y*7pQtzRxk(jY>_FQ|Y1Wpd#fogI z&_Iz!Zv_Hecr?hIZ_RhqSxX+CPRf!R+2kz4mtC0z>%p4^S|AVr7CCAgOA*Co`JKB| z|GHQKM6U&r@NcOdr0vh+pd(UZ;ZjkbfZ_1u?9G*YGA~07X}&uEG8-BkffK z{ i6hQ zhVZ7Tz}xxRVP$qXHJMeEw)xi<%_g@DiF9g8>z6zP8>^O2tb1!I$`7^+FU{i$8`n0T z&_AMout>-L03n|~kWFCGbh*?BxqSKlZgo)~F>kS9!c>_&)DK8|Qo?S_rThnSF+8SM zZ2<8L?+E0GqU{3HXGz+Uhtdg5jVa8Wjp0J2ITXiup@Hj6GMO>v;_;7x|CmCUGqnc` zMk~Yu5a4KRP{5*H#KCZr$OQ_) wJE()Xs4k?L!DS>$g&8NBs~uxh z<;Eu@N>i>}F Kvt 4HO}#Q&leZ9DkR#apf;h$4FSeFKb=B@d0S zlZ5wV>9S?={`l&vR@<~KArI|l=`^4)KKETPES>YkMSadHXr_G9W4d}$t;&%7gJEC5 z!G6e8FTp|avPsMy!_UzRCb-0?HBim;PVLwDBHn8%fb{IXhwY_nhf|grl>0|sr24OT zCSfm2@o+8I#dLJz-cHfJZ8iY4_ixcMA*2zA0bWj@#0*q+(2tza<2!t8ORaZ)ANr)4 zd69Ls+s&n6l4Mk1%eGu281E76I;%Op@UDy*v0ma@+rYz TGdPFMdb%q(;DWY%Rh6A8fF8255bb=EQ zBfQ>7`Ox0WIi;Mr(aN-GbbOta(F|Na5?Je>EBt1I>5**$(6XIih&yNmReGbs<|I`Z zqm`iBV_*YNIuZ* JXCjo>)O%X*Sw+y2j|C@dER~K9?jln`$FO#A#K@)=4?|(VGMJ9bn zt!G`5u35yHtUJ4BE2*{Iihymi96mOWIs&|YppOUppw*k?wBQG|FO;VvM7T}i9bXZH za3xkk?OH?i`~IX=4H_wKVP$Jhx9Plv3NC5nG3Qg&d8I30A1XxlTl7P&MfQgaiyw?* zICF#MnOVYU_xgZrU_^13T>iOQ$|ABx(_8`(C*&%Iks4Bt>?#*ljTY(R%bPW^;bQ1B z@-3kF&+RZfRP)}2^$5k!)x&nwHFO2hz{n|SMh >5V7* 6%&e~T_9%8Q06I{ n}dM zq$pRd!Fv~iD>kXBI@6q>O1#vRLX-&x_$P9zK_4YBHn_O_@i(=P8V@-CVa1@ZV~ktb zy!39FiZQNJjN4-f-kt5G(Xm*OrNmefV6^`U7WY5FvJ9Mh=icn&qXP7;@QdL;0^z_T z_8Tj)R4`!r<;x5x_UIQzBV9NiSZlrFX#B!o`@S91XTEWY2AaLV8WuC?)nEQuyqP5l zV6Yq+W%GTL&&TF#XCKhhpc_BXyB>`#G#Ft`?0*%z2p8o1WbosDYU~Cfk+=IQxkvkA z=@8=XVSa#KIe0Kgd;@GI=`y>TgGA4M&hZe0c<8}uvrn7D_b02Ou)h8NiGZyTHSJ6` zDe{Uiug6o2L7yws+)k_yHDIx{47W2tONg#&MjM&6!dxYl8an(Sw9G7?5k99=^aR#n zHslM1u7edU6=d0oT4uC%+rIX6`hkqcZb<6_Kk`&glk`T!y9?mZh#Py72nm#ID|z5I zvvSHSOmes?E)qX(|Kz04wh@m hg}n;KlG=Rmrjx&WrZO{>!*g_Q<%Eq zaRme<#Qi$6k_6CU7}tfpwzRym+xfcso_8kp2a1epIYG&=#+AjIj4>Q$@f_82gxPMf znG`j=A2X33Hw45d_B}UOuO1%B)**RmoinjA{rnO~L!6G}*iL6;62e^iD(7`Ly@@P8 z^kriQR?bJY`#6l2Io=#~?r9g>VkXwkZ>LPWttbT?+yG-S5w@kmOY)Wr%lkum_^YK% zeb^~VrFx5?|F? d?{mSPL>7k*6eNM5g%)-(74ekz{{qTiQl>L0Mu-(WS;gd1xF zL?U7!y#%|?^v0RQH9*vza#}+l6Pa5#%TSV>1ZQ~aZo$oP?2z3Y^~2bM;I)9e#xA0; zRze(VdzsE1YdXby=Y-0I{J-*2HHO}`088dE;!t=uD7n-dYBV<3|5cCXsKS1}pQnTZ zU3T5LCW92mU$da|pvo3JPL2Tp2TO@BOa;FSG#f%%ZdEm5`JJD@V0*2Dj^kJ)4%deA z-}gLXCcjvy!hhoZoEBK1o+%ZBYyJbp1#4keN6PXHsE@VKyr(Buw TYzeN>F?i5X=OX~LB+f|H@Gse=O${aWXDviv>1Tg_;h3Wj!Q5C~9%mtE*Nb%?Gu zeYa@G>(h; My4HlHY=T%+kQToM??m6G$okk+)_s;g@s(bLRwdQD!&$NwgGOlIkwBL;sSx{dT zc1^Bl3)Zx8Mm|~kuj_z)gd%zFO=oOGIfPmC;6S{IQrtwo9 LGLHuu}M+w#bR!?Rs9+*5aK&*RUHk>Va@XhW}t}A ?iJK{9ZLXA&8gzS)qQ)8C zE5lR#899*|r3AWG5_XReM8Zvc;Fy>oXYe{D2rE-~Ste6Zl8bhy=7dv_O^DlVdNlv6 zDYE`r7DUbVWC`dhHZvfgWQV>?xg5*d%4eZ-jrqG88x-k= }2~DkCea`gV?3? zoGltcvN~&VQ@>R{o&EWX@nV|VwuRZ5fX0tqs_%R7w;q6~)?g}-m!k8QEkobbOg_Cr zBs(|^_3zDvdnY5L{mc%o!$Dq|g~NM3$|=I7h;kq(MzeR6i*jSOCkFd0o#p|V#$OXT z%G0WSY7 +GzRp`JSYwSR! 5;{lGxABCii)CaCCf7 zv$3wAMsQU?p2d&!$Ioiuj>C-VKjHZrC#QE@;*nc4@gr_v&_`xAld`2ZwF@}1$EL7G zD74K!hfhJ!MXG7IxgVT4W|rB5&Y8nVvVl=68Cld`g5rrtIbnaJ9dMv=M%Ys9w`IP) z0k};$EY0ATaJbVw zQptU@B)z2Bp>1=&?xLD)eHeoc)I;>OaV z>k7Ng88r W6xuNzBPtA@J7UPoJCQA18x3K-S+>)6V8TtI<>0rllWyErM zlxXs{=haLLKYI6@O$5Cq{jxQATCL6<3~(HXOFJdX^*|GOP+mv3UBGaDeq8h_wQVN= znl+Apz?wpqHB$?=!po!8F!e~!lJib xX7TFu)Y*!uNu3pLl@1x_1MfhH06hkMHG^;I5 fP3n+QmBRc=Gy0&q^ ;H_LQz008c5ip+3BLBId|q$5%TFbA%x0Sew*T9=lF{&-mQ9 zA~5cbh-o*{=B{v1IswY&4cC9?I4t;}NoNEX<&$y=C8A@emC{Y*Vza^FGmwN>B>z3C zXPEmyAKFhu=Hz|EDqr4|m(Zh;?XW!9wGcP|13t5UnOXeiobh=$R0n`vjE9;pUxBHy z)@5nrjtTHljm(@GBV>dmkn`O+l=3iCkHxAs*u<>;50IDKl7-q$O%b+$@^1$fug!^$ zK bPyj62#(lY!x~DBeWF_!*#FcFqU=6c*G?p61hcJWP@!_X-~)gE zt8$PP#(-A>2!pW3pOAA9C0sl4`_!5_yr*jOCyU;B#TIKHAu}+bk(|Lnmii(9( leNuX^b!Nyvl0Zr9B#6)JrC9osUNiae}SL?13>}7 zk!mc3Dt3b|cGDf-e3l8KkqL?{_2MPM|03GDbTtu%g0wV(V#$7*VsQQiqe{kEbQ+b5 z6-3$NR$Hqr1z()#KCC3|HEj;OKrd^%&7x%B1@0_9H!s-Ve+dU+jJL2EtqAbA02Y0G zQpZR?T)4*4R!Ed03%l}hLite $C2p&oDH)<;#zo}~fA^Znr*g les??_*(@PXO s7K}aL!q#9A{@`)v|2WUR!q=x3bWfH996h;&U)1+xqcW zY`Z3ujlz83X|-tg5~m9znJHus^T5d{!c@oea4P9O|05BYZn#nS3^TlZ07om#4^}4i zOh=?)Q W2w^+aYTaPUV*oAG9(J{^6W40AFLd(c^@K*1fp?fAlB0 zsw?CJEnc%Uz9j T5 =bw5-)RgrGW=NyE z91K)Dh)0%jK~+rDR*&y@)g_Jn8lzBJJkp1@1Ky=Gu=m5M&`yNg_G-l}^y0A(A4L?~ z;W*K454idxq+oX0mTolYm+tBGcv4l;kG!BMmyOVGCAn*c&=Io4ev5S~eeF^ML8~Xb zOhixl-<#nz$Zm1~r;3a}y4qoE#&`xZ<5xez&-37P8!_CIG6aI#-#qzJ>J*qOfRp&& z9n*JkPS+C>bWe26ytQ*`a$Iawcb-Sd6Tm@m$t$F$VPLNPI}9I+0zvzA6D(854yS~* zkrgo-N~8?{RA$r>hO^~}egTKlf&7{7n%-)x;_B|*wIaa_Q)tYId}XkB<=eVlVL2 5Y))CZCy}2_XM|Er!E7@mYuud*94Cw_PXj60QVevn)6(x^4evBE82{c0QkXm zw+uA^RjP*p`wy0*)MxGx`cbLTiNpoWBjfn!0U-50)Ea97)fO@BOMEg3TM1{=Q#dpO zw0GVrEIT;@V_630q)XOhuInDJLX8fL5_ozrUExPS$zcMk q5J90uscHy`N18`-5hNYffg62jZhR_H_V*q>jQ2{+uS~VE;Y;b 3|DO-{(Hej*DWJgw&Hl+EOsh2!)w#Xw?KUr~o3w8+RMNvXCmTMa`+$RCcJ z5E%3k2#rHXS?1M0w&!9C{Rq94ig+h>$w9c^KL~GC`{XbU= s7Mi*avuPZ*`5*{cG8sGR2FNO7mt<6HNo-vL6&WECIXPgFve1f?+{X%&{2a$5 zmM)&s?%89xt%LzewK@7LyI`yRv~0|y7aoQ(S-D#Or!{&8YK_i_qNl1>iS7^PGj?Pr z4jW`$1K*K!S>(C^vAD>*EHP#fit&~BI$0$`AqIV0JkJ&w9uc;JP3Ea%AAZt}O~}Jp zK_%9FEB`Xh@{F_V(^z1Ez@Lh dNnEJG>3k!p*Miqte!_MOO zk&{}pg@@_@O4g#36{oj_H$pL$r_}${cjQp6RL9D(01?wMpJhWF@v9&f1{3B|OF^RT zzIILhOyR*XqL}H5 joeH^*BCYkGTh5;{rvY9;|FElA;WoL;>3IJN4$4SWtI=m zwFhh&A6%Tp`};-+;$iJ*OqVye?at3{D*oU&J4aZN*&{57hZ{X+{mX&OzImb%hXU5E zYkIfqBHL+Y4*$|Ge~;QIcqS<5F99m55vM@PB%^zQ3Z;X%uShTHTdBpU#+$fbr?f@i zR?DQro6CG`@IEC9=SIAzXa{!ZPLf^6u5_z}o#g!*rksY3`$iU&``Y36eYMm ;v-em1J+}4OnR}6=7A=-<7K1xj@4CzxExRvgL}FPHAuPvOSbq_ig#qCYkBnvP z<3B@845F>j#=7 O zJ$tZ!Ll$D+u1)yy^Y`PhHA0(#AX0Das9x8lFWMhP@l1o}^Vs=(v~4E|2EpwgcIbIg zS-Ebw{ko>-aNT%$z3Dvi1R&wa&bx+f%FkiJ{9V#&UYxSuL5EpU&~xoGik{J@0FHme zIrgP4j{?d+nV_Ea3E0|&J?f6;O=)u;nukXZN`Y#+gI0HyM <1GAA|g#jFb&W zjjA>9w6Mr5XFVV`p3xKu^8cV<1qcOQFk%)9_3%&Fz6y(%byU0mp%C1r%;qNWVMutg z%RGQX4m4J1Q^9*S+40Ng+`5g3su5u~-tC*_RF*F5FQkdk|A0-&drhs;nEW;T^X?N$ z*c78lG9eF;iu&+qw{*}3j=8b^wVapfH{N{zqYiK2f2E`EKx8PeWE~9nY-@K3wv(f6 zk9#&@zrc+v;5hdPFZW}{*FKg#o)X6cekEk+!}(4};(BE2w`G|Y-#g%}$=Mt|Vz;!i z+s6JhZExLyjEdJ~KhGlMz+}_N4D)JdE=crDgO`Z|&I^i2?VIB$*k~gc*_PZACQ ^m zQX>vT^!fI^N?Q>*KIm+kQtq^Q(w{XLf3e1=upvX+@*~pA2jvM%-aUF?Q5DxEX6l}& zJWh> Iru%UF0`jiaFa^7OcChyb=X-NR|}>A`UV=c2r!ikw~*@N zsIX?@@k4>}+W)}UbAWFesdiqeBJFrX3uS@bxY(&QqMvyTwCxj9aQThpRbs(E4*i2L z|3~FmGV%BTB$OYbOnw(J#|u5XxGT?75 ?vW?>7$6H&d(6Lm9jf?7dCl4@32* ztCj1Oj?PW<$0~;T{gW0`Pj>FJ2Pp+pYH1)q;tpddMJuEn^tlBYMBs|DbfF2X2L{xy z2*eNv
K^oA1jk6`GW~Y7WVa+AK}F31?o%v)@Co#(brSt`wHW=lb)K16-}2ype9|*_Eez! z$Z^ER8baY=jxRTn15(Suj+#M+zg#s?=*7GkxI?w`gW<<6u^7mACCIlG^oJVEZUM$_ z0Yae5LK;|wH~{5)rV-epQwYOHGoCk4{Phy&NuQTHs(~O*g#APQtyCLEMIc`58lhP(j?{L%zll-X@R+0@MS`xtf79!h0CoYGo%s zss!D~?YEokS*P;zq7P$wFSE%Uzxu10Xgzo=cn9QB*{)drswL449a6)G82Uo>b}!-L z_*LGVt&N09w0@Sh)CTT^f&>6cKor(A9eI83P6mo^ziV3%0{IOPVG$q!;otbm*E-;N zQ!N1TYB6~mp&H9SwM79uobFnV=gDT~C|`wNO(gpg7yGz`xT&gTkH&BZ4Hy=pgPeh! zmu+hE%wO&|(hcNq3F`?wZj B$nsEq3%rCyd-#)LD`_D1I8%GFbvO%tFe`Z=&UY!!Q-Py5zOA8aX7~E> zbb8xrOx g-BEz^}x`Ynezv^=>Q=wNB#_>5}RfvuT{03)L0oK{T^r)!w zbj0dvEl%R&>K|XKdFN_5qBQ|b38&ZE0jn5WYU$M7)mwhD7z_YlC35%+%4JxDkvo#0 zTMo6#li54%1G5Ozldg }VKBSjNO=Ex00Ni1{z12Gc|Pt%6Z`D|zxo!B-y?y0tF zkjlik9UyaDA*A?RVS=v?k%vH;t)sTC%HMYR+_Ez$u;IOc<#iL+X>qbR;OoAbEi_S| zR$Pr3=22a@Byxq(VyF{zLc!_z;jXyBH^SQv^rz()$_H?VyUv)1N(=^0`g2Rd;hZsN z?6I&`EPYEf3c m3T72;6KWCl#;Ol!dJ4@T86t zZRGx=^LDktv%