Main branch¶
+[Docs][issue3591]: Fix of NPC reaction tutorial code (Griatch)
+From f1bb23ff9ca45cba2be8a48247d3ed3d00c4fde3 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action [Docs][issue3591]: Fix of NPC reaction tutorial code (Griatch) Aug 11, 2024Table of Contents
+
Changelog¶
+Main branch¶
+Evennia 4.3.0¶
Here we make a simple method on the NPC˙. We expect it to be called when a (player-)character enters the room. We don’t actually set the is_aggressive Attribute beforehand; if it’s not set, the NPC is simply non-hostile.
Here we make a simple method on the NPC˙ called at_char_entered. We expect it to be called when a (player-)character enters the room. We don’t actually set the is_aggressive Attribute beforehand; we leave this up for the admin to activate in-game. if it’s not set, the NPC is simply non-hostile.
Whenever something enters the Room, its at_object_receive hook will be called. So we should override it.
# in mygame/typeclasses/rooms.py
@@ -160,19 +165,19 @@ location.
# ...
- def at_object_receive(self, arriving_obj, source_location):
+ def at_object_receive(self, arriving_obj, source_location, **kwargs):
if arriving_obj.account:
# this has an active acccount - a player character
for item in self.contents:
# get all npcs in the room and inform them
- if utils.inherits_from(item, "typeclasses.npcs.NPC"):
- self.at_char_entered(arriving_obj)
+ if utils.inherits_from(item, "typeclasses.npcs.NPC"):
+ item.at_char_entered(arriving_obj, **kwargs)
A currently puppeted Character will have an .account attached to it. We use that to know that the thing arriving is a Character. We then use Evennia’s utils.inherits_from helper utility to get every NPC in the room can each of their newly created at_char_entered method.
Make sure to reload.
aliases = ['pemit', 'remit']¶aliases = ['remit', 'pemit']¶
search_index_entry = {'aliases': 'pemit remit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' pemit remit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶search_index_entry = {'aliases': 'remit pemit', 'category': 'admin', 'key': 'emit', 'no_prefix': ' remit pemit', 'tags': '', 'text': '\n admin command for emitting message to multiple objects\n\n Usage:\n emit[/switches] [<obj>, <obj>, ... =] <message>\n remit [<obj>, <obj>, ... =] <message>\n pemit [<obj>, <obj>, ... =] <message>\n\n Switches:\n room - limit emits to rooms only (default)\n accounts - limit emits to accounts only\n contents - send to the contents of matched objects too\n\n Emits a message to the selected objects or to\n your immediate surroundings. If the object is a room,\n send to its contents. remit and pemit are just\n limited forms of emit, for sending to rooms and\n to accounts respectively.\n '}¶
aliases = ['batchcommand', 'batchcmd']¶aliases = ['batchcmd', 'batchcommand']¶
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 = ['@swap', '@typeclasses', '@update', '@type', '@parent']¶aliases = ['@swap', '@parent', '@typeclasses', '@update', '@type']¶
search_index_entry = {'aliases': '@swap @typeclasses @update @type @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap typeclasses update type 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 "}¶search_index_entry = {'aliases': '@swap @parent @typeclasses @update @type', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass swap parent typeclasses update 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 "}¶
aliases = ['@locate', '@search']¶aliases = ['@search', '@locate']¶
search_index_entry = {'aliases': '@locate @search', 'category': 'building', 'key': '@find', 'no_prefix': 'find locate search', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶search_index_entry = {'aliases': '@search @locate', 'category': 'building', 'key': '@find', 'no_prefix': 'find search locate', 'tags': '', 'text': '\n search the database for objects\n\n Usage:\n find[/switches] <name or dbref or *account> [= dbrefmin[-dbrefmax]]\n locate - this is a shorthand for using the /loc switch.\n\n Switches:\n room - only look for rooms (location=None)\n exit - only look for exits (destination!=None)\n char - only look for characters (BASE_CHARACTER_TYPECLASS)\n exact - only exact matches are returned.\n loc - display object location if exists and match has one result\n startswith - search for names starting with the string, rather than containing\n\n Searches the database for an object of a particular name or exact #dbref.\n Use *accountname to search for an account. The switches allows for\n limiting object matches to certain game entities. Dbrefmin and dbrefmax\n limits matches to within the given dbrefs range, or above/below if only\n one is given.\n '}¶
aliases = ['@chan', '@channels']¶aliases = ['@channels', '@chan']¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
aliases = ['@chan', '@channels']¶aliases = ['@channels', '@chan']¶
search_index_entry = {'aliases': '@chan @channels', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel chan channels', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶search_index_entry = {'aliases': '@channels @chan', 'category': 'comms', 'key': '@channel', 'no_prefix': 'channel channels chan', 'tags': '', 'text': "\n Use and manage in-game channels.\n\n Usage:\n channel channelname <msg>\n channel channel name = <msg>\n channel (show all subscription)\n channel/all (show available channels)\n channel/alias channelname = alias[;alias...]\n channel/unalias alias\n channel/who channelname\n channel/history channelname [= index]\n channel/sub channelname [= alias[;alias...]]\n channel/unsub channelname[,channelname, ...]\n channel/mute channelname[,channelname,...]\n channel/unmute channelname[,channelname,...]\n\n channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n channel/desc channelname = description\n channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n channel/ban channelname (list bans)\n channel/ban[/quiet] channelname[, channelname, ...] = subscribername [: reason]\n channel/unban[/quiet] channelname[, channelname, ...] = subscribername\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n\n # subtopics\n\n ## sending\n\n Usage: channel channelname msg\n channel channel name = msg (with space in channel name)\n\n This sends a message to the channel. Note that you will rarely use this\n command like this; instead you can use the alias\n\n channelname <msg>\n channelalias <msg>\n\n For example\n\n public Hello World\n pub Hello World\n\n (this shortcut doesn't work for aliases containing spaces)\n\n See channel/alias for help on setting channel aliases.\n\n ## alias and unalias\n\n Usage: channel/alias channel = alias[;alias[;alias...]]\n channel/unalias alias\n channel - this will list your subs and aliases to each channel\n\n Set one or more personal aliases for referencing a channel. For example:\n\n channel/alias warrior's guild = warrior;wguild;warchannel;warrior guild\n\n You can now send to the channel using all of these:\n\n warrior's guild Hello\n warrior Hello\n wguild Hello\n warchannel Hello\n\n Note that this will not work if the alias has a space in it. So the\n 'warrior guild' alias must be used with the `channel` command:\n\n channel warrior guild = Hello\n\n Channel-aliases can be removed one at a time, using the '/unalias' switch.\n\n ## who\n\n Usage: channel/who channelname\n\n List the channel's subscribers. Shows who are currently offline or are\n muting the channel. Subscribers who are 'muting' will not see messages sent\n to the channel (use channel/mute to mute a channel).\n\n ## history\n\n Usage: channel/history channel [= index]\n\n This will display the last |c20|n lines of channel history. By supplying an\n index number, you will step that many lines back before viewing those 20 lines.\n\n For example:\n\n channel/history public = 35\n\n will go back 35 lines and show the previous 20 lines from that point (so\n lines -35 to -55).\n\n ## sub and unsub\n\n Usage: channel/sub channel [=alias[;alias;...]]\n channel/unsub channel\n\n This subscribes you to a channel and optionally assigns personal shortcuts\n for you to use to send to that channel (see aliases). When you unsub, all\n your personal aliases will also be removed.\n\n ## mute and unmute\n\n Usage: channel/mute channelname\n channel/unmute channelname\n\n Muting silences all output from the channel without actually\n un-subscribing. Other channel members will see that you are muted in the /who\n list. Sending a message to the channel will automatically unmute you.\n\n ## create and destroy\n\n Usage: channel/create channelname[;alias;alias[:typeclass]] [= description]\n channel/destroy channelname [= reason]\n\n Creates a new channel (or destroys one you control). You will automatically\n join the channel you create and everyone will be kicked and loose all aliases\n to a destroyed channel.\n\n ## lock and unlock\n\n Usage: channel/lock channelname = lockstring\n channel/unlock channelname = lockstring\n\n Note: this is an admin command.\n\n A lockstring is on the form locktype:lockfunc(). Channels understand three\n locktypes:\n listen - who may listen or join the channel.\n send - who may send messages to the channel\n control - who controls the channel. This is usually the one creating\n the channel.\n\n Common lockfuncs are all() and perm(). To make a channel everyone can\n listen to but only builders can talk on, use this:\n\n listen:all()\n send: perm(Builders)\n\n ## boot and ban\n\n Usage:\n channel/boot[/quiet] channelname[,channelname,...] = subscribername [: reason]\n channel/ban channelname[, channelname, ...] = subscribername [: reason]\n channel/unban channelname[, channelname, ...] = subscribername\n channel/unban channelname\n channel/ban channelname (list bans)\n\n Booting will kick a named subscriber from channel(s) temporarily. The\n 'reason' will be passed to the booted user. Unless the /quiet switch is\n used, the channel will also be informed of the action. A booted user is\n still able to re-connect, but they'll have to set up their aliases again.\n\n Banning will blacklist a user from (re)joining the provided channels. It\n will then proceed to boot them from those channels if they were connected.\n The 'reason' and `/quiet` works the same as for booting.\n\n Example:\n boot mychannel1 = EvilUser : Kicking you to cool down a bit.\n ban mychannel1,mychannel2= EvilUser : Was banned for spamming.\n\n "}¶
aliases = ['nicks', 'nickname']¶aliases = ['nickname', 'nicks']¶
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 '}¶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 '}¶
Test the batch processor.
red_button = <module 'evennia.contrib.tutorials.red_button.red_button' from '/tmp/tmpkk33rwpf/61374b10ff59d2988cdf42ae6cdf11ccef487dd6/evennia/contrib/tutorials/red_button/red_button.py'>¶
aliases = ['con', 'co', 'conn']¶aliases = ['conn', 'co', 'con']¶
search_index_entry = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', '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 '}¶
aliases = ['con', 'co', 'conn']¶aliases = ['conn', 'co', 'con']¶
search_index_entry = {'aliases': 'con co conn', 'category': 'general', 'key': 'connect', 'no_prefix': ' con co conn', '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 '}¶
aliases = ['@callback', '@callbacks', '@calls']¶aliases = ['@calls', '@callback', '@callbacks']¶
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 '}¶search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶
aliases = ['manage bugs', 'manage ideas', 'manage players']¶aliases = ['manage players', 'manage ideas', 'manage bugs']¶
search_index_entry = {'aliases': 'manage bugs manage ideas manage players', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage bugs manage ideas manage players', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}¶search_index_entry = {'aliases': 'manage players manage ideas manage bugs', 'category': 'general', 'key': 'manage reports', 'no_prefix': ' manage players manage ideas manage bugs', 'tags': '', 'text': '\n manage the various reports\n\n Usage:\n manage [report type]\n\n Available report types:\n bugs\n ideas\n players\n\n Initializes a menu for reviewing and changing the status of current reports.\n '}¶
aliases = ['q', 'chicken out', 'abort', 'quit']¶aliases = ['abort', 'q', 'chicken out', 'quit']¶
search_index_entry = {'aliases': 'q chicken out abort quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' q chicken out abort quit', 'tags': '', 'text': '\n Give up\n\n Usage:\n give up\n\n Abandons your attempts at escaping and of ever winning the pie-eating contest.\n\n '}¶search_index_entry = {'aliases': 'abort q chicken out quit', 'category': 'evscaperoom', 'key': 'give up', 'no_prefix': ' abort q chicken out 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 '}¶
aliases = ['shout', 'whisper', ';']¶aliases = ['whisper', 'shout', ';']¶
search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry = {'aliases': '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 '}¶
aliases = ['examine', 'unfocus', 'e', 'ex']¶aliases = ['ex', 'unfocus', 'e', 'examine']¶
search_index_entry = {'aliases': 'examine unfocus e ex', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' examine unfocus e ex', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶search_index_entry = {'aliases': 'ex unfocus e examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus 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 '}¶
aliases = ['inventory', 'give', 'inv', 'i']¶aliases = ['inv', 'i', 'give', 'inventory']¶
search_index_entry = {'aliases': 'inventory give inv i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory give inv i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'inv i give inventory', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv i give inventory', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶
aliases = ['@open', '@dig']¶aliases = ['@dig', '@open']¶
search_index_entry = {'aliases': '@open @dig', 'category': 'general', 'key': 'open', 'no_prefix': ' open dig', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶search_index_entry = {'aliases': '@dig @open', 'category': 'general', 'key': 'open', 'no_prefix': ' dig open', 'tags': '', 'text': '\n Interact with an object in focus.\n\n Usage:\n <action> [arg]\n\n '}¶
aliases = ['achievement', 'achieve', 'achieves']¶aliases = ['achieve', 'achievement', 'achieves']¶
search_index_entry = {'aliases': 'achievement achieve achieves', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achievement achieve achieves', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}¶search_index_entry = {'aliases': 'achieve achievement achieves', 'category': 'general', 'key': 'achievements', 'no_prefix': ' achieve achievement achieves', 'tags': '', 'text': '\n view achievements\n\n Usage:\n achievements[/switches] [args]\n\n Switches:\n all View all achievements, including locked ones.\n completed View achievements you\'ve completed.\n progress View achievements you have partially completed\n\n Check your achievement statuses or browse the list. Providing a command argument\n will search all your currently unlocked achievements for matches, and the switches\n will filter the list to something other than "all unlocked". Combining a command\n argument with a switch will search only in that list.\n\n Examples:\n achievements apples\n achievements/all\n achievements/progress rats\n '}¶
aliases = ['hit', 'turnbased combat']¶aliases = ['turnbased combat', 'hit']¶
search_index_entry = {'aliases': 'hit turnbased combat', 'category': 'general', 'key': 'attack', 'no_prefix': ' hit turnbased combat', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [<target>]\n\n '}¶search_index_entry = {'aliases': 'turnbased combat hit', 'category': 'general', 'key': 'attack', 'no_prefix': ' turnbased combat hit', 'tags': '', 'text': '\n Start or join combat.\n\n Usage:\n attack [<target>]\n\n '}¶
aliases = ['push', 'press button', 'press']¶
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
aliases = ['break lid', 'smash', 'smash lid']¶
search_index_entry = {'aliases': 'break lid smash smash lid', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash smash lid', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
aliases = ['push', 'press button', 'press']¶
search_index_entry = {'aliases': 'push press button press', 'category': 'general', 'key': 'push button', 'no_prefix': ' push press button press', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
aliases = ['ex', 'listen', 'l', 'examine', 'get', 'feel']¶
search_index_entry = {'aliases': 'ex listen l examine get feel', 'category': 'general', 'key': 'look', 'no_prefix': ' ex listen l examine get feel', '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 "}¶
aliases = ['light', 'burn']¶aliases = ['burn', 'light']¶
search_index_entry = {'aliases': 'light burn', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' light burn', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶search_index_entry = {'aliases': 'burn light', 'category': 'tutorialworld', 'key': 'on', 'no_prefix': ' burn light', 'tags': '', 'text': '\n Creates light where there was none. Something to burn.\n '}¶
aliases = ['pull', 'shiftroot', 'push', 'move']¶aliases = ['push', 'shiftroot', 'move', 'pull']¶
search_index_entry = {'aliases': 'pull shiftroot push move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' pull shiftroot push move', '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': '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 '}¶
aliases = ['kill', 'parry', 'fight', 'defend', 'bash', 'chop', 'pierce', 'thrust', 'stab', 'hit', 'slash']¶aliases = ['slash', 'kill', 'bash', 'pierce', 'fight', 'hit', 'parry', 'thrust', 'chop', 'stab', 'defend']¶
search_index_entry = {'aliases': 'kill parry fight defend bash chop pierce thrust stab hit slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' kill parry fight defend bash chop pierce thrust stab hit 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 kill bash pierce fight hit parry thrust chop stab defend', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' slash kill bash pierce fight hit parry thrust chop stab defend', '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 = ['search', 'feel', 'fiddle', 'l', 'feel around']¶aliases = ['search', 'feel around', 'l', 'fiddle', 'feel']¶
search_index_entry = {'aliases': 'search feel fiddle l feel around', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel fiddle l feel around', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry = {'aliases': 'search feel around l fiddle feel', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel around l fiddle feel', '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/tmpwybn10_t/5797b711dba38a0d6e8496c34db83637953bf703/evennia'¶directory = '/tmp/tmpkk33rwpf/61374b10ff59d2988cdf42ae6cdf11ccef487dd6/evennia'¶
directory = '/tmp/tmpwybn10_t/5797b711dba38a0d6e8496c34db83637953bf703/evennia/game_template'¶directory = '/tmp/tmpkk33rwpf/61374b10ff59d2988cdf42ae6cdf11ccef487dd6/evennia/game_template'¶
**kwargs – Passed on to announce_move_to and announce_move_from hooks. Exits will set -the “exit_obj” kwarg to themselves.
**kwargs – Passed on to all movement- and announcement hooks. Use in your game to let +hooks know about any special condition of the move (such as running or sneaking). +Exits will pass an “exit_obj” kwarg.
aliases = [':A', ':i', ':<', ':DD', ':r', ':p', ':q!', ':w', ':UU', ':dw', ':>', ':x', ':s', ':=', ':!', ':q', '::', ':dd', ':h', ':u', ':wq', ':S', ':', ':::', ':j', ':y', ':f', ':uu', ':echo', ':I', ':fd', ':fi']¶aliases = [':r', '::', ':p', ':dw', ':x', ':DD', ':j', ':fi', ':echo', ':>', ':fd', ':f', ':wq', ':!', ':s', ':y', ':=', ':h', ':w', ':uu', ':q!', ':<', ':u', ':', ':S', ':UU', ':dd', ':::', ':i', ':A', ':q', ':I']¶
search_index_entry = {'aliases': ':A :i :< :DD :r :p :q! :w :UU :dw :> :x :s := :! :q :: :dd :h :u :wq :S : ::: :j :y :f :uu :echo :I :fd :fi', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :A :i :< :DD :r :p :q! :w :UU :dw :> :x :s := :! :q :: :dd :h :u :wq :S : ::: :j :y :f :uu :echo :I :fd :fi', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':r :: :p :dw :x :DD :j :fi :echo :> :fd :f :wq :! :s :y := :h :w :uu :q! :< :u : :S :UU :dd ::: :i :A :q :I', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :r :: :p :dw :x :DD :j :fi :echo :> :fd :f :wq :! :s :y := :h :w :uu :q! :< :u : :S :UU :dd ::: :i :A :q :I', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['yes', 'n', 'y', 'no', 'abort', '__nomatch_command', 'a']¶
search_index_entry = {'aliases': 'yes n y no abort __nomatch_command a', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' yes n y no abort __nomatch_command a', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['abort', 'quit', 'next', 'n', 't', 'p', 'a', 'e', 'q', 'previous', 'end', 'top']¶aliases = ['abort', 'top', 'n', 'end', 'e', 'q', 't', 'next', 'previous', 'quit', 'p', 'a']¶
search_index_entry = {'aliases': 'abort quit next n t p a e q previous end top', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort quit next n t p a e q previous end top', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'abort top n end e q t next previous quit p a', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' abort top n end e q t next previous quit p a', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
@H&V`|`hw z`q1RRoJm`fWdrGdn3ULp=Vr;w2A3Iuu!Ms}GtaRUJlm(>X48^ip65H3Oqvj?!p4`M zMqC|x6Z0q6OkFp#@IS!4>Kk!|xQphl$M^z*XwQyeSFreWGDm2YaCXqxh8q@}X_c zC$?cldmaKFS>#pyEos63t?^li7-kw3N|cS` zl0~z}%^G2UMq9De>11F-m3$1Y*>f9nv3JB7E-W;wuwMKxYWX-FRf$Z4%2`Dz>4rhO z@W}>5n=s-bD$p+)GVrudQMxYPPg>QPon+bNi;vjtLaTh3A!bPz4gHI7X }A<5M{K_2l?MMnT>N;R2DDm#bMdHv>Lt`-GfWaY$0sN!ohf)C z*#v3)^E@S7xU{+= `5qRT0+eGM9`pWM_=pV@KDyV@j z{g(=5f $FiI1GkHeh0>LDCPNd7Xt*SvQZDVa@?;XEn~j@ANH!BU3L$o&`57*Ahmppp z)gqRatK7%O*lZlTvgkKStieJhpBjd#f^$Ua 4r vYZj|-3#cu-a#fL3F0bH!3+m*qOeqRC<|=RKIY&^Rcx?e z>eZz52EYgU0@pOWiQYbDJRxojV8Z0O;ngRdUAj{l8jepe%{ex^a{tJU<5!;K=y<&s zVQWlqV5z(>!A0tzx_sr)#m4gkU7TZ_Qj}Thv8Cf?wEUtNolrs}8*D08libPpire&m za$5m9sfAWO7;>c3!BdQ@CPz`pggBpe+!m{ s(a zBmpVH)xbKt{35?9d-lrohoPm$E+I`s`TcWY|5$+c&9a5 E z3(bjT^@Ko)knG%LV95c=;PNgc%P?8SlO@-VT)bglO!W^}f>u_CmM331K{s}Z{T&NW zD=^n$&b?NxJJQXVUGbuZy uJ0@&V|7;`r1f=SmEFafD*+pxq6X>Y;xf|7g-#n| z56vfD)7B7P&*}Zh<1-IUBN`_rRgKMN718vZR&2H{p#xFMm5^4fIhRj7WbhE2NF02m zLTw32PHs$MnYevoF-lX5KCRJ-nZ}2OUZ}-REOdZ{gCulk(p1b-PxsJ&wCfa%g&nwN z65a+O3Oh%P`dzrF7@o%JYfMTG*SHo$--Mq@_NKTeOF=Sw?XFwCs?i{pl;5$xDZtV$ z5f;u5%-}n}EAGh(z;#>_sh@d4V{TPTgA3$zR9VeI=abA=DRi>jrK##rGoc`Cu?!Bb zcbfNq5{owGbjd#0vq7nUB}%pYcM6nf{cjaVSoGeJs%nzBHgJfgV<^mq-#{2MZAvWW zJ{OM{tt#BWM*d1INLjNNLE#a|4hFK0;4FV-!HjHwWHA|wfxZP|=-|Q##M%?_Le8enuZo-ob&YAGPiACW1eeh%fbG>_Li_=}XUAcan+47A>h`}jA_S>)j zuZaBZ*MFoIA6|)OPN+|hD~mj0^ hU#pOQd>3EucSz~r{Q-L@ zh(>3v@L 9v7o{-x+-_C* z4Lq+{FzdFd$SgQoUT#5ySLRj2*M;kC4OwNuEf)6j*{w`}m?Yszb*v4ng*RS}fIHK9 z(dRfwzy;m1rn)P8*a=TlmL{=X%rEdhcSfh$B05u|Q)@yEF6$0?bSo=B&+}3#b{V>s zxL{xd`&Ie&uB>(~sh>#XIbR_*nDpQdnutj)`mn-D;!MdU@r>QDev0+1 TsDkP&7bSJLZM0>7M7Vr=puL-ED-*e+>CTf9 dB9yKTvSWq}xv zK^Xi_Ey!2$xUv|)VGx3Tr52%Twnc)?5SJX1%^-{jN-a@e9M*3B$YPM>x;P|n`0@_S z+M-B4iaa7LrBDz?N3=APe4A7gM(d5I13PvS!KW2WjqA#%GUNlTA}Blc;3lptHj%_h zrm6;i;g(KNb%4+Hj N39l$* z2hC#@xsA-w>IQZaZb>F0pgo4mD1UsGRu8fB?=dMh`-Z2_MR@Fk4HLTHb+kBw4dK#; zqX9gSe$9WR#GBKyUA%y^q2>$(_6$E$NYK=OTY@*%;3@cBQxh=lzbke*shjiRZUvEC z96!JwD%_Ey@$i;7!AHeuf{Z2jK84s|8Y$i#O=1_MlT^cGon~{calf^y@+XnY%I;?o zi8iM4ZC4Mor#~5-MCBi=g1wgN+le_Taqoh4CP^3AwiW_p_angjN7uKZs|7#MQ~DQw zqt6uhtJ7TpV=yU#o^tYqKO%ntU)d-2l>q!L=_T oFtYgCOahSIW4BJ*6@;(Y-vm(cK2=XnD}WtH!wLa^B>;?*?tH!J!h}A5+i8fO zI$(JC#WFW3 T`cnhi&wt>B(Hou6hU6)e1Yq@BvQZV zOKCe9*Ue@1#YmRdorL|gg%>TLo9?bTv&)+;f&IbywC(aki8qOVIg<{iBYQZ *)yuu_JWnFqoutK+g%dwT-L^^2L zw{7#4)Oc2bYNtUhITa<`KV4VS03esr$4LjB2uu0`gR#hIm`M9#WqsY1yB&pDGDl}H zRYu4Ky5giuF&a hhUffa969_d=1lc2gd6}M$o_K#0dEKeW> z79Tu;H}GK{2ke+JKGGE`?cv#A%=u)TPX>ILWi#iKP5G=+%0f((5WU~@cc?Zp_{huY z|0Rv4)6638%Ojp86_}KO@mbY8Fn<{ADp}ysVrD!lwyPjP-75*_n(0mUd@b~dd=Yx>++<{Y> z?nJhDnna2d?UBBgV8^;=t>FpEERk+T{ z2> ESN&WRGD=rO-EQbbV&8CB0Dz1qXo+1BR-dAR)PGo8Ln1wqH>l3L^I5cO9EIm zvaYW|S%GNAiL!|b8r*c`#R`Q5Jp?}Wj4!6)YiZ4XpW~~4l5~BC&&{6>Ioqkkeg$1? zo>+Rg_quxFEQk1#t;z9~YJB?*H?}De@H{ApWS>61&KMEw>CiXmiKVAR)>1yZsRb4% zCtBaC@+&SH&g@NUetm6Uok`f8!3C-g0mK!{?v(K?8Dz !b#XmDS%z>E0& z%`%Y?Dmf5`VH}BPj5u!tFR~A9RyP@=o{3B_VXLZDOOXz|^#M{Is^*qWS }jK~&lK4sbi-{^ktdi)uLN2xIYIUh8KawjaVpAMNQ7WnqD^L>3A!+R2)Zkj z8Q$R%HnG@mJP@3iQmOBo>P&m;t`W}W!58zkXxm4~L;HiWrVF*aI5uZ^`U9W0J+5A0 z=@Gwd@JgXD`^B!1(S$N$G_&uzM)=eRU(-kwG6|v?Bg$X#J$}DVS;3YGOyv )gN{cXe=|>{{gb7bXb8hve0CP zIYOQR;S34mKt>6(MoC_ NIze!qe E!8Ioh=!N_Ih zp6@Qhr43FleZh3YVhv^6k#5_TC+rA++3gTzO#rn>O+f3Cc&>y^GS)7d#Ax4k!)g)_ z=al69Zj7>Wfp(%Mpshu`!osImE0hi?ws&-zgO#r%Ct8o>v$h~A?@_U{?0S6AfG)c0 zuX(ZE;=KR9sLoGNENNiU@&G~^5Q387gv4Tn76qTmV9$+&Xfhy_aY7jqN?s6uM>;=e z=S1qud2|8}JFO@?^Er6BKdr3m5G3#E W&9BTD zxXm7 ~#WgKMSc~$$#;G_Qgu-5ohbl@OWy#cjy`6DZLDPOOLXsm{Hk%SqO*F zq^SAk`|Y`^NKXfX+oouDPh>T@vJAX@gr$Ho@B^1@#s!}55?pW_hH?>(v4IOabC_^h zt9+$h5>~xotALq#lBct4wWAp9R@qbxo4~M9A=0g-rD1EX1;^!3lSsXPZ(4X73LY`X z(+++C0s`*NN4hY;49B8-g7f`!IJu^WT|=Y (%rjzl-fjum;a 8? zyqXANFVt `v=9?xw;CRsPGl zq%-Q4bf@B>W*hmmt3I`5x4Q9qTCAgTk&L!Kl5+J_>Rfl6#T;73gK0-iz!SjvMHT zj1gR?XyleG+gIsZLYPlr9FUnwt+EXZUjE28s)rIz>0!L5tN0dwo=gSLWt0MNBQ-gK z;<~0%uTjtx;*fED3%LJf;jr-KJ~rEA0`| Y9^ItQwzQ+A4Y2ZwLG z!E_sK0CPHPBTrF(E!GzTi@)TB4{S2YW^{1)0=8Z_ANjfx@=> j&B-bp?g@JV0B z&`gwBySjDP7W 2#Klk9z1=(Mk)3C4)SQDVJtXyD5u2&75Y>jK?AE2=%ub*=9LcsQn ztSj%7*|k`I?6B{|qREv2_LDe$Te+@kIm#sj_O2}O#Tug0*$(nOHhp=|tTFaD!{Lu6 zJcaOX3}RM=+8C0dmsd;%cS%-I(72hct%?b^z)|MU8kQGty@x@4b~fJq^zoA4O|D@Z zD!X_a1BG2lXYQg(eD%I&*P=tra4j%R#4j+If`& r ze&FsaiN_c-&e|bH45(&+`-+gHDpUymNPjLYHU%^<0-dzH=G2pJ_um zBKb4@$gbH(IL6EI71-F}e;^|r2t85-`d)T*kc8O)8r`GyGqz9h0MjysPGB3kT%ch- zGuno(fQK&?>bBT^Mdv=ttHxB45$PY4kENJ@730gmXDEDNPpK=$neK-tJis?JcFSLR zQ!UIRpQ-i|$&2TuOob!lAh-YP)Nb+NbtQO^6)(KN)558XPs89x8I +OG^aXqm z#~zDdYcD$`#IB{ET>0rX9me2O?K~(@!P2Je*;SIj3vf=nGumK?Q}*nl2?Q)c4wr#x zQ2BQ}aK5Jt!E;LRI`VIoFgj;>Ps0{}iGc4#*3AxPO-+MuTj4Hn-{iX{r7(6z_(0`P zG y5UM4*o zE*Fm+&!(5l);-Yf9k-6r7aSP*6m4^^cge*wb7B%+@p!s8$JdUnFEpm$%J-G4H`L zB5CJ5Cj1G%GWN9ya7TMlQ3<*`Li&`T=ftmA2s7G&kY(T@h| FzyB-Pu)|SnOw0L zwhhM}Mr6mOy>|a7R0j39qn+r1pm}{lnT$NHA4Tb4L?$94Bw|M`KM1E`(ev1W4xh`i zV;l4!wQp&U8#&Y~bYVivOn(!9?Tbw?PpMxp%i#EJFfI07x$W0N&S-Po_>lL(T<5#6uJ=Yb8+m=`CY0Bp3MQJ7r1F}nE&9Lrz=F1ylI7lWJ>{mKeIqgtBYfI zSXX9XFqVymB# ?!Ff{#?F6K$qW z0SmJ6d#GcW;CdO}VOvSRQ}RF4k?$?IFHNN7hmx#TpGUMm!^cw8*XOo|!GD)x<}Zoy zr=%rq7QY-M&hql^2v5|1@{zJ Cjtw4TF(yTw zYNarh&(4w?2!aiOh|Y%SL{hUkH6?p2mhUU+r5v;1^Y%;jnMR839pR3yyS_Pb9j+pb zp3^0SW=w(2i5F5T(Hd~s4L1XWpU(&pYsv*Tp9$EdvMs;I)Z*ZO0MIw+=Dz_01yb!+ zmQBlY5EP Zam6RGqY1v3df z7{6vQ=qiu@M6any_6W3kz{8Sq$DAUpIPTl{y;elUI5^!%IR`ivU-3-k%soNCsR_ CTX?BXLOzJ!s4lI0jN+=B_XFtlckTyq*4V&S zCDHC)Z ~OZ;dI!qt@ILe5--ISaHi<8~*pH*%(e;Lf->&VVK1X*kYEFO!wqC6AOl z@~7eGB!#5XFGAa&PyFsCDeCiS1v$;U29FF7#jlEDR2mtff_JM(#3=I
`TM^9s!lsjJ zg)L7-nicjtC34NuH(z1Btw |Z8{l6{!&FW9_5B5dE{EqiQY*)*TgW5XhU=QY*3WPmz< zC%zo}%X57o%`&G1oCbGt)HYkPJGb~cHoq@Vb{S6-4Up{!)eS5W&>xX}o`v&hmiC*f z6i!wb8N~CqiNy;rL;NB!!AlWXf8lF@EI23M$~4<9BPku6z(W$)nc*{nyq-XG>{iT3 z#!m4eBko@c47cFT`YvY=7p4{1pDn+C<0#zR@Qa|Ly|A &huV+1|fhK34N+>bAC }rdq*gxMLQ h8xzgDLjsiB-7GoR&8%bfy4CjeUoI!+tf|nv30e zkyO~;3wj4YqoMd6wt*zOYdYNeTzY^o20NwwjDF)d`-}xFL_TpaEVmrf?6FToaWR|t zF_yWbU6D*gJ=gtBS2c^P{7fuxFTe;tQ@AX|J5>+W8CZ@K_arfX8>49%WDu8O+*0wr zohZqtsdx@vuSE2?+TA68sdnUB-xlD9Wml%Icw^G9;49-_3qkL}x%1TLc#3`1i3Aot zKVsCxp?Tzv>PR;5j6?28`^cWTOe)WW_G{8-!{ 9+NMLZ!?X+dyEK^MN6pVAyu%iKQqoJ3~$XVS7<(cr<_QYw7O * zyEs!<49`E@llH!(-PV%X)tD4Fe1+55KX358qR#}k$gc4P^6y@KD~@;(jE+0sFU5_o z SabCu|}mV$6j`XXZi@eWi6-09ZvD&%CV_yMS>T)&)`dn-_( zj_HcJiC;_L;uQIpp{k| UbjTH&! q3+1Qc+K$AAHvSkR``-k7X^TqQ^9@htX3qdQQbz&cPy4CZ;eatny6 zxLXH|q%d!Xi%OJS4&)Y(NCR3e@z*SDz#laz3HaR9ns#(FBtJI0^J3p33VtnhZoo}@ zQTSqkOC)FpKSiga-zKmjQ6 U;di@M8he=5%U* zz{y=#+zTI{59ttVsefRB84E<$p$`irfChsOQg)>1@6utP(EUU|(c21sroekgQe4Q= zAr_P+<~O8R*eUXE75lBUh$Yoe>;t>O1W3WGfIVlM9 x)V ;r>4dhpmH6IcGvHqh=cxZ0 zenRdhrJRue>xSD&e1;2Gp9!;nHzT{HXyeYsJ)wu4i~E7a1L}XxnK8)&+)R5Q{8{VW z3KCe^Ehw44Jima8oOy@0)ww&k+x#S!P(BsNLW9+u3%DDav1sm2?lwC)mrFLf;&!VM zxS#r6&@D{X5sE*I4qL~v5hoI5N}AOVyvYXNi(ms$V3J(_W5Te9{^t6B{k!FQ2D<0A zN(~iA0?3~~y>r3SxBI_@_up<(O8@ 72A^`E}4>Oj;sWG%)*-2h#3R^~j_Wd;jy*8?Rb_KO~&jdWbWNtmH%k zyM5Vq@C*hy< 5+iY7G)*BB6&Y+rGRPP7G ex-E$SZ=`e~W9Upsjd8= 7vmrJS z*O0zcld=N|+#$< ?)v6f{#|tSs1v4=ynC$s;#;^ZZjzTn682i^ zkR)SC+{kyd_o$i^{Q~u{>xNx0SUr`OG8DAQE-iYrMzudXp1V8GZgGmqKqj`2sL40h zj>C~CS%0EGv5|Xlq*Dk|_n=U?>Vl?&>^Y)S@lXeYuv7bgcNPuh^zSkr0Ion$zlXMe z#{@dGZBr2_YP?QOCu!2o*W6+2vdp_~B~>O;`2s-KyyvpwR(OLKkM53;-l;VsKpW8? zcogkJ2G<}M6@r>lrPIo)TYyoLxa2 BgaRl1|w#!=)ZthKIJGb(T&Gj^$$fMv`zfh}Hs($drf> zywZLTs}3^+A@?-LaRFirQE3{;Dm7Y|yt@C9MlDBeHttyhf16R&8>A0i~Lhg_6gIbo^tlp0$%RjQ4_hBo&n8NcP@!Usbq^DW>5rPHQbhtP@ z799*^kZu7ce=RxKk;bcB?=cWN@KB6H- T9SZuh{$9_5Z;o^r|0Y@ z%XXLt#AEj%e_fLKI)L4qk%2-c{FB4+0=q(;e Z*ERQsMsI^Nryw*VL) BInfp>ZNHGssvXH-2 7ZQ4E (p|M(-oUXY$oRTvuWIGmMYJ`v}iFCV|Q*=|EzP9^S{cIi7lF zBWB4)!{$)2Sfq` tuuDUmk~yVRw7*efQ^CrV2PO)tfY}r&M4)K5}bT; zN|x7F><~Q(rxWDi?h(9kp`lfMsE9|ie=uS<()vsnn&9#a?Drr-l<|u(L|8ND*X5BI zOID`fvkcg526^!ed0SMZ-W4r-`3%XN$aF0+P{3|MG!z=MD?37buobAckx6m6iLFce|CKV znRaQ=&Z%keibOt$x4ee&mxOr+_Vga`#Tw=h*^k`PYTc0@_sPyDMMHRSwM5-PRIga# z?0i!64~H3H>Q{KOCKOq*9ds15toiv?Xw*SVXNB;R8XW3aJN*eLUFK^gEMs9|?7>Yf z7Y`I4)^~Z*(|`oew_I%^*$8)Mf3vflq+or!F!N;Q5Hv}C-Te0JKRN?hG(Zq0qCL-R zmVClZlU3N8N+1@-J3>yhuQxr(qvfdNc}ag}FH7Yy9Ssk5 9a>v#RqcRm0 _6g12C <4+73cPgdb#p zMB}HVtzeXvfWok1M`2=M*~l%`n|yKz-IO48%Yz~gpk`w7f7K%JeZqi_9}}^Hq%%*_ z3jdT95uU;b;}L_@LGcxj#`QOk#`y|H`(c*zoEUgAvz#t@F%@UvXbi$fY}-uN3c^h6 z9Y0V<>yG}8Xr{jwki4@Q>WK02atA;?A>L;V6-|AvTvEJjnwC;5dabi7U9!<3HG2Hr zDm40r`SpRdf02!u(pRD9aD@h(-=Mc3 ;i+@LO$#3yj?glZYA&~G; zMB`KkUi*eR$L-iV0yexP6p@h(-XI?$G7;gz1viJ#e=Ynjw0f#JubWK#o-usMPEA3N zV3wZ0=Z^{)`VUQV){lT&2s&o(9_!**ZsEBAm|f|WuOp()GVt1PaXJ~-bq+9EN^)WW z{rh_i^99DgSk{?o0O9mnp5?1$*Accqr!PJt6WVe4-7DdM@TdGCBLB`V`0Vk*F*L zCkKg8e;YX&Z?tgeP~^NKB5~N>b@wl3xE6{Dsy*I-Xv^JFm~%RKje>^YMs^4!=CzBL zO(dK#4d&^K7wHVfPaiMycW6y3=9h- p^7ypTIIm1 iJ%E84>uCl!Byx(ip5AoLd8#Gc^Hx!h{{!Wn7zBTIHz_UDvb zeCc|j&!r%s Cq!(Io{oQY!qDMHRA+F3D7biL-hpM^t zUNGr_Oi8@P?=To(&b|!Agu*-c48tIAK@Y_mfkQ(@T$~>2ix-{~4-@9JN>#)rihG67 zM043hV*tmnS*`o{ ydn!;AcgUNw%=FhY_~pm5Z%a0pe~Do# zGhc~cUQBUTsovsSRPim;&_l3#6HrFI@B`YkU*(f1V!LP=SUbhfESecii=C*j);s3V zw?=n{K}b2BF+LVJM>Sl1e4`w*o8}3#)NH08udOLJCix-Co9Q9DnG|df!OL{~T;6Zb z)&NOQ=?8e~PRME6&ebCmq?n2ee{ddGfGPK>xMdE~qfpMM=2Nl)Eh|Nu;yI+qh7_Lo z@j#copi65=(;8i_I5BG};i0g6_Ll|vBV(r|$~9b8c^sA>Zk#T<$?C1b0;NBoz2UCt z3pkivB!(YpMF5@(HiRG*oCDtl3De_FPf0uKs-iR61A$l0 3J4VyK`r8IhalWy0fL-h!2i~h_V}m2{69-zn~8FWe_-%o z7V)1vDhTy?6gMbn31}nDe eJHA0sQUZi#m2WXY6$(#M{v{=y}G%{GiB_zy5r(xLtL@(U7?qjt{ROm`>IecdQmv z6)iG28Kg6bde=NaQ>NuiJKe*%be${e;5q1Bi1_R?i_ds`hVgE|f7^-_H5?A{bE0q! z&M90%2%IX35H}1VRndOScjQE9`>3}i2}ffj^p@*|rq0v|Z)`Y+QCeICDwV`r86?_a z5E8#Z$BIOdP>>i$mMN0SsUpm8aH5aSf`zlQP;6dACx@0IQO0cGSt2+7;lPZS2fLR* zJHcSo7E%FS?Pqudf0r&mUhVhj63f!3Pm+#Ii+EgiBwa`6o*nZk_DN?XG9@!~?+-ji z5MkcS+?FdkU>-EXq2n1v(Un`~z#5-nkakZ7t(o$S?{BgL4oJrQenT?7X_Jv2=&|pM z?XVGmbpwMOw>5mAdJw-5DcE8a>fb-JB=egb9?}fH?C`C1f3wGDPXV;_248ruWneH$ zN)I-*if$>qfzT!U%J3@;kjMQ5KR_cwhARnPfY2-nP5sERXumE~)12C+49a*=7(QVD zOs5lYLW Ne8mTp Txe0vw$gnAuO9#Q>;HlH z-+uicI30hGH@h%NkPM1(0%&U2(234@zt3|Slwia#F`2SZ>>;3Jc1?!qvYZVeP N|b)>xqhpb);9XpsQsVn>zbJMUYf52ZP&H1>q1lE)kf8;dd-(j%8 zFog7{=7F>+DxsDh*q8jX2#u;-{X7xA<1(HT#$t97_ntR?Cbv0zBJiR7T52Y$;{@u{ zn3#c1k K7Cm0bH7zW zWtFf&kb5#XRXUZY008s6%7zZku4tH )e^?&as>@&RnyliP@*&8~S+tF)GS_An z Tlt5{WpERJ>BbG} z=e}*=5frus!`>MS0b{2%QqhkPn|-9Q;C+bBMZWbxNO2d p$Y`u}E6A98{HP_)SzyB8y?14W ~k7jS0TIqSc{M=0++r)5sIUr$Y0_X~ljlvGSvPMf=k+4v*G&LSET z=4QV!+?y{n64wxJV=eQ`-8; 8 z^4)*a`Fa!C9u_b|(f_o`O0@y)G9@pw%Mf|9mzXyz{F)dd`*W^rxAAFcf8U_57URR3 z9s;|_qG*5KsC#*QD%&^c5@xTwvS|}Sjyg-*>p(~$BL}hYb_>(drI?V0LII|=;YjF$ zJk{dGNGfbG3G>nXTJ^ (;J+QyuqtaGWazT}xV>gS#ME33|eP^{pp^BhF8+ zuCDWok8ch7(I@7Qw~IJze^?Ng(Kt7&@lu#dz$TJLg;+3X=?qI)ssR?}2Wqe?phHB9 z`@M#feitk~rNJx#&KG%TAT(ULg9|QPg^_+4ycsnK5f}R4(2K`-!bBhZZ1cQ0`JF*n zfm-NY4slTLOk2ceuw)d|!W~P>BMPU1)RGobQ<@eNXcr *aFwsW3XZCdwB zY!GyGCdQr+<_C%yWnz6@*f#Z)m}Mu{`cB(6-;nCWy}G&v6{hY)_h5?xf@WH{iTncf18-Zg+g6|*|;`}!VhnQ0>0U~KgBqAgT zigj e+*Xk!uO$V{op{Lk{G$@oJ{piIPfwYzYB7piwwH(I(H@y5OzF9 zQg3)fCL=P8@WEFRxL8RDT$_W7y%D%(B;Ju8Ps3;!+`EG?A1LC?!FtSOhB3 ^Y#Z@PSF1H_i5xUsmPE$gUU 1y%fbQ4K 4cz6ck84vdX z2dknxh~wV+oog&JIwL8cq5JxQ5bQ >%B+$WRiFC=Rl#^@5?Qi z(TbMff378#EFXB3Y(<(1)68cnDshbcfb$KRg$^R^j?R$U{!ubz=I {o1!Pt#gQHgn=L&9O_Sg?ZHM_1rgxz!w~xFm9uQ+A~V(jRDrz8I3& ze-R6dLa|pH4pL7+SSDVop>`;ED0usb`<_x>^a2rt$3h0SQS%=jb39oT>OyiFWUt%e zMDEL)*n4T2%-v7Rq&9BTF6J uh=GRM(S*P;b`A^RdC*LvP4(?*5uU5HBoMlr zp0ZCa^Zp^jsM|;UtHJ#C)1|$p(FE=~e?}AOX;14_*=}8O3x>0NYAtdxG?sE804tqn zjVNVF=>*jZ3C>1CsR=Z_vkrW^y0X^+n!sHLXd*rBX&q>%9;(d@XZh4R;9_VjyFdU| zI?) +iUNFr=<=&I)Jq@J8b)Iyv6#rjmXzr@*?~lVjBMqk9{aM;pawBw z@1mtN44%)>IGUzov*4G)y^yAH%o2%vVk`n)D&Y}ky5h#}@v-}*Iu>nN>~5tU9!_CF zNb90m4`ZO3JITVO-uI7Je|`7-e?269`9n5J3YBKMoHht@U({Q&%TG<$A6f#;&)~}k zPLP|PSl87?G5ly=@O0TnmX1o3{S4`{?>=Edeni|%1;5wB6`sE4pi#0cjxn8%oqXZAev z;)>h4ve|V(Y^Ql~b67Ul&dxZpnk(6SD=WM)!iKo$N--fJRsBhXhZOWcEK&zr0t1wA zy~MQPdF}xLW$kXkJX^jafBWKG^+C+1c{#)EJ02hhtf~aB&R6HtscHKhpBkG_O6H09 zqy!@}9)S;)ndvgWpcs5;OZ^1hz-W|@GxcWH@!(jdqx``VmtA)zc~7dEt}N 3qc_O*=lxr-!xCIF^Okk$Z z)}HW29NcC`ADu0}8!)>NZ|80%a)B?9MK{e_p&phtVfle7-PkbfOD)+nm^4tz)w*_m61Cdw)j xIC!fVp6yAZ$A?7I6Y73y(=$C_20s8S4$p zn!9 0~?`yv7Py>zJE!TGg_25D2t@*yMOG~FSlhkTOZU$${ z{*i^xOvp!+ema!(H)EZ{*m;fn>Gj*6{u5`gvQq&+e`;4(?=-}xRS>)=eZ$GI?7i?& zDeHJO0P&@@2=5L$A)5X`dOuKVhL=tK+pquVvmf#EcLo*|qi|@&oo`{)8oCNEzD_Ds zM&T1n`1peADH9mb@uiq|p(yG3qHItu*EutVX3jol^=+PpUy9}Bg|5gj+(=YCFp{3% zAIiTMe|pO+14knXaZ)5*# jtZ74!aU{Pg2%eCx%Nx8tD~Zwxe|P^wT24248Y)jGALCBK|Y=;H%Rew_8A`sH9M z=JHWRFwHEc`hLpq+lF=vq`PaH-mp()W *yd@qFMidg9eK;lb*cV ze}%TDXZ8dwomqHv8VYkeA?5Y1OCAaLD=^ZIk6*2ojt Ms$!bICU0&mxzj->8`kVcS)O%s`gIi|w; zHz{5vi&Mf{-gZE~xXHnE7SUXM=!wpA0FGNFyqr855ZeSBo~+#EpvnG@_Kb(9D&s}) z3KGeAEi6rFqKqfv= Yv%P~a z!Pvs=SZu>tshQpvTMstf`FJeaM}HO~!xj5$A$?!AJzYDI`re 1Yrc@;gkd1%4enYq12rpR zl6t-@^_hfDiJ(ay*?wh115Vpp0t1wLUZKNdB!=GW*x2$(3HOEA)cZ5Il7fx>s$til zpyRQ;>*0;qkM^ZV2B!rgS@s?6=ti%BeD5idnkNrkiD>1pQcO@ySnrzzf2y7o>(C>? z(E_R9BpD7u>GbSe?;@dT2)z?waGIK7m?tb4Mv`buM+nBHIBgAs1GiP&7iAUM;0?6? zri@wGDPpiEJ~5^wQJsmH7^pl{`19$|7CYBK#Z&P|!106IS&(lf^FdHLHW390W$X9; zU;gbcU`zhTe{qVh0#NejfB%*<3i-dtdGh_gJo~q2e*weuKR)}He|A7Q3t8|ME|(>& z=N&=wpto3k0}u6>yDD#6pGlelu8!1zR6Qf-vECquh1u+dWPf;LA_K5tMF$TfYc{ym zSDJ(yxcSp=hMjRkR{2B|cuxC?Jm8UokvZGO)j!T;<~zwHwtwZDe@s?xUKMvfw7L!g z+?RXi^li6#rnFmfpsj(f+U5Du{Fo <&|K2Eu|4dV$ zRB|}xkcwH4ICAg$=5+EHL`Eh(v&^4lIBqpu@o)nKUz5W*e{D{SP2r3)Zk>o%{ruaq zCLh~i!8c3otr)!@e{ 1;5?o+I|8^@b&rP>0=8*sT}Ie?0NRk(c}On;WZ!&J@ z&k(RAW3MtMjI0Y}Mw#9DZ~#A4Gsnv=fF>dW9gk=4A`I~cX!A46Xbt+2nxBaJ>k)l> zl6u=do;=&kD2MO_`igy c73ye*Pfl0%@jT=pK9-|x{T^YMx zbuyjuX&5LOf7o5DlX7@BB`; e+P;1$R?zT`Vv!a zZOeX`r( 47t_)0= zF`6HBo|YM{8R+3F5$vjt7fmHSxH)A%Ewn=_g_0g Ym$J?wAcg@ zrotJsb=OlHU0|2~qz6N7Xii(w87`LUIQx>5SJy={#o#-W$;_zv<2+)h^+h+y#-Hio zpJr~fe~TaoyyImYleFxn`F@n&>d>TN__buiIPS{AMk5`39=+L)a_2Jpf3V=}JKWWM z4ttdl{=FGSOK#2Ed|K8+j!)v3jlAVPnt{B?@o93~OiNx|X!R#Aa>&cDX7X%Z2Fp-> z%fy?_JZC_Am5X4Dd6t>0n(<03o5!|UdY=8cf8!VG_e}`PQNAnu=2z|ajg6ssXTZRT zXP7Mib+jMrzWA1twr$!j-!Y@}3XTdL)+u_%UevBIRmM_fEL8@nH1;P~aDA=pAM=lR zSSdWljynB$8s6{o@azrVI0Hq?6h`v$sb_Ay)pd6`3)Shsz*wIjpI7E)Uo;S>vsM(l zf3hoXtC8w< lx0^4Dh<7SPVgm5r543=nQAgP*l}}{eYO*@FSZ1XPpJ6V|1$Fv z^E}2Sgg B2=CmZ)@e=HR71eOVF*o0- zHeoT-Vx)fV2s@`@@xu+t>^Zx@Cy^@mC?iZ?f{sw}=>yCCl#yml`MeZ9?6UwU zuz135l9e><)Y~^f#z2gO@(CrjIfDt|!YXvLEa7uVINSPA!Frd}WJ!+6uk ymGP4Dxg%+V(^8b&ulB%pHDmH=i0cH zFij!MCRpfXnJ`NXx@8j*t|B_7J1o<+4DD3jvI&fgWHW)0O|d^RgN I%NfuEpv66%mP>Wz$MV4X{mvhOl?qz! z!}>s$$PoGBpMI`O*s6v_e;gUz{2WDymyO1OptV_c33yIml6sWjp9=Pv8M;Qgh4ZOQ zyBSZ1#=b3Y&!~i#%~m`q#hyk(k4u e=?VV|!w)lj@LEf6qWk;NrD$;n1qkgk-8s9nl!Dr=sor^ukh_)xzQ(j5ZDoPMs(y zY%1X-BXEi*?H$^n$;_&N=jtsPH#WXb4G7LQ@qt(buz*%Fq_(QTRsDt}8xKrAy76r^ z3h5~9%2N|oRk0r?CGm$PY*{x}-VT*0+|A11 Q!bL+n)Th*1jh&SkZm+ywT@;8HM8=Er^GhtE@~DnhqH1%rj6 zup#Rvw5uFve{(2xoHzu}#*yyJO?W@5f$r4yL`x|p9lLQ4(EZ?Y-Ans2c^E2p2^jp) zhl}7_3IoHmGIzAsnfSO1$mUlHJaGsfcL}J#gY>UL_tm~&mQvDlT{VXT*_FY{A9DKX ze@Gt)%v}l-A%Y5GB8G2SC@hl+P6Pa>E|}V-c}U~Ie{|!4$y2Ekm0OWWdI|OesY%N( zkou^Mr*|lgr}ARG@xtb(Iu)H$d4l{hDeg#h@?Q PtDknKXr1a+ z*(8yye<#Nf-O}W4wbDdBd^bM0y!9xM`KS -FosdVCrI1BNOg{MW%5m&va zl9WFt>zTfqMl0<6&|Hn!7 wg9KG3E0`}wi$|U>AM(M^y!&$wyjRwZV>alKIjjhE(=Lx3 z{srfpO8Sa4?|pnUxtbolH4ra*gw*Le7;&_8b0qaSs6vi%dep{I`aodGU@iikPy|P{ z5^2ATvwj)G_pfO#1$b3GTWLI%0>k@Ee@*`2GWYB;G?~K6IHm(N$rn+i9^L42y##4w zkuKu2khBBaHdWK!9E #zz>?nO8uw*b7flerbqmE(PFXOCVM&kQdIhO*w zDxj@2o=Sn?J*y^vaG87dAeu~JWgOG9n&gWpQjeZ>xn6=avPc(kT1ec19ZyY7f9l{m zE3$c2RgpLZ&+s!Anfw`qarhaB)>(ZF0)|u~gNUAWNdsVA-Ry4nC8>6?<;bl_Jj+ zgVVnRRl%alPZce+^aS%YHA22^iQ>vAqVNU^VdXdEiv;XniW4ED3UVT5Xjv){R#wnm zQ|)Y4l|H${N|NP?0O? lKkj# *y z6)m*f1oJgD(v^q0sG_@0o;|GOc%~Sf{w1dh7FBYpXrU!1n6Igkm{r_3b6BZ)uT#c3 z{7Wou;ieHOw6wgIZ1H;V*1&?nAzbQ&>!EYkH^&=rH`bTOu#?nDUY{B{f6fsMFDcx` z@RN( IDyE~9o>r+5eXEW_M1An>U3A$(%RZ{ZHOd)P%syRj z5)B3FW}#MM^^v&iBgdkwZmQ-`h8dA4`8=wyk~#>|Gx7dUQ{QykmXN>|yq#1Sa1DW_ zvN&oSX8tnE{bi&I{~G9_e+;h*=_sEk(`SmR8(od#tF-bvr2N&71qDA9IJm@Bt*@`F z@KJV_JFr|m$BtQ+kg|*!RrPWO7oW#yx=b4ZdRU-=7}*mJQHN&N^x)qboS=rC?2NN| zRL*gRP;6L&H$C~*|LOL2+w8~^uv1#W=w}obi{q$nn%rMz+VHP}e?I!~s+O)odU~DG zPvvo@B^5+cimVWCg%PPiL57E_Pfb^uAOw?g4>MNF1>F6FJS>KSNTZruu z;x(6~A6U=@#Mjx#hM%a(FK_K}4Lw?4L0Vd-n@EkMofnlg?26o+9{al{Y{59n=~1Ic z=>vg1+ZI)ITWr5Nf88#IQVIn=&A(6(M|ER)zu2_kU;W&A@T!gWf_XwsI{g=TlL)T_ z`a84U`2vgG Wzc;*^njmSvKiAtOg*y-lF5V$)Jo2z2o=6;9$P<|(idg~j zBns=cZF%aKlryIgT*y3MB;c^(Ri%tATUE}8f)x $!Ri$6=lpW zrAfYsV)WRlOre*@6WLaUd~i9kAO|Yp#X00%06ws2CsIcj@I-F=y=s;>XL)lK!_%ni z+?UmoQpWtj<%_wZpoW#{AYE)}4)R4bSH^y2y##4wkuCyj^BN1nmcZ-1Q5BYF^{=Zu zLnyXq!I!T!fBAz^KJ&Y7smbJ7e`eAJ*P@wxAuVdees#ShsAjR%?OANK<9`E-Q O-NyK%-~*BLd-#BWyl9$`#l! z7R>bLGR8Ct|GEAm<%FqanL;8}k#@9(0U^RdYRKkMe`|-tA$XQr_E{+fp^macvu1Zx zGsv6Hs?V(muUcp?nI}@^^6DB{b7L#<@H3#ymEZAYJrUHtRDr}fCRTo~t()*+bDBA< z2t7xHX^wz`iy0=hGI^Jl$GEse1OBqdOC2I_!hz=e?FRi)-oO(HVYP6S)u#@QGK6AF z2z4Ryf3$+Q>el(&7nb^q%smPSt#M9O_zi>BvUx&fM)aN<0^xPQw-3?e3N7)d?$jh? zOzHact_idgsF!6LiPS~f9`0P1?$<2r`8;Z_k~#=dMBAF>4uj`gZ)RB>RYxzBf8EiG z 1d+Ev)P-@ ^Z0b-k~u&4f?L}^~5zax8S8JmYZN1l*UfAyRJ z_=px>j`}%3QjG-YVu==_ ?LiSoPiRiY4O{t>F+!q3(#ir zs8=GXKaz!zBCst1>8KBSq5P|ce_kxFS~6$7nli$Br*YPhvhr-L ej}rX{hDft>C;AegG$c3L60(cmsnhX zHWw$bq`W${SQYpRA1!vc!09@Yw%GT &(w@t_SYl zi?6(_bEJAXVY3t}Bux($f2m$h*u+3}v^Z^5SuBZH3!JfDzlw$Vi13j#%sqqyUQ4#+ ziF9d@31Xkv-vB)1TX8&9;2vOr6Wn`Dh=g<^ldSQ`eJelD_T^?_0qA57YYS7=KefUH z-*ZQH*}iGB?nJ68+ZNrD&Oxge{*eQ#oU+Q1RW4Y4vLaa^V)xLrf4fX}I( Qn`?R zF8gw%e>LYBAVI{mc9b=w?fK5=M(KUqS=5wvE=pLF@|n;^O7AImti-{xrkX$=NWG&g z`SWd1rIWcl>YGd(0A?|)D1Zy0I;x0CIRDyW63?sR=-98Rmhhfzk~gU2JX`Z5gLjF= z^kzD70!zxHKZ{p^f3NV-VuuTytRsPkxq|8*WbmkPkj#&JB!mDQp 4JqGPx-ecHa z ve@Xfvkd z^QlKe>L5r-;6+1C0^3zlEW!rV9gDbr)yV*3eN{#DVAI@zf2Hc%%BNWZN;0Z<(~1>b zdOm&KB4zliVSxf-L{HcSoz8#%dlk4f$n$tqMxN3e#v(Yuu%h8PDuzxN|H`2g$E$)& z*{-94@Lp_`GoW-l8|)~#XUW9$T5~aiO2wnMiWA&V zLd+jrgqSM|YFH5t(#00xAYVigGWKihr3}6_s>vT*gr(o*Qcb3?A}syx>3Yc*QG})T zK5uHh9E-!Ejui6;7a`_~f*MwYgLJV)ILH@KgpB>#e|l+)`al*GA?6P*Ld+EfHLM5+ z>0*m;kT0SL8T)nh5 8YN 0R=INj{Z?o<_zUNvf-%~GM}i9_%tgt!oOdO o}PBDcB{AG`qI-=4p@1tm< z+jCj%JkIjR$t_iGNaVwJ0fay_@xV5LGPuj%EQP+x4~dkYsRj1$h^CqR^zUeP)07*3 zyg>?gbuWspE!|3tTpOP@7$l326!ERJE8()iu4(+5=8)V{ABIFed>23nL=z8e6DWhb ze}K(WSO*9_%fxc~cM{V~e#PKuOw*Jbf4o6@_gtFI7$p;L;rX!b!sA|Y*z3BL>}zYOR-3fF+&UdkF}ts`$)XU9jFi$3okPh?va zT}Qg-5Y;_9Jua0Io`gl}xk5ch>N%xue`g*l$Z*ScvmCeK{_Z9WRNc_NWHB0~lKq6V zeE0`+|KmJf4a?O#juSc?R8Zfqf$Q0hY(0OlXfC0G#qk#;y8nH^d1OsGznU>5w^WKD zkq_U1dO6MHg~3&P)07*3yza8pBDNOkj8QuA;>$X)*h6c;@N=_0cYSj#J72F0e|Dh1 zACtROze14(YIhNA&kCZjT(3m ~`J zT6UqJ&s}jypgKn8XZYU-!N#Yn4+0cWE91w6Z;yZXKKtfrE!`1M;biCi!lE{l8-V?_ zKyAv6KVEk!Y7tw@a>gi;cxq4Lf2(Jn$3xA;)vZhtZoIMj>sUqWrDDM*jbv4EuD5sF zV^|ZCxjd9C(*}Uq1Yq`8^%%96vIkbFWIVM^-@qa@tn(PMd8m9y9D-*Pg4s>Y~zX1U%#G z-vZ^y!%%q??-x~oK%J=~_?Na|xR%UNf}91Nd!Cxw^T8vBc*QAa-?>8dy^fa;-td)- z_lm}UWyAk&ys?HTa6s!>e>E7JWRiKC3{Ud-DcEkWI7zti#u}txKP${Bn &H<>2US3MeGqWSFhyx(^|lrf=^K8v<sI^kKmH9$Rr4B>1km6UJ%KP9En^EM1SzaF=#uOJInfmf2W!^9;FZr!BCMW zq?eagm|tWa(l9^B6ZTZha{m~uBFOt5|M)QL%k9@VR+#ge{^!M}Ee{7DBQh-~p81;n z_2GB!(6j6v$?l4JSH*HhGC3ua3o<`T!f#lJ15JlJTY nR#;DNVd+R7&HDoW_;<##4U6vcS{8r2rt!5ppml%W}s#Bm_3eh zaeS5G(ZR{Pe;XZAJ1U;NyBLyeJTUpm?bit^q!(b{So;V+ygo?7dyzX*RQ=t}ZQ->d z7*d;yb4c?~K4hZ#2SJHOwK1psq9pwyC2$s|Sq59_>Q$ChXzxZn&Er)7_C_*I=u~?^ zYuCc{)U~ tLo@eBWN;nC7_WufBNw6W?Pk{?tNJeIjmfjbe;e< zmLy+Pkj_%lz_gXrL=Wi%YECe5D5Q?Ej`Z-9RF{2M?z6h-vqMQ^{s7y=9m#fNUz{si z<%^c!18(2Piz`?Qfpft+FZVg+oFnHP8Rvp=P8s9Fa@hxg{8c1!r;6&+Hl)VU p|gIXv1vGK 1P9Yme`SNayo X7^ zhW|bJg _3#<-QK)=XtBq#x-X&t_OM{ z2u^K7yTiU*ibA1-NIuH%5HuZYJNP@u*3$&5V{LUr@LJ)7zg@ R3_BVjbyZ)%d^{}f8XBG z>c1sj=QbNO<#S+|qz-~4O@T1@X4~vYG|D-tFyI;jOJ&)F=KaDle;G7kt(&2`n3;4* z0{NJLwCcj(9ML?L9ydYtIZi*e25n@Qss%K=$Njn9!Ym}9BN%0K)@(I#2%a?P;<2Ve zzKNIDw?;W6_NZPKAnU8kYq!Iie>tpR%{vIz9Gh@?q6*NxU1Ddvni@7CJxP@45ke>G zddPjTqmf{6?q3s?Os*QJB=tw~tSIBa6lDM&nmP#5CJ4J{J 6{N-CwA;4j zDWr!oQ3xp%HD4rP{*GElc691 Wap`{xu-2YG9yDi6!WZ8o6mw(6sNPlie zd(tT9#{hleNS~DV7Ubzj|9Ps#8XD2jh(sd{jiAo|!wHcue7}x$ZF<3BNcgtzCLHi^ zJ(QcfBi=&;Bk7$pEEmhp6O2BYkzJCu^XSIDB49}*|KG(&4{cX(k4aYqNKaHWTc$QG zIaLG~r=^Nw;%lmT_*?o$F3wr_y?$)#ce?vPGXmqgc|)f_R6komZu&y zPE9&$lCCgMkI%vs6ER9pE+GDFy;WEq!4fSB1b26LcXxuj26uOdK#;-RgWHcg1b24` zZo%E%0t7wmz3=(%!@aNbFxAsjUA?NSdM!&w;}pa)7e)m}sDxzWar=x_!J*xsQQJui zSrTk)P+TY z$$KfKYiW(||4^dQnjJ3*Ko z+eS7xd5d!MVv^;+@ %M7mgOBf8u24a zWa;3b%U5p~yclI!@qP}5e4TT`{O9tolDnka)XcO555uthCY{Gd{|P!4&PmC1|E1%h zmepj2lgea<^qXETemoRhp=nYoYs~$cguk|7B(B;Ss`xHUGTM3NuWxS25@88d$!koQ z*(@=8LB3qk7J%*pJLN0U>z5BBmK TKZrtFifGm-8)j};9yIPJjl8syfPEN5 zMWM-k2gSE@oG4UEfPECUaMNAtwtuVI3pd*Do4_l@U8kS$Jc5X~TF}Wmi2;oc8Z;V- z(VaBL21-0{Wu_)P#iB@f1});BcQusppMH=}6R}ydOX{RwmKVaQ&qI~_FTh4~twzra zTC5*LW;gqCT1M4#4q=4Tm6XV qIKo6 z<0gd-+Pb>&!pVvYl~+R8 YG0@O nFB-L z0L3P{Q<|uX{tk4l+4kKztNfXT5U;2f3))kbZw=9W$RoCxKR6omZsg*$niO_!Z13`h zXf`Ns8$qqSVGVJ=hqe~@Y;pjO`J(;kvOm-P(lk1@mBYj-gBtLSws8@D=ACK7ynHpv z>JitK3yKB`9mcsFUuk52XwDuvEV%5V0jM@#xdw_e?`kJ$HfSGYZkAi6_GwEydfKuc zE+%(5i<=`OWtox=s3<`Z6ZPg8v$9God2gP~GKMFXEy@bzt)YgVg&~-Fwda! Ngs))B{ERz;d%OiPh;*x%6V( `CfzVDb`u9h)_NDRX!4`f*(DPJ-<>MN~ub^5BS>cinfr zl)n$n6=$u!WWg`>A&8g*9r|LKsl^qyoNs6+XHkJ7 a2!IY9LWNOm;MFw2@ zT9Yc5{2n2OtT>7>zI@i`oQ7lbw0br7C&@=jmCEW3$_=>E<{9a{FC1#4z~8M^6F87& zrHx#Dn6UKHb)9Vb{f37$6;qS1(GG m1ItH0v$VU2Vd_= zL_DT1fD~ii-<9Ft=-6YouHUzn<3=U+;gsE9bq00@oc4l3(8nz^68Q6Z7O(}`Et2GD ztT>a@hP1eeux?suSz_#M0nT_P |bu7R66y~t}2@aHT3Y|#i*TZik zVLmtq>I5SvE9E;6rzgrkm80q5(BVy329shi>2o?g$1*6(i;zb=bZ%e9FKIm0D}v)Z zCQVBPbprX_Exb3 HUnnz(&$1(e-((D?e8H$X6l zhCg=GiGRY(-3=sl=GPReNxan2nozsQ$q-MbZ1tj{B^se`74Z_^^&ee|jlzzJW!#u0 ztCN|)5#Q2Pi+O1+!TiyKnx065zMPl 0-CaejbL5N^W4u zG(94gTo}+U7z6Q|0B$sC0&)CVTu~6zYO) tVKw^|ZDkk!cqy=~K+3?$}44=g|IYHlIGKy(C`gnAH6@=)#TFAEx_w*8M{Vt|T zrtnemg4_#O)smAzV-K|TuBfv}ULG{JPmT-!-9lvkMx_6vr@FaTNqQ7jtX;5-Y9CWQ zc7zSyvwZh>9cL;6&0Edj&_syMa1Ik{eJ~Jb>=I>2eD8gKQk>sl5Cju(8xWRY<&H(% z0y}D+(^mKje{y>Um*VhNQi*&yjRx4a=WaFbgwO-*KaDl@?fgt`86R(Sg)Gf-+a2Ij zDJS$2*~Iw@gnn_R$Gf7GicDQbO+eCrDp4aj;8;5?i+2#_g-4Q3QgA{Ma;P78CV+Q| z`mEW@FZc1xnf=`MOjCpyx;|uU?=) HW}Te&At`jOl%V zWDf#D@a}4fowARj^x@1PSW-4d+R7gJN*{NQgg0Te?$MNve}*7Qeo(Ok)?ydPGY}!I zw+YC YNiaeNAD% zI;B`+r}!O2KwPy sm~rmo zh;!mg%rC1J^Lb2a^Zw_rG)+LB&)k#LpqtpM+HTV^Q;qctktfUXZxcbt`gpXZOpBOL zCt82M{z*N2RNY1xUOK^BA}<{C-VJ={h=w~2nu*9?9zFUDs%*Q5Ln zkl`dgAXYM(=-SAl)(D~own~Uci4Ejg3f?Kd-+Awyo-A<&6dVw)I?|qsO6ZW CwOw)+~bI$aTiq=1%p)th-(~_D?~y<=mg}Hv$-8T81-L ze}2BPU`v?k{mtTDe&YP{;yV)jAIHdrjX#Ncy+rSox43HGRoT>1#5 tZ>9QV#l93VtihnPI~!Ap-+MNlmihUPkG6cHEK%m^;sW$`iq3O zsCWoZ5qysTs%yqncf1EI5^&-H>qksF{srHZkX!?j5F+8XyMOH85v?A9ZfI>+5g>-8 zTdHmM%p`HJ#OruZ5S+}fCg2FXKroN2pFk~iiwL$!4=QUAqBMi**I`xla4JGVy!d zc+XX%Uh1zZo8e-Kp_m4yI0k6oe`D;SURcUAnq~{<`zCpP_uD5>0KPo0E0VnEd|C>* z3W4aU1apoYZ0(ldsGTOuHRR-wAYQ`Q$&O&|gS$3ec{3>b`7H1&_*vjTzboDaUJKP3 z7D}JGF3v;Z;=9C!)!5ssYFt?%VV%nEryOi!Z`&qTBC;y9;YgXW%Xyo~APpJouo*@q z__Pf%FEz8c4$lFAdL)6pbR>dJE|Uh+B=ID#zV{s~TuAQ5<81Ta7MAciEi9Jgg~u`t z9rLQ4nqkZl>id(m1dbuSZwSoWK?pqNwei<6?nImevG061cu3RCNU3@LJ%7bXcE`o} z3tsnEt^1(cRTw9D u4fkB}a-*8wO8iVKW^HqM}6^E}*5K`E_} z1_cZMaJp-nh+dBy`5UfTA8U+*ub+D@#r}k{oPCsh%DPMsd*)t2YRAYRc_YjaHDZRx zg~PW`HA+xe15K6JX|Y!`(c{aAqkX3HQSjuja&>r2YNE8=U+QS}YKD|5PGx+KbWG9uRW-H$; ze0K^6pgL<{VzrWd#QoSINB;Rx^Bp@3a42K;Z~{0ZPuyXg@iUlLLy(VuM{IsQ9L!+t zT<*6?j=GTR7X=8anH6CmrI<*|MN#bi^s$R}SvA9?S)?hn -#BRy2*0JSpeG&B*&qe|pmSwunTDb67=VIj7Bg_v z2|QQdJ$(G7aL6>^;H?+aR65d+$m7xcZ$Um$nZ%cUl*pxVX4*_3Qa)J_*L- 1}bM*_(VS{Nvj?V}gvSFwvyUiz5y@OTMO!LuDB)SSPEX!djh;&VZJ@ZTjV9| xQ zat}6t zCBtE+m )k6(fVLw3GFp`dwi3LLmMPfX zQc(|-_98yRUTkhk+Zp$C9Qyezp?Yg8C;wW{N%Y(vs_&Zbus7*)%v6rAhZ+smHTB)k zU9bo>DC2$Xykw&vc;1Z;Zr^}H0LLCql{t^Z;QsFFT~J=PLNR7Sp3(?Y#tS{%#wg}6 z%k@9p6pwN!cV5FPmKK3DAzBCNAu!Ah#17mFqMX3;5A$3NLT6Gxs5o>l95{Si((BP{ z4B#%cj(=lp18wcal|yuJxc6d4`sui53G|?7 t%wr=ToC9e54KXem_kf!H|7~tKyf*hUI%4?ZB&Ks$#0Jj36~2Uf8_}l8oIT!dTWA zviL5(W;w~S7x$O%p8+SFgU1}D0^|vYivjhVd zsmGZnMFDO b^E!+k6=+X&PbjF-bFFkjvg#iW}UG!k{;8PFBy1v}JAqPf7E1)Wv3(iaK=q zPVJg!qt%e5_!jn~9xKX8Z`yzHNAThiGS)m~t!T*^q7rpeDB!_AB#bwYO^RX**ETE? zx&YrH$~I9Sd5r|^)&@oLpY+A47bR-t0s=af`aIQNCoGtEVVb}jZ{Yw8k9064+#NF8 zgx*C!BCsU7i{VUMqE14*Z5{l-0h$997(0#Q|4L;8pB*QRa2(Zqp?|$HzdlV8(Q}o4 z%V%6M*bCf5H3TqAFUN&u2~EDef=fRsm1ljSmcOql%m{O9H|hRi{>=L58t%JoIKmz* zuW^(`>KNuK>CgSP>YMDt`(@Ts2>~QZWrN?rPu`C@j%DI?2tF;89SAG0`8@=UUh(Iz zLR<6+JPW-XZ6Ni zneab&>Qv0($9d(Sm6I;F zB;w&q`2Q!KXv=eJxqrr!$ZR} o`+H897p0Ddt(^?)zpwC5htSb_i zMo l$p3!Te7q^CY3fu+8rkb{RgVbWm+id}Kkb@feH&c_zN7ms<``wK4dAH3&A zQg<%IGu!v2lA)7z7^9N>!LgyTDj@lDuD@e z^lQ6p+xxLssi5 zIT0{*CDBc~WQfLWHYC9@;5kp{bs(z8yB9)!)oter=yYZ_?QsI|jksEzvf=-Dv3p2Q zClB~Ml@w+id-fVq4TQAtMAy0)Nl26gR9Y2t39AP92D5W2Q>M$rD}IM$z#pObA!5e( z1zZK(XgMQvMcTNyY2dKNI @x|xqjgB!oL>mt7}<%BksO@htrQy#t+BCQQt{62mSG9AoLPa3i;=th)iR9D z&z3Y_+1yrnfuD?piaB39S=w-tQ-sX^2h#`q9J&b%z7|++T&q}l1M{dc&}r%D TsvZ5KEgAlkx7abuA$JA8nB~b?hFatz%!4AG5=D{ V{t|rU56XdOKrmixSb1z{ zVnbFCdM$r2LuO(>cLKfHA+n<=`OCj^38
;~W9=*T53v%^{@Z7$* z0sa7xn@Is8;Ja-Tkrq~- 0-sy{P|{w5{l7Rr?z%^3AB|`7Lzk z5y!u$M}`T`5SOYC0g$~W=lW)ZTmIY+st_rDexn(<68ZP`u3oVPu)n_l+`9VzK2#sQ zVo{ql!ad$>fonztCKwH{{NZcKCr<65%_*{+YEQ{~6RaLXHVI>Z@2WgvHtcieTaMYcNfl2dX1H*hc}e@p zHQVowZG5G##nz;jB9i}tp`n4- gJ|qf)}Hzf2n`2jq_I%x$9{968Gc*EaSE5A%fB7%!oAqyE3%(GG4@1lEljz_K3D zqYVDq1=iS=q4+Q1V)cg}cM&u3n#-tTRQI~2?R&qr#n#)4gBI3?(fHvDu3?lcqC!wQ zAYqzRM-IW}bEa~wO8?|s!%#bz-xaUSjh{}nre|^h>6-}g^c8G1sd@wPW(5RonemZR zTMwoNc&HlVUK71KiM55BvD?^=>8V;oOrGbo(hTU1r-}bTz9^|K)YjORcR3IZadTt$ zWFf|jiC}Hd?)OTcqvf 7rF{b|fglD~JJ{9pMxo1XY0GQ?O|&VreUUI;po zY^ge3tTk#neyE$?+hBUM8x*u5? W}DLoFbjEZk|S(|2}8`cf=42!elbOS zSh0kZtlnbT#!(1ycy6i!os!R$RcS9gGsAsfjK5Y#qf)t5he7&DK0WVfwdFuBZK%R} zMBjNG9UEj{p`c^&dAaWN^~Kun`NEz@Q}0i7W=%rj3KL)2OdFHa@CGt+7fXG2KS#zO znu-~UEU>(4w4`n_3X=ibK)pLk(@1UXw+opYy}X_>B>LP@Pq=MQiw_)z56G}}7RqAK z;X@M&O0vNkqjHU7l4kr)(qen1ul3y)Z;UgBPB@S$K_uNw=ELyHNmb_@^%Jw(=kdTh zkhGCXURfa=AJ%e|dfK)aAga!ZHGrX#GT^cxWNM*a$aJ;~TC!5wZi~qDb7P~dUYYIe znQpI(RP9wv1ZAPK`T=I)jm}y^(C6j-p7yn1P$@#@+=A6CQcz#W@L_*^lI_QmI(_Ao z!^^#7P~J0>K0DauGOQ;r1@BlDbxkF-xX zotoYajZe98Ta*U=K}`p-MPPq+CZ$!YZ!{Bl5~_R(+zv}{7y^njzJm!e^4>cwN(kDe zY*q6b2DHYR75EdJ7KP?xa^Sz;<2^Dct>VgTp#vhsgzjszSo~l8M;{KH|1dv9gOMXj zJ^p4u375uy*gkR0Pq{j6UTqcNGFYv3QzpZ}IO!kRn-5pF`fRaR?wqY+De)q{9H5x^ zvq8fKpY?kL>lOH$hr;CkZN1q*Ge#Vt_-y;Rzhe|NNCnnZR9`1C6!ZC}wc57Il}qyN z3Fo4aT?8^2p%s(6vzZEUNDCfG+1}Z0>7sQ@WR68kJZtuQN+pR|e;FQ{r8|FU2FF+> zE;N?5a5}|pCM6;AqDATupQp7Umn1`f)e=V@AD)-$cTE5igEHLFRg#QTdXi7u!0Tti zLzO8LlQ3(5JV#SUJ#%z7rK0?vl)vwT-mFH^?4`AOY}0PVhJoS-U-nb3Stk~*l$+`o za{QTb={@xkVd`#Su~OoPNc0j0jPa3^47EebJ?{B`7H(b+!^*=T%O}oIWe}9P$}vX} zyJL2KogOf2u;#C`Yf}63@=fQ9i+Y=M3n5{uY7O6M_fu$UIV+f}yq>dJ8a7fRHR}Rd zHH&2cvFqyXN_^uK$tk$!EQgQjvXQpv2D+|pr#oHt#5U3El@!v$SN`7Mu0%Kb?^pT3 z!FafD5uHXUF);l-f4x=j$ku&UneDUIY||1E6&Qe5{G|)z@nK;GS{`Cc2*n}?wq=41 zJIP)KwAaE)ZCEq1q+nQNwfhhkQE? aBPs^b=R?Osxs+squx=1W@@n zEJXp)Yiu>LBuZPG$l4|r^9^;T(q{}0IMzsk`TiA?v%~P@x>b<9Sg+X_*EM|S0s$RU zj!|&2wZRk27gL ^B_Pkx^TDzzZQR@-7nv3%6i%FMzWD;+hn-1 zwnb8ex0{~?>^KTM($QFyVn$So(;ftdzvBQC=ZQXI`;Bq9JkM|F%Ax|uXP_u{#kKEp z!7b2@#I&^7;hXm=7&5`%?W}iLB+5triCtO+K1Dxhz6f(U1U;~f(&&|JjXFA?mkA*3 zi-v&9>PXc8Rl$X6?L;S&k8mHVnvHMZk{9z%_>ibD6*ecm;)-j)3;*mfyRe;}l01IE z6P$Y5V-2*oHjW$+vKE- Xl^OSmOJ7l`JoqN zqoC=BVi0PQ7YE87X=7`~YxI4ajRNS7uYT8zxO}}f*E<4z=ai`1@NZ6fj|?}goAHI9 zEH1#tYq=+H!1D!tP`z}vG4L3zx;(`UG=Uy1S{N{7@o>>(c&TG}GYX#56a=M+eb2wa zBHi1{X!OUhTU-?{FFL3Pp=^(soL{w~EKj#9QA+bdXa$5C8jGCr|8)OIf& 5l8sXLuSnMm;^d=D+Qxat+wpn)rsJg%gZlmJ7!69T=tPAheb2>4i zu<&0^hDnAi_k>icM$=UykZGm*COI50Q=7I1M!mS6U^0npd($Hn82+%S_5Q)n%j(!c z0Lyo`>$*UK>46{>XCT0 %It z6&Q!f^*cxCBl560>7|!ix>@e2L{A1GX=4w0Lc$%`G-T_R ^- zjr90@s3!(zJ1TeyrdO_2CPUYU 3(j z#5WXI61o>hRR*lv!DW0oXq=Ynyv90T+K&97RN-!NI?Qog-RQZex!(IZkwzkJqPmjI z(J2QV5A9X|1+?n*Q(&9t51SMJ!M;7uq=b-buNLcIr&Gs>Lc?>7sz`TyNs5Yu4h9mP zK$<=c{vW-+dp_YZ$Bj7iU+UB%MCOPFTwn=?>HeXF-VG09xRWvQMQ=!;{e{9tsvCz4 zyW|gaA-h(#d_tCl@ydAthaS3osmlLn*nz C|( z6Q&C9umm@+2l8~16E81z#*=T;+{4m)p6-x}e0#7!9t}vJc4{=X!p&Cv@v|>DXxVya zlbsojEEoy7;HG>KPQ7{3DXfb5pR