From f3f4b768ef3157605efa6b0782767805e254edc2 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action The FuncParser extracts and executes ‘inline functions’ embedded in a string on the form The FuncParser extracts and executes ‘inline functions’ embedded in a string on the form To test it, let’s tell Evennia to apply the Funcparser on every outgoing message. This is disabled by default (not everyone needs this functionality). To activate, add to your settings file: After a reload, you can try this in-game To escape the inlinefunc (e.g. to explain to someone how it works, use While The To show a The FuncParser can be applied to any string. Out of the box it’s applied in a few situations:evennia.utils.funcparser.FUNCPARSER_CALLABLESevennia.utils.funcparser.SEARCHING_CALLABLESevennia.utils.funcparser.ACTOR_STANCE_CALLABLESevennia.prototypes.protfuncsFuncParser inline text parsing¶
-$funcname(args, kwargs). Under the hood, this will lead to a call to a Python function you control. The inline function call will be replaced by the return from the function.$funcname(args, kwargs), executes the matching ‘inline function’ and replaces the call with the return from the call.FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED = True
+
$$)randint may look and work just like random.randint from the standard Python library, it is not. Instead it’s a inlinefunc named randint made available to Evennia (which in turn uses the standard library function). For security reasons, only functions explicitly assigned to be used as inlinefuncs are viable.FuncParser tool is initialized with the inlinefuncs it’s supposed to recognize. Below is an example of a parser only only understanding a single $pow inlinefunc:from evennia.utils.funcparser import FuncParser
def _power_callable(*args, **kwargs):
@@ -141,11 +150,6 @@
16
$func() verbatim in your code without parsing it, escape it as either $$func() or \$func():parser.parse("This is an escaped $$pow(4) and so is this \$pow(3)")
-"This is an escaped $pow(4) and so is this $pow(3)"
-
Working with FuncParser¶
These are some example callables you can import and add your parser. They are divided into
-global-level dicts in evennia.utils.funcparser. Just import the dict(s) and merge/add one or
-more to them when you create your FuncParser instance to have those callables be available.
These are some example callables you can import and add your parser. They are divided into global-level dicts in evennia.utils.funcparser. Just import the dict(s) and merge/add one or more to them when you create your FuncParser instance to have those callables be available.
evennia.utils.funcparser.FUNCPARSER_CALLABLES¶These are the ‘base’ callables.
@@ -421,6 +423,15 @@ to do this, and only works for English verbs. map pronouns (like his, herself, you, its etc) between 1st/2nd person to 3rd person.evennia.prototypes.protfuncs¶This is used by the Prototype system and allows for adding references inside the prototype. The funcparsing will happen before the spawn.
+Available inlinefuncs to prototypes:
+All FUNCPARSER_CALLABLES and SEARCHING_CALLABLES
$protkey(key) - returns the value of another key within the same prototype. Note that the system will try to convert this to a ‘real’ value (like turning the string “3” into the integer 3), for security reasons, not all embedded values can be converted this way. Note however that you can do nested calls with inlinefuncs, including adding your own converters.
Here’s an example of including the default callables together with two custom ones.
diff --git a/docs/1.0/Components/Prototypes.html b/docs/1.0/Components/Prototypes.html index 5b00be66c6..fdc2e3c3a3 100644 --- a/docs/1.0/Components/Prototypes.html +++ b/docs/1.0/Components/Prototypes.html @@ -138,15 +138,11 @@ Spawned Goblin Grunt¶Enter the olc command or spawn/olc to enter the prototype wizard. This is a menu system for
-creating, loading, saving and manipulating prototypes. It’s intended to be used by in-game builders
-and will give a better understanding of prototypes in general. Use help on each node of the menu
-for more information. Below are further details about how prototypes work and how they are used.
Enter the olc command or spawn/olc to enter the prototype wizard. This is a menu system for creating, loading, saving and manipulating prototypes. It’s intended to be used by in-game builders and will give a better understanding of prototypes in general. Use help on each node of the menu for more information. Below are further details about how prototypes work and how they are used.
The prototype dictionary can either be created for you by the OLC (see above), be written manually in a Python module (and then referenced by the spawn command/OLC), or created on-the-fly and
-manually loaded into the spawner function or spawn command.
The prototype dictionary can either be created for you by the OLC (see above), be written manually in a Python module (and then referenced by the spawn command/OLC), or created on-the-fly and manually loaded into the spawner function or spawn command.
The dictionary defines all possible database-properties of an Object. It has a fixed set of allowed keys. When preparing to store the prototype in the database (or when using the OLC), some of these keys are mandatory. When just passing a one-time prototype-dict to the spawner the system is more lenient and will use defaults for keys not explicitly provided.
In dictionary form, a prototype can look something like this:
{
@@ -171,15 +167,12 @@ manually loaded into the spawner function or prototype_key - the ‘name’ of the prototype, used for referencing the prototype
when spawning and inheritance. If defining a prototype in a module and this
not set, it will be auto-set to the name of the prototype’s variable in the module.
-prototype_parent - If given, this should be the prototype_key of another prototype stored in
-the system or available in a module. This makes this prototype inherit the keys from the
-parent and only override what is needed. Give a tuple (parent1, parent2, ...) for multiple
-left-right inheritance. If this is not given, a typeclass should usually be defined (below).
prototype_parent - If given, this should be the prototype_key of another prototype stored in the system or available in a module. This makes this prototype inherit the keys from the
+parent and only override what is needed. Give a tuple (parent1, parent2, ...) for multiple left-right inheritance. If this is not given, a typeclass should usually be defined (below).
prototype_desc - this is optional and used when listing the prototype in in-game listings.
protototype_tags - this is optional and allows for tagging the prototype in order to find it
easier later.
prototype_locks - two lock types are supported: edit and spawn. The first lock restricts the copying and editing of the prototype when loaded through the OLC. The second determines who
-may use the prototype to create new objects.
prototype_locks - two lock types are supported: edit and spawn. The first lock restricts the copying and editing of the prototype when loaded through the OLC. The second determines who may use the prototype to create new objects.
The remaining keys determine actual aspects of the objects to spawn from this prototype:
At execution time, the place of the protfunc will be replaced with the result of that protfunc being called (this is always a string). A protfunc is a FuncParser function run every time the prototype is used to spawn a new object.
+++If you want to escape a protfunc and have it appear verbatim, use
+$$funcname().
At spawn time, the place of the protfunc will be replaced with the result of that protfunc being called (this is always a string). A protfunc is a FuncParser function run every time the prototype is used to spawn a new object. See the FuncParse for a lot more information.
Here is how a protfunc is defined (same as other funcparser functions).
# this is a silly example, you can just color the text red with |r directly!
def red(*args, **kwargs):
@@ -246,8 +242,14 @@ may use the prototype to create new objects.
-Note that we must make sure to validate input and raise
+ValueErrorif that fails. Also, it is not possible to use keywords in the call to the protfunc (so something like$echo(text, align=left)is invalid). Thekwargsrequred is for internal evennia use and not used at all for protfuncs (only by inlinefuncs).+Note that we must make sure to validate input and raise
ValueErroron failure.The parser will always include the following reserved
+kwargs:+
- +
session- the current Session performing the spawning.- +
prototype- The Prototype-dict this function is a part of. This is intended to be used read-only. Be careful to modify a mutable structure like this from inside the function - you can cause really hard-to-find bugs this way.- +
current_key- The current key of theprototypedict under which this protfunc is executed.To make this protfunc available to builders in-game, add it to a new module and add the path to that module to
settings.PROT_FUNC_MODULES:# in mygame/server/conf/settings.py @@ -265,7 +267,7 @@ may use the prototype to create new objects.-
$random()+ Returns random value in range [0, 1)
Returns random value in range
[0, 1)
$randint(start, end)@@ -347,10 +349,7 @@ ORC_SHAMAN = {"key":"Orc shaman", Returns random value in range [start, end]
-Note that in the example above,
+"ORC_SHAMAN"will become theprototype_keyof this prototype. -It’s the only case whenprototype_keycan be skipped in a prototype. However, ifprototype_key-was given explicitly, that would take precedence. This is a legacy behavior and it’s recommended -that you always addprototype_keyto be consistent.Note that in the example above,
"ORC_SHAMAN"will become theprototype_keyof this prototype. It’s the only case whenprototype_keycan be skipped in a prototype. However, ifprototype_keywas given explicitly, that would take precedence. This is a legacy behavior and it’s recommended > that you always addprototype_keyto be consistent.diff --git a/docs/1.0/_modules/evennia/prototypes/protfuncs.html b/docs/1.0/_modules/evennia/prototypes/protfuncs.html index 31c0da482b..538464ac0e 100644 --- a/docs/1.0/_modules/evennia/prototypes/protfuncs.html +++ b/docs/1.0/_modules/evennia/prototypes/protfuncs.html @@ -77,30 +77,37 @@ Source code for evennia.prototypes.protfuncs
""" -Protfuncs are FuncParser-callables that can be embedded in a prototype to -provide custom logic without having access to Python. The protfunc is parsed at -the time of spawning, using the creating object's session as input. If the -protfunc returns a non-string, this is what will be added to the prototype. +Protfuncs are FuncParser-callables that can be embedded in a prototype to provide custom logic +without having access to Python. The protfunc is parsed at the time of spawning, using the creating +object's session as input. If the protfunc returns a non-string, this is what will be added to the +prototype. In the prototype dict, the protfunc is specified as a string inside the prototype, e.g.: - { ... +```python +{ ... - "key": "$funcname(args, kwargs)" +"key": "$funcname(args, kwargs)" - ... } +... } +``` Available protfuncs are either all callables in one of the modules of `settings.PROT_FUNC_MODULES` -or all callables added to a dict FUNCPARSER_CALLABLES in such a module. +or all callables added to a dict FUNCPARSER_CALLABLES in such a module. By default, base inlinefuncs +for text manipulation and searching are included, as well as the special `$protkey` function. +See the Prototypes and Spawner documentation for more info. - def funcname (*args, **kwargs) +```python +def funcname (*args, **kwargs): + return "replacement text" +``` At spawn-time the spawner passes the following extra kwargs into each callable (in addition to what is added in the call itself): - - session (Session): The Session of the entity spawning using this prototype. - - prototype (dict): The dict this protfunc is a part of. - - current_key (str): The active key this value belongs to in the prototype. +- `session` (Session): The Session of the entity spawning using this prototype. +- `prototype` (dict): The dict this protfunc is a part of. +- `current_key` (str): The active key this value belongs to in the prototype. Any traceback raised by this function will be handled at the time of spawning and abort the spawn before any object is created/updated. It must otherwise return the value to store for the specified @@ -114,8 +121,9 @@[docs]def protfunc_callable_protkey(*args, **kwargs): """ Usage: $protkey(keyname) + Returns the value of another key in this prototoype. Will raise an error if - the key is not found in this prototype. + the key is not found in this prototype. """ if not args: diff --git a/docs/1.0/_sources/Components/FuncParser.md.txt b/docs/1.0/_sources/Components/FuncParser.md.txt index 56ac51c6f6..fce01b8249 100644 --- a/docs/1.0/_sources/Components/FuncParser.md.txt +++ b/docs/1.0/_sources/Components/FuncParser.md.txt @@ -1,6 +1,28 @@ # FuncParser inline text parsing -The [FuncParser](evennia.utils.funcparser.FuncParser) extracts and executes 'inline functions' embedded in a string on the form `$funcname(args, kwargs)`. Under the hood, this will lead to a call to a Python function you control. The inline function call will be replaced by the return from the function. +The [FuncParser](evennia.utils.funcparser.FuncParser) extracts and executes 'inline functions' embedded in a string on the form `$funcname(args, kwargs)`, executes the matching 'inline function' and replaces the call with the return from the call. + +To test it, let's tell Evennia to apply the Funcparser on every outgoing message. This is disabled by default (not everyone needs this functionality). To activate, add to your settings file: + + FUNCPARSER_PARSE_OUTGOING_MESSAGES_ENABLED = True + +After a reload, you can try this in-game + +```{shell} +> say I got $randint(1,5) gold! +You say "I got 3 gold!" +``` + +To escape the inlinefunc (e.g. to explain to someone how it works, use `$$`) + +```{shell} +> say To get a random value from 1 to 5, use $$randint(1,5). +You say "To get a random value from 1 to 5, use $randint(1,5)." +``` + +While `randint` may look and work just like `random.randint` from the standard Python library, it is _not_. Instead it's a `inlinefunc` named `randint` made available to Evennia (which in turn uses the standard library function). For security reasons, only functions explicitly assigned to be used as inlinefuncs are viable. + +The `FuncParser` tool is initialized with the inlinefuncs it's supposed to recognize. Below is an example of a parser only only understanding a single `$pow` inlinefunc: ```python from evennia.utils.funcparser import FuncParser @@ -28,14 +50,6 @@ parser.parse_to_any("$pow(4)") 16 ``` -To show a `$func()` verbatim in your code without parsing it, escape it as either `$$func()` or `\$func()`: - - -```python -parser.parse("This is an escaped $$pow(4) and so is this \$pow(3)") -"This is an escaped $pow(4) and so is this $pow(3)" -``` - ## Working with FuncParser The FuncParser can be applied to any string. Out of the box it's applied in a few situations: @@ -261,9 +275,7 @@ It may be tempting to run use Python's in-built ``eval()`` or ``exec()`` functio ## Default funcparser callables -These are some example callables you can import and add your parser. They are divided into -global-level dicts in `evennia.utils.funcparser`. Just import the dict(s) and merge/add one or -more to them when you create your `FuncParser` instance to have those callables be available. +These are some example callables you can import and add your parser. They are divided into global-level dicts in `evennia.utils.funcparser`. Just import the dict(s) and merge/add one or more to them when you create your `FuncParser` instance to have those callables be available. ### `evennia.utils.funcparser.FUNCPARSER_CALLABLES` @@ -331,6 +343,16 @@ Here the `caller` is the one sending the message and `receiver` the one to see i - `$pron(pronoun [,options])` ([code](evennia.utils.funcparser.funcparser_callable_pronoun)) - Dynamically map pronouns (like his, herself, you, its etc) between 1st/2nd person to 3rd person. + +### `evennia.prototypes.protfuncs` + +This is used by the [Prototype system](./Prototypes.md) and allows for adding references inside the prototype. The funcparsing will happen before the spawn. + +Available inlinefuncs to prototypes: + +- All `FUNCPARSER_CALLABLES` and `SEARCHING_CALLABLES` +- `$protkey(key)` - returns the value of another key within the same prototype. Note that the system will try to convert this to a 'real' value (like turning the string "3" into the integer 3), for security reasons, not all embedded values can be converted this way. Note however that you can do nested calls with inlinefuncs, including adding your own converters. + ### Example Here's an example of including the default callables together with two custom ones. diff --git a/docs/1.0/_sources/Components/Prototypes.md.txt b/docs/1.0/_sources/Components/Prototypes.md.txt index d7f77efe57..6bb61a4b37 100644 --- a/docs/1.0/_sources/Components/Prototypes.md.txt +++ b/docs/1.0/_sources/Components/Prototypes.md.txt @@ -20,15 +20,11 @@ The *spawner* takes a prototype and uses it to create (spawn) new, custom object ### Using the OLC -Enter the `olc` command or `spawn/olc` to enter the prototype wizard. This is a menu system for -creating, loading, saving and manipulating prototypes. It's intended to be used by in-game builders -and will give a better understanding of prototypes in general. Use `help` on each node of the menu -for more information. Below are further details about how prototypes work and how they are used. +Enter the `olc` command or `spawn/olc` to enter the prototype wizard. This is a menu system for creating, loading, saving and manipulating prototypes. It's intended to be used by in-game builders and will give a better understanding of prototypes in general. Use `help` on each node of the menu for more information. Below are further details about how prototypes work and how they are used. ### The prototype -The prototype dictionary can either be created for you by the OLC (see above), be written manually in a Python module (and then referenced by the `spawn` command/OLC), or created on-the-fly and -manually loaded into the spawner function or `spawn` command. +The prototype dictionary can either be created for you by the OLC (see above), be written manually in a Python module (and then referenced by the `spawn` command/OLC), or created on-the-fly and manually loaded into the spawner function or `spawn` command. The dictionary defines all possible database-properties of an Object. It has a fixed set of allowed keys. When preparing to store the prototype in the database (or when using the OLC), some of these keys are mandatory. When just passing a one-time prototype-dict to the spawner the system is more lenient and will use defaults for keys not explicitly provided. @@ -54,15 +50,12 @@ All keys starting with `prototype_` are for book keeping. - `prototype_key` - the 'name' of the prototype, used for referencing the prototype when spawning and inheritance. If defining a prototype in a module and this not set, it will be auto-set to the name of the prototype's variable in the module. - - `prototype_parent` - If given, this should be the `prototype_key` of another prototype stored in - the system or available in a module. This makes this prototype *inherit* the keys from the - parent and only override what is needed. Give a tuple `(parent1, parent2, ...)` for multiple - left-right inheritance. If this is not given, a `typeclass` should usually be defined (below). + - `prototype_parent` - If given, this should be the `prototype_key` of another prototype stored in the system or available in a module. This makes this prototype *inherit* the keys from the + parent and only override what is needed. Give a tuple `(parent1, parent2, ...)` for multiple left-right inheritance. If this is not given, a `typeclass` should usually be defined (below). - `prototype_desc` - this is optional and used when listing the prototype in in-game listings. - `protototype_tags` - this is optional and allows for tagging the prototype in order to find it easier later. - - `prototype_locks` - two lock types are supported: `edit` and `spawn`. The first lock restricts the copying and editing of the prototype when loaded through the OLC. The second determines who - may use the prototype to create new objects. + - `prototype_locks` - two lock types are supported: `edit` and `spawn`. The first lock restricts the copying and editing of the prototype when loaded through the OLC. The second determines who may use the prototype to create new objects. The remaining keys determine actual aspects of the objects to spawn from this prototype: @@ -121,7 +114,10 @@ Finally, the value can be a *prototype function* (*Protfunc*). These look like s "attrs": {"desc": "This is a large $red(and very red) demon. " "He has $randint(2,5) skulls in a chain around his neck."} ``` -At execution time, the place of the protfunc will be replaced with the result of that protfunc being called (this is always a string). A protfunc is a [FuncParser function](./FuncParser.md) run every time the prototype is used to spawn a new object. + +> If you want to escape a protfunc and have it appear verbatim, use `$$funcname()`. + +At spawn time, the place of the protfunc will be replaced with the result of that protfunc being called (this is always a string). A protfunc is a [FuncParser function](./FuncParser.md) run every time the prototype is used to spawn a new object. See the FuncParse for a lot more information. Here is how a protfunc is defined (same as other funcparser functions). @@ -137,7 +133,12 @@ def red(*args, **kwargs): return f"|r{args[0]}|n" ``` -> Note that we must make sure to validate input and raise `ValueError` if that fails. Also, it is *not* possible to use keywords in the call to the protfunc (so something like `$echo(text, align=left)` is invalid). The `kwargs` requred is for internal evennia use and not used at all for protfuncs (only by inlinefuncs). +> Note that we must make sure to validate input and raise `ValueError` on failure. + +The parser will always include the following reserved `kwargs`: +- `session` - the current [Session](evennia.server.ServerSession) performing the spawning. +- `prototype` - The Prototype-dict this function is a part of. This is intended to be used _read-only_. Be careful to modify a mutable structure like this from inside the function - you can cause really hard-to-find bugs this way. +- `current_key` - The current key of the `prototype` dict under which this protfunc is executed. To make this protfunc available to builders in-game, add it to a new module and add the path to that module to `settings.PROT_FUNC_MODULES`: @@ -153,7 +154,7 @@ The default protfuncs available out of the box are defined in `evennia/prototype | Protfunc | Description | | --- | --- | -| `$random()` | Returns random value in range [0, 1) | +| `$random()` | Returns random value in range `[0, 1)` | | `$randint(start, end)` | Returns random value in range [start, end] | | `$left_justify()` | Left-justify text | | `$right_justify( )` | Right-justify text to screen width | @@ -170,7 +171,7 @@ The default protfuncs available out of the box are defined in `evennia/prototype | `$objlist( )` | Like `$obj`, except always returns a list of zero, one or more results. | | `$dbref(dbref)` | Returns argument if it is formed as a #dbref (e.g. #1234), otherwise error. | -For developers with access to Python, using protfuncs in prototypes is generally not useful. Passing real Python functions is a lot more powerful and flexible. Their main use is to allow in-game builders to do limited coding/scripting for their prototypes without giving them direct access to raw Python. +For developers with access to Python, using protfuncs in prototypes is generally not useful. Passing real Python functions is a lot more powerful and flexible. Their main use is to allow in-game builders to do limited coding/scripting for their prototypes without giving them direct access to raw Python. ## Database prototypes @@ -203,10 +204,7 @@ Here is an example of a prototype defined in a module: "health": 20} ``` -> Note that in the example above, `"ORC_SHAMAN"` will become the `prototype_key` of this prototype. -> It's the only case when `prototype_key` can be skipped in a prototype. However, if `prototype_key` -> was given explicitly, that would take precedence. This is a legacy behavior and it's recommended -> that you always add `prototype_key` to be consistent. +> Note that in the example above, `"ORC_SHAMAN"` will become the `prototype_key` of this prototype. It's the only case when `prototype_key` can be skipped in a prototype. However, if `prototype_key`was given explicitly, that would take precedence. This is a legacy behavior and it's recommended > that you always add `prototype_key` to be consistent. ## Spawning diff --git a/docs/1.0/api/evennia.commands.default.batchprocess.html b/docs/1.0/api/evennia.commands.default.batchprocess.html index c9fd3e9483..49f6afcd89 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. @@ -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 5d55b2fa18..b6f6594304 100644 --- a/docs/1.0/api/evennia.commands.default.building.html +++ b/docs/1.0/api/evennia.commands.default.building.html @@ -1345,7 +1345,7 @@ server settings.
- -
+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 '}¶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 '}¶
- -
+aliases= ['@typeclasses', '@parent', '@update', '@swap', '@type']¶aliases= ['@type', '@update', '@typeclasses', '@swap', '@parent']¶@@ -1376,7 +1376,7 @@ server settings.
diff --git a/docs/1.0/api/evennia.commands.default.comms.html b/docs/1.0/api/evennia.commands.default.comms.html index bbb27a51a4..4d83c23fce 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': '@typeclasses @parent @update @swap @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses parent update swap 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': '@type @update @typeclasses @swap @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type update typeclasses swap parent', '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 "}¶@@ -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': '@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 "}¶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 "}¶@@ -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 40e2e9eefe..c43f090206 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': '@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 "}¶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 "}¶@@ -300,7 +300,7 @@ for everyone to use, you need build privileges and the alias command.
@@ -709,7 +709,7 @@ automatically begin with your name.
- -
+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 '}¶@@ -750,7 +750,7 @@ space.
diff --git a/docs/1.0/api/evennia.commands.default.system.html b/docs/1.0/api/evennia.commands.default.system.html index 1fd72e3fc9..fdc40c105d 100644 --- a/docs/1.0/api/evennia.commands.default.system.html +++ b/docs/1.0/api/evennia.commands.default.system.html @@ -683,7 +683,7 @@ See |luhttps://ww
- -
+search_index_entry= {'aliases': ': emote', 'category': 'general', 'key': 'pose', 'no_prefix': ' : emote', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶search_index_entry= {'aliases': 'emote :', 'category': 'general', 'key': 'pose', 'no_prefix': ' emote :', 'tags': '', 'text': "\n strike a pose\n\n Usage:\n pose <pose text>\n pose's <pose text>\n\n Example:\n pose is standing by the wall, smiling.\n -> others will see:\n Tom is standing by the wall, smiling.\n\n Describe an action being taken. The pose text will\n automatically begin with your name.\n "}¶@@ -729,7 +729,7 @@ to all the variables defined therein.
diff --git a/docs/1.0/api/evennia.commands.default.tests.html b/docs/1.0/api/evennia.commands.default.tests.html index 285c44998b..d6e86d2a6a 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': '@delays @task', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks delays task', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶search_index_entry= {'aliases': '@task @delays', 'category': 'system', 'key': '@tasks', 'no_prefix': 'tasks task delays', 'tags': '', 'text': "\n Display or terminate active tasks (delays).\n\n Usage:\n tasks[/switch] [task_id or function_name]\n\n Switches:\n pause - Pause the callback of a task.\n unpause - Process all callbacks made since pause() was called.\n do_task - Execute the task (call its callback).\n call - Call the callback of this task.\n remove - Remove a task without executing it.\n cancel - Stop a task from automatically executing.\n\n Notes:\n A task is a single use method of delaying the call of a function. Calls are created\n in code, using `evennia.utils.delay`.\n See |luhttps://www.evennia.com/docs/latest/Command-Duration.html|ltthe docs|le for help.\n\n By default, tasks that are canceled and never called are cleaned up after one minute.\n\n Examples:\n - `tasks/cancel move_callback` - Cancels all movement delays from the slow_exit contrib.\n In this example slow exits creates it's tasks with\n `utils.delay(move_delay, move_callback)`\n - `tasks/cancel 2` - Cancel task id 2.\n\n "}¶Test the batch processor.
+
red_button= <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmp5dagsku9/3eacb1a10f30f08766fedd70f24b2de4c529dc93/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 7415dbd677..53d5ab97cf 100644 --- a/docs/1.0/api/evennia.commands.default.unloggedin.html +++ b/docs/1.0/api/evennia.commands.default.unloggedin.html @@ -122,7 +122,7 @@ connect “account name” “pass word”
@@ -157,7 +157,7 @@ there is no object yet before the account has logged in)
@@ -242,7 +242,7 @@ version is a bit more complicated.
- -
+search_index_entry= {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶search_index_entry= {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n connect to the game\n\n Usage (at login screen):\n connect accountname password\n connect "account name" "pass word"\n\n Use the create command to first create an account before logging in.\n\n If you have spaces in your name, enclose it in double quotes.\n '}¶@@ -268,7 +268,7 @@ version is a bit more complicated.
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 94765a172d..a6036ad3fc 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 @@ -139,7 +139,7 @@ the module given by settings.CONNECTION_SCREEN_MODULE.
- -
+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 '}¶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 '}¶@@ -169,7 +169,7 @@ there is no object yet before the account has logged in)
@@ -246,7 +246,7 @@ version is a bit more complicated.
- -
+search_index_entry= {'aliases': 'conn con co', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn con co', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶search_index_entry= {'aliases': 'conn co con', 'category': 'general', 'key': 'connect', 'no_prefix': ' conn co con', 'tags': '', 'text': '\n Connect to the game.\n\n Usage (at login screen):\n connect <email> <password>\n\n Use the create command to first create an account before logging in.\n '}¶@@ -272,7 +272,7 @@ version is a bit more complicated.
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 538172f38b..7ac64170bb 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': '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 '}¶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 '}¶@@ -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 c86b7500bd..bafb4fb08d 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 @callbacks @callback', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callbacks callback', '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': 'abort q quit chicken out', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q quit chicken out', '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': 'chicken out q abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' chicken out q 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 '}¶@@ -400,7 +400,7 @@ set in self.parse())
@@ -428,7 +428,7 @@ emote /me points to /box and /lever.
- -
+search_index_entry= {'aliases': 'whisper ; shout', 'category': 'general', 'key': 'say', 'no_prefix': ' whisper ; shout', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry= {'aliases': 'whisper shout ;', 'category': 'general', 'key': 'say', 'no_prefix': ' whisper shout ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶@@ -467,7 +467,7 @@ set in self.parse())
@@ -490,7 +490,7 @@ looks and what actions is available.
- -
+search_index_entry= {'aliases': 'pose :', 'category': 'general', 'key': 'emote', 'no_prefix': ' pose :', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶search_index_entry= {'aliases': ': pose', 'category': 'general', 'key': 'emote', 'no_prefix': ' : pose', 'tags': '', 'text': '\n Perform a free-form emote. Use /me to\n include yourself in the emote and /name\n to include other objects or characters.\n Use "..." to enact speech.\n\n Usage:\n emote <emote>\n :<emote\n\n Example:\n emote /me smiles at /peter\n emote /me points to /box and /lever.\n\n '}¶@@ -519,7 +519,7 @@ set in self.parse())
@@ -581,7 +581,7 @@ set in self.parse())
- -
+search_index_entry= {'aliases': 'e ex unfocus examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' e ex unfocus examine', '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': 'unfocus ex e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' unfocus ex e examine', '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.grid.xyzgrid.commands.html b/docs/1.0/api/evennia.contrib.grid.xyzgrid.commands.html index 3b5a7b0942..fd788e62d5 100644 --- a/docs/1.0/api/evennia.contrib.grid.xyzgrid.commands.html +++ b/docs/1.0/api/evennia.contrib.grid.xyzgrid.commands.html @@ -422,7 +422,7 @@ there is no room above/below you, your movement will fail.
- -
+search_index_entry= {'aliases': 'i inv inventory give', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' i inv inventory give', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry= {'aliases': 'inventory i give inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory i give inv', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶@@ -445,7 +445,7 @@ to all the variables defined therein.
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 ac2986c4ea..88d4de653e 100644 --- a/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html +++ b/docs/1.0/api/evennia.contrib.rpg.rpsystem.rpsystem.html @@ -865,7 +865,7 @@ Using the command without arguments will list all current recogs.
- -
+search_index_entry= {'aliases': 'dive fly', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' dive fly', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶search_index_entry= {'aliases': 'fly dive', 'category': 'general', 'key': 'fly or dive', 'no_prefix': ' fly dive', 'tags': '', 'text': '\n Fly or Dive up and down.\n\n Usage:\n fly\n dive\n\n Will fly up one room or dive down one room at your current position. If\n there is no room above/below you, your movement will fail.\n\n '}¶@@ -892,7 +892,7 @@ Using the command without arguments will list all current recogs.
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 e20978d040..084959c8bc 100644 --- a/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html +++ b/docs/1.0/api/evennia.contrib.tutorials.evadventure.commands.html @@ -357,7 +357,7 @@ unwear <item>
- -
+search_index_entry= {'aliases': 'recognize forget', 'category': 'general', 'key': 'recog', 'no_prefix': ' recognize forget', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶search_index_entry= {'aliases': 'forget recognize', 'category': 'general', 'key': 'recog', 'no_prefix': ' forget recognize', 'tags': '', 'text': '\n Recognize another person in the same room.\n\n Usage:\n recog\n recog sdesc as alias\n forget alias\n\n Example:\n recog tall man as Griatch\n forget griatch\n\n This will assign a personal alias for a person, or forget said alias.\n Using the command without arguments will list all current recogs.\n\n '}¶@@ -381,7 +381,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 d2192c9d70..bc601b4913 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': 'unwear unwield', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwear unwield', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶search_index_entry= {'aliases': 'unwield unwear', 'category': 'general', 'key': 'remove', 'no_prefix': ' unwield unwear', 'tags': '', 'text': '\n Remove a remove a weapon/shield, armor or helmet.\n\n Usage:\n remove <item>\n unwield <item>\n unwear <item>\n\n To remove an item from the backpack, use |wdrop|n instead.\n\n '}¶+
aliases= ['press button', 'push', 'press']¶@@ -182,7 +182,7 @@ check if the lid is open or closed.
@@ -379,7 +379,7 @@ be mutually exclusive.+
search_index_entry= {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶+
aliases= ['press button', 'push', 'press']¶@@ -408,7 +408,7 @@ set in self.parse())
@@ -506,7 +506,7 @@ be mutually exclusive.+
search_index_entry= {'aliases': 'press button push press', 'category': 'general', 'key': 'push button', 'no_prefix': ' press button push press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶+
aliases= ['l', 'listen', 'ex', 'examine', 'feel', 'get']¶@@ -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 d6ba83aee1..28e3db4820 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': 'l listen ex examine feel get', 'category': 'general', 'key': 'look', 'no_prefix': ' l listen ex examine feel get', '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': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶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 '}¶@@ -592,7 +592,7 @@ yellow/green - horizontal roots
@@ -609,7 +609,7 @@ yellow/green - horizontal roots
- -
+search_index_entry= {'aliases': 'push shiftroot move pull', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push shiftroot move 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 '}¶search_index_entry= {'aliases': 'shiftroot move pull push', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot move pull 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 '}¶
- -
+aliases= ['press button', 'push button', 'button']¶aliases= ['push button', 'press button', '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': 'press button push button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button push button button', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry= {'aliases': 'push button press button button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' push button press button button', 'tags': '', 'text': '\n Presses a button.\n '}¶
- -
+aliases= ['parry', 'thrust', 'hit', 'chop', 'bash', 'pierce', 'stab', 'defend', 'kill', 'fight', 'slash']¶aliases= ['slash', 'fight', 'chop', 'bash', 'defend', 'pierce', 'thrust', 'parry', 'stab', 'hit', 'kill']¶@@ -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 0722df4d88..cf25256aad 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 @@ -968,7 +968,7 @@ to find something.
- -
+search_index_entry= {'aliases': 'parry thrust hit chop bash pierce stab defend kill fight slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' parry thrust hit chop bash pierce stab defend kill fight slash', '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': 'slash fight chop bash defend pierce thrust parry stab hit kill', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash fight chop bash defend pierce thrust parry stab hit kill', '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 '}¶
- -
+aliases= ['feel around', 'fiddle', 'feel', 'search', 'l']¶aliases= ['feel around', 'search', 'feel', 'l', 'fiddle']¶@@ -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 09d6cf9d47..ff91c17c6a 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 around fiddle feel search l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around fiddle feel search 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 '}¶search_index_entry= {'aliases': 'feel around search feel l fiddle', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' feel around search feel l fiddle', '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/tmpgvm4ge8i/9a6142b2efdc038f1ee14b3bd5c6c6fbbb217adc/evennia'¶directory= '/tmp/tmp5dagsku9/3eacb1a10f30f08766fedd70f24b2de4c529dc93/evennia'¶@@ -269,7 +269,7 @@ git pull - Pull the latest code from your current branch.
- -
+directory= '/tmp/tmpgvm4ge8i/9a6142b2efdc038f1ee14b3bd5c6c6fbbb217adc/evennia/game_template'¶directory= '/tmp/tmp5dagsku9/3eacb1a10f30f08766fedd70f24b2de4c529dc93/evennia/game_template'¶diff --git a/docs/1.0/api/evennia.prototypes.protfuncs.html b/docs/1.0/api/evennia.prototypes.protfuncs.html index 42fb2da3be..9a9e97effd 100644 --- a/docs/1.0/api/evennia.prototypes.protfuncs.html +++ b/docs/1.0/api/evennia.prototypes.protfuncs.html @@ -101,41 +101,42 @@
diff --git a/docs/1.0/api/evennia.utils.eveditor.html b/docs/1.0/api/evennia.utils.eveditor.html index 8780b633b2..cbebdbf722 100644 --- a/docs/1.0/api/evennia.utils.eveditor.html +++ b/docs/1.0/api/evennia.utils.eveditor.html @@ -336,7 +336,7 @@ indentation. evennia.prototypes.protfuncs¶
-Protfuncs are FuncParser-callables that can be embedded in a prototype to -provide custom logic without having access to Python. The protfunc is parsed at -the time of spawning, using the creating object’s session as input. If the -protfunc returns a non-string, this is what will be added to the prototype.
+Protfuncs are FuncParser-callables that can be embedded in a prototype to provide custom logic +without having access to Python. The protfunc is parsed at the time of spawning, using the creating +object’s session as input. If the protfunc returns a non-string, this is what will be added to the +prototype.
In the prototype dict, the protfunc is specified as a string inside the prototype, e.g.:
--+{ …
-“key”: “$funcname(args, kwargs)”
-… }
-+{ ... + +"key": "$funcname(args, kwargs)" + +... } +Available protfuncs are either all callables in one of the modules of settings.PROT_FUNC_MODULES -or all callables added to a dict FUNCPARSER_CALLABLES in such a module.
--+or all callables added to a dict FUNCPARSER_CALLABLES in such a module. By default, base inlinefuncs +for text manipulation and searching are included, as well as the special $protkey function. +See the Prototypes and Spawner documentation for more info. ++def funcname (*args, **kwargs): + return "replacement text" +At spawn-time the spawner passes the following extra kwargs into each callable (in addition to what is added in the call itself):
---
- -
session (Session): The Session of the entity spawning using this prototype.
- -
prototype (dict): The dict this protfunc is a part of.
- +
current_key (str): The active key this value belongs to in the prototype.
+
-- +
session (Session): The Session of the entity spawning using this prototype.
- +
prototype (dict): The dict this protfunc is a part of.
current_key (str): The active key this value belongs to in the prototype.
Any traceback raised by this function will be handled at the time of spawning and abort the spawn before any object is created/updated. It must otherwise return the value to store for the specified prototype key (this value must be possible to serialize in an Attribute).
- -
evennia.prototypes.protfuncs.protfunc_callable_protkey(*args, **kwargs)[source]¶Usage: $protkey(keyname) -Returns the value of another key in this prototoype. Will raise an error if
--+the key is not found in this prototype.
-Usage: $protkey(keyname)
+Returns the value of another key in this prototoype. Will raise an error if +the key is not found in this prototype.
- -
+aliases= [':>', ':q!', ':h', ':j', ':y', ':r', ':u', ':fi', ':UU', ':!', ':I', ':uu', ':q', ':echo', ':x', '::', ':f', ':S', ':w', ':dd', ':', ':s', ':<', ':dw', ':::', ':fd', ':i', ':A', ':DD', ':=', ':wq', ':p']¶aliases= [':A', ':I', ':q', ':f', ':u', ':q!', ':uu', ':s', ':fd', ':j', ':h', ':S', ':fi', ':=', ':p', ':echo', ':!', ':', ':w', ':wq', ':>', ':dw', ':UU', ':i', ':x', '::', ':::', ':r', ':dd', ':DD', ':y', ':<']¶@@ -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 47c6e7f9b1..b1a9d04eb2 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': ':> :q! :h :j :y :r :u :fi :UU :! :I :uu :q :echo :x :: :f :S :w :dd : :s :< :dw ::: :fd :i :A :DD := :wq :p', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :> :q! :h :j :y :r :u :fi :UU :! :I :uu :q :echo :x :: :f :S :w :dd : :s :< :dw ::: :fd :i :A :DD := :wq :p', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry= {'aliases': ':A :I :q :f :u :q! :uu :s :fd :j :h :S :fi := :p :echo :! : :w :wq :> :dw :UU :i :x :: ::: :r :dd :DD :y :<', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :A :I :q :f :u :q! :uu :s :fd :j :h :S :fi := :p :echo :! : :w :wq :> :dw :UU :i :x :: ::: :r :dd :DD :y :<', 'tags': '', 'text': '\n Commands for the editor\n '}¶+
aliases= ['no', '__nomatch_command', 'yes', 'abort', 'n', 'y', 'a']¶@@ -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 825313d5ae..74dfaccdfe 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': 'no __nomatch_command yes abort n y a', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' no __nomatch_command yes abort n y a', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
- -
+aliases= ['e', 'p', 'top', 'end', 'abort', 'previous', 'a', 'next', 'q', 'n', 't', 'quit']¶aliases= ['p', 'end', 'quit', 'q', 'abort', 'next', 'previous', 'n', 't', 'a', 'top', 'e']¶@@ -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 b0b0a6297e2924c50e9ff4e0bcf79b027ed775b1..20319469f3618547956dfb2bfddb5ce228f29c23 100644 GIT binary patch delta 54918 zcmV(
- -
+search_index_entry= {'aliases': 'e p top end abort previous a next q n t quit', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' e p top end abort previous a next q n t quit', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry= {'aliases': 'p end quit q abort next previous n t a top e', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' p end quit q abort next previous n t a top e', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶7?pR~;_S1*6tJCY7^XuvHkOyez zjD`daiN($N>Gj#K7a!gQMZz=m8L7y_pN|JRI rXT+@^e|)Z8g5 zAy}_}2o8L6)q |ZZ zKtOe=6(&3o4vGQ%X3wYl5)YOcaC;R-_+)A#I#J%}o=IS$;`P^qw6Y?+?L9)Zk@9;y zTl5&Che7sN>6CCMANLmS!nv=InTZuatWW)aw~sQm)T%;ZRacm5o0h*uX<^+hFke}R zN2S*WOPqFUU5uSBPS}@=Y
H8x8VIWTBIoVm+X7LGW7)@;qe`pwX% (cH`v(oZh% zF) w?l5~%6VvG2r9z!zjk1@MH!6C zgR?(&ROjOI5YxE8tmEyf*aYY$ wmREPPLngw_jwG~_K4AG!*vAv-$Fc)|j^x CNPYu`A(w>v eRjKt)*4Yxv&+rnOR0 zku*wbZJZ$*S8_08tDH&*RzVd93z9Yq*$x;?@fdQLrR6MS8>fMPNDxH~{U)d*pj5rs z(|pG}d94VrXs^sAq=!eFcDH4>rkgk&6ggnV zPc*0D;M1CvNrlIMil8-2wqjK`T~?;2Xh)@avd%X~;dn!Z&dDj-QUPZtHr5a3$PBYc zLSsaYlm-B|67tNEEoS|pB=$)BHhYE*A8tUL` x|Wt0^=)X6r0d{gH; zxLrWQ=Tj80$zLk&fr>O}Ct8LTHofrjd$>9-6kM{P)mZv}CW^0JHUD9@p&Gr!mFbw; z7@q0+h3w-v6fx KVKft#|3*v=3wV+S&c}!sr}e8W)Y9AX9(l$@l3pE(~ c!~9B~PSaZVg5~bt!<@Vu<17B@ZwdC>eBw=+)&aQY9hP zFUEX)e`cqD(mSvC!ex`!`#xjwx>+^F);eM4zPwLh9|mc@Ob{?yQUM1d_}Y Ngd?5W82Z*z0_3(C-T~qn8c1Liy%GCu{Bjby zTF4>tc@(E60oHeO9zP2MYed&&eV>(gQOT!D%Bsa$;dk#pzCL|_cXM`qadmrRVb)sG zC}yL7q}BkNvXnTNM1(hQf5~{}B10I?ytd5GTQiBa0^tT39&hEsrb?-3Hkz#n*fvlr z2LPY V0=wg&r(q1fQBqI*G4pM ubQ 6^6i0;g)W8GB6-T(*%Z>ez9q=@2b@7~M4PTtB%uCIG-lm@ zcc8W<3g4UJ(BFqbn>%c$fj=Ibt_wQV13dzC4+N5LAuvlme7ggSW0qjBga$Kd8d#h# zn60?zXPv_U$1++a8c`LiFT``uLJPy|l kWM^dHdz5T(C0^gG(6IYSJ3PV(pkQ0x7U!NeF&bNy@Le_hnSw{ z3x}{$!0;sD5W3;kbTXV4cfvP<%Z6~qJ!pl6$+h%wXp G}|9h+*WB zei4{&WKd~vMhTi&tR)ZP0A_eKf*@1ABemTyV9-}n&1Tbgpj=Hy>Sdi_Px@GY*Iy#i zaV+|=cS+F2LHxHJY4)Pk?* kgMHf_|+UIOLrK}I+Zs=!Fxt P&77exyx|kLd{IRC-#qy5ALlWv*Q1BkV=R zP=##buerOp_(wd60}u192?BIQ$1YDqE8_+^LtoSdeZ`gV%&pj<;Di0;IHjxr!}>#g zJj$$_3~rdg8hk5Hj@R)C<;8gi0TLE~pGOx9SZ)o=qQdr$%G5hBUxz~~|H;XLf 2$h zX5gxhz@bMGB7hPb3h68$(g#f?TSRS2xe;g4xXFEG&Y>I=e$D=dQtrCWwQS?2 }Rf165g*iZrly*6nepoRnnad@R71pc(-_8q&mPLc&R`L)_v+C 0D^|kLEbQiNJyTkVZ4^Asb7ABGc7V3y$*w}% zZy`aAi6S =#g-s$oV>)QCM>H&W!+ z+spTEes)NdmmI`uqjWIIb3NGUQtpNNv~FFP8OU`VrGOMtRs?_F({B$It|-Df)P1>Y z?&BB-vYhx9mmy*43Z32jG*vL)a30MT#Q2mhN)-nT*NTToScrr@#JDfV(-onhI4};& zt$3e$!-jAO7g#nt80X@Idi}tzY;V};lzCh9TElxV&q|Bv)k2d9XdpLrUOeo@P+E)w zqbS`Fm% ^_SvZvKBnzmJLxr0!heDrgAayPlO7v4UCXSCsrVx)b{hCCbx5vw zC9hUwOXW`6eYHxjni`j!wQkH5f^}u+lyD~t7JFt49JUI$qPi7+AQnmn-;cCit#@=@ zNSbyBZ@Ttw;q*SB8|63iXF75>hl*&s8c)xMYr~9VGa-Lw`x<}ySc cqhoBB5lw(2k)5uY5L$P_tiz_QuSv Ju#BDB+2Ue33lhYO&ARepf+anCn&=p(@R8hz>%3uF z (=LqrWUBT+jon-3ZFM=$Xbe911X z>VALFPE~Dz^R8WE)vyQBgP(r5xk&hj37a4Cg*H9_x(_W*1w-TifBz37avyCEC<|zh z|5rLd+x+y~-$kUsNaVk`1JVrAg8h*1rCV}p5K3ekJ|)lm9GI-TaZDe~_(JA%rB51+ z`23lB<`YMwi^fEXe1#(x{f)!M(My=QjR=3|!ja!pZ1kSMq>0$Co|Xb5X|c<_3QGs} zybT-gJDPbj`B3;4AH$K~8g)f*y)T8`cVcT*2BA*GnjL>)Yb68V3Jqx;400u@e?0~E zNm@D}CzU;#1_c~2XWWNByMk7_(Z{bCi&EN0DQ)|diBZi8bWpkpRGhD%9p^mFc3pp+ zZg<-)>6}Hyqo@N?QJIIrL4h91r~K&E9Ne&DZ}~(j?SvXXyMvp6%-5sjW> @VJ-84M}v~KW=C7i8j zD{y*nGxi00m+P%&O?s%}FpzjR1K)q_Qte3F!lPY(bhDbRc2SLmUEH+5v$uG%viN)d zy3aUL y>K+q;Q_C%rO!# f?u$|K3H*FD=L+ZvYb#H=JKVj?XeU)r}?cEGybMsr*O2t-gQh> zp4gbyp_Bk(#Q^Kta5q5sCaQn0RWBJjPz4$OBmdz=o|K_xVZj-er4%DJPgN1+x0Qmu zcO4(Sk({GJqT`{`JeXi!+$cJoXS462=;$Pev@vOXO?r&&l-7=P2*0G`Pfm{%8Qe>T z!Con^Ee5FKmLFVhMqhc|(WH*FK87c=HhogNwJ?fFqh)xQYh%p|sds+}lM>jS!!@4( z<3&p?i$Z8z(sCIGZfa^7Y*a)yB@vgdc3Iu>geQf2yMryAw~>59Hg&USWo1hp#%J9O zx&(mq77cGO$R!3rkc0*4wfp$-wXqIUcW#28U6Or`Qy**zw8j;}u{I4t-Qy%mgtEj& zKwE^u2wT3Ege&B@7|nma(z?DEO_+~A2;+vYPvK&_2n4S#LCWz!W9`~UFF6fzbMxz1 zluq00rXx9OfrcVi_I lYyWu9sawnEW0)6!x9mH4rG6n0ph^mkYYO?$De<%9Vfne zmN+y%W*itWQjOZf0G9 NjhA5Ega-L&74V%II#tNJwCK Nx*+CDLOPE)p`}FtA}E}Ylt;xJ!*{P&xA`zMzb09mUdcj5{1Mjf+qS#`S5Y# z48OFj#k)B*(F^6n$5|FDQne(KPDs6He|;o1Z0faLY(h%0kFf36cHRVR=~#ZZO=(pS zhCU)04FETEPO#fTWlFe{Pm7MM9;;%Nm9_`iJW79zhvh74x=^}Kb)yvzl=3|oi*L)Y_2JYIEc=ITY4WJ6i=nYudt3! zAsBzi1=AHd$yyxERNGa`K>RtZ659|iz#WG^AFj?4>F!h}yryazgtz!TSKqW0)k7V@ zHW2I^B=~eO8toQ2h;-9Mqk!G&k)MC6eZ^1>DvBd@OL}?bVG_4AmQd=FN+;{9D1J5U zP>1Ljmd;~k-05BC`v=Q85JyP$X&Dg-4>*5rDAb)lJx4rT>_god6KY5z9*ALD#j_3M zy^-8KJa|$LLh$klKP?zIMc8i3JzO234nEB#sxEa3A4!H(4ko;k-iCAV@OWR{6$8*A zUBUA&sd%zDg2W&U-pLubCEtl>kH7aR&~^=}*7&SaQPb(_eyTDKAXMyz`zKf2KU{yw zHcpk+TX@*i3~z@P1|w#6_@N-1&s~ad7iC?+Afz@u7vSJirOuQOHxn*m#gL%D8T;#k z7CW`D3LKd;23fha3)`UHJmYIsL1P1jRuel@zZ_&V8Ja92ay 46V#Xtv=Fru z>Y5edo%De6*oM`vHJ#%{=3_7Nj?RAueYy5XO1Q>kdBn@kGLZWfKa)%Oc$bZDLY?kK zLh3P|VBOL=e}*?@F(oEsqZ{T@^JR$~mZ5O87G9%D^RTIrqS9FOin}ClxQm1MZ@YrF zjCADPM6^7r(4XKpT*PZ!Ef79RLSoCTCWTL!5O2warwIb)K|P5OxMhF+&=h|!7`(_| zg#b6j8VoZ x#KOh%ND3Eve^kTr%!Hk0EZQIH=pU1?5yP>VsC*X!e`bG8 z(A 6v@vjn6jDxwY=M8o8U^7Ed*h3Vnl(0n)>um%dwFBxj;XVoXQEwu67344U zL4-o*9wy~XFklT3e}JoNCNh6iD$nm$k9DykX}vWc!1rqecA0dH9yZ}l0lF{~SV42x zu@b5 n>!$y?SIATpaw$$>MQfU`dh4oq^{t*IyZdE!2X;H1pT|1Fq%AU!e zA)Ly!A1w_hlt2fTdVlC%&76=DNuEfv@9+#CoME}Ab542LBwkA=+PQ!9#PcxsgwD@} zXMm;;yRuB%-92j+vNmnWHlt$~VtdWTudW~REe(-~5D82hcnIYU8=vB$rDd(f1T}{M z?|1{vzavz@cusBwjVMAHOrY?VkT2`TD -vi)LCk6x;L;54AX2 b=?$Gb7&0namz-=(j`zKT%b{&Mw+J22<3)5Bp-XTHUZke z#GX6_bdVN36nTHRp>_UrY3v-0+#$0v3$1f=@vN-bpx4>6@j$|Y5Bsu%G21-~utR4R zx)%!Mh&YNdAkrkY0~c<}nD# 9h}_u?R(R6OtogFrx_3miko+`dE_Q*K zIiO_2d_6Sc0swEZ(V$SeQB-imY@~!8=>Y8l`@^v^gT8+-fGVc^jQL^;QGX%aoy{Vc zFqtI2U6A@^c5gg13RN(Mt%~QVaO={GjT7zAGN5y4qBtFQ6a|%&ACV86XbxEi!u(8q zVViU6%-g1pO-U5FqW}4@*?Tn7M!|{&ie$5ZK$m%@79DgpX;hba{apFVJr5;{J^ysz zv0|u#yW)SO!Yg8-M4`n|qX}q^6pE;(NaKlVhMMfbds0*c;&~xOEJp}s@cw2QZ0$E> zRc!rZR+Y;n&aali#WL>X)?medhn<_$>4&mWQO^m1ooelz0o=izk`6wsH|U?}XBz5< zuoQyh|0x>pj5$i7D`>-jiv$U{>$-Uq3OhD9&_I6(om&qCsvO#3U%0{(G?LR8Ef8vj z!}~tAv7Vw$`=uyLlBZbU{9C8G9wXr!=8y;n12=mn1dQ$DKEAW|>tT5#z}^%A)BS~U zU1K05H#AZ%;)|hybcirPhnP0iq(Mx}I%W?lVkTN;&R|&2c_Wr3Y&i%4Shiu%rY?;; z-57riZ7Q!w$^v 5h8`W+u7u;ym7@cg^vH#sNJ~Gaib8|j3kuVdA)V<^0XxoQ z%_54?NSlbtJYWquggv5Dj$oTI^(o6~U)g`b?K@|t_Tj`E^rynXiOPC RwRZ3p0?R8e@kkUOS)Wv^e %&F`l}Wfj(XQ)q$6o?8 z!c*=tj%vi)vhF4%pAYa>^-t8qME|kMZwpf94+US6wlxki6mJ-^cAvl}8gYMwt#}78 z))*>~3ITkj&J%T=&?FzN!vlQK9No}1yCWfIuLeq(0N!4lzkie5o?l+QKfOIq{@3|m zZhrCT!FJ2N?frmUN`2%%d^8RD+pcK5H$?_CQtF!j@X>_KLkAqr4a;{>;+uAN?<|ip z6gSr{J{@@c;GqI;S6GKv#6o|GB8Hs l9wX#_VEb4dd^83cU_+ zBZlvv=vR;eK?U7J>@MzgUU%?ZYrXoy4QyIVyB3r;K;VWCx}u{GAKQN-a7lj-+=n)h zju4m `iE4W%5G(-lx*t17QV7+QS)Hd)0?x4i-gK2-@)#uG)~6>l25m9(?29VKq5jV z4B-3F >`37pc~m`C&aUqXo^+C3Y2%qE&y2{?a_5q56hrh|$AHXf`; z_00+dE=AhdrMMW**kgXR?;btFX)UB!>Stx1k0%p>V%gKu5YpRSS2smgQk}E1Uhhaa z`&d?N`?4=I;t5sFw6x$u!YjJ$5)mIgq|XIyLxrQP(P6pb)HsyslwV^K!x;z$7X#5z z2AddHc&7&r-Ozvfai6We%oD94=xM@S65%pQ*<56>Fx%R-bEs>AovSS2V+#;SL>zB} zwQvcPhWtYI&vlc}5{p14IKT+OWKQ4}G#)Gw!KTGkI6h>5n B zPba}Do|ojwdu`4m%a5KXPy8}Fn3|yzMIxZl=0a>ak>Gz=51;tec?O*d=#-grIHa^| zkqBj4GOogy{x*Xb;c2CV9lgUEpg|nn4AO2tdP5C|ZNuoMNsW_S{U%?FPCNiIOMY39 z<#T`FEFKe?mLJkI6*M8R_ryoL6u71H*R&!epCu+CJklr@>{VhQHgbkQ$umhH(4<&G z37|!`Xq0~z671o_bttukI53hSG;lGQh3Q*iS_mP=BFy9{^0C9hG4!zXH?L=pU)$~S zJ!SUVsSb{df(Ux!X9Ay-bUeHh)HOV)6J$NhbJpO?UJY4iP0rp9UG2~YVT6LB_i&({ zCZA8QKU{oxmt3E}JH37bzi!UYK3!kj{v|}y{uqBe_AcgU?))kmVUz>)z3T*}W>9FX zOoSqMFNIdBxT&c@oe>aM3Ti31duOY?YHW$2?V8;R=K0vFKh>-3ephDAghJ-QW9t~w z8~caeJ3wEE-W?` Ws^Lxkg_2Ghu|$Ln4!*u51S(PK7k7IH_R|j zDL#L{os(($8IjJI2fTpBQV`$p&Pj-Nk6BTXd~zKe$e*##@Y*LwVeAn+Vf+Ser>GB~ zOwlU@SC01hGkwCneo)_C35kdP*yNN!xAE0V2{d@GGH_6>sm3y8hI--wl&bPV5npF= zQcY;yPzwGFVJO<{p4BGN?zCVsrLI;JYNme^?TzqEp!Mfzl66U4twL(3Fp|e!MBLQu zLBs<}m=Exr+umcZD>8pt>LN; izqv=Ts>HzG3r2Gz0VNHJ~ zj5k1NO+rQ(@tY SUuCm#ab5CRWGK|2KBAu0D$KkIbfxT+ z;RI!@P|{)x&Scs65q$y_WcSIzNF!|<;wIwih4dZ(7IJY^#l8boIAmfqkiQj)5IU8@ zW1 4Y^lIW0m`Y_vwqG}Q`yzXrVA2zqN;PeKF zBWIRR8EstQS#FG=Z26=0vf%t#IAc-?=doUwS>Zm43<2Z`L%7wNFcC{{ioumbeRzp3 zsGpZaM%hU6;Qm5o4c}J3%(iH2)$>YJAB?5oB^*^?4lYc&U=|22!wdTkeDHtI)|l~f zE1j3(u@E@c5k##S4u(>X=SdpkeLKOXmJLlB6oxtkXF1S0SjXNv?_|YPh~C0)gbMw9 z5u(M6piNfB2&POup$svzYViuPoe8`IomHtkCv>o`Hr&}tqHGc9K=}ZLhcMz;F#ir# z2TV^_N>QGw&j{y=J78tFbZdX47}}t-ToSB 1`+z6C%WZ!B7R~3v!o5(|FF2ups=sbKZZ9F*h4rY?k!| zQQ0NA#EQkHk4zZbK+qdIF#Za6{d~i}KAe86Q1Ni0t4n8_0jVQq16m`*6jfsKa;QU0 zhVH(C%{n@wINRi{Cxz9ZERo-nb++0k%-Md+cOV)Yy%F#97~%ufs5GkEhTe2GDPhJ5 zOcJngo$}YlJdJ@KlqG-sHASTZybpNMN_hELl>J|6{QxX)`yy{pz=Fd!f2I8dbPZDL ziOvo20&L)MWus1GkW=9#k1vO41J*X{D)X=Cn6yxY`=3Fq%$n5$4G&j>A??z(+tcVY zyK+({`4G8Lu(!;gl_vC0&_6_JQf3WY(a!fxQIU*}u4yw)r&50f#C(FvZoG5mo8 !Rv!OTQ)Ws6TcMP91l81SBlV+mx^fQX6dXmfYw8-VRz#C+ z(k7zG9&?xM(bITVF3A3bFk!z9+Xwl ?lSr<56IazBULFKp}2y8>-eXDAPkE8 #>21ynGm?K%qd0SU{ilWD!Si@kOCjkPHP+y4Yb0x zWk17a>KflbG9m#(%9cjuEL7K5H@)t*ycU7@=({cnw~m$E;~8Rx0C!;cWY5kMnMWFP z)W(U8(EDQQfHHsODGn-8nN{l@O=oO6pC5}BOflE@54(27$b$-su0bf~dmauOY9208 z!dVx5)Chkxecs|?5eLU>Q1W_igz_PH2bU+6glqy9tn4~+aaASe ps+}FBjJJX?G8zfYz4P4Ro+u?F)rGQ+BUr|bI z)mZi8CVtwD#p)3Kg79ZgS}YoYhC7_<>p)o6?ACufu1TK0-gTYl3UeQfcLpR+xES$6 zGxJq>dXHbBanvbI0P$Lc8fP4m2ia!4!4YF#dunVSjHM;}ep8#q_)6Hg9&|tw)rab& ztsbjzN<}a{iXlzvkjUMr-jwxodJZ@JoS7m*@jRiQ34A*6Vsk`eh|3U_GGuFJz~we9 zt)YLn@Igds1vB(wj+DF2O0+`zVY_nXg%XbM22lr^Hcuq^aCK&{>Z)8^-V7OI<^==R zPUxCe+f`swH=;L#geF6i6`n_ c(DhjuM(6=L z7vAimhTN*~=lwd{dD~-E5f=U({O^K|shbLVOtq9;bV9W9-&a# e0;Av z92|q6!2d2#8nv!ivHXhw*Tin{Bf$?BS1bt&e;WjgSFzeya4v=JcuTAG5^WnWx6pqT z@nni5`d!IyFKIMa8&Ks~Kvt2}<}sSf0KxkPYz5S&)uj(Vm>e5lO^lynw#J>1^oEq; zSfjn$lHnA)#q2#-bcJT2qk)_h(ta_XnUR7i2zukED`3Zo&}`RK_gUAKZZl4OFmXbr zsS gY3fORLd6=#Up!Hrl2Y%sxz@fnY&R-|>$qWWMgu~jk4 zqPrp@55E*`NHPz|2C`@Bmyb4VQaU8`zD=r=;2I4yeQdWPZ2xb_X#u&=oRi$PK{(JT zyiAYu2rtq)XUKBakj%Mpr^A0g%dfC4rXkf>KA;T$*I)koT~oLlA|8g-3;MC9A66u0 zYNu;g!LXku0Hf#7KZU&+sJ% GNNIx%A|7Si>`*^c*};;Ki+zkczI6=z`+H%FbNt$As+!F4tuh zjR9V%5x0hL`<70TyE ~h5qfNg A5ON8lmwdaDU2i8Tj`Lz_cPNz z_wTD34qV4@_EK;N_P_C`lV`V0@nlR6`%Tet+---#pSCF;qIn~oob<3}DEGba)lM-t z3Dm$0@R_-?m2!W4`_ngr`MUpmEVU2`nIQ47v3={Sggf}aaZw7gg8mNJ{~yL 4E)=Vx3F1Avfh9z#i&vF)cfTn*Zb4$AE=GTh8|fIK>c{rA3>zyP^|M zNlw?xgZ7zvC-7 _@fNv=(j=id$E)7YZ2=)-QJ4P@X4_8h9@ye)w3P z+qSD4?+k0i)64ZgJzV!$<2}GJ xj~BlscWhCsjb)KXnA=2!@iKO+M>;}Tk+!X) zW2VXKpFV%yI^Tn3v49cbh*lHTzI>#+hlf})6v6+!;LM269otfkBjIL&P*el*kjm#_ z?$8iTYz|8CREUoNeF~Iy_ZVHrrIh&LW2wu!x!YvTm)$lp15q>;q8gBwbhD*X9q;by zm{H30KfPRGz50-eO9eK_bfjFuFgBV-h{<0*q9%WPh;R9&l=$Ie!5yVLFkb|A10%`U z9c(E)0P|4i#VV2yCEz~~G69QkccnBZ6HI`D%(6 ?V?WJp1 z*_OaiJeIB(RDS#D_-p2O69~ma=!{YY@{m4g&zlDm_G0pvk7!qx(?$y*DMt$`jE50w z$25ONv^gduRTv***z?&VIw`icKA$}xD!RMimzPI$gSVCkU_R>cL%`w8x~%@` |lP4qhTT!@V^%v%jzcE-sQ@xsS!-visv>J z@?*#_9k%@|j {3^^ZfvgVY;RQnzcYy{g zhP(qK6*`oMcdJ+y2qqLl{I7?CUBtX&dqq>@$gg}d5GAq}aGy$aNORxctqj*f-gJLV zdI%raHgY}y0`#93HsoB<7@JFpA0C#_D~3ZJRZjl&ah3J+oqvIQMAhGm6968fj$P`y ztN3lVU@9&MSHBVk#7BoV?!}BabOm(4Y{r0%ptFA7eP&&o)$|FtFEHX~GL~xsLwrJq zx&57i2ogg0Y5hb2@zLq0^uyVDx&D8rmx~<>z6&`2J?7JneCtqwyzMl~*72f;PP7{w zXAY)P1(n}Ex~_ bv!S>a#?MXvwp;R@Pf91;m3{#Q`! Q!q)Lr-mUgOPW&+zEpaV?cH=bW=AZeJFovlM7oi z_>Kpjel#Y-fY2p=nt)d#yx5B%=w;DlTR8T&N5nGp>D7gPenW>v#=q^Xmn(+AYWUav zZwt6w{D!e9SUJOU)b%Qm%Pua>>Z@K!Zp}vtRafPn+aoU!YuBITj?&2mB(;M;-12{c z>h*y U2XCs$#Sbb-XXpW{44)q#*`<0gFySx@(8d6wu(-WfyhPWPmqF6M2gjYZ5fV^ z7%+H>;V Tja#HCOm(H5@B!HUkhNpYgTmVRKP`E`C@PoyixK7T@!HaUm!M9ckE@U z5H23{7XO&hc1_tf ^cfmnGpIIO_BIpCLvtT@srYC>C5|JP2 zyveSLe6_L<`;L8#CtPe-?I{>k3HlCyn;{_p8*l{<%taSy76T48LVIH!c?()O)U!V6 zHz3pneq}C lIF>~_F7w&BG4e1tzDGv8IC*4lfS+fyyMn`nD_DP&*ud2>*1X^%MV3Ehv=4z7 zeCqL8tPy)8*c%=^f#3-Xo_q(*7A}K`@Cgt9{ZRLHS>Mw!BN%ci30Pq?+y5G=X_tG4 zK8f^6gwK!~r>is@ABweyObvON;Uk{#dkEN)tXVw<=kqA|4LaEKxqYNV_SLTQ0?TkW z;@1#Leae5{4W@>?RbI9q0K%eXF}|iag6qS562BzWMU`F^IDTtQO^f2K+hCy?vgIBo zENpT*-k4eR8)B;hr}C!_T^fWST`0aLA`C~|kj}>uiEn7@M!2-)s>@O=;$*9F*X&?1 z3ZM1PxYom*Z5k-gqHopg_tTpsBMJq+{3zQy+9iLQ&TCl7ZPIVyxk%v-%PQ>ITbmL^ zMJoZF%l=)YAs+vDsK=)*teQ9>E)-98 ^tV4gOeHl$gzA!~HGHi}*{$Dndv(b37e zX3s@@-In!ma%g2X2!5bLnRU$`n_y1=W~0TGRgr07gqjHKW{M9NNB3N_by87ww*^@R z7kGac0%!oQRN}&_s0GYVQHa*deAid;Q4`zy>us#+V}#>(El7G_SN8Y};8ls&^5-9| z1goq{3p!tIJ9wSGtvBTPk=RSfkj*B3mQ~3`0`Bn0y>z$h(KkGU^bAnKC>xc`7E5Y& z%3k2D_+^h9EY??D`UUC}9roeJGnf*fO
9jzWb4goegAufM15!9Gy{lavYqqzptMlMEZme{&=g z>Pzc;vEofXC|{)6hR*7EmsqDI9n)3e2@!#L!6J!)c^~ud361eZl5G+m8X|+CebIl| z>;+%j?H(Sm6&=# -F z0sV{31+GJICQlrSc9Ncon79ZTz(;=@XNV6D!D2c9gXCxYpGFv;`DV@juk~|Rw?Dil zbktHQ&tH#SjCV07h_lXC_)8OhQ#4`68^rhv?xE_bGgZ4G=&2me!RK^MAL!`jkquc# zo45z)I)FV*(1DG9sly+qE4 8dP7#-9&RR)IWCE {a*NrV_!2VKE|D`w&8Wi7R;k#i#wCTL)2UR1}p2> zR@;@m%9`$#0iKz`PtVka1Ye64h{czDnVo%hEiaJ|_8tu0KNi4m0GiiAW{HH2X~DSR zdM~$Hps_9yJv-SM_W|1jS}cEOiR44E-r@0gFc 2U9tMYUK>56r8D4hBgklcUN#U=g~Z`9HglOpclD(d+@DKnCLVvB^tMPDsl@Xs zY~S@9+~$v(;ZXVlv0^MTLd;V6Tyg1}Ryu3H|Lf=q!F=&CF!il>m3%~}+2RE|!x^?O z@ODnoEmru(M6m0eC0D)6oRPAeotQN~<1-iVF aA4)eyOdmMk?qnSA(oMMRv8!nvS`|yy(?EP;nCV0p&Crd=jNBN%lvr>oU4@+f& zXC3niqu)1w&8l^s{%uE^f*jV7>QG{-nV&0VhbY-DJ`30%N#zoUD$mv___ xCQ>Low&UEN~o`@^xr~U6a6z_irHcKe3qW9ybSrmVmsarOw z-DAHMzvfVR-PF4+Td<-n4*{DM@~-uYG#wmgv%PdOOS~c#c*lcdODKc0Yu`M$`e4co zDO3{LF2e#?2d5&QNkg9N@*!OyDa=gCd(!>uAOCC<>XU#^B7Oe#kN =8n&rFe7v12W_#F!K`W5vdls|B%s})f?#!%EimMj!F%#!z z-WT^x*6icXw#0(6eq2)254cz(&Ow$e^n7t(U6p*Fsea&xgvHtsCp<9IoRJOUKdt0@ zQ8Y i{NIz(4w#M>~CzL2WotnGg>a@WUw)S}J~x)p7D@D{r}(kc%- zNmtNGL-)t{*t}y#Hs)z`hG65y2A0H=ivEV6$(y1%Tx0t!oq6={!Nrds=22QLxwut8 z( &mr8JR`|02^ZH HQ$A!emBc$u-KRn4~D4`=Nioy zZ}E)xeBGrzx+X61Zn)w$U*upy&Rz?jXW`WzwK3DVa7iXF$J(RSH5rtayjV0!D$6;1 zL7B{pIitc4b7eS>U BC+Fy=WMwjU z-_r79wERL8yq--fS%0Qtv6y>_Z}^#BepY}EYN1y52RY_TgJbloHcLOVMPj$j`B|*8 zRL{f|aDl(9>+NDu^D}?qArcxwJ&J!*fF%G35uXgKu}e?Wo1$Y6zkcj%>eMNu4U}IX z7Uv%`FrQd7cw2ClRY_aWdRfgE2lY f_!b-c;<@LUm-=S;H{QxWfAg6$BR zis`|pEZq_HaUV5@#eMImj0UBx{;U2xE^Q2PP=h)wnING$h|B0aT=MD{Y5IQ(8fF|= zLBM5G=qGtco|!mh&B##`$fCk9eSVVZ1IZ&>yt$KSuH_708qBn$;fl U2{-k@Wcytt|7G)0d2Epb8X(B)c|&lN|U;dRHe9EWuz2 z4>o)1$jKYF#WellO3=c|VdQ`0Gbd=q&ak~>?(;^Nr((*@4lUc$jmU0zR>RsbjbAlk z6ZsNslv2Q1Y#a>1*bs|`ZdF@$MYY{^hij@`h7}EXSI>5r)EF5Lqr4|8;@W{Ny~*=C zN0j*!VN!)utnu;t>kG!+N6izVW3QFTWJq|h G_u?#rD_pz#)z=VGFT|i4G*}?95tQk07*c$ zzl?pbcVFg?(OlDiZ-i!=|2v~2PV_#KvaDw@ZQzNPiBKFH{uSKV(WaSyqxq1E*Jl=u zTu&o^%^i`VVoy54D}F6>WG%r_{=yNn(!OOr3G;!r1$^k=xg%aTn{44Wgmav*zu$d7 za}?N1b@JULG<(6`YTVFZC0V#|`spu32=>A&T90MVMe-1HCkT8qYssJ%H>zy64?KH{ z`1z0CV-_Ym&$CCIlkmTPGe?21_kqoMW?6OJWZTDLwQ%{i)AEHz@L^V6|MidmEj<7A zkAKb`eR$>}2dt&L~{)jCUctbtK z7Y}$fop#ONoeuKk2wE=U&l)Wpe=}!)Pz5X{3Fn#PD^{L(f|I6yshfrCv6)gVcJZub zuCqtBZJANHH9ow`a$hm;M0%rncloN;yy*ZVI9x}DR+Os2$99Xx-@ Zxa79o%>|0`5$wS;t0^lx&x-OGOtB z*uc_Mx_T_iydl+*qCDmm(S{>ExPm5p=8k$l! AJ4-G`k0j_s7XQ7c(sO zqb-@XPQW`sZ;_D`j& s!H0CkC%30INh54^6_Q_vXh@lL1#R<5wt8ek zw*&La7^5Iwxgg1NPJ~Gy3>!brlL+`=q5FN@nWAlG!dH9S;rqI?M2&OZ@6)U-vcnJP zo1-;m;jaaM-|rLdGJABy{nn);BzgKM$-A|4M=HN>$iu=BVjO*B@O$ovd?EXVqX7(k zB 6-5G^;T=;_#Y4DY~MGA @!uNLl8-)tD* zg5l9@1IGvtEj9*)d+2xk$DI16G;a@{!@0EP1VZ-&Kj(-+U9AXST7&1j^SUB%y8kiD zQ&QD`yY=G&QSvc 2W3-J9M(Z-kAh3gzggG@0skStSeb`>tU zmSuXBcsc1l2~Rv`DqrsmIQjIG#ZFXuRc2Ksj@E}XVqPR}V6aLgbcS{7Kn2+q2`~WC zc1`S9IZWvx{;BpkhyLaEF@x0yl107d6so>|27d})$u;|$LHT>qN$@Rcwxrw9VBk7` zOjNFPK=vB`KS~P+c?XI@2G#JSM{JrR*zSIWQ%w5_Dz`c v&e^;Q2TdF#CJOkMQ8hQx$*9wHO(Vd>JxiG;OBMtFQ2YepB zx6BWv?JfIy*xdAx`wlWAAV=*jBQg%#TSg;`yS~2ecYQ$&&OqE`Wu@?|x|F|vC*!iY zth`uZW!YJ=o_5&c8FbU$)hDrkvtckkSRFTQx-W1u@oy*ALUUvXQ~7uGL%OYTD1~?b zHlIW)uSR%FYjJ6G$K!V^k-WJ?oCI-T%=4!Y7i}VN5`ptFdCS|W_3smolx%Ap8A2qu zN2P_r3rH{5&W2UH@xExT+^6?{c-F}5f_}%LzHQTOvD@+ZR~_6SU%(YfD%*IzJjvv9 zhai&Gt40 Bf9m-ra7oIg{tFV7sWyJEZLGz)Qm))_RFk#dfw zaq_MhPiK1S=M7>oyGdk)KAf@$gS#LhqMRoJ00h`5`7GgvYv7Iz|4Ni>&twA>_HN3f zwABHiO)5WA4cni}yn%l36W;1t!j}ma@|MMc_vIx7kHs;+Ey|*M`W)Hv8N9&kgIn+h zJEG!%5i?<@KMj@F@Zw{CEbS!HP6Bqs;$~?lnc6u^E-N?DLp%VdyTh=t;h4OX{~y-K z@n&Y8cEthbl5!Mfu=J{|AH <(kS&Qog}(t6ML8-@kf^YuQvm<# zpZ}Erwz!gvW3QiUYmL==L%q(xy~mrV^DLs=i8;_B+@WnfY&vRrT?}6X^>v4h{m`xA zT`XuqLsMB)Cw0qz#B->Ss%^=(;tP)}P!><|`66=`%CGBTca;R~TPXmVpfYv|pw}p> zz8ZZ6&_sfYh6*mYY1zv&WERvAc-u2xnuZsq)w^Aa7fbT~9o{&9+^1rs66+N_UGpg9 zVe9MJGiN!)*P>637ggi+Z#b~cLE!K~1(JOH@IxX%u%^R*<3W!?o`ak#_+qmbtT;LH z@>Uj~u+wl7*HX(JY`gNr!nO@A2z3Y{8CbEcOsXWHk_;+xznxS$R~TWa4o{uj@;6Zo z`ZCU_K0HB*_&a uMdifchu7SP@mxT54_>_aP|ya zpYiJ&cNMCecd#lHn2<*TGx?&e)v@|;+%$rMk^)TxsJzJc@a1{(3WiLeDUaNtKX=GG zs7;DW`?RJh%2pT^sO`7;lPKLxOqPh9c`eJ^^EX=Qw1Y@vp27GJz+%v$2P$CUl^NOy zX#&812?FDXj0208lD!nuL}DkRL|#4L&^P&IJ#(x_rf{}O{#e^5ZN3G+J8+ cQi&!X|ABQ=fUS1o}|JOhNuT=ThKmQwQ0R8|K`OlZ 0fZ(L*unYS@TN2EMRs} zj&> T&_ptrP=j`=V~b4?Fp)?T z37R-dralyMakpII!Ek7~`wZD(vkZZRG%Vp_r8&&>K-%gND0X7pPrgNX>W7>d$;G69 z34Zq4PrwxkZ`lR~c5?U@b~dn%XWQ9l$=2oib_dr7^yA2Qs)?M@$#FjC_X)ry2q*GG zz$L{_jxNKd4GFh?# t0;&N|{)^maPL>J(1i@JzKHnGlskUMx*!KTK-*RmroNBzyV;Hs=qv9fGCywiYp zx~orVzS&^A|2{8IpCMb;p~>?D&s_i@$QcQwIx9RYWK#xfZUo|D0F+3e1c6r1hy!n* zi+Ljb@;u%EhmqFdIEnOle>`)nLzukhjsKZ!B4o7#E|M=k+<#cV4;Ow6OH4d}`ZIGV zhvbAiakfRxKEFQG3TL L6u=3zAO&6iS8rdQDLiU!UHd#9YdAjig!HspMqH=IO_X9$*?p0# zGoe{t$-(#AQ(3Z(e+X{tyxD$#rd5+?_Ce;4S}CA?_`ymtvjR7GDJwV(!>y>ZvB8R% zbC_5;SN`_vlCbCvLj_`)C;NQsTHP#$b*rK&hOfXdP@&|`6{TTlu7R`5p(L?tS2u7w z6x?HuvmJ5+1U$Gq9eBq86%Kj(8Rqxb<0&IOj2a>mlxl^97qa6NjN0;l!5<)!P>@LL z=fx^JSG yBjL8B_+vrq$PO51mF>E+`I1Y)_jFV_O^x+2uuf?ntak zRSYkSHBqvdD6p6MFyzp^g=LQNL~Mx$O?*UqdDdJxvMMie{WGt&w`|99yxX0ZZyZg9 z8LITRQ^8x*4Qr42LnQ`(@_AK#Y>M{mi`UoXI?9(G4cZg}?Pc;o!6gXyGWjduB@*vt zas|^3yhkPg&yzL%kgOP2=^DnwvB3C27E5ZiVOTihjy>`?6fjE<-+SJRZ{XHcIJb)< zfHhXJ0|c(EOMM#!mr#?8=U)N$KkOW4em{;a2AROTI8zzStL4Uj!x$CVPX_zY%#rqA zCf_|Jl0YH}yi6_ygMN1jm(eJkr??a{o?X7%rFR8u;9#Gp@f;hMx#!hSS?2134h&7J zjTFfW4zGEG<~FVYOnIw~eU4&rekU;d3z_*~Ch5(LCJtZ1(2KOwU$BIBv|%t=f8)h> zy`2Q?te?m5nrN+mc75os$#)%h_96W|0}Me_euei->j&sVgdog=_dq-bHZo{fa>jH& zRd5po95;8ziYBdcu{0W2%lA)@cTa7x;b{5s$hh|T*Ke&(7lV&QdYl6Y2rXDtO{!ch z-^Nw^{Zj>)41h~A=vUmv_qtBsrYN<}R>~==*hz^`;q82X%e~zf)tbC j^4WJ@7_2>G=k<4L>`HZZ#P5||>w5xNPh#`!%w^SRvF}1)?J6F=Jcp~iwS#sK zbywVr)fhW}Y~jdz6F!IYeh#Wth0z$q@QhOwgS{kY2+;U7J9j81)&jpW-xy3@jQ7G& zK8J3Y{v?4X-ff}odhtNQ2M<@@;W8*3BUYC&&;w4OZME_WSLlh=TQGJkpD%UlHs5^0 zUH)NxUWz9p= 2OF3(+Fal3wrqG_EYpXQ;=Pwg~$k#k|BX4}smzqUhSxIt kz z!j9qKH~pqczx!~>09?+7D_`N7!L_r`VBq`yQ6e8L^+LO83hwAVZMsv#R(8Z} =Asl&YLw~)3B}+bNtmmG2w@KQ-}v0 o*3%GANtk4(X_BVaXgk!LvdOml#1&N`W5^h z#y=L(Hm-VJk-HIp_29?#^8Msv`t%;EFy&TsVohn_N_a2d88*zw6`fdd3J(@Bhh0JZ zQSlEPdA>ie>a-?#6Z~848E><^=g$_ofY&B}RdCn&=B}>siU;ftb~Wz>t?7*05Z=@D z6Hm?ft00oa0^zRaov%e6N}F=yANFypu!U@1-)tt7Ln1+RoGb5wHIhF#HaKnXuJ4oC zjPy$;j$6~qeQO_h^^S+k;-N4w+m|=>soJjYp52o0@KUDp&Z$gKMEW8p8{WOG4`~N~ zQzWZa&ST(@_$v{=77=cFEvgDZd&gL}Ch0l&rFbG{@8HQY^6&_*yzg*rHf~l(*RHAU zMlMAPF63fz=V)?RT5EStDr8WO;Tr5c3%pR!>yy>S)sxB{Oh{Bhghw@RuvgoK<6;s- zT_!D73#+H`q{Ih4l^ZTKq6^}yQ=Nl !>{oOKsGhE{g)&2OjTcwq7@+}JGWQA8&E2&c?odrv)IKunxT zy2Y{Ah8^nrr7fW`*(vrj{u{@0pNR(xnNLRgm`W1|@ignY;xjfGQ0%pT6zPk9T|HIZ zO P zE_QdT6g&3VH90i=x5e58Zw&ngekJnPLejhe0>k{xQ|Re_1lAMmA9xFO__>hxovhi1 zJYJW(0e|(6$svC{M=ix+RUOrTTUg4pzL%5Pa31O^eab0mlZE&AP#upN+kqT;vd%dA zg#6-R^by4sN6{xdR~$qiF}}~sV#}L -IJo*%xka=^cSN^ij(0|1T*h0kz;p}ne;*!=r0EmYEPn?>6m~+z?jeG$D zU&av=gKCvw?=)=7To~J)xXZ-4KK-mMevXZ|#2AkkC}2DW(Z4^+g^O1sEHAk_O$qoa zu7qmDc$bD(^J|Pej_B#I7sKDnsP<#eIscZz5ewaoSVMjju_)K?!rYuX$)PtljCjLk z>~L7ajM5^P)rgQf3S99H60Lu@8SQ8h`|m9R-M+3?g07| zdr02EUyDeJP1>>`c2CE3-&+Iv&*I=par6j2TEt(r)3B7S*|i+GVK*XMhFFvrb~tsX z?wC01ScYj$S0>P~&>Bxf7QYwKKH;ou-gQlJd+Nk-d2rC>iu7%NCVs&g-B ^w&0fVNK#_lnm;c#DZs%7=jAgA z16w2b58~OtKW4t5r+>&liOZnjD3$b3Z%-v#kG~Q9JwAkgLnPssc(}xadh_rQeyUOdENq#iEvpvg;EoW(Yu)?}`szQ-R4{#d}YJ|629HtXkdki4lM)?;i$ z|5-dt#KQz1F7N zD&rpYqxgY;)!+(DVMJLhyIY^HhOJn`c(qv9w*q%@JK6R=ue#+E9tQpseC30 4whPMf*@7%g2-Hg9_Q$Vk`+V$v %P;-h4>JUop4(^qlaq@ z`%hdEkdXuaBXYYMuGL*_-|d9w4E=k2uw=9Ch<$Ss=PTeCCDb|V(x1bB6i>wN8hEnM zfpxxrZ4=syzi%Uo>wFs~6c>LVMij+s{It%Xz=Y`pTckdb1_S ErC)@N@u<;@Lwjt>rh zPQETaozh=g^T}IgL6PU`ELa%OgtP?H+$KcNsTofBx7~{9FgypifXjYf4-fnt*x^)) zm2B$d+^!bKE<^Wf$5<)OU(UImPp76n1d|N2kb;RfN~I5NS10e_FlOl1ea}^rcW^nx zD-8GZk3YXBII5+fp;K!+6vyd}878)W2;e0ryZpf0q IcDjsfRSX%bF&%DAHZg;1yTwn95l@xdq|? hAdOdpH_>*KNeuNf=`rxB>b?7Zno{@+RI7D4g6wc@@G0uTE`OAH+E)xN{z2B0`e3 zPgR#chWp}&yck5puKYnH5h8x(TV8vV^$}LP^YEyfaze?PQC{~?A(~ hNC>$AhD zy(3nOQ%)9`*gB$OkK#QJXQHWp{>1;pmz-dcHzDAv2p&*a#fm4e;r9t|cL*loM*E9M zhJ5- O0GL(Lm-#m2rvfy~APID|-le;mhjX{Jt* zmSmqe^8#hm?U? ^~*~ECL~%y2;YAF z9u^&S7BAO0EMV*a?Ux3Bib5?<_5GeFEoW_C+_QwXKsEEe(%1J;h{MR*{&1@Jn=aq{ z1$+fqIzodDO@G-Rp8o}&Ch} T-}G4GNRl9PDVHw zk;YZ~@9`m4;GrCcx^uYdY9UV} rxJ$yu7da$Y~DPF??di6Vv@+60)JJoc|QO? zMfv=QN&F{;=>@SnD*cre`#aOoTNX*VgQU1u+w0oo0TVnHaOpnR>i5t-42Gw%ahW!P z#L+2>L(!#0#dD&6s~fyBO6aDWylD!{ c-$OI8HqP(h- z{%N9~`YHA9HFew8_m-F5MQ4tnBGW(d)8JomtT5!GG=G499ghlHj<|#}BZ2aU0n|cc zA=NTSgpi*<9*V)5w%{L+C3$PZ!IL%m=brq1ebP=ccfE5;P^~hQJwrT4t%JD0J*!Y5 z?~1Bu@7&f#U0pn;4Iso-tz29{5CSqHML=AEc3)6r$>7DdkQX4rz;_qS+6yR4oqAK0 z0FZtK0wm6VqTPF2%AH59Mzx2m1*vZ|tCVSr*-r16pW5NLQ_%^6wOs9%@diUMM=M+^ z@IF9#(x0x1{VGg 2xaM}*L_FZ8)O~J$|1oKtjG=$qK zgecA^OHtt#h&p}f0p*@KRe1V%1aS9ay&6b=$-Q{06e^K0u5Fit(smuTb2I~AB}8G| zU(O*;T$c(sgNt^tgwZL};FcEamUTEzb~ LS5csgVi->0+35VK$ z$*?K05%1Qu&UPXp>UOovQ!Ix-k$?U3zgi0_u0K#KL_4W!cYI>ZpsJRe_B od@|XtdED2YUR`w9)SZVpNPmA-Zzhi+-R!_ zsa1M-c8U-pS|6<&F@}LcMuV6Q=2HmNTR7muQSxXcMli6;bSs0=29QyQWz{?H={F=+ z7Q8p|u&sKBM-EIjxe<64gklv%*ay5`!Gq!Aye#Dt{w3QrxqEjk$pJU)&mvWSvQ5UR z0pwRH96E@h7+gVD6HbYQq2t4C-ldneI>RQaKGwW9im8c6mDRP+kR0cQ2hO1dr}Y_v zq%a*wAdnC@C-Mr`*$pPKnL|lheZq8X$i;7Rvxj`S!^xR(#utOgrxaSX{CGj_BmI_d z1zh;aj$KT45 f`rpb7!m<&7z`S z)Rrjk3s@3&;7L9!leN^Sm>!h*xzi2;7My5WyAz(b0pe{0o00nW_#=UT)Rtmf&Vzxn zn84fQ6>Rjg97OD9;sBG=X_((Q4ak!cOd_%rC-=cU5qR29Y_M!dY9g(Iizo2lAa4k- z8n`BxR(Mf%R(d-`z;M8AY<_Fnq(;FbyJ-sh$G}Cx03v5Iz$5X5L`HiP&>4~K=u8YP z7u?dg^;ZhuStW?>I56CQL(~q|-%5Z7pdiulVc|}ayyeLnbx38&)Nx@<*oa~3L3|^V zu`4c 5AjY}dD?~+PhIn>PSoEsgRjNZDZ~-hrl;@oqpSWfh>Lmz z&W7OMY G6Bn}RlVd(6lL <~)g=q{Nzk#xow; aXO_ z1b_Oi!-ai+q5~xOLlXxNO)J_I_y_ax0!BsbJ!@bAM%VhXrx)zACpoA`Ze%q>2q3 z1ABxYys|p^qcFB>2fC>HuYgKOAi>YAKMVy%VZ`%P96At6&W`k6ouk6~s3n- Jk)(*@y6=f)5^^q4jSlV(6H2{l 64sKey_C^0E)h_QZbZPGh1i3mL zZf)m(xcHga@h(K-5H-j$nMh)*_Q2EnDQ1Q<47G3G+Bq>X*_ZV#xx-{8GKKg7e}~b4 zHSNn-Oc36|&oB=CR_GyHBX}54)b8n_ypZ@D |)+ z 70Ud7uV?TV&1TmWqAe3+v{$}Vf02x0t5V;} zx2WJd(0+y1slFYsPkKosS~s8idr{PI(K51b#9u|SST(IiqQc(Zv4yU&o@p4wRN{>J ziHCDm!~Vw~wP|)+J7Fd*S_=K%HEr9ZoJ9F?I>~N_g5e>!p;gYy)5dHql*~xq!G*7X z%1_&Hu9=yF5+Tmv1i2j6b070taY}j=%Nc4qg;i`tE^>+IAdw6bME*FTD{f5WC8Tbw z=dO4;8 vr zj?2%Pc@u=3T82l@6Y-2jrJwohPDjVtt3Emgm{-H};UzrgjdkrzRtKw+XBo^4@|Hxk ztsmf3=K0Jk-TkTX%`2MddGKC;sr2Mmk)Fu(1k?S5Hzms}m>iPxMBx#fBV51}m{n3w z{4|tTdGnZV*^%-0quLZKoQ)Oet&9toPV@vaH*CXbZ(IZ`9pY{ONWF(aOlTh+Cldvs zF|mGGrc5TYiqO8nhCZGctWG=& 8(L>yt}U%6r; zM!*cGj&l@wTWrKB)_4~~zwXHrHJi?O6Q`Kq05Ng+H;9>+Hd*l?j$M~;hJgSq8~Dhx zTZ2NC0RBozh|VgMzke5hBJ-Ub1aF1|?eM~N`?1eN2aI^bfp|ak4})29JQ&o<+okjd zpbPOU!Czs72>TOgghoJ?EeRw-xGV{m`msaad|DQ!Iod`4D3OoC_^AcJyg30gq*%Pg z z*=AD`R|aid3EYPT z9xe>G6ZefsMA}2JAvHAAcVd{X{)D$E^_zI$hM`3z+ll)lTz&knfBs)c|JOhN8)nBJ z`kh@U66AxnH~}KHt$9P|wA-a=|7e9ThRw*-gti_6a%Nj6D3_$-69Tyx^Zfu5%WFXm z1<1AG^ 6Zt!g7Ay>5-LZaP z%^HQ!hzILS{#`wdDqP)M2rqLPw+Ul8d%?-=MmQNk+!Odvd@2kL)v hCK4_) zd0@9~(OF=J+b`i4oW_MKSEP Fk@Dcl={$%r$?2Cp5ESmwP!}q}9Kl6w_wyx7yRbNVq8U zV=~xOIu^%&00MJeZ9oTGSNxgXxVmrrQ0zsoiyn7_s=BLucx1P%-i@d{H!7>|uPx`* zd1Wd8VY$iJBsMw2uT!Vy|2nVvW~z9YoOn^4Tf(h&=jyNITmJK8Gq}xuf0i4R&s|f) zO(
@x7e6uCCS)jo{9=meVqC;ypUt;438Yn}beIMqJIwZHMVIc~K;n^VnQ0=m{ z{EIbz)gRbf)yc)H4;Mea;zdLLp&E#>{>yvG5A~KgT8wt5#`^MB^Y{2Gz`V1$>NSqq z()6^U>M;ye`vS{CU7G$I{0Oz3raaHt=F_n*s%{|>9ZBbur2KVPDH)w1Ru<8eP+R IF`9> zqnO+F1mMT3_wRTkME;~OD5@=cjE%Ua{1*Ns#~T$R!!3-WGX6;pw$_VS_|j`g8jjW@ z34Y=Ax$`Q`kH=-KB!g{P0`IQ~1ztw(FY~yEaY3>LR4FW%h;dyd@ zEbx@TnAfsb{UHCK*u(qLU!?VI2PbvFvF#oE#Kdlgmhq~!gI4n)-PiTLWD%?a4Zv!k zuEw)kthZ|t9QMJY zYu{x0Se|Ukb~PRev(v8HbUD#~b(X%b1CR#Of0tK$0YHC_4F_?4d~ {)3NK^j_Msi2Xo!yovt2UkEB`yjkoXKKOct#^7 z7G+|2UHERAk;KYQEcLDN-TaZ2M|rBN@1tT86;&pr$dz8ky4k2HW*nM=?O 1F6 z!gO@OX aqk2q*V}?0E-+ce+lk?eqsXA1l<4G9l>`5= HhMA!+xTFkaRi?k#5>mE>>Pgv`vBn?g^HR3aZY>LX^hl= zmeYSE)5$EG?c=EK7Br6?UYtl^RmV;3VRyzxW}N zjE(?A;P+(NosWbVk6aj(2?$WZM`0nU)8cS!>U+jN@kN{Nc$H xclE#+)|_~o)n%6(_jy<(<%%%Q<-mVy+YK+IPYH@8a+O=&wH{;GG|&Ok4ur%E zdE3)5#luF(hv(t@uGp}uotzfcKNKzxGJpMlUJV-JPI&nv{cW-nYK)-^ruhu9`qYl? z^9RCqDpK_gw6I9=RLu?=7?cc>>ad>+^<;qEH9Q(n?Y34tP2~Ij&jCRUc$9M25xakf z{sgaJX9vt^hz=DoN>bw5i1anPPd=)oxy8dNz}84uS$Y4<|C=;+1I=;o#RVA!_wmCI z14vQ9a9yqrfwjPlrQYhlbf}IsYHh8|!@}XSP5$lhye|ud?s&=a2A5PFpSrv0V3=lL zD)&zQPCnpo4X`iVMi@-R2f9iJ<79uc+Hs`Ui@fXq91!Z=uGqk`S@kCPONm3}XPMN$ zMTP=X&szaHIHvxL-}7FDSJKUvw?G=lo2<)R4S#DObzRz>5~)}4|A`8hvzDFh3#oz| zkDtT3oQjpWVeWMSTMV{(Wn~po*W2^wo34-DMhe1+wiLA6nJlW=il^2i58QuLJV@HY z8ReyR(t(?z7}Ucq`fc6y2lk0Y`e7X1P;#gcyZt=5Kl@K4yIJa!D_boesnksR7uuu? zDK|HwIP`DXMiYx9<;7cE1f>x EnIrve+1=MSLFl;k19TWySP6UZ7tMB5uZNU7#9q4JT VYZ)I?%r FhL{X$+{T7Z!iE=DvTr{Oh~t??LqS zcgaW;3eB`TZE@s2uQqI(9_zN-Hw=uQ;6xsn3$8on>{naepkcm}a>)lF$Gu5@0lDOh zk0>a2+JEVGVKY45>RC^vYtj!c5b8bFTpnjg2qQ0;sv5MwjRf3W`%}}Zt-KFf9fw!% zG@C(`shH|uHu!%8NV!DxyXu|h4$T1$%`uCPeG|o1Q&+S&iOav@BN79(mUiZ`UN^*W za|5gDVZ5&05YSN#;r2)Xr!kzzoX}?SJRw=d!P@?{YlF;Ab#chIe_dO*;mBgHsZk3n z+!P`{anXfh0?~*1qk0~a(F0gy42%E+mGHR4yu)+tfdPLv?SF%%TDoPs{8V;9#;3Z{ zVDg20(0{PX0?uZ>JROg9)1`P}*t}6P7m|$ gP6{maR<9$<@8|W58BRy%9 zY^;@!V~vjVgFP Y2T+O~Kgjf@wvYJ(hcBmFw0;;}X&H4&+q;)sol^wlxn z+_CgSQ$Ic#3i4d2?|SxqEZlwt0tpJ(@kQSgZhC_~$#~LcgQx$`wza#h+d*F8J#w&d z84v616Fi*6@4K!$%62TFp=agh1Cz1(@#^Y>I(C2R!qm_+bJaV%xDyVOkA3!0X}WNt zGj~%T#g3~(y)AZ6xES~Tj( rHyd|nsLOHYd@vQ^{a6g{ n29h{86m|g11Rv22NqUph`b AmbXY*^D3JKVO~Qf(V`e~{e{ z{h`&mV-s#*90*8n?Ynk;Q97Q4r_Qz4c5*iL590Z3;q?gVr+ra9TFV@!&P&`+KfHha z=|8ar+gB=Z8rtRMI|KN%2*O!NkJvcwYcISS%K5z-h)}T>@!dit#O3#_qmj}TUf0#X z{`p^B@;(0iUltRbqdJyK9-)OrYp5zncD*RvM|HB5I;jhaXD?u3C%a 3M{ZtuWwB_5P%}mS!SCX^la4Bs zxEi?VJts0TXa|PlkXI)$plLXg(`|gJ`W}A|=kU7BR=h+WPq$^ULGD3zXSzT24{&+A zvix>>tmmjW>8YY1=}!z0>8onn)TSXLlhg D8V*$ >DTbRY&;c&5SoA05BSj#X?Ezz-CMZU^dv5l >j 3H9XRrhpsP3Ld@pAH+7J1psjri$vaOGm_@M}~j 3O%5(g>Y`;F3JH`6NCK*lceYe4za8 z3KJhI7@k2VzAYcM=TwSywL8IqP%yAx)?ynJR6LH`ImnD@*cVC+W($;9@&&KxMt6FA zN%Tn9Nke-gMn8X?h$|EmQTwh!)eI#n^hk0%LrR!QhKW$#JUdm}NNNV4cj_6;rY87| zNDDqAt3=EM1mC5&Xbm3+xmIzP7iHuNZ^8PT_RYdd5g!xzsc*_Ep|gRh4;3MVzZ~~X zzV&^mq?EkM8-K`k7VNPQCkqswK|}?i4gKDK_2+M4E%|?oue|Q-1T_8hF2zv|n` z_g_8x^RsVZ;rWYaUwN3Elq GZ}R1F@k)2e%s=#<%sWmehG}^ZVH>1LGFe{+=au9vt4dW-~5Eam_a@ z+3ilW)aZY2f3cF&8mZvUzpTD_0I{HC&r2-tSoc#v^O=~mKAMg{u~7(v{3xY|xu*HN zPx6Hl|I+FPy)md*Y8swqp0@Hv&5E~OeLNEC`O&JInexZ}xx9E>JhxDQ6W8QozOvpE z{hTUYGA0k2fCKGXt0~$7M3X&(rd(lYS`ad`j01lu>ZU&Wt8LH|!!7E9KgUZgv|O9q z=JqB!aGuyt;v%eJ8tLb%gx%SfeWz{oLDo~nhgduroe3}!!qw6BY5Qjr#TlHEy}*BL zc*C(3!zM7iBrFxDrtw#^GEdMO3=+Y#gD-~dWC_S&ZoQRq7Ru1N)n-z(QBN3M-_(cW z$+CYWd(N1M^`j8$sScy2Flw*Fh FrX=jJy}O>5^oBx znj!tz@2n-lo0z;7s?Ck;x%m*lkAv*IVWZl&Le@&ZWcM&G538QU+Dp-A)sC8@@+KgC zltQ?MO03NkpDpbyI}1~7qjg_%9`el{2;tOC$SX<(({^w7^{|u^b3xA6w7>R~J?4Lh zW66TJ4O;z0q4I&vS}V4%!fp&=Q6H;7o sc`)kb|t1Q{7!l?J8OS=)sFhqQrS(^ xcakA^o2(LD_(&3dxzbV!ZFM4Fqr )3RID z6)#oae7r`>Y_mJHa%26j4ly~>yTspe%l)o)8MF^SSS(3}%kdb43Hzz)^2d}lP2IHV zRxCa*Vam|6O2urLgm#HiiI7T!R02|lbtspxjjiaO(hoRksm_BPRr+%oS?|l|$&a}6 z3 vn~( zGT^0iz}G@b&x+^0)a2vf<}H`*i;;j`zG1Kkg}aaSuULj+Z^!tYpo1%i E1>$w*2periRh z1Eie9KUMXED3i7UMH|D3=6~>?q8w|3ie{UwdWxGovF pvlQASzyL;Mk`!imXkK6!2l31xUflC#)t#PQ!4#dk|zy#0r#7 zki_5&3c|)!sAh%Wa}b;jeduJ#IW_5$qxhvc2ly-bGdJE}l{9}Xcv`w@C8#k5cz0n{ zMX@vE>HGbxLox;v6D8Bp3v)yJTI`%CEeGD3?2L4NfFE*b&T3_}Hb*XGtt?GVlSQlk zXkCw7{8|ky(K!=YxWr%;AeB5Ds5H#VuAKelxE1GJTZa;+5^DK`csl7O%!DDfqCp}< z#J}mD73xNVZj>0eq5;z A^$JrsLU@3(XYP83|h5B-BaM~1|g|Mp8&z)&@G;@D^h=qN$mTQq(MQJbmv zgy#Sg>5;&{<>D$ZJR<29=BE }6!XUh^H|oMDaj_VlyoB2Qp!}<<2O6;d zEk72|*}PuY9t)S{e-B;0zn^uk14&N3%viWg2&%DZLVA{OHub3*-}7ZkA93lQ8lmWz zZg8TN%x&Kk8ViHp9qR3=>}TE#fPoZmYeHnbWmp}-(lv^^y9al7NpN?U;10pv8G^eL z*g){$?(XjH?!kgfkbL``^WI }?Cn%%q=c)na!&D1LD*(pr_?!z)@e`Q{PEaC>NJv uF15}Y(2kAbF 95w)u%}g{MC`?q@fBM&xk?;VWVz2DO=Mfy zJvUxVDix-&AV6o_`NB9B8tU5)>T*en*3^zyo$PfD$748w`S=?WYI6hd^WD4OQTlA8 zcO_BuXU0EqhZ^<2^Zw!Wa?M8(aBNSe^KYmBDJOlR5c4~>j<1n|O2V$yi*fwYLWW(g z58s4Ax*=!o88f7u>mFW{Q1>+YIsGCDlAix*-?Z{gz(gQHcoX&;D+=7oL)%f)^kHQO z1kYDi**y&550cp^_#xvG<+yIn=Hil)^2#T_W|rV|#biiA;12%27+L<65}gyKknlS; zN9h+PfE?2o@##y2E|piAx;X987qJv|>IK3mVitEnA*XAcH%_)IU7w;SxVBn4ck=y~ zjF*>L%4M$GaOCg!v%=YAWrgr=xGJ-7VvG^7<0*K iQCmOkqhIum}u>J)wFsEg(#Jq66Q6k6||_dRFSd`@lt z|Gr$zT5q}Wda1= xz40$quJ#$;?Q z?zyO0Sk-XZ#*})G=ZP7x*{F701Py3Tgk isnY=BSpLo2LVT=sxz2 zm!^z$%I=dq^$Z@oE6jdC!nJP~lC%=b7KyG05@RBjlDI9&7(AAK+%e@mQ~NH1w)~@S zrSF$k6*k*$h{Wg|CO%;u0Ak==F(lAA2ip!ML|vC`L^F@~A7y>2Y8-2Vf~q9m5G5;8 zg| HIGLJPii)|gljzQc3!zPVG-QyFd>jvc! zM tp9n1 zzI|?pzgyN0h&b%|Fc%wEAw`>Z`EquGuKldzSxlNyGw3v;NJGtL-d%3h6Wow+&0~lc z7sSsTDH{8SDG(@ld}zMfRW#)H=CJ4Xsg$SBHV;#E%n0El^}Fcq?%G<^Zw|e{Vaj+% zF|8BI*|(bQ&XEc+f?>EJ$5k+<4LHuI1_$|YW3`?m@FJFw`iU&bd0!8xM*ht^LPk$M zkx_qM@mumfHWd)| TN)*ui&&xTSeoEEq9^U9F*$ zs^Cia5ORm#R8Sgz^n2IP-VyCXs q zF{L=9;XbK6Hxa+aqJ9I)61HYvrdOQ lQFjL731^hQ za-cn2?yMEZ07pfECV_HQ^yQFk#X|V$F71AOJ|&a6e9ST5?yec%^}M^#{vnSxZRfW# zpBo}gvvK Ns$O*EPHm*6DY9Uf6rKLy`SH>X-0)w=tP?BAg`O1PoBQ_6-P z8vN0;=zeevJ0Z#h%P(t==?Gl*k~DbrY%xL#NRz~nx8i1-AJ;|lgou58-2;=VI9~t4 zwaAOcW2XCKY$8o_+_@&;hKQjL1VaqAb{p|6U7F?TYwGk1y|#LW@i*s9WbWV__S;>p zIc&RsC}F_i_P8*}9@PfPlNa)vf#mMj_d*+Nd^T%wxn(w|clm!a*#lZdClT*%=4r)8 za5pjMo)pw axXi*(br~fuWRb$9k TR(F^eA&Nt`y)*p=FF&$B(c2mHBE8DZcMbU;s-kCC($nHU2Me0`8~)o>ms& zCgLQ6d;lIPRQcVUV}wwrk<|QQ2W#sdRT@34O7uL4xd^Av0dcI-T3-|KQWqQQ&rX@K zt=g|hUk;9jRL00^6 BIjVE~h km`?DC{pJkF1Ik z|JtC7FLJ&%D|vdPG|FiI7^8Jc*F+m`9sR_RA>USpqx5ThQHCxBmbDq(qe1Dfe2E=_ z{u0}u%4<8x4ciI83;j9LW;tF{V*AUt7)NTAfSH2KMmL>)BL?{p-g&=*ojNl3*LH1a z*O_t_yY&SJ)%^1&grll-RPu%lZJfR^%`Z}e$0S{itD97~Bq=X$;WVAJS*LJEBsUH@ z^oefF#k^c?*clq3f0>10G*1e*(7e2xqG8a+P#OL5MCqNy$)y{} t@lg^ zWkV_=(nCkU{X)xUmruXSh7<<8zLjrup3CED&cpGDa}bA0JbylSbaK3FULC~J_$!9u z2R>stSe)~%%bkVz_*p ngjLD*Q~tA@L;T qqA+2Vnf ztwlaNaMjA~(`1cYkMWgGIkrvJW%y41-4G^4E#NBsBbhb vaGXEVgG+QxbL&RXj(eN=Qd8KEi9A!x1t`A*L+%Bm zRiZp@j0Ooj)lN3AK5`#=VBFGr5{+Et+H#uIFsYWN7b>SGSv6{S5A8ar9>C_7zHgHn zV>-=Jj(eyD74hcXz_M-*5=oL@G?-G$JMO3O*Dh*JeE1u0fu?n8Mp8pJeh@L(FO?A5 zFgsU&%r%s3^s<&ZP`|Cgw#p4aaq<^QyZ_}DvL@ABe4sR-Nn UB-s~UVxQ`_z%H>Nil?D^#YnT6Wyq2$K{?;_(v5K0et;;SN9V5=}A z-}mMAd9r1HLTDIEdoR|((xCau>ups0zjt|=t=L=H@H}yj6B8b)2XP@AZPf?1nkGoe zFj2~{Yw@On@pR)0Ib~8RXT|OVxzCqcI*aPC9-(y9KEZ?@sWg(DJeI!(9iUqQ>ZX}^ z6@`G%jvfrd9#$?u>OQrwBQ8Ra^P+z0$6fQq&Q!mw7Eg@=UV~WbA>ClXDthV1h+q-^ zgpN==Y!{oR>XuWUf`5Vm4^V3-ToSyMFN9_IPuN7L-i)Qn0%bp5oC87a0xor;3@a*x z?X@_W@Mnz(TU_i + PCUfDnsrVG*=Y2Xym%IcV+xWGMYLJ+&MgdVkk z%>JEE)<6sE$KLcKVWjx#+i6j_7Fh@p#o>RD2y-akmox0+qFTFQZMW2IYXV!0{!3fs zgh5V98DIaXpP_Y8JZ}_R)Eq11FpGh5{RYfbu0;U+B0w10H%RpHS(x $UXWEn{7^F$}9dpn&b`hNQj$m69mH$Q `q@dU@QiO4`74l}F|RM+R0{%I**4pbp{AG4eey^EXz z37GajH=m;Gs#pD^xxzAa-T-PYrMevryd**vxg(| YoEt{q6#MibaUA{~6 z?3c}JWj+M}PV1*=JNd}dJ1l#_y)N@?!_p2|6WNRDqWepF?owNW+|#>ZHb6gwa(H2h zr2dn(|Kd3glf???(sR;|Mg50{YrGKq{1dI|iXH;`dVUp#)s=S^#bE6-Z^BM1f5-aC zoOzT%9NK(N@JTf*TvBXr)G=Qb)?yyM^Gvn}OdMO7tv8G7$ZdT`N86O#mte7VFeabu zQ8OvHgjb8QN?W6;;h8(%hIX=A4{$!J7O#GF>4w>_y0%_=XQ z0z<(Hpnn2=EoqgnNg#S4iGE0YY&|9<`8x9eNcCwFIr77^@KL=>nFSlQQK_4#ze>!Z zywR>|{(`-Riq|2dVK6*74TYni*q>DRqYC0b<5ji$HV9x)RCO;k;HbHeBE6D6)Zw~* z?kB`f^8wV-MCN8{DdF0#32zi6b{OIpAL_9~|2bP0w#GeCQMhkooyK_W=$el%JGs?k z$X}O{<@|ocxF=Bf$}JoPNPlT7K(?fI+};G$xgE_S1lHl_6G~6;eS6#!S>tN;qhi;D zj@v e{~#`!Y)56yHT+6(?4+E*fr!lh_04;b%Xdi^~Cc45PkNBh4l zJ)#WSsYL_lFuqW8su0JIhiP-jG~RJ;%xnImPsqaZ+4|;nc2+$4z7gds=C)C);;HZB zndOxwWc0>Y>F{2mXzxpgh7G gw5Vecx%$iSM>5b8ooPSKs z>P~7y+(Y~($TNlsO3<*lYunF&O*?6QZZ)#0XlvRI@_lU-(jvAAgVBVc;&B>V4wHDU z9AM2k|2o;=4V2N0A8_P*3q)p%7!=K+mAL8-ughR$6X~^zs1criVs#-F)+eY>%#^1d ze?TbFDfe9s=st?76;3k3;-N7{Tm+x)oIS*PKGKa%hqe58D&Ap)U4gmS;-9eeh6z7u z@F){H;+w;ZK?PRp8~>O&e8K6s>9xg>#K3Qze@!lg0${e}K_0FYPs}X~B|6=9m}S1z z$E4a?1EcU$tE c|$$#MtaK+p((Kbluz*^}#z4=3y#b=G;BXLXABOgNl2c1YBs{E1CUCtY8 zcsAVm`03C-`Z;NwVvSO(pU`R#_>eqIxKh)_V;DF=8gMG9#oTRkl;uT?Gx61{WyAC- z^1=QgHGcu3oW0gI326O&yOAt)ynsMS-60)am)(Hz({5`nQZc)O=tug2O|F2v2k8ci z U)>h@?JIl}bTJqCkqqz)n=hZDtnLTrNvy>{2wB!3 zCYc}MunnpJ-V=Tr^xw_JZ+in}2}iIHre=4a($cRJ#@_pG!ayReWVuhllPB?;!5}7R zRsXAq={ L@=tv2%Z@z{E3{nnAk M(Z&?BYj?oqlcXcADOC_ zIRR$#UgVSX*{k`aq9&haA#2LMNmjEF!Em>e{yd?O2swv|bGO4srQsa8Y%!hFq;k#n zM%4}4m=kd9X1(| aAO%P`88Bx zx{ -~DAHtcL;lSh9Fgl#U Z0*d_Ib{&_}OkB4mft9G|o~jazgA+ z^a@!@U^fJQXXnP5wsZ9ho(~(kv<>uZ9%+VoQFx*l4f#kvaR_fqu-oJYwE+=|F99A5 z`S3&9R}0W oTzAmR{%HcdzaQk_TB??UN2ZTP!Ls$xiN zWAIH)mVOO_QxC%0y3e_`ISnhO?7`n&&uu2N*BhBey*2E=AqHYByEqPx#rfH9S4qMy zw4~}8mprX<>{M>3QFZ_PEV&!NSvUED$T#6vGX701OuB7bxR!DN6Mk1~h3vgJPR9*O zf9qiVc>go@?aJ|Yp$a899S?y*oJ8^`sO+z*$&XTA8k(dVd;?1m+v?nEu4#Eu^gqW0 zC-*_sBcB_-8LBK*Ta#f&qYPPliQR^MY(gSGHxg+{)Gs{=aE@y65B#euLuraY+Nag29IeXVHJgukZFTV#m2os<+}CubDL)m`l@)AZ7A7wGSMaP6 zEc^H3J8X2#ymK&M7FB7df;Mlu@@ZYnreT(pwfTZwhqU-uT(gf|iyHDBS*y?v$LLr9 z%}a?2x|sTkQ9aFm!kmZ~U$UP&3zK24EJHQc{NXs?^x~p`%ntSltE+#Scrcp%%8?nt zhZR4wefz?wON$?0iPGPz+x?E%!{BUeZ3;r_zlN>z#BMcKT4cp*7x2L9yetjcEK6*c zgNTx%T68BZxH>i;vib9=Gs-$9dOyoE`L!3Jgr-Mi)N{NkjbmQQXbvm-BaM==q*^1u z^t})OA^rxyZNK%SoGg?jo6=vBqtwXU;DP7Gi_u+DriA7er1@bs)X$(Ykqum$yM6k6 z0h3${ndytiST&G-_OKPW4!_%Ig}+m-)S@Md<2VkJy;YOtlUj?FyILOxXi?uP*JDLe z@yaw9m8)UR<(XHPvx8PtmO8rv5e_j#|IW+ZJ6jL1Uk#{V!6Aa_3*_|!E_of6FPuE| zoP_lX!=esE_X-7|K0Z|+-I_d@!7WnEh2^$g5K)=ee@30hVUEoRG_G0jV6bufn06-q z!_4Eh@f0d*ZGs*Qg_4&srH~pDz0_Hl=c8RmgkP44r_U&+f-8c_wNF&BBKP&U-VP;c z?3NqQ)u<&mn=S{KEnWPKp5jwDBa~WZ9@+X}7=y6u4qN3D8>p4=S+Xt!yF9BzbAn+p zCKPMpQzAox?tTjLdg!3@wG#(_mW@3S`rHB`972kSqnq0BJw~%6YSMOtfVc3$_RY#U z|6*6=q-BZP4powEk0;%y?Kzm!>HuL9f_MVRF!=iho1{t`A;Kl{Nj{ZZI)`0umwx?{ z11P=7?QARJk>uPmr@wQ)mXfyKLx>4RIR@#Sv3+9W`((Ve?3lT4^N(cg(B<0z1Bj zg6luxZ6K#KPFk)IaHJgBt`?h!4Q8W)>QaX;eF{ypQw8kX1Dg3PXjR3s%L^)qRRCas z*#S9-Rf0Velivr5%iI!u7C|t$<2jw6CaG4yfC{r`XmVzRutI=JzjU~_u2KJM zR|F&Cj1Je8v908ZW%jBwMrs^lJQBY$8I C aM@i ziqyXrm^G?C>{pvSfb}?G7(RuCxz$x3>h291&Qv%aC+jH^9vIe-Z9XFAtD$U)LG}_v zM@)t5I)oGfOgM@Ejih4~%r!ViKvNueH?#1N8_W}8 pe7hap@ZrTXkRkA0KeV&vbXL z6rs}Q2Wau3hJ&q^4*H8}PLHD%ztOjKg@Hs}yi;g_NjNrovD^%Up+Chm-F*hLxQ;m& z&B<+-*k&aJtrD<795@?~@!%Har${jWC&+hIl+EuDz5LNMJQ%-(Fn(>wA2+KYNy;Hf zQV%WMtX@BzTIFIxbJFueb4AWoT02JBNhM;{AxfznHX< G zf@e6W0G?qQc!tl#&ADlgDNpc7MY6>|Av> 3MJ9@(mTYeJK=o9VYVIy$q%DU zM5lQ3Wuo)Ca;Vz(R#zM`JVvT6zvfm=j)dUQZ7jQE+feK27Al~iL<&MfLka7H65wgr zzhJAFU~tD@KzGn61*!}IhLC4r^qyQuY~r=Ulbevly*kdjwEz4*2nfC`QiNfEjiG;E zC)sFtsC%A5Yz2G6WYeVZlEm&64KX|R;$laEdp4_Z8kcpYyho;YGnlHWGF4Xo7Vs@4 zexs39t~e>FO|W5TeEElhG*^W$9M_5SstYmpZzB-dtr1N&1p_uvJ%R>nJ+k^M(Vq~d zh9Cl3h-9Lj$~r#v=`bRd5;QHlY2&iI<|9$Do9>g}@9#!W786Y}QkO}WZ4PE3fOM|D zQYj bXV{kf*ofkRE!1HJQy H8Nj~a*wG|{K}-dJ+z%W1eJs05ipUG;An%dd zHb36nBR+s7#)lNm ?{tC;e=!TAbtq*p-tZ)1TUEs!MIv8vPNl~kI_86jOH@Sp!% z<8W8-KGER()bLtaG}QSk>@PogS}*UuXU*EdS|js=#qr4ma`5V|ezkwCvU`#YCT<%2 z|4uXvHrx+#8?c)Aw94{(Vs(OWV75e1$wGOfnjp4HU!1)cwsr#LRnbuK;&JO$#Ztx= znDBflb9dhzaa}M;(D+GPZ`=Pc+Bzf?^3v9VZ7h3lG8v$8>|poj-Imh4rwNAmxS=zo zP(+0kH88RH>%0YmG#3<|`6y{+@%I){8P{}u8rePd`bQIn|9uSNVoYM4MBi2Z;b~MV zH#r&SV?UnbF;GN^2=n7lYPeB^9Kf)fE)4qcqA%!wCX+aPyPXLE0e_seVad`+nM`my zdfKPGV$Wpd1yp{^I8e^A$xd$C+kb-BJ83pRkQS9@tICbg{tjj#xL&enui@N+y>-y1 z4%-e_@k(8L@31n^bM*GnTatrL90NPQ!+YZ8{&9ad&q{eLJ2PlV^Tbx~Ar@T_W`Ld5 z3=TZ0BNBb TmyB$bmb60lMK;&;&v1!%m<7YL7?( zB%U` RHNTp5HnJW%AkhcThT%QTerc)KiYh zqGFq42A>Mh8cU<%9gWM|u