From ba30ca7bb4eb795db35a89a094e7a37a3eb380a7 Mon Sep 17 00:00:00 2001
From: Evennia docbuilder action This contrib provides a wilderness map without actually creating a large number
of rooms - as you move, you instead end up back in the same room but its description
changes. This means you can make huge areas with little database use as
-long as the rooms are relatively similar (name/desc changing).
This contrib does not provide any new commands. Instead the default py command
@@ -136,6 +136,10 @@ specify the name, a script named “default” will be created and used.
All coordinates used by the wilderness map are in the format of (x, y)
tuples. x goes from left to right and y goes from bottom to top. So (0, 0)
is the bottom left corner of the map.
+You can also add a wilderness by defining a WildernessScript in your GLOBAL_SCRIPT +settings. If you do, make sure define the map provider.
+
The default provider, WildernessMapProvider, just creates a grid area that
-is unlimited in size.
-This WildernessMapProvider can be subclassed to create more interesting
+is unlimited in size.
WildernessMapProvider can be subclassed to create more interesting
maps and also to customize the room/exit typeclass used.
The WildernessScript also has an optional preserve_items property, which
+when set to True will not recycle rooms that contain any objects. By default,
+a wilderness room is recycled whenever there are no players left in it.
There is also no command that allows players to enter the wilderness. This still needs to be added: it can be a command or an exit, depending on your needs.
@@ -197,7 +204,7 @@ provided as a string: a “.” symbol is a location we can walk on. desc = "This is a room in the pyramid." if y == 3 : desc = "You can see far and wide from the top of the pyramid." - room.db.desc = desc + room.ndb.desc = descNow we can use our new pyramid-shaped wilderness map. From inside Evennia we @@ -209,12 +216,14 @@ py from evennia.contrib import wilderness; wilderness.enter_wilderness(me, coord
When a character moves into the wilderness, they get their own room. If they -move, instead of moving the character, the room changes to match the new -coordinates. If a character meets another character in the wilderness, then -their room merges. When one of the character leaves again, they each get their -own separate rooms. Rooms are created as needed. Unneeded rooms are stored away -to avoid the overhead cost of creating new rooms again in the future.
+When a character moves into the wilderness, they get their own room. If +they move, instead of moving the character, the room changes to match the +new coordinates.
+If a character meets another character in the wilderness, then their room +merges. When one of the character leaves again, they each get their own +separate rooms.
+Rooms are created as needed. Unneeded rooms are stored away to avoid the +overhead cost of creating new rooms again in the future.
This document page is generated from evennia/contrib/grid/wilderness/README.md. Changes to this
file will be overwritten, so edit that file rather than this one.
This contrib provides a wilderness map without actually creating a large number of rooms - as you move, you instead end up back in the same room but its description changes. This means you can make huge areas with little database use as -long as the rooms are relatively similar (name/desc changing).
+long as the rooms are relatively similar (e.g. only the names/descs changing).search_index_entry = {'aliases': '@delete @del', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy delete del', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶search_index_entry = {'aliases': '@del @delete', 'category': 'building', 'key': '@destroy', 'no_prefix': 'destroy del delete', 'tags': '', 'text': '\n permanently delete objects\n\n Usage:\n destroy[/switches] [obj, obj2, obj3, [dbref-dbref], ...]\n\n Switches:\n override - The destroy command will usually avoid accidentally\n destroying account objects. This switch overrides this safety.\n force - destroy without confirmation.\n Examples:\n destroy house, roof, door, 44-78\n destroy 5-10, flower, 45\n destroy/force north\n\n Destroys one or many objects. If dbrefs are used, a range to delete can be\n given, e.g. 4-10. Also the end points will be deleted. This command\n displays a confirmation before destroying, to make sure of your choice.\n You can specify the /force switch to bypass this confirmation.\n '}¶
aliases = ['@type', '@swap', '@update', '@typeclasses', '@parent']¶aliases = ['@typeclasses', '@update', '@parent', '@type', '@swap']¶
search_index_entry = {'aliases': '@type @swap @update @typeclasses @parent', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass type swap update typeclasses 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': '@typeclasses @update @parent @type @swap', 'category': 'building', 'key': '@typeclass', 'no_prefix': 'typeclass typeclasses update parent type swap', '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': '@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 "}¶
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 "}¶
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 '}¶
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
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/tmprttw_f_s/0096df1e3ee772477e1fa108545329384f32ff54/evennia/contrib/tutorials/red_button/red_button.py'>¶
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 '}¶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': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n quit when in unlogged-in state\n\n Usage:\n quit\n\n We maintain a different version of the quit command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n get help when in unconnected-in state\n\n Usage:\n help\n\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
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 '}¶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': 'qu q', 'category': 'general', 'key': 'quit', 'no_prefix': ' qu q', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶search_index_entry = {'aliases': 'q qu', 'category': 'general', 'key': 'quit', 'no_prefix': ' q qu', 'tags': '', 'text': '\n We maintain a different version of the `quit` command\n here for unconnected accounts for the sake of simplicity. The logged in\n version is a bit more complicated.\n '}¶
search_index_entry = {'aliases': 'h ?', 'category': 'general', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'general', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n This is an unconnected version of the help command,\n for simplicity. It shows a pane of info.\n '}¶
search_index_entry = {'aliases': '@calls @callback @callbacks', 'category': 'building', 'key': '@call', 'no_prefix': 'call calls callback callbacks', 'tags': '', 'text': '\n Command to edit callbacks.\n '}¶search_index_entry = {'aliases': '@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': 'chanalias aliaschan', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' chanalias aliaschan', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶search_index_entry = {'aliases': 'aliaschan chanalias', 'category': 'comms', 'key': 'addcom', 'no_prefix': ' aliaschan chanalias', 'tags': '', 'text': '\n Add a channel alias and/or subscribe to a channel\n\n Usage:\n addcom [alias=] <channel>\n\n Joins a given channel. If alias is given, this will allow you to\n refer to the channel by this alias rather than the full channel\n name. Subsequent calls of this command can be used to add multiple\n aliases to an already joined channel.\n '}¶
search_index_entry = {'aliases': 'delchanalias delaliaschan', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delchanalias delaliaschan', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\n "}¶search_index_entry = {'aliases': 'delaliaschan delchanalias', 'category': 'comms', 'key': 'delcom', 'no_prefix': ' delaliaschan delchanalias', 'tags': '', 'text': "\n remove a channel alias and/or unsubscribe from channel\n\n Usage:\n delcom <alias or channel>\n delcom/all <channel>\n\n If the full channel name is given, unsubscribe from the\n channel. If an alias is given, remove the alias but don't\n unsubscribe. If the 'all' switch is used, remove all aliases\n for that channel.\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 '}¶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 '}¶
search_index_entry = {'aliases': 'shout whisper ;', 'category': 'general', 'key': 'say', 'no_prefix': ' shout whisper ;', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶search_index_entry = {'aliases': '; shout whisper', 'category': 'general', 'key': 'say', 'no_prefix': ' ; shout whisper', 'tags': '', 'text': '\n Perform an communication action.\n\n Usage:\n say <text>\n whisper\n shout\n\n '}¶
search_index_entry = {'aliases': 'ex e unfocus examine', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex e 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': 'ex unfocus examine e', 'category': 'evscaperoom', 'key': 'focus', 'no_prefix': ' ex unfocus examine e', 'tags': '', 'text': '\n Focus your attention on a target.\n\n Usage:\n focus <obj>\n\n Once focusing on an object, use look to get more information about how it\n looks and what actions is available.\n\n '}¶
search_index_entry = {'aliases': 'inv give inventory i', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inv give inventory i', 'tags': '', 'text': '\n Use focus / examine instead.\n\n '}¶search_index_entry = {'aliases': 'inventory give i inv', 'category': 'evscaperoom', 'key': 'get', 'no_prefix': ' inventory give i inv', 'tags': '', 'text': '\n Use focus / examine instead.\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 '}¶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': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n view inventory\n\n Usage:\n inventory\n inv\n\n Shows your inventory.\n '}¶
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
search_index_entry = {'aliases': 'hold wait', 'category': 'combat', 'key': 'pass', 'no_prefix': ' hold wait', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶search_index_entry = {'aliases': 'wait hold', 'category': 'combat', 'key': 'pass', 'no_prefix': ' wait hold', 'tags': '', 'text': '\n Passes on your turn.\n\n Usage:\n pass\n\n When in a fight, you can use this command to end your turn early, even\n if there are still any actions you can take.\n '}¶
test_get_new_coordinates()[source]¶
The defaults, while useable, are meant to be customised. When creating a new wilderness map it is possible to give a “map provider”: this is a python object that is smart enough to create the map.
-The default provider, WildernessMapProvider, just creates a grid area that -is unlimited in size. -This WildernessMapProvider can be subclassed to create more interesting -maps and also to customize the room/exit typeclass used.
+The default provider, WildernessMapProvider, creates a grid area that +is unlimited in size.
+WildernessMapProvider can be subclassed to create more interesting maps +and also to customize the room/exit typeclass used.
There is also no command that allows players to enter the wilderness. This still needs to be added: it can be a command or an exit, depending on your needs.
@@ -199,7 +199,7 @@ provided as a string: a “.” symbol is a location we can walk on. desc = "This is a room in the pyramid." if y == 3 : desc = "You can see far and wide from the top of the pyramid." - room.db.desc = desc + room.ndb.desc = descNow we can use our new pyramid-shaped wilderness map. From inside Evennia we @@ -214,16 +214,16 @@ py from evennia.contrib import wilderness; wilderness.enter_wilderness(me, coord
When a character moves into the wilderness, they get their own room. If they move, instead of moving the character, the room changes to match the -new coordinates. -If a character meets another character in the wilderness, then their room +new coordinates.
+If a character meets another character in the wilderness, then their room merges. When one of the character leaves again, they each get their own -separate rooms. -Rooms are created as needed. Unneeded rooms are stored away to avoid the +separate rooms.
+Rooms are created as needed. Unneeded rooms are stored away to avoid the overhead cost of creating new rooms again in the future.
evennia.contrib.grid.wilderness.wilderness.create_wilderness(name='default', mapprovider=None)[source]¶evennia.contrib.grid.wilderness.wilderness.create_wilderness(name='default', mapprovider=None, preserve_items=False)[source]¶
Creates a new wilderness map. Does nothing if a wilderness map already exists with the same name.
mapprovider¶Attribute property descriptor. Allows for specifying Attributes as Django-like ‘fields’ +on the class level. Note that while one can set a lock on the Attribute, +there is no way to check said lock when accessing via the property - use +the full AttributeHandler if you need to do access checks.
+Example:
+class Character(DefaultCharacter):
+ foo = AttributeProperty(default="Bar")
+itemcoordinates¶Attribute property descriptor. Allows for specifying Attributes as Django-like ‘fields’ +on the class level. Note that while one can set a lock on the Attribute, +there is no way to check said lock when accessing via the property - use +the full AttributeHandler if you need to do access checks.
+Example:
+class Character(DefaultCharacter):
+ foo = AttributeProperty(default="Bar")
+preserve_items¶Attribute property descriptor. Allows for specifying Attributes as Django-like ‘fields’ +on the class level. Note that while one can set a lock on the Attribute, +there is no way to check said lock when accessing via the property - use +the full AttributeHandler if you need to do access checks.
+Example:
+class Character(DefaultCharacter):
+ foo = AttributeProperty(default="Bar")
+at_script_creation()[source]¶mapprovider¶Shortcut property to the map provider.
-MapProvider – the mapprovider used with this wilderness
-itemcoordinates¶Returns a dictionary with the coordinates of every item inside this -wilderness map. The key is the item, the value are the coordinates as -(x, y) tuple.
-{item – coordinates}
-at_start()[source]¶Called when the script is started and also after server reloads.
+at_server_start()[source]¶Called after the server is started or reloaded.
get_display_name(looker, **kwargs)[source]¶Displays the name of the object in a viewer-aware manner.
+Displays the name of the object in a viewer-aware manner. +This is a core evennia hook.
looker (TypedObject) – The object or account that is looking @@ -536,6 +555,14 @@ searching, and is expected to produce something useful for builders.
get_display_desc(looker, **kwargs)[source]¶Displays the description of the room. This is a core evennia hook.
+Allows the room’s description to be customized in an ndb value, +avoiding having to write to the database on moving.
+DoesNotExist¶aliases = ['inv', 'i']¶aliases = ['i', 'inv']¶
search_index_entry = {'aliases': 'inv i', 'category': 'general', 'key': 'inventory', 'no_prefix': ' inv i', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶search_index_entry = {'aliases': 'i inv', 'category': 'general', 'key': 'inventory', 'no_prefix': ' i inv', 'tags': '', 'text': '\n View your inventory\n\n Usage:\n inventory\n\n '}¶
aliases = ['unwield', 'unwear']¶aliases = ['unwear', 'unwield']¶
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 '}¶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 '}¶
aliases = ['press', 'push', 'press button']¶
search_index_entry = {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' press push press button', 'tags': '', 'text': '\n Push the red button (lid closed)\n\n Usage:\n push button\n\n '}¶
aliases = ['break lid', 'smash lid', 'smash']¶
search_index_entry = {'aliases': 'break lid smash lid smash', 'category': 'general', 'key': 'smash glass', 'no_prefix': ' break lid smash lid smash', 'tags': '', 'text': '\n Smash the protective glass.\n\n Usage:\n smash glass\n\n Try to smash the glass of the button.\n\n '}¶
aliases = ['press', 'push', 'press button']¶
search_index_entry = {'aliases': 'press push press button', 'category': 'general', 'key': 'push button', 'no_prefix': ' press push press button', 'tags': '', 'text': '\n Push the red button\n\n Usage:\n push button\n\n '}¶
aliases = ['listen', 'feel', 'l', 'ex', 'get', 'examine']¶
search_index_entry = {'aliases': 'listen feel l ex get examine', 'category': 'general', 'key': 'look', 'no_prefix': ' listen feel l ex get examine', '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 = ['push', 'pull', 'shiftroot', 'move']¶aliases = ['shiftroot', 'pull', 'push', 'move']¶
search_index_entry = {'aliases': 'push pull shiftroot move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' push pull shiftroot 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': 'shiftroot pull push move', 'category': 'tutorialworld', 'key': 'shift', 'no_prefix': ' shiftroot pull 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 '}¶
aliases = ['press button', 'button', 'push button']¶aliases = ['button', 'push button', 'press button']¶
search_index_entry = {'aliases': 'press button button push button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' press button button push button', 'tags': '', 'text': '\n Presses a button.\n '}¶search_index_entry = {'aliases': 'button push button press button', 'category': 'tutorialworld', 'key': 'press', 'no_prefix': ' button push button press button', 'tags': '', 'text': '\n Presses a button.\n '}¶
aliases = ['chop', 'bash', 'kill', 'slash', 'stab', 'parry', 'fight', 'hit', 'thrust', 'defend', 'pierce']¶aliases = ['pierce', 'defend', 'chop', 'fight', 'thrust', 'parry', 'bash', 'kill', 'stab', 'hit', 'slash']¶
search_index_entry = {'aliases': 'chop bash kill slash stab parry fight hit thrust defend pierce', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' chop bash kill slash stab parry fight hit thrust defend pierce', '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': 'pierce defend chop fight thrust parry bash kill stab hit slash', 'category': 'tutorialworld', 'key': 'attack', 'no_prefix': ' pierce defend chop fight thrust parry bash kill 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 '}¶
aliases = ['h', '?']¶aliases = ['?', 'h']¶
search_index_entry = {'aliases': 'h ?', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' h ?', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶search_index_entry = {'aliases': '? h', 'category': 'tutorial world', 'key': 'help', 'no_prefix': ' ? h', 'tags': '', 'text': '\n Overwritten help command while on the bridge.\n '}¶
aliases = ['search', 'feel', 'feel around', 'fiddle', 'l']¶aliases = ['search', 'fiddle', 'feel around', 'feel', 'l']¶
search_index_entry = {'aliases': 'search feel feel around fiddle l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search feel feel around fiddle l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶search_index_entry = {'aliases': 'search fiddle feel around feel l', 'category': 'tutorialworld', 'key': 'look', 'no_prefix': ' search fiddle feel around feel l', 'tags': '', 'text': '\n Look around in darkness\n\n Usage:\n look\n\n Look around in the darkness, trying\n to find something.\n '}¶
directory = '/tmp/tmpk82ky06k/62c2558e985dde08c5adcf4fac22b6a2ef5e778f/evennia'¶directory = '/tmp/tmprttw_f_s/0096df1e3ee772477e1fa108545329384f32ff54/evennia'¶
directory = '/tmp/tmpk82ky06k/62c2558e985dde08c5adcf4fac22b6a2ef5e778f/evennia/game_template'¶directory = '/tmp/tmprttw_f_s/0096df1e3ee772477e1fa108545329384f32ff54/evennia/game_template'¶
aliases = [':w', ':dd', ':f', ':j', ':wq', ':i', ':<', ':=', ':S', ':A', ':::', ':u', ':>', ':echo', ':s', ':p', ':x', ':q', ':h', ':dw', ':uu', ':I', ':DD', ':fd', '::', ':UU', ':q!', ':fi', ':!', ':r', ':', ':y']¶aliases = [':UU', ':y', ':<', ':i', ':S', ':fd', ':p', ':f', ':j', ':A', ':r', ':I', '::', ':fi', ':echo', ':w', ':q!', ':::', ':dd', ':=', ':!', ':DD', ':x', ':>', ':uu', ':', ':q', ':u', ':s', ':dw', ':h', ':wq']¶
search_index_entry = {'aliases': ':w :dd :f :j :wq :i :< := :S :A ::: :u :> :echo :s :p :x :q :h :dw :uu :I :DD :fd :: :UU :q! :fi :! :r : :y', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :w :dd :f :j :wq :i :< := :S :A ::: :u :> :echo :s :p :x :q :h :dw :uu :I :DD :fd :: :UU :q! :fi :! :r : :y', 'tags': '', 'text': '\n Commands for the editor\n '}¶search_index_entry = {'aliases': ':UU :y :< :i :S :fd :p :f :j :A :r :I :: :fi :echo :w :q! ::: :dd := :! :DD :x :> :uu : :q :u :s :dw :h :wq', 'category': 'general', 'key': ':editor_command_group', 'no_prefix': ' :UU :y :< :i :S :fd :p :f :j :A :r :I :: :fi :echo :w :q! ::: :dd := :! :DD :x :> :uu : :q :u :s :dw :h :wq', 'tags': '', 'text': '\n Commands for the editor\n '}¶
aliases = ['a', 'no', '__nomatch_command', 'abort', 'yes', 'n', 'y']¶
search_index_entry = {'aliases': 'a no __nomatch_command abort yes n y', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' a no __nomatch_command abort yes n y', 'tags': '', 'text': '\n Handle a prompt for yes or no. Press [return] for the default choice.\n\n '}¶
aliases = ['top', 'a', 't', 'previous', 'n', 'quit', 'e', 'end', 'q', 'abort', 'p', 'next']¶aliases = ['a', 'end', 'e', 'top', 't', 'quit', 'previous', 'p', 'q', 'next', 'abort', 'n']¶
search_index_entry = {'aliases': 'top a t previous n quit e end q abort p next', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' top a t previous n quit e end q abort p next', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶search_index_entry = {'aliases': 'a end e top t quit previous p q next abort n', 'category': 'general', 'key': '__noinput_command', 'no_prefix': ' a end e top t quit previous p q next abort n', 'tags': '', 'text': '\n Manipulate the text paging. Catch no-input with aliases.\n '}¶
S#t?m6vBmEv7gg8#=`eMh~A54au6gq44s@culN20n)emvkK@qj8>6z3;8Lt zA*KU;z@Y@q2s~*GFqWhygD<58TEF_m2_Z9>7^_VsUmcpa4jR&sS{Xb_uNal%8#Y}3 z9h>LE&{}za$Somc0#W|ZS|mv5ErGT%t?u8h9+GLBwb zFakMCb=GpO9?SRjKUdT&gvGvn$L|mHg`b_ifw}>BGTu7XkV(%7-}=9-@QBju+a$rr z1SaipYDjUz{8D&ehuqa!^S9dV4!B}J(L*nv!t6+R;y%%1Kilnyc; NjP+w{M>r`ve4 zbxFS6+zy{nk9+`8#vTjG;cf@%Hn2xs3uuBa`bFbU!DPtHBE(z>i6IT&MkBXxVW|+- zv1rcAafA<=DBu<~EMl^gfcJsgW7C0Jvx_kwJ@?ipUF4JQ>>-0$P}Z>+V!E0IAK=c7 z6Q%Fw!(h{xubQnK?9_3Jxb+?aU3f~tkAfy6djF+SEMHes+IP5R9dL}aorjvG*+ G$ 5zxY5yg~lb~Hn1`*(o zaUHDhxm8CExi+f;-c!ExZx} A1{-{#sd#VZ_yZ9wfwngugVb3obHLVl0P=>a207}9KH|KXco`OU zD*zpmbM(M;e6h4MDhc4bVPLy1yD*?Gd9RN1I%mo{^Z4_XAx`>hpM^QV59nEdW_z|6 zzo!G`yMPE5dZx;%uxzP)tx;^mj`%B8p|h_7U9+nNj2d9BC&MR!NXsHHU41N-{KZLg zK@623N^RExCJq`nTV}hc53Q^GHSBmnyC;FbUCIE+9z}3y&mwTVr~i(E`e+lSnPJjv zj3EdPLbaxiZ4@Blf+iOELkW+bUqtGiJ=-$igsQY$sTG4?D+S6b*McwOZ%OtxzFet5 zRMFCJ)PNB(MbEkLdV_5!3|s|*6(EO13Xy~Ej>@f*&*^MApTL>$vvZ~|gwNai ((s%6#e?hXeBlj#^7!w-Rr-4BY>B9a-_AD7yAk^T-L20gZ1J1SYl ~Qhdd6b|p9okIqpU%ua0RCL_fXoNLnyou@Bgq+- zj!Kb#%8Z9nld3!uJ=gatTm418SME%*0d!vlu{RW_N*HxSY3BaOLIr2HSGzj$-K&;U zk8XaIlf8)|(RxW0@KuNZt4#6c7_Ok<@266L@AU&`_g|NS&25E7zkBGy!6Fm?OKvgb z%D+ErP&5xIl;$}aS15qv?B~#Dh5TFp`RRs73zV=S4J>|22!mD-L@1UFe`ue;EkP`D zDTDJ{yg-~z>{~QxSA>9&g*czj0L%b)P-4I L Clsbc{fg zegu?p>l*a#6-^z=q87`2cAiNgQ(V$lhr_#FmYqks%C9G(e0bLI!M6cINIR$?)?^yk z!2MB1Wr$gEi5JF;AfDkgY(p=cDv)zHIiz9CZ1i>-8J7U>0m;EiL9KZabmqFl^trXd z2tGSuD*=eU1yCrTA~5_nF*Hhu7<6Ya_@AvAoalq^>Ys1gs;HAi9}*k1d~<){JphAU zRc?jI@DBim)m3f;xD!>L>;PoqI{kLGf!S^1vDWze{lFmN-9>d=_g# o{QoQz4UoqkM|=!Ft|J^Z5@5qn1zM8uw8 z!4@)l3l+7Gg}ZNv74?~~{RQ*&j8>rETYGc9n2X=_`zVgP3XJ|k*|VwHIm$PUpU-aQ zciR|oT{y8FU0m!hy9OOi3Y{*~>*hYxQ)H gS)&5Uv{>jE~rSX`k+TZfdG0t^j> zJT=-kykf%zb`#IC!n!LJErE^Jt?MTZZ~Mth&+{G=cx%U-_f62fpmKbe9Y}Y`{ENMj z3%ZWZ#v>ZzZ3sp$Pq$rLB`|8Zsuv)08x_cloj{epnE@(B+I1Y;Up7~!d-+{2&KI&u zB|H+ut$;RZ(lBqIe=I)TY+cy(|F%~8f%jJY-$f%TaGNl?LE4A-MK|j&3r*)*yt~Oy zwINGQTnn)}xZMjO)RnmvV|5L<7lNwBvXMe(gyzAIDt_lT^u0S{Z6JGsW3pf_6L0nB zgPH>cnLf=EB<~0Ml0&6P=7aj6hQi&`WK7n^U>~W1(2nP5|D|*jsyDb1Av)Za41o9$ zL7^=Z2dk-N{LwxVvTA!kWH1pd6NEkHfniStSv(~W zr0flNlY%En=MQ+H#}Mv8t1={}PL%7n!KWw;o-xXCK6$6sBX{6Tl`dJkt&Nj%*J@p~ zP}elp(8>HBHw!ygdt1#taMo27+hIEwhP#XPpmv92Tx) +>^7h~`RvT^YCDLFC; znQW8wNxb8OCzCN3zD^@kz 0fn|Gf<{}_Kq9ScLUK2@kjt1`k?pVFkQFeO?1k3;^Tf1myhx|A1Lx#uu(Y>5 zbVyI>gRjqW$1^yo1G^;8g;aaDG7x#q()6j&BS&EvhQw;;%##=d|D=RQyf4DEUymCk zY~Y_9!0y+^V4X5lAJCfZ8*u@y0Wt&n$>8NDgY};b!hbRt_{rete>3PECl+s0^^dYG zf ?AsMy&RG ziWJyDA}i1EK4Gs4$6QwhV{G>l><4m7L=?O!&IjF@7zFD=0fm2ypw?#}`SrJMtkC9) zy1+f)R%9Qf4+AWGP#2mL+Djvz@@hoC$i5Of-K@V*;WYiE>HE1YP5z5xZ 5Wr{d7!sd_Oy0O=(m#VA4mq3r!>U^TEPvtNFi2KI?sP5dd{>|i~!7$`L z^UxbQ!FJoZ^{>A##jGV4+Ka|^;~ynqaF~3U@+(KDJ*-s^Lv~{uUa0W8ITelo&=EXU z9YQ0sg}W6ztCp?^*diLNwyO>tm47~0^2onx=7-#%NP;DHi}Z4RQ6_7Y0S2a+#mD|@ zpvd^#?cJ6yv#Cqnq^MN2-ck&mot8wE+vPFQ6sawY-g3nDvMaiC6-=;Xz0*YCkgpyR z!eLDWD9Y<=vH+}k$6Yb64XKCRzKSflz>w}G;fPmV9QJiDm2Qb!sQjVsHPNVhDj+#k z;kX;OeDKaC;m8}eU!op$kytyo3efku7)+geL}+_G%+Ag<=PENG&tEEZAYVQ`-^a0a zRY SRl@TxTLg}5siD(!?h5Uu+$+Pb#=6oE{@ue<&+~uO`aUg1+ENhQ>c<=(;RT0y zcZ0IU#kn!I-rvIyFg8<`t9Tod$v>vM8ldIV4poREn3REH&&r_?7Uv)vtIPkaE+}tz zKSR1ChoBl0WcpQ2aw4Ih2KS;SxdF&egL77sykM}}1k+}hhP*bz9j8MZM 9SF>LPm4^5ah2dmw*JRmk|;1!S*!1hlCjqs%d!~f7krMziDb)J9C z)aL@H*p6Ygt|s8gc+BFqtmlENH@|&84D+f3!@2FD7U_T0%tzu!`(dwlOy68KeWG{< z%peL5W+PAk5G8Ach$8TPRT)ns0Q{sDrFbX;h-bY5ydzQ|n2~6K&Pj?$lpyimVC{eI zI>vjMkk)#t!P5P>I^OPozCcK}BZP+AlR#n~BFNR{1jC;S4IPAQ4ejq$nZos}FrAB4 zV9BScA#jb*f}rc6YvJfMXtcbJ k=VQtuCd<&L_8axgJ!NxJWtNcDbxb%T7$A*; zRiKu%)GgB(-9!hZOp%~K?S0KKw^K}cKvbk8-`sV)8St;k_`U)E YH<{YB;8CD 9>UtkL-thgI1o4&0s>0Zf^riDHo{bWhC!PkW>d0&ou?k)c zEYL;GHk38;iY!)JpuT08UViA^Hb|0_-iqlEeUCzH@kMUC;nqc&6%!xcd5*0p>eZm@ zNM?o$;pwmo(yJP{Ii#nT54og2@CtOE49nUKZWIFp6=XNk5yuhx-5@GyfqMZkl@Hn~ zsu!>iE$EN}Ou5S!ekb0Yv0H5Rlhu~Tc=q_FZ57l5n8o@;NZxjO%Us!+Tp<&=pFr+$ zp6d{DHF7ll)<;6fO=s3Dimb?*3>8muK0rn^6o)e8;<~^z4?BAiSga7qHj7! }SigGiI3@Q1-UOiTwjM1Bf+)FjlDtQ&a z$mo+bD&l$O&iXSXhXqjzD4A%V5kowmxI%Kz{QxDq#ad%=)y%hlqfB#U!=NP;uH1h( zl;A}RoEmz{osZ)fkX|(u?(?;n+I|D^nV3Bpx4JsO;JK_E4I;;vfF a#U$;r%-({;ZuwtzIGEd)iDg+fK48J)uwF+Ub3SK=}|+Cr1!RV z)axSQ^z-k8CHZ1Hnn2n7E80lzJ%7?t*vWa&gW~`W=K`_qk{$hMQJnGglfX!%rVe74 zL>|=(4MqR3vsrZG%Gr+1X|R=R)dj7sBVxGy%8rop-3;p`@h1c|dJj3L8W_8OXq&yE z4K&6FN9Fr`eYtSzNAP_(Sq)czx0Ib8+NaMkRm@HB%Xkl$7 x4J?w^Q`q)!N_Y0OT5Kkf zS3xgN0skq^4f@U!-BWUyuaC@f+DC~hgl1K`zK6F}7sG1SR_@pf8%w~DYHy`?c0n;e zdyi4T@Dt s(9y#qL&p$XGvYXv}8|cpz43l>l}k(#R7Dq`!qYI`BwLHESo91}rH< z FX=1USgt2f>l4!hV2oQ>k7*@w+ z1Xy#fIFaQ(7ZgU||8vB5+g2kQ<3$Up;WCa#bUDZ1x}qJSec|p8%Gdu#Q6a~y0+)8; zxyEMvC|eAtXB_Ic55fX!rJ2^Z-!=&Kzd~k79S7dx 42%g{Sa`p3gdQ9-o<$rE?|KNWsq%K<~FI^)OR=bGf9 zY~^vcdIw}I^o}h_H3S+!rxgth!5R`z `p3@+n*{}J6; zt2v@fmRTt~k}_A0Htp_(kxt3K&P2sIG~6i@w4yMWhpS!bzmiUU{}E{qBlF^0c{H zl;WWLDP#}v_a+qTRVu=MhhAT;N`C+~P_o784yd*kNv%h^8AD~Dn*bteCyIE>N%k~5 z)hudgWqz-Qt@~Xk*bX09#onz RWZ{!Z=e(T!@`u^ 3IE8psxTJCQEQ{ zw3{TTs QANP4E3z9<=-WPBS})Z343NSGIk93sX%>gew&5q3)OP9h+yug+0P)CN5x z##b2VShzjnmp$X)QuL7;_qkin5dEW4@v9~53{EE&j|U+w`!DL`ZmhXb4`(4^5YqCo zhIKaA+L<>@z9OYjc$Fc7rP jL2-vT!y851|+*+l)tAd$z>=4q^ZoqpDaSHhF+;c zt6`rk#3)_m5_i>~mOoSpFh3dn{Pfp{{^`^aOK3Ln+JBlGE-} *sV;YcK2>#sPXq6Cw{w|@c-R@%tlxk;S}WDzB$V|K5{_nqW^r!msJ*&v4!>k z)VwERR?!Pyj?LbWf=gTS+V#=?Ba5aK)lB}dX`@z%b>^~* rDDU;iS8eXSQAQ916*?3RNG|DuQEdq-0mQ;4M)j%U5 z^Sz3A=6J}5pVI#&>3D%GC*A&!^?E9+cB0ej>JTwdW`=`Yw>$w~7aWSB{NWr-!kKY6 zN$ZZ>mpE!;qNwOI@I&az$GE-@_HMXPXS8J9jXSipJ{5}+gtzf4igokxo!x@Msr0dI zLV{l;TnG6yY=U{-Qolr M|@=Wtc z!7AOC7@ICCuIr`fqfRF@k!qgT+}&Bg I&I-F6?dD*{Yg5RK1I_NuTd6p+T+zp z#a!=fJN64-ip2-cM`CGA!Xv4)=3Cbi!qBRXm(G;6T7&tWSYjNenycmrc2HTfCMkMM zlFcP12h*jyD!VT{PQ2X~6yW-sC#^x=-tW**QvVSjE$1E`%L7oLa9~6ltp*D!8Z)2* zwQc*1Cv3?CJA2; aZL$;o>z7Qt-aZPC}0gN=-@1(i9gZ$Aoy5+!jcJIQVCe`Pg;lUgjI$8<|-$rO^? z9F%80Nl0>vjb}aOdHTpEJokV>=frF5g^^rDnh8{N9ASw}(tALpykX~h)ndfEl zB4rIYhsJIrw*NCrhkx4fDR-#<*x( ^{R0Cu97^oN4y?a;>n_F&o`1HMJzyX=zco>dALVvO M+3d3=}l%{#Nm%&_>hlWb$db+)@pCF+$cBRah+Qo zn2S2U=ZCo5p)v^8p}PgYIJi45-g%&P-LFS6rm@49zD?QZ)fcQhcKFqC0*{T`>Z=t@ zrZg|{z%Fn5u#+$wy0Oi{$FtIpe9SE;3-kQ2wrfZ;No|){*rZA u*W+p zuzFhVTIe|0ToPhl&sAWESiV0NU$#3;_0zYvkz0jgZl_41Zb{VydeL*s_B~lvYpl`a znrbM)OKWE{)o_Oik9M9S=EARX05MN<4bf<`-Df#)>06-G)HfMB=aDYE9DY|sI@m?= z0UYuxWM!G4Tduo{y(O8$B^jqRuePO+%et#?oGek6%xlaoJ!x~o9n^&^jLQt4;{5G_ zXI`zW@; =*$7zf|+lNTZdI$@9)w>E222|ptsac-zC5-v3Br98QjE^+?>6&)XP9F z#a~IbaFL!GVjSeUPU-gF%m>U)mwO?|A(eO!=-}j*bK&z#_nUZ>$Wx6+(Ik)Q!hWpF zC)ELQh6!fsXYMCloROs-u_(N2c|na om;()Vettx9HYaV5}opO`5{k<_*K0h @Ji>REgK0O)JSVZN#J~~%C5 vZ+7GZjqcZX_Svr63n{pIXjK4P{xI?+}~>S6EI%o6VK+e>`K8V zf+U*XRrb4uWJKXL=Bgeau|s)9)78m0#j@Jc;J+%MQBJVd*vANQZtcxL&t!R~5E3sh zVOFwaL8_)&ivHt-E2IJ5z&zw?p3Nb|2Ik^-;-cwV?E^g?noN9FeL`V9Mtr?(54ct~ zx{~x)F+k#q>P)eysrDVLXtEs=@eu#zen-i>%Qsgqxj;TS7EJk&z0!&ky5dEjY_uMr z+W0zf`9QxQ-MTD4y)&bHXxCMGFnIk{X(p^*w*)@18iO2I^y=g0V+TAUw~Vq}bbh>u zLhb^mbpn?{1xR{{EiOx^=a#h=KmWrOLi?vjTLA5~n6V(7Yp?%6vR=vLs;GDMB=8(0 zowd&zN%7IxnlaGdt>*a0WpJyy)~8CZo~hUE*t0k>A}DE?sPp&Sw|!D%p?W*Q70OJ% zKSmmgF+8Y-q2HgwYnPo?N9$F<&}K$HSG=J};IrnUpYU0)8%W4&)KQHt2|VD+Pl8m< zAtlvWl1*ok*~Mm;yp#Wjuy61yZr=9J#7+Z%B^ICO6kOrZMDkQlPZQTw4Ke`%GkVQ5 zzOEV5U6suRs-HT9&tZV>Lk=A29trb5xY3^}hJopOkLHopr#hL`=UjQE Nmk>0P} z*bs>-p5xuekX?Jnj%vBu?Xyv37@Zc;l_HBR-lG?*1c$zw|Fi{jrQ#`Azup@s`<92M z=cGS}Dv2)zyX&=g!;plTYx%=46K%JUhU1I*$`FJfY`EPqv6EfL!8p;dz}z_BLQ}c0 zX*YMxks>sULcBm`%>^g0i$;oWqev*u%`KD~TqBqWcTn!H`T&3=Cu=y-%{n+j**13b zr=CrHB^OIj@!c{=sX?X(5$!v=)4lPI{7~ZSK#2HK7;M%LdUM8#&inw9+dxpV156KM z`nNqD!8$8t;RIJfP>CgQIBXvb)^vc*e1C%5KtQ5>biAWr92e3n{VRb1b{Lu7rTpGY zkgo3RCD)TXdZFGY6RguamZp2LUuPhyJcsE`(WMYkxN4`Xtao$as_=oNQ(5pu6fND< z55wSz4dbDUYl2MD#Bf5Oa5?wYL-T++12NDk&iUw4w@LI5#+t*j;9J6|TH97EeaeJ| zomf-h5#uKK(YliFGXZBFLbi~|mB~6uS^670yx>xsL_Rf|)m#PwdCC|A=f4q*f={)5 zoOwYEHI&4sbAd>v*4Tyjv0k+S6}yTi)jLX~Iz3Z}(1wmVk;FSSIpnZ&mT5f7W!7OT zjqBi~b<{2%T@?`*i|fnm*Guiy4~W-`SV};tFg?=hDB~)FLnmA+%yS7*>)Kp25qwNK z!^omq{F5kI5@|A*p9DtAHaL!vvZpMIs9BP?SzN{+sjFM8*332&4mMcHLH 3iS{Hgr0B20{Kd&uQZ3GaH6q6c0;vpk!Yx4@$QwGYh4wBXr^ghUS z&okDyGFeFAKc&nrdE-`v&o_}#*!6v=IrQ=#6maW$Ic@+B2P;Uw(V=D@JBhO3<$}$1 zG8{Z= t$G(5XT}CQugDfLbVdV=r#jJxS5VMK?rbpB05}z6-Od^@OUpF7mLxCb z?abbw)47iVY}Qz6%7R7tioX2)nW~|@B(Ga87%+({4G$UVp=FtR@NW@2Ms4N^h@$6P zjP<}HrmRmH5G`&navWK3tp3M5FR#?$)A5aV0pF~v5mQSO!>zBU`qmky$id=G!{c-* zHNAZBkv29cVS%2;Qvz){oWSru&XK}H1viR{4HYc<)OrnDAiPbG7a#~RLL~e%TfQO> zi%_T;%(t*=w(u%64>L1CoZebq;ztTdl&QDEHaT24agomOS+)5j;H@6zg9KGcq8$}2 zX2|P{n@v#N6=W!dR#!_K>(49(4}n;ni$8jF9~(YMnQ0qyha^ly)I-e9j(tK{`eFlG z2^aJi8VKnSR@TuS41V-R7|vS(p!x>nI{Zst>C(FN!uDCxL?z33WmEF}(W>n%bU0kB zgrfB;_cX0rbLB$aA0tv)p6EcwrYZs-##~U5_q5_?wdeW5Nw(Q6vXEBHftgG6%A$A` z2wH^6_(SzEwwp*Ujl-=iF*=4xZI08CsF1Wd%MXmxQR$GhdCT{Yiz{prJp!WtK9HRz z=EmVvQy3h@CO1ZDi4>CC9_0FmX(=?K+uon?yp2n8Yvv~V={0kN0GhX-Oq6|U_2RPi z1&hja#kh niPXs)e!DVJQqx0>os>=+vQ yl%wSCJC&%se$ zjJ5rh7g~W(z8rKqq5jEKW2NeedjuQz$|~b4C$o8ORt~uKg?LB(?FS*V_GXqY-~V-c z&lged$$TQvr=5`g{R4jR`2)W91I}mn1K#%o-fQ~ Ad6HjFL-6Ew{ z`!R{-A-o+FMh9`J)e$@bADle@Mfi*|!(%m>UXw7^uC8T*C6*_yyxn=}?~o3-p7jgx z70h{EFK u0ZRjlY^_a_^YZTA59otzCt5gq$;roqEQ2)srb;Z<=Db|C=oUCkF z#F{*GA(R?|ds2xuUpp$sW*i>jB>aryFyRRS(3YwwEjP_k?zFt0Q((Ic!!w!wm42_> z_Cilbr6!B(4lfe!VK=7p7v<%aEfQfX+X69AhOpj`vC8VTC!+swi8|W9q2eARfI YC#w2?@90=I_qaMCC@;8 lE{9>z#~XWIy4^!P9A9^4C}HbC;io zNw$~FE+aw9WzS99t6obE05>1e0WD J1U&16IG%Y4W8<3#-Ou8E=Pl3f~yy#2CWtD3oEUdw^=YE{qESNjGXf`w)z zy3uF->nr_}?sx;fvGf53vZZ_%CakH`5-O~<{sIEBxpfsnT8uXDac6H1S<8$B@+F%z zT@RdteeW`ozxN*mSYTov521qu7*D+xw*+Y b z!j#xL7Q?N(=&||gH1F-msTNpKLgN)RDmg&D|K<0krc_2mewO@xx%&rLM0S(>dictW z{CqBosMabCyrf980xneDhf_v)vT$gaxq ArZ zfy@yjV)FJNNJ9OuD4|&lT683qdd6kkekG(T5KYQKUE^3a8H}0fpg%;X3d-! (z>Xh7Iu!KYS;j_h>>;hbG! z1*U&8Bh2$L)~0J8#9~~81*x~`kYd8yXrBUi9Tg+Iq=o69=+I}*zNcg>N1}aZ1gIY1 z5F*++NRJD56_6r4hJ@%2;ZSGXzx%o>I})k>b+-WrD;>uvkPi9{6P*H+U?Y)W29$RU zWJjy>QLL7+f_ljzN0-+1o&3dVEwO@-vbA-W!0aF*Iz0%D4EMo7x16=f59czTd& 9f=AO8gC)3GMfE)5v1I7VQIm9S)x&i|#Pru3l!jnDp z@Wn~PD3KxoCd#KslpxU(MkdDNNMvEr<%r`zx&T2!39ba~?ge^S=$`sCnwRj903wW+ zMZd?Db!)xr1p0KrIz-Bl?olG7JM3WXb}LHafm+4#kWN$LReC3hxd@_#hM~xnoNx5{ z56kasy_uD|F@#+%bOwHWMRpeL<=IpVvO=bu%780Xg1B zHofqs)!9X<(sM~c$6o2EO%_r;|C{=l%S*o!nQ_#NuaHrC-pcVKLItIgzRX-A;i-&t zo)|Z<$wfxYmMH!CAEL#r=q|Yb23xfZjYPnuq7qw2v|mOX(bANgsK}}mMZ%`Eq*CeB zP12OF#Xp^$smuuwoR5oyR+S#l)l~L69%~`Z EpWtm>drUeZR*aj@ zghT~JKUKI%gaHf+N_I<7V4nGJJndp3uUh$8_zTH&KSl 3qdci77 zJah|iq QNsuh;^5v6&9f|dl@1s7`E#CQ*f_L%8|h1!|@ZatfN z79UREEG!TdF_-H9C7LgQWe~3ZdfDCoYy%@O(Ts;AJLYOHJY408V>--(D|B!Z{%g3C zqyYKs$c$awX!I}DkGj_fDZUJK N>J_E~etCJ}fjmDiVxLsM5>7&K(vmO1S6ToXhAI3JV#PFMexy9UE#RNQBi`A`D$v zX#&2eRW$)G(3;vUy4AZc;zSDvo9 QbAwJ76e7mLFFFhzSzZWQBK9?c=#=rG2wsp9 z-->_;Q@3S*4rkfh6$;b`q>#+Dexc! e9oOgeCm6 d+6Jb`K zb|#@JnFU_zWCu6eG=akm_f+H($|`-pEp7_k`?%g5c!7DID{G@MEzv~L{+SCA%g8Px z{;YOac)sx|AhI$K!5?*XYucf_x-CO_Be8@r52>K=&k-ml)D*7ySv78k&;sNAx8jl8 z3p{Kxt#@$Y`98_szU-dmG5lUagg vf&d^BB9v=u}gAPR$0{-K!WfJl*MI93tj8y$xzT-#WGrRrx1R?wO< zWkprAw)6ou3dt7>#mZ0`qQW00aon&Cg;b!z#G9hSU4WlL`f#|dS|P&hsz?Af1*3YY z`(14w-u@io`8$cr4$S{oat$wZN??kf5k_^YKVaY@J{-L|*0#|{e5B6d^(LLMqt-b_ zBzRo)VFK7dKBW_K8UOruVd6Cz5~|d5L4p)&7)b<$h?Pir+2TU3f(G)QuwuC{XR>Ok zVefP>5NZPVLKsAkQ=ND|fCf9=Tr~=!`@GeZ%+7&E?6llHXlsMhgjqfuTE-6ogo{+l z&Uza?69lecasf7K5@v}I)l&e15X2=uU_@2u!%Z|GTpjMXu*#)fd0aqbHnYfcb{mD$ z$Tn1>YDMh2oFQ_|8%cdm$bkyxUWFD6qkdkii ?}o3rjVc(JkgK_iBvdeIVyTOp-Qy_ zkMdz6hivyBOLbJ_B<&L`&FY{bccot d0DE&N60n|pn5YYk@HbLQYk$5ZvJRj9KHrzCrixXN4H<}XA%7GbC z{p#Ef`UM~6f6a-^y#?_k&`!>I)jabkm$8p<={& zN*@q#_2hB>VB20BMq`TThK6QttTEo&q7Y zr7D%*#IO9bbaMZKuhb4(I&WO3ct=GPqJjs&6Us)bpa3PZjqBT7ktM<#;zzUrHtLb& zn8f=~{$Dos79^=-DiF_t-$6{2IG-XQhsnQZpbmmLE4DDi8(pPwwzO~bl3LP!JW;*9 zy_>%Sc>*@%3V2ZZtT82_VMsK7oHkjR@bXn2pt9taSA2cjshv)MzSnmiV3G!bA)^ zVa&JoWl{^pk|U{Dd=2-SDerCBLzoG1D%y+Qj;4Rmb(mFn6k`lmn0J@w&=MMt|Kdn8 zE)mJUoV3CjwKrH+s-}bcgZKYGw%$29k|%EXO|mgIwkLM7u`{u4+qP}nwyn*^wry^_ zak3k}^Ly@d?m728_mA)SbXE1#%<1Z`n*OR@e8+%A7tDpN?%5)|-DL2h?TH)eU%T>; zVptUB?d-45LAN%P_M*UjFHIs9L8Wr4$6C@8=IZ6n(HQ}YgX5-3WLQnT0+;tq$KTFh z9JxJwGY_TK$e@2V+iu-Azjz*SFLQ1|F5$D=6U3BynU#`nt?5=i8QYZ-p)e%|i?*;} zFh_5saWkyqPUOiV+D)Hb5+&}SR|ON-=Mz2J*MIaepkOuu9-U*38hu^$e>YkA+P9kj z{$+MI{1MZ}s>W)v3 ryAcsm=7k?F*6`tX zbK5X#Sw;hCJY3Ru^tXAGd#7g nd^+b`8{0Ai<@4b{7_G^IPRVP_d%?>e(MMRWXA zpIIWnglMr}W3Am7WyBb3CKT-TDO>vy=X9_=Wt26pz2t4`wvDzCX5(y9m2(nY?MLyZ zP9!k0;HG?#q=~4Lo1NAf>gc+$i+0GOR{vK>Yhnh_=|;I=&^AjFUc(U$t=!kSEZF$& z+(rCoT=Du{4lLGAtu9ixs9FydwFmw+lJD~6CIawKA3toen8KDxjuwVx?!si{DpU}^ zbf&m&q ;)q{LAnd9+m=n9zRmFC~mgWG09gbbuRk4*9y~2rg4+-&v)%P zsm3G3V*zzlqdywzud J+%Vs9gsfI<68u-Y_{pdUi#8{=<&?F^M-`@$p6b|~T;{f>D1w$6c&}Q1 zd70>x E6YXu5;FIlAc>^?rW+Lj zk-PVl*&kgwc&QsJIOeG(JlMt8SZjg#7}1v07v|LXpt5GOUfP2~=8-%vU8w%20_D=T zsOEQ4A!mhnifTEKIV<_Q=4?uB!%y__H`y(fA6{{r<(nKzM)LrT1S0UdXmtf;Z-`QN zeQYK9s?FVDgDxQXXBQIL3btR4`MrL4>C~FC2)+TM*bm_Z8SJ(^!$;wMhkG}Ay#FE_ zmuYk2t5J2G`EN2%w1=J|(Tc29N`7!t II*; z=%Jca;k@~+$DC1ydQ*};tq8*ER-TsZgGkCNM6e5q)l3^MYEf$7^cZQ@{a+=>$t)t^ z>mM^Wn87)aftx433Ey@aZ_u^+h<>0bH~J+Y{37@{7e-_s^0zuIQRhTWrO#TrTtCtu zzV386B}J9bqA<6-Si){;)y43Ue$hPrIz<`aWS5D77DYXem?Y_%6P`lG5|+h_24_F@ z9w#YDO63wNj-jW1CGAduOV_cicIXm@Zvkbvv+528hPb`}Cxl-}Ov!vg9A?O?CP9wD z>QWk$+jbGcXY|&y+Z}P1f*&puX_5?ohTi_Hqm+J;@a1~(AdSh);H0ddZVD&zv<)-* z9#e()(T;1&5;fj6lbc+ r;hLFOb0PFS3k46p^CsgewT zz>T+){gs=dpZ6v5dTmDAiwYlyi@GuYUt1igZ9daw5g{&N o1$ty zvt$8uK-Dw Dx$&sn|5jPTylSG3(bce%j50 zA7o|NjI4Zz2R}?G@EDgNPG~|UOU>3%mCi@*mLd(Co9I-frs;07F7d5=IldR@U2<#r zH5-+Eo-GpP99ifK@T&O3^xItC;t;r(=zmBhFYEHEBzIZ?j?bp$VN~z7L!pgT^*-u; zbGF53!_UoTlIy?YdOe=CV5DHLJS#xKoyE{kV%^l?{EMOO@l(5c`J^!C!g#Qj&i~zl zsljz)e$+iy2+Ov+;JSpcEtG$i)~|dgt;K+fBMr5r#i+94m=llm_K*anikx)8+R7WB z yTD-r?J1uV> z!K39SKrx4_GBAQHpfH)u@1&Eel-pq5L@}rt_HA^dBX>N6WQ@r~a}Ri)h%s&>r4%BM z;XwmFOeLD2C6zf^tl93SSW{KN2W!N5qg6vmmYQdSyZ>2~be<1-T!Hbq4mWN^^-Z+i zmSJY-rQ5pr^wI8m-Jc>yec6|fiaE`?jwpPPltW>K69LNt-fyHU*RcK;W3#aQ1;*!8 z75lUeec{P^x9r^g i#DeZKrwl1%qdOkYm-FkZ!1iSUs2%O|vH^KhDy2si> zw#2@rZV!-{(yG?B-6j;yvIK86ypZQ!iDjF0*QoIt{LC3c+)O0bgqn;DylN$bjXsIL z2fZ{o8{(!&;2U?(mf&%&CVkL4+t>_J1>4sS%zda^UCz$swq?~kG6i%Uh0zh;91oIQ z6iLaJul4mR_tpD6AS*!)+;trPwIqrQ{HusRmGC!E|3uoi*6suek$8d{R!K;_Xxa4- z3FdE)SZOZCg2neo=YWO+jJAjSv8gkDnXLy5do ip+SB D@)g62;C|L~$yBL#@7)<+ALYfkTO_m6_1n#i~ CAJ{k5Tz&PBNXJmEPs82`zat#SHH4$5|-MLae-GB-a8QW;Ie? iOU=F{Va5@-Zp z()>8;;1K2&f~A#}*oWp3c#ud_>nR3`>{7;6jOL`6$*t1e)HJG-kF%i_m1J5LI|Z0q zm;y>{)}^#BKMZu#!fY03rdIt2t|e;x72IIXUBgKz^FLUp5Tsx!q+C8A==^v3lo~s# zYX0%6(K!M8I#UT6bTmZe>r;N2X0(g_X4s}`%-TPEnVNGD= 1If{k%W#5ua4a zV)VM$gSrQJRekjwr@g+bbhQ6Q!9D@lW#2PSEKNSS(a&Wy4V2bvHMil@h?h@J&q=8_ zxBkIXwlx3QlUk(*ArBv8`20hYHeiK;p}tt{DQMW7)!OjYr!-SFYEnk67j61EIHSxv z1*$G%ox^*^KfCTm3=XM0;N{FLI-==k0SzE~ZeLQApdr4YkuQUIx99!C<^FtXYfZxw zleeeesFA3YkB`|C*=zJrOYj&s#&j#uf}Zxhl1PgK$!jzi&CetXQZA5mZr`%q_Djah zK^F#(`>b<5bfRrD7D>{bPHF(PaRLsBr6xBqsc{MpnPDn75VdIr4pr>ZSFN>HpwlDb zH1``c;SoU+tmYD|$aI!CGukNI;rxABQcNU6oDhcIdBUM%YG=GD%2{X9$hnOp$aPkh z{P`Tkh-^O@D>PF?n;PwprIICgi5cK98Y{e*%-=OB-XbzPFrF9>4 )KD?+JR% rba6saF1A<(MtA;eYA bOhmf~db$mwU$`0kQ%xOG0B88u8 zj(ns(0z*m%W6G&;(+7pZ%YK6kkT>8+fmo&xE{flInux8`?KOX(5usRs$PCa&aZ$Gi z>qcpD7BQZ83gJRG3JFfS4W sE}sC{t3@>kP!iNKvm`F>>(!-epdZqvN)a2a2n44-8;FVW9-YC7&oJ z^xq?M>w857z!=E?T@3p*`UYrV#XYY<`}vSo{N`JB#BTt{Gp8Zl`;b S0;uS@Bi6)6C;oqj-rS;@`5Z z5UkVs0tZI0&=&7KzJS2RsKEKRP|<#2 T%=CR>QUzPJ15r_ EN0-nF mcS$$236pf?Fn4dmMC+$kVyK0r|@^o@RGr~ z5heE=SQyM=NF)h#-%e&Q?Zh3*VCVU$56`iaurM-nd0@vN?3Bn _&UxFR!}K8hJ#Y@x1bF3F)f4)|F+BR*1?&=^>89vpUTTqaAHHai|-SUPE# z4v68!sCK&Sc#(neNKgjsc+pX!g%SGfc<@n@nPXb)cwn|i)eAz9uEl(Rs}~ey$&2|O zL6j6N=9{fv05deuKK6%#5~3PqpI%MV4q}evjuQtMvEhZL&shQh93@KQKc{Qf0>~Q# zeEkZ#-)`X@>icu%8umW!PCh6OUBfsp_Lyy!AyRZpz49w#9w2;r2Wi&9(#8RA=@0nI zu14xlBZZs2g-q}(&uzX%O^+2_!wTc!{gRT56-bs^R5*7P9;Q}OaP-@+3-hLSB?*K} z0Wv(=1J#bx2FzIkeaotLk!lD g3*6p{ 4HielaQ@k%s1&z%YAUHE-%>hMFtT{Gq-9nm_XB_`&Z1 zaIK?^ 5q z=!g mPO$_QN(1Ja_h%?X!+>Bfx1lM0B`07V=htF%r}}{2}2*JK {?^NUf+gS~3E=_t9A^O(<_DqB^0M)DrL}7sP@t77HG3YKT{`cQqv^|ePy%)l?i#!5a41_@p z6CJiYq~ApbbEi<*AYG%S|3*0G#0SYYmW1L$C?PiJL4d$;>ZEvl_>uR?IemXOPwhQn zs0FP#i32CA_vJx_1N_lL+g6F3X{teN(B~J!#d`A~^JWV{Ux^rp=4|ip*v`fJ5MmOp zCxlLr&=0xcBa2bp^HK;QH-kKkY0j?Ti4z=;8o;gqsmNo5>%AfiN&h&HVRg-sbEnI0 zg0|jlJxYmUzcLLu9z#A~ot20aq%i|}c6afRqS5>P+V4ZP*juuSCj%Vt29~ZOGh?VQ zf?l(P(d@3R;3v?U8)(R}{e2azAf7qHhT)Zd!A_ue!_Y%+ud@3NfD~FuCq?@r2O8+% zCB+B80T4rq4+WFd(V>M9ntQ3JVF Z}MvVF221r*t7mu&qu=019{>HFEDG31}IhM(zO-Er~jz<&gwz zeI?1|n3)sS^>F(T1t+YDWSC$~IH{2!MtI7F9vyY5iJ4r_;xf3x5HZx3YC5>Wk$gFq zY8gcO;qEbEC6)rosRoEbKZau#>~p00uSX150!tFWKJXg?3pQS- isS0BeOsqhKIk#>#@}Z| z=wa6D{FOpAgx{Ptbi;^a(nAbMc$gQJ&T!ODn6bM_4e!b3gQT?iM%c-qmSM$j>a3`( z9cG!6ynS4w`CvqAEa6(l#6UMunCv@0BOnmV4OmF(4t?dIzdX@fz%Gk4{qAPa_=8GZ zVr*9UMhgwRCar4SU*83i`S?d*Tl3SNl$gPFUtIK0ZQ`B!f`}cIBePAc4YM>KY#}lw zYK(_5(|2ceJLcei&wx&FX7~i@7Ts1^e=A9TqNlb0{A}6TY4fVwc|Qi)jiw!48@|q? z!^Ll(s9k?73%MG@$Ogy{qa%``D&S~F_6R%YGnf6yH+06pRPZe66CFbL#^AxVCgHgY z750-KMneRk%KUd8&^aA+UV0&`s>}%5m3SRFeUSt=l2A( jhnlM~wV0=OSk$b?N*|QJ^t$PHEA{ai-Ig%652#dRtD$TgN@ke4Xq3IA z`Z;vZkazW6rp ?Fbgmcd8wm%W%sF%1M`9Fv-u3YZM4a_K+1da)2gn38+f5%jYLMatEVQfPdo9%X~# zR<;!vu^aRQK0ju*j#n;gWaeaX5Ko4-G|0K?1^m4qJ{8cYUmc z%^BmGA3mqbE>(nK7G2!E1w|s1ZYKJ8Fw-d|)wtl5x2aT@&9OAnIHdGjtBagFY8!h3 zcAA@?r`^C&i 9jDoMM)w`{d&c%t@p+OC zG|#t(RM!4 zOYH{5^p~xqk{&8=A0KLI2I2I~FppHdjXkfE_7rCV+&eJUo-c5UtOM$KI}b4Iey4pn ziA69I<$GYW0Pd^hk5F>$l-MbzxUr|Sla5|8*fFX0_DC>A)z+*9*=qGu?TArcRP=U^ z5f%0?{JJpov0x8S-#6nAxL4V}57qdzeGZz~TJAzc{G|7q(&u&vOqc}{3Cc>Op7;r& zl17SN!G_{>kwM4d ztyC2PwBb_-R+pq0=ndP-;V8 zySd;roX08|I;;PP`p2f;CR~h?Sv1Qb;tL%uq(ciBxcF(!LapBVcr@YDaZCmPj*drb z=~Zad*)t`GTz#6IB_};fkVi-%Z?~;$^jwL7QS{+%4JHV#e_kRKoZY%P 9=r_usjYEV1f$nlib1VC+wwu3YOa{W*Z)~lg^zD4GeScYzlY{RO9L2VSi8l- zE_bajRNy)S6zIq#^2CJ_I_aL4Y&0Gr!gQI=H{Ow_8h;)TV@aqTX|z8LT{P6RM6BrV zWg}Ggl@nqE*ZZKbzd_Rz*IISXFlp ;5;o#)qp#NL*dnSoS`fY-acF*XUKPePECdaW2-tt~IX70SP3 zEz`Ve5j81?9o5GFG&2YB(`6T~vgA|)Qo*GG4!9kl)Rtth5pVad^J`b(qh!{P?gfY0 z6u)J``M$G;xa(n3K##IDIFdg0FGpvMeTw2wZXk*MIUc(M($^31^*2gwH$Y*>ncL_v z;;mn(6GBc LAIgj1P6W3XeS`=3=_R2hqH~k zAxFC&O#$6hG(DK~ba`T8a*n4u!K$KhTQe;-K)ZR&!w{1j4kJIo_rf0;)aDryuX*TN zjSYOxje+KnpP|j7-Mag64;NRR+5(XmAsUJ7v;C8uYU2K<4hdK1s;y%r2KuGPdyII| z7{sD%HH!3^sWF NfG+MN8U0@_})A?m(dr78AQt_1b)-f0E%2AJO0 z6{nq?he2|on*V-s_E+IPf)eZvK5lDL(hqn*9~%R=cRzl;+bX@Bn2GRyWU%V1S><(H zlD~q6^6_{`@aJ)ib=@h2hD}|*0lsWUimsZGW{LK;J(-Z=hd);Et8lR&JB=$!l>Ew5 z^)py}i*K ~> z)sYmOtTsb5x*15sx(E&X*Al-JmCW7{ETIdC%W^MJO}Sg6T28{U7Nd6@mjBgtf%0a! zS#Gz}9KiE?mMbtVql#-?O=rIAn$vS-i?_ppKC(8tN^k{+4r>%j?NJ{UI~`(i^mMZ3 z^?<)@!>;-TQfuw&j8S{-W8L6UtJF>Btm9vnLD$0C2(C@}6@%Bpt{Sg?y?=Yqa-BsM zgXM|`D)p{);9M|J@C}H40~HHf=ujm4i-(t%QwQ5}$m~+su3Ogc5YgzIYr> LB}J34y$OE@lJ6eM^VrxKYqhfZJl1r;IT2+p%qeb7l%9_l6PIAN5p5D zcUq!OW2NUR`bU6W-IW68GVYyIL5glmA$Mc5D$ Uq?$%9pv)04Z;@nC(vyB$sBFM^YXn0A>d(X96%3aJ^FRZ1y$S+VR1%#_*v#AM=1 z{?cPy?&8zqNPlvPM|2LQoHF(xuqB+oKr`z6q(V>m;6n*CjMC^}bO0bLT^Z;I5Avu* zajai0FSruxi$JOM+$v>GyN)WwfV(kWlA_)r4y2tH)XjXD-|nYKMCD$%3$ ? zayUzY3aBEUJN6$z+rU49mL8D&{72y8d(8d&cHCupA?Y+TglvvwOgw+c!+}rYV&^Yv zxyO-2=x!XblQ*Y->6-snlJ47wg!A Q^SvRVuFT6H@y^Qu)AbT?1de_7|<*`hZmFc!Mjle?gbu`9rlVJ*be$4<=~z4E7$n z@$DAf9J&Aht$=h`79_=enqwCKU=3FKiZxjlEWvx4%LEn6K}D-&K@(8%*8Pb!S?>eF zM5B*neT9k3{RyF3?<3esqt9@2g((wMEC&^}8s4E=^#39J9$#e2jIs9*Vk-6r(iZ!N z(G>fOQ5XA<{6_{5>HohH)=^`Sbaeq0tJfpcSc47f9h77B9l^Qemg$V1%ok{md4TXE z29}u0OFsNq;s?3lKr)G1q`sm0|0V4k28RDD{c9oyBr75TAypBd;flx~NEJk{_|`Oc z_~!qYbnAVDn`&q%H@2_z_5WS1Jhd*mz;6kOH!OYyA~xRoXCC5GhQ)XI86hhIeJS{% z|Ip!5D;h*u*JA!EravaUm%#-(8cc ao$GEaBYRTTm_3|D>@lDUKB4gJ}FYI4`0VG>wk{j;2yxd%FK@^u?r~W_o zF69qfy1!Q(CNqmex9w7Wm(p5n6mN#JdshEr^CIf{Ch7DAM$(V%2abCquS^`HT7emo z@-gfMl~UG*rku{Pc&4?fSZHQd@;#?4j$AVRkEv2UpVpFY^B+?=pD643|Lp54xE95o z$`=5s=&nSmX2u3jIDc8ODad`oS-Ose$8eYN3=343i7t9$rhf%rmw7ANSJmiM?0EUO zLmCV+Q?+y|6Si#)(kp8YMx|OS r`h_rz)U)GFpV z#2u<*TG4`Ms4C-b=$7wm;xVx=z@SM)_YeFx$BF{320IZrp_rOCuj}9il9`M;F<&)l z?|mHOydhDOA%#Ma@N%n9N^|A)zfQ$q^Ll;Lfno7d38U-!N9vY0I)ie%q^d2yhCeQT zZ~{v&*hC7MFEPoAI6AS$2qF_L4)hur4r `tr&LSvFWBU|1_#iZy z+0bWfIt9dB$`^<2?&kVY*z<+V{+7Laa2%Y)VXvQAV)#3f8&0{`Q$>bSbWJig)``|% z>5=#^k_F7^z!cGoBJ45pt@>%z->@8#d=xL7)O$MTsdpmyO}ZZ{FVgO6We^j~vnVK) zsR0Q#cuK?jt_g1+i3S@T9YOG9Z;vm%MpyKK-n8hv ESnUeGlzG1MA-b}XDy9kE7+T_7V5jLk?YkI2U$XG#_BZvO?;=t{bh+Vww TE9-$+U?7RZ@C{Ppn ziJbuQJvwAyewM|_?(gY7CpKdsvvt}8N~Tr5SYC?`8|1Qf&h>(BUpieSoB2kRuBaRP z>=3cVmx=1;?+eIk1S+9QQm;Yb-$m=+mqY``($))wZVU{HrXMrUjNReoS#Fz8Qz2+f zdi#VYpfoV<`!SR14^Sal==6&$M7yITK+5*4 {yQV8eN;w5rmWLsXZ%j P{ERP~{d;_{g^COe-imoL;$ZBdNoII=9agND*UX~?@rm?>17mH!U-(~R#^A?XYZ z dSj2?#)@KH;dmO1ipm-Atj0H@`r(T)8F&R z9Cgxa$nz{#DtadLjezIfzd W& znPvPv!`F)W%0!WZImO3xz{VyHv6GdIih%3j?ulKWsXvOtoT;A%UVoO4B4`@>_gC8% z;>MT8A7<09myHmA%1(8wE&rOWQjzP9t~kJqi{4{hJ)PYmy^N=v+QWqC!rwo1zvTEe z+T12cFyGEg=CeO2ivyDf?G_NrH*x@p`D3+n49+}1uEVoupTOJrD_-oA9=B2)bBsqC za9vA1 l{Lgcb;}D%38!$)*Lw{?eD^nnu+-J@lTR-+nOssXmhqod#b5FlW!Jz z_?f{i6y 3-jo&=KXQ zpLa#5Cm?>uFYh7O3zD|0Y7ChU(5wA3k}5N7L1}Pd&7zNUkP@2B@Gw4Wj{W%iZ00=! z6}re$_mCVU`LnLZcuMu$j&A8n2LUkZf|6I3_OFiTy&T$+52t0xkG46`%RcxT$|iwX znFOk?ix8{t-V6ZJ@G=XN6ji5&hN3J!kwi*VxLwpkETGn}@qV_{Xihxev3Ayo1|N6V zGk%`q#G=K9dC1jw^bu6oDUED%!>|+-yq-2R4Purgn5ahX&9E#;KM;tP(*sR;CL$1t z1er3C4}af9X>Jn*RVhv^cG(n`LWU~##%xDtSvGz264OTc>9orrlZPUs+N8N;L5?%D zF8`UuQeLy#U=dnK_W*puOs#@UjoE?m5MN+0k7n?Y1p;{OLq1g{*+YV+S?oU^RAGm4 zD?Tur+5jGaZIxioaV6|oGOBDL4sKcqo)b}war!bzgv@M|eUsRo$b3mX>?>$#iMcD< zXDD=r*u#0t1d6okM^J7>X3`q~$5zD;Z&_wzF;HAQ*=&nrl|k(~oncAxXPK)?7@5rZ zlS-1o)JRfV94!L{ucH%;qk>aTYmYQ&1*+CPe%+S@`$>s;*WHF~rA6CZ!XH3pbWy`X ze9W6K5v`f#{J1Mzw~&G8M7$W*tjM~Ju2tS}B$kR}J(a|!i>>!V7T?#@tFj_iF|18b z5RJ-@-#PUW9V0}h)oLZx_Ii49LXGY>P`<(2Z!7iv?xYS`vVQeG=NUt2&7oHj%&1R` zA3W5r{4Zppp57|V{9|qsx{%jLYZh4XZ~c^N{y@4nBn}5`bM8{9rfnZuJL TkzlrrsIDD2QIyvkB zp*Nx1(oR2`h(~?WB1;-&A+3fX*s}fxcaJeg17?5wn}d`*_IhG2Z7CtQ)Zg$3bZ9qV z#X0AW->>?;)*YlS4I0&uA?ksMsx+v0Wjc7=Qgu`T@jOOT%suJguE8|flP+K{n6W?! zEU78~DtmZh*!Kl}Y&K~hrBI>kG9`#H2RRK`qXIVqIyVZNlk5e=hY!pnoaeWXR_I?D ztIkx}m30|fJzkpBJ4n0{VZxey7K0o;MvAsx;yaX`u4Dy@-rlh =9p@fk;HRa#BM z?kNHGu(@)TK@^#?+nd@d=)RMzawBYo gwW8&cJ6+w)8v~*z`Shn7 zt UIqveo*pVmRCxlDAYs4Q!(WGF0a?a)F>HM&ds-+9$i;J;|L zH`8D}3u82}_es4O OW!_IFCd4N-wPHw;?-WJ-xf&2w2gN@_M`Iiuz1_Dx07+>$?CF9 zvmtlXWaFQxvD2o_CGsv$OiX|SRKwzyj-A-SW!-^_yFFS=0n)on{YtX7!h}8xE=Azz zvD*-Hjq}ON6ms?s?a%V04s8j?U%%#qPt5hLsCrzWu{8D3ar=6=lgFHG(`cCJ3*?hM zDBRPK!={V3Tg7aj&4VWhwX`Qqnq@NFp5qJ*9*xTlUa;W{y%q|X%7}8WTlEq {@t2&RYv>iuPV%$E4}6I41V0Mp2w8;*ih79@h^N%#pEB~niV-q z`km=o_3D~-&uZKp*1a9Hp|tz8mNq>70@I)D3g{YHGGM_a39r}S^utJuBfM40O#jn_ zC!tGeM;UEy_QU``mF=yE0Y n%W%3Q{ ;ZXCSKi=6!&wA8)x{DEraB?1&YOo`n4xDz`(EL@h>g*D!~ztOQAs4$fH)yn zU>v3TJD$@v*Xy`WqqC-s(QwiNR2&(oRRYu+A4{oDfO~iHO9(n;7->g={s^XWo!uB` zz$Oe>vL;;|){q7hZ$KA~*{@E>5nM-U4{K27p$J}E$~?F>Zp;?g#$0J*31pj_KkSb$ zqG) nXZ cPfTAGAQ1D zR^kNn+ii68`#THF*!S9+*m%M-GWkeCNeu#mx6kWYU&p<2SXtaIH&ku$W$_`|Q1R!2 z>>su;lg`3@(<_b3;P|{Gnk}|a>T4=-Mq2#$4vdr>EpSc@V~V4#xim(mQ{2Vz=G+ps z3m1)67udEuT7%YIr${OZ+X<%}O=tK;)FX|UkVy-E4!3s<{`k7z-&_S1c1v2qylp4> zMNX0oV4@f37Jd*^&9?aZXK3o8>g<|byX@;Ch6X<5tgJ3FZ#0K97)7R&Wv&U8%? zv{buGn zCinwcf+jZMdv#&mPuJLyH<>(RN1rO6T*01!oP!IIjMF)Ny1)AOP$(N10`)AgC>9#6 z947&M%6_B3CXoPDy{|skpOt3L4SiqL5Sn>nEkNJ0250X~KCU(mjqgD{g1ixOxkEgF zN4Ou|s}Xq|wP#FZ#pX}N8|G$O757GBa9$a82H$DvEoORaw@Pg^QWsovB+ZQ0lL(6s zB9Fj)XjQ^zVa^8TSBk627PIzT6?#!w3hsj}eyn^GZm#S~uj z-Dh-e6+s3qHe -ORW>bWt)!!G$X;Q0->WgljVq{7 zS?CtLMhoK-`qBK~!uj=H;qL|sGy1K4Ip)Ar-u`sz3Oi&}+IU}G2oy!{vnk*vSVU+P z&Nlxog;RJohT4?9 }o)XdiXv@0q9*RyC`p+ z`#r6*3v27)Hp$6Np}~8W&l4QsUo@0Yw~l$Puz=tv{P{g<+sDkHAENKGz-W5a!)!2g zuHejih<_|DeIX2So!&$?Y-4HAKhnbCo7UtuIV$n8$6q_r9D3tsuXs)-Qptncndk^9b= -;vV!8rf2zPlUNIX%Ue-vk@wJECGMn2S`uR{wEm3`r@SVseON|f z{B3Ux{`Zv1Ax7lh#B=(fH;%rre&`{7i1$3h1$W9#){)3q{?q4p7=l#$U?bPX5WLB2 z)`!95p} ^J4(o@xuIC {zT)?l`jh6;5%{j3( ({rDqVDhVp)okeb zu6&&{BK#C?HeG+nY?x?SSdrX7k}3{$?pMR5I)Z7|?qB>q__%FznPlWtGjzrp&T@JT zg3NL%y+|8W5YXpIuH|8}@veUK$G}%uL~nnxku0W}nrz0T5i@&!?32BP0csjBppjb9 zE>~P%yvV5GKXLLcNIo%K?wO^y^yQ0@+m+GdWe-M|r(Njt(hAEN(B>}-Hv5%R%fGKo z(00@$S4M4Vu&J^9dW_Hhq16hQI+kC5P@Oop(M(gsNT CGDgtvkD{3rM9VtOxyZ!rAUOW9AQXV zLwS+cG3F6|)`U^aG@f#H`r5ViiPCR;Oqp{pyB;Mb*Xv;#*-8X~u%8?T-Nfk6kX-vM zlc0@`pNA?BJt +A%dpn+{kR)nY0ztSq){LD5K0 z{Y&A1ZHCU_ p_Ak((L*;>uVm!-G7 z2t!Sfuaz8h3RIKq8EE@)&hblqKgUwER{fA@p_=>xJ77XO*?!>+@CUO_{J}rZMYXnE zMd1Q7&J#g+qWwpY&_$eVL$W>o(xnf&oGeqCC&E$;`DVW_bzkcBZaFvA>UivCBqtk8 zUZ~#@klgLdQ&D Yj+yggfnTm!?5+`2le_MYYonA=B))na^T$A(;Cf4wPgs6xJ`XLNG{dvA9vO5D~ ztVR>kWxL;>Y0o)Adjt+$PI|^U7j$2gqdL}lB&(60$r?Tr0WxB*5gQ86ZM`+31>))2 z_@B|L7c;Lm%`}{{4OWzUVBM6tjybp4#~lYj1}X~6dmp=z3U%XfU7R(sot*fpXzuzU zqLVgqFmcNt=Y=WtZv+^ 5hpAuXDhcDITJmRFT@LH0HC8lb3AVQq8FD(#PTSq3Aguz5#3qejMy-eA zrw% UIU*v|5Bnam4|j)`?xKga5og}g_ 7ob4reX6t{PW#%@nuW2l@VdKE>%RlFyr=G4A#GW;}IqZF#LaMtyDF z%S`6UHu9R>QJhlc{l+mU5m?&3(CQ9V=099e7Hx{WN|b&DtF2m)TutBJJiC##8kIOH zZu*)EH@R89KrI(WwLm48q(_!%D^|ap&Ycq0TXn@t{x~df0fpF_Cg8mB107chgQIoH z=6q7kW+Aj9fVCr{!tc_dZ+1z*tG~xP(IDK{6}S|L&QBsNw3-?ivzSKFZ3L5Hl5R}i zjmc~C;VNx?eu3Z!^hRj87dPv19pLF~j$V^lWeB{qf^10Xu~t{UD>aUBzpj3&;oq?# z>?_@{;vy?CHA6OKLviL6pS$QCtt>n;jLmK9iADv^r1@rtPhS2_QG!6Ka87J#w%~>( zJ=XtTtp36RL*q&?14L&R`LZ`hS#7z`F9?s)VW8XUPy>#4))lWXY+V$Ztg551=k%U# zBs|e;w=6YUfWFCw0}pnid7-6?0w2@$YJI%Oe8l{8XYCc4!iL`@KeEthNd-uk^Q;O_ zicm1Ay)$27e763ks t_w8W}_T$$>UW};ZdwNf!#A- ^u&1bsO`q7dt857lyIHnMmzH#bSV!deF?nw`cvsZOXRP!gd!WQ>Iqxr-jk$N;9; z*y3VNCtWE9SXE4NACXTjvdG^2^-V(^(L=%dJmRy)z*?XD4H P`X0@Lk=&nf? z1G%RjSL<;;tL5v(yk(Z;W <;vataZ^6il(>!hiB~=G`Z0#np>1EyaIz~ z_o!EpRHZwaJ|$aPTlX&n78!HlIISFP!mArdG+|8kdp(vi`17jfA~I6E2k3^6+Q*S5 zy3$8zReEz8e~iZo$Ru*WY-cYqY?HuKK?hGvZO`ESfRR~=*+FkRrZXF1xU5#SI4rDI z8XFDsWJ_x_N~_e;OXoIg(<9BVuB}z8G!#`?sg`l0mT`U-sWlQ< gUfGTBPC+dcN+<@HI>;R72t2tW1wjZ-LoqrLvgU7Q9ZIP ziSzfhGrgy$Bc{S%gIi&%VZdzN+||e1xI-dyC_#qDdzDI^WSD?#kP7n>PyfhDqxy!B z8ZBRuA#J8&_MT-owK(gLL?gVBxi&eCPgzzAI1_{omlV&4=1y*|RgnfR #c*`G|Za^_axqsJaGkL8QlA0XpR+Mrq|5un~AL27FS!>4&tMYtT zD-7Pno_Hm>3 dYneLMX6*a^YZ9vVpO35w+qDp~+Pv2!rVwPM zeXB=^>j%tY2akJYX28S!%E&N2uifFRiQ62U$pBRS?ai1}_n@!NNP0ek2HG5DH21-> zm{g;PWki?@u)RPt&feVk^(AHTdv5IcD4c!sYS<0<^nJLjcrmDVSRcD7u~M1{re3KF?YXTU*Fu_tt#fj&Hr7M|I?TIRr&Ak*R{+)KCScqRq%YT;+N SVQzu&ySTdQ>(MEr5{{@Y5?f=M*;xlG2ca8%ED#D4Y5`|JPurv6*MAg+G- z`r&^G$oTE%{RaXvdOKymz5hZ%&HW!=jg&hAT6)V}rDXo IJYJ% zgAbs@P&KTj(2G+m^&dfLS;^C~YY8gTFOzjm_z}4n;>@wKU0n-X+lWb1#ibAF?N@9y z{V7faE1#D7D0uyL#Ok2tO{mrD%c!}*A!9lbIkg}rsNoNS9YW*qI2l3P1J9)1o=npn zD<@I~&rk;oDyk%Ono-{x*r71DP9~pk%S~ALe$cRp9B5Stlp63AAW*`%91fx{#8bQM zq--!vIxoUDd<6=mj#9;-<=R5D1eWZ1ku31PP-2!XZ-G*=d?^crk}uz`*Yk3UoRF8( zYDjuHEsUC%Gn%qY?Bx13ZL|ynCM(N;+HwRXNcr4aHaTBgMk$MC{nw-JXj-YRU;o9V z%8W&A7qqRYV=widBnl?HuPA8HJIL04B}zo!4oN}4r^%ufStfVFI{Fn$Mm9{UjwyjM zX;_u4FGIC?oI-J|A5m)+O yS+voSy?i#D909Y4yRj^?IG1 zg9bu mPY==YJbc(6SdKot zqb%4XuLY~>vMqH@Z>UuBt6VmsW?P=LYxnjiqSp6J6EW00(^XeBs{26Vo#}Hmd8-`w zs-vD$6@+}|kt~v4^GG2Dzj-RCwFezjkkh9(r=n&rSu37eI_7_si=tycR6Dn8h^b0> z%Lz$ZzjZs3vts*ZPDeAzl7n|%hj7~^QGqKW?A?KjB8IysZ{z(i)8gNH9%)%F0;utX zRt4U6LJM3tR|YLd7W&V!er8=G##Ns*w5cChYxiu@P_)b)L#z3#<3myg8iJNL4{(aE z%cALWy{vU@cX?1k&Sy@f5q6vtl`77!N`0(MaON^BS;Q1k@|_b|R2=9;QX~IEt(0i` z(W`FJ(dclJeiNB8v$frNuY#OQx3UPkbE}YM }h*wm*}&_uHVwBjf=fL0Qf z2GGi((r>VG=(Wdsdu2yR&qtXBX9dC0LNr#e;>bq~Rwq4IWrfjlSXLCFLE|G`l>C=j zYe=J0F_A*fTTHbPb{12alzhch7Zq1A)kM@H>4X*EyF#fdi`8eCMj_-}#6cNh2XPQd zX?kg@s?`U;Qt?{{Vf`9FR+oMHHbTP0RurmJO|QskcKQ$cC^e7=RaBbCgCas<^g&cD zwzX*Xgj^S;7~*cP6P>NyR`)8%HPluX;a1uzr0GDdI7;5rN}}RAtsF`Y;l38UQU9*( z5(XXQoWdxKuv-{4QnI~K6cy_m1yQs=Iz9S7#y$IM`h#8tId5QP5%vXEA+i3lRYk0` zJg6epQ?{~bMtN2orIyA@qSDS-IfQ!0R?+J1Ua#XOui9sw;CGca=0pPtM|rA=f}4Dy ziGq_n6-CHJo=W>6p2=ug-C3UsTFW>7rKiwBH?sCO2kv9FH=j=Dg}K0~lEo61p3DO) zhHv!w)&(UkB3+m|09I9!30`y+i4sc6T=jy2vpnF4A@;h4!(>`P N`LuFpOfEJyM zh@pg30Ji*WL=-tY(GruxsI*;!raf;c$)V(=2TkT@<%!B#53h`_ktMtpyRxRzz|F~} z(-ec8xE7|U)_t>_wR%^6XpjB~Bd}v%mt`KzukT&LJAEPF9=?4q`y|)??b<}iatT1Q zcCebjr|e+m@hmGJ?Fl>K#*Lw=dZ?%fn(p=8mSr0pal^`5Ht__jW%(QrjGnb!5jj6Z z*$I*JKodc!AYfgz+@VpkE$f`Oj8~ODXF2?296(86sTcq?Ra9!vT8_C}5FU36!eVpp zQ6Xg6O|g@qJH;kqKvY~A$HH>H#GIiuDXYo)lgDd2IT&I+(5m`Fo>;OM!6%`EYbvX% zY(&Z${veATYxi~eNJZPQZi9-JLmNs)(X{7HO4y@RPC;GIi&hW1l(lZr#=ogZU8~kN z`?3mcP0YQ4tx13HFWvK}Rs?n{CiH>4OULN}6o4#N1JKc*?a;SW<>t@z3S=r|JS}KF zIUo!7AasB%)&mi;WU&E&0MjQCEtlDPwPMkDJpjM8&^7tjuZc(AVKo(t7d`@LSeCR6 zKtNlr+h{CbD-0u|SyjNo4QC4!m}6|zg TC6cCIn z(m>NwJBBCyRTQE&$<*(Ix7@s@8Cfi(r;4Vzx2&qlp5LPI4R6Fz1%GS$JDH_RQuM>B zAJ-EsbQA^$z)$oz(+nJ4UFdh7UYnoZCvc8pq8VE(n4^fP**3vuOq=DhY2LE_rb`mh zG>rX_S@!?MgEXyr62>$6Al~Bhq$MlLb}x(FTU5WzgkWrwmB|m0zTF3~mFX=$K+|?b zJDCf9`_D3+%Krc0akk;JI_s)` Q_-#9^@sAYcze2aD3_-8F6Hds dy~3rv6D?JYNmc*bywJz@J63S?=^no&0C+OV=_4UHXlH@ZEsS3SI}wJawV<- z86h`FAY {4F61 J7fQA&_C1h+hUOXg?B5B0F&qu@0O-Dy|sL Iiwv8=w+*-ak?`Uk%0BK2MO9sqZ8e95;q^4^~ zU6k{56~URzCB(paJjDP>TvyS3lH(P2eRY(_pyfZhR%QTkgMnEdH}o*NtbQMKEs7H+ zvLN&vrv7wV#HQsCHXo#M$!lBkuKIgllt57OHRlJ vUh@HL`6l(#FOn4Q4yp<7CL(T{W`E1rNij?%?=N*V(3#5S3Hy4JF_yTARX4O z=WLFom_y~m&bq~vwYC#H5~K4i4M* e!sz%W zBZr`88g-GX-SoWDUCx{Ruf`Xx=#&mBsQ9FbqSal}L<=d8G|@%CAx+d!@<%7KC{=7? z-e?ToR$d!;qJz}>z*B8&+uf<2)fb)FmUjIrbWlO90!@?=s6G=lt5=@yBK>7tBfUz+ z85JzpErBKpWa9*yI^NpMhy<)`qDo!K673>~^Fh|H-B%mEOop}k_}-R6A!$87bon$? z3P{zUA1vc}MWJ}~am^-CtQN#Jb@`(oLLyL5Mw+SKN?kwkM@3bs8WuvD?7LI-sv+bF z=rp-kgP%;zu1`V1@RTG|i|7an+MyOKN1uA2w~`lC;<0ONa+k+mvFTmQc|kSkZu7l8 z0KzRQyeMUnhOqH5L_MCPV~9!?jEy0x^6p|GY6%|~Ll#A+Ixig)Ly&g!<%3rW1Oy59 z{b%1%6>KHTMpn?(Q84{uMgHL)o}@3|t|` 9{?hWl^nR|8mtHq6iYkJc;`onpD z>hGZg8sN^H_1I7Bv8?TZD30&o=tiFxaD1awzn4r`!f^5f2852Q4 zlyB9+=Pz~ zshh)xh4jtWd3sxJz7}7%+u%lJ6tRRoaP @00rj;oeqG|vy!Xq8|x;#S8f5qd*%ax zDu?%DdmU6Qj-)Kp0MbK;)U&Lg4ygpLw+^XlX`dZZ3s}z`S`?k?4BU$ck#?QQe6z0e zF%szbo?Z?C*V79j=6QNiBpgpKg_hqrXd+XSDSDk>Mf-=~l~1w|R2g)<&p{Fa4|EVi z%nKcak?=$ZIkdddu`W`zo1$0xEO+~MU5{iW(D6pS90H!G7edSn^`c04pk4|s?{m;Z zrY2MLI^Sy1G`^|RkcH6kKvPi!{LoYmF>f@LM#3je1<~?Mr^<-cbBbQ-yPeQm&pl}c zbo`Q0L%<;!9mG75(L}-p86~uQ&nSsXC8p?Y^d3k(c*QrFSl8=Jm4Hs4!mC?6nF=PU z?sA=$boU3(vh`ozR1M8nc%+bo<9wltX61s}!UZLb!1&Rif@D1>G+r{QAycod97^?B zhX*8D;6Vt ?uyrqAXB~RjWAIepg8Kwg6(jG z7KX9s5n7{)RkmDaB4usOAH>?#|5V$uJ(385!1gO5Xsb${MU>oYG{>1dT8}|P5`}p4 zNKh>rL8zkF##J$1RjLW%MM9`Hf$T?HF3Jo$-IZOPtU1gxQ9-F0oXVov2u>9eXl732 z5Nc$m%Ccdco`M(xE_^D7h+F!)5t(e(91XJyD7m9S5=~b$sH0`~gDL`MHb@~AlnkPX z*!_^(k;3Ya7g{L!f|ufGdWDxdY59kj`UrT6m!gQ7XJ5w%*k&(;qG4KPw5`&Lq-l~? z93gwOidG-wIMGAQIS^Pjaw>(QgBZ2Zb`jIHHw2vorPVhtG!Zk*)z<|b3!!L~RvB%R zJS?mtXpnT4R-Gs!(`s8iB%Q;`OVD15q3a}!y0_pchP8ZToduPpbLUjmW!fczJ&sK$ zp(0z^gXn`N7UWPgw})p?>~H_2mg!C`%&a+4vQPr(l374mOV{xMN?B~@kXj&iTR`Yp zbbK6?0Jx?WOc6%&3MLM+NktHq3BDu;ID(>DBtnwVM8XLfB_M4$n3}Fid26DbcE98x zwPk{ockVSUI%XD71IPvjNIlDTFF-1R+qwX$YTbC}SPR&u1!z%psx$BgfyL53@cPHP zzGqNC!}E-4R`xri4nkgM)U>+K8I{oSI7gDGRAP$W=1Y0Y+ho74!?7ah_?$ry0k< S|N8{V|*xgX6=!|xa+D?1#cfsm&$dRBKaMg<+;GRmP) zVaa)u{*F)j-0T&-%0vYb?=n@iwwIY|q2z6*y4LqPQ#FLV&r}vQ>;GJqKlFTQ zIYtRBk26Z5Qi-W~n>*3c= Y=xVeU!F1VLY4;A{*(?NLqCp{TV$gZ=xR+C3~Sl8 4*p3}6l=Q&7P+0YL{2w3{pZe2?s`Keg?K@dGlKWL+4 z>E|@98uOeJw6g0tNLtzT9E1>XJ@+CLRav(ydY`ETDh}vK6FnbvB#(|8dPUaChJU1L zW!pc}Lc#opZ09SQ|3m^A^Pg%WX#P`qgv|fEthLR5s%mZXpK7s3h^6Ctjnzv>PgxL> zL(D&}I=%E#2%%}FGvd~rZaO1~kmb{v?-`efw7k}h?%K6`)Ilu}I0&N~4IDJm3keR| zh}hvl5P??ak3LoJib4290Tt7mN}^|UQ+0IAZK`TzLz_yWWn!x*$Zkc`E;w_;+#Y`B zMt}Rg`u}(uiT?h!+ywici6S5=<|mf-n!?@=uqf+#sFabF)0a~+J!qLyX<2!7mv1sz z>>hcR(UfSGKs04nCq&Dz?2q`SDXyLz7D`XuaEofAX$o9=E)~AE+MXy!Lf`k{$SMkc z*of(iYGX1f)i#KyQ&iRo=V?1hPC-px%IhCgi%#mbB2>kd9bs{;o$jKl&vpS&<#nyh z=A(Uc)of7TU&Xsrwkn)*1RXB-M88rstLoaum&M)|$adA1Y%BXvLhp#W(6hh9>qpo; zH(9yEr))(1U^|>11=`=`Tb}l=_xf*<-kHDdMAOLm!=o?oFC*?Rnzb}Me%0^i%AK#R zK-HTSCFI FcaPbb8XXt5|a|EuV5-%x;>oAhUv@ z4yjB|%v&k4RJ8<|V>KGDcdS8&>%*A 88+apD|}-*>Y!nvk&V#h`LN>Q6Th(QR|WdsURFVB50J)ss6+R)FeAWm9GR+0g62 z#W_L-;@7;Y51A_wtzarpPi4}^7NK`nvQ(&Y5Gl)5Gj9zex(5A;neSrL=c*$1^>Er$ z##GRVB3-HMRopALWvmSqP@>p*KS;4LfN@oW!m^OeN0;B`0?|1|+9i)7R`(O2=h5#(xH)j2F1k1dLL{4=QBm$mXD zd%jNj`K$vudvD;_@nPkkDvM9Y1KR$9gwuKjR|$H(NPkvS!0UijVis`dtNSL9mZpV) z43eq^t_Vrdq6ooBlis< 6Ncu g@M(cGMOZj_Wb7~3> z-UeOLk!?^AG&L3idXB7zfS#tUyQJ-E!5(-fQ=cKQ5NRr^Ny}Wb%3|l;g1vILqiMf( zH;$<CZ-N_PlFaksi6IxkL;Lo&Zkzck}(7`P$RLQdEA$O!9xm9Ic4tGjQjSnxyI#5{}& zsjt{DR_Ho14y5N^eS2rVj9wJS)HeTyzA|o6EUNSi4Pf&5I#2Zg)ODG;I;D#`mI?4* zFoY?_V q^DQ;y3l-W^mo-0-`g( zj)?OU5eu++l8B~3L7tDx7NDDEvK3D)625Z;wSZ$LBwB#%8sjXaz i6Ov2wl@Rz@$ |UpS@lJfgEO@K(MiOg~s11cffd6msQ!|5wv9` zlbp8~mh8fCH0)8fd)!wtVe57~(Oe#>TEb-fsH$Z4aiqYd>7NOO!nQq&tFh`BTu4nj zxn{;o^w+qBms7x5B s`f^2`3}0`9lbxOT4#LlrYSQeaXy~)$1ap!ws~e}YBwZJRf`8% zb`3Jsi+T fCaZ07&1Cu^&2u2Xa}d5&-Mjbq@o# z9U3Hb^|io6cN=a9L$`;#EknP2cEjP4%ki zglxefGkBF5yvhPpWxA=w77}pFvj$Y*o;OT&L}#X|{b9>2Z6E<<3W`=VG8OQMtQH9< zYQxGB6j6PGc56imYcwjHg_fuw5gxopRbeMEC@^9L?u9B*=g@enQ*QU_fT6 cRVg{b3h~O9IeV2nPM^PY(Pk6Ey{pj%Kx#Ab5B$iX@%st5P z=1KZ(8Hh|5clIuZ??+eg@GtG_T?{_6>lOgN%6NiG&|sF2O>nX30VYGfXIm5d`>Sop z@cZ0)kdy0N@vi!r(+|JQEDAXb?}6Lfp_x-Rr|hM#`>y3wW%bPZix5frL0fDZGd^4v ztti?Cm!-d^AJv?UGoTXMwJAe)FBX^1T+@kIjOm8y#YCcRpI4xa`>a32Gvj(K&~qhv zHxiM!)c!?sL{4iX{R99WO&okA-v!o?Twd68eA#?+*I#yRUFl3O=^VH_>U nI2)*rHZcnMd?65>$4y AQBoE~pPq=dGRLeAeYl56 zAk$1>Kg98Rk2#MV&Qp|i&NKNRarxYg 2fnv*LCQ{bc+$ m`YNh)`h2@87aC{27r1G3-5%q@qbM;c+W2cGx~)GUswSEnx{K z!F|=pmWR@{IlyOS`2!I?Z+6U1Q6RH4m-a+0r?4{ ?8AJtXpAzg(Z&sF%roTiB6V 6ipJ z4Au-03=;Pt`dkF+r8_O2U(D0&yEZK!F 83>6vb4+Zu$lIPr*W82 zmUEopY4@_&p}wV}%QvDHDf%Nl$VP55f$ob=(m7&K=%efU1!^Ki hQWb5EpJJX z=N cTMIdp41FQK$NK(22CRh_7T&H+!4EC^_5PS8<(Pe95jwW(GaCx*8AM3M zgt->xd)cqFfLsZqG11q-7?OyqU<@DfP=?_^>KYns-1f~-V0k|Sj$#RVz1j6)Q6Y#W zOfX$eU|NKK@qqS4$T~_DPi@VaEVd;Mhx4gPi&z}@rw3vCZtxBwQQx6q`yJNqP1QT+ zyS|-tOoy}x+&wGOG8&iUNDCP* >(+i`>+jR2=?4*0|3RXl= sT1nts4{9^nKd3>fVM )KxuHZjqG_GMeI}O?%td71M4e01alNVQvPP>M<0IWX+?F+twViMvH!G)XhO6Sc z3u|gX`81VZR}X-5j4&0u?yHqZ#Q)O=n&{QCKkla*jlex*^W^DM9(ab${yg?fWptil z!P*0thmdy+v@sY}_qyDPLg&swe>!8zrVn*EqymE{lX}C>QDl!oQ}UGcU4RH|V|U0L z9bIG6^scBaS<|BN=)O9BjXOH{!k!!wixizFbkrb-sWTPA&VONZn3G+KXHY8RcP^Z# z_3~1eKK^j&?}c3gKNEc&LC;`rc&n<>i*u*uOT?d~tI`8Wn4S2LZZjQR6&@qrA?TP7 z(6`e#`X?i@5%8zEpE0>mX*>pIUxl44v^(n{?C-C7h2i(PgZoadbH%&5Gk?z>+; $zUr|Bam?AK&l zxuNj-97n^3QawciO$}zMmybp}zHHv1^p_2#Gpp{EMA@&vIS nX&Dp5DeV+u5%P>V`g6PCU9OAOT49INWgoq)6i+W7>eV3JF_XG1|ljwM>c z6>=<5C?AfUP5m;g+^I(fMRtns{V^{c1iTCu#YnO2^4RNwmd1D<(AbGW@$3_~4l3WC z1B5I7q}2d@0GBy_ckDu{pk;s9HZju?n_lkFAv?PKw*PZxkH#e~Z<6^reOS6nOT~bh zvMd%;YlqPz@m*d72g^0HG!2?ecMxK+UCemvOV$7D>L!k^p7j#PSNCqt(MOyi@?>y# z5CB{*-T{Kf!8HKT%%p(=WV*Ce6_Cc!82~W34a$NLT}V_K#M3xhf8%KP;|}b*agco8 z;+t8O$Ee<8w}CVZhHwKJb(&4yHLkTb1iuf&5eZyZ{(>=id9ENHr=+1^JhMqd;g~!e zR}c+4zOz5{hM&o-u@GH0{cb8OeAj`9KzN@{t2;%heEQy|8-Zyx21LXbW2A`ET8wO{ zj&@{$uSO#@N)@_mFYGP|L&K{&J$#I6(=%aKnVtc>y7aK1Ri)+457(aW -Y?cUp6#Ns$(u#Cf@FTIFB@6KiVM{JrR5g9T^CU~J^D}6Gu`o6)ZtC1=C zWp-wO9rOtY(-rQWYcl#^( s~MRRN;n@mHV z>))PCZUcK~i2fEr6rt!sy|zsM?#a{@!G-tJ3|0Rx6T?2^S9WIj6`D+b2 juW0ura_e*wO0O RK5rzoa zKNt@D+HGjCTOmVYD;ronGjoxzhe_t=*W;r8XP#F|kQ^4sUI02=>5h5z{`T9o`SekB zi*4%hvvvPGhab2@%?F{`bTUg#j-RB=kh%Krulr+vRCxW-92g&&^mEy?$dp_2??tNs z;n5XD^6bOxMivmZoIgckDoWWzpfL**L^@QBVh3I=?#!1x>(s^|y~a6?t7NS1w>%Y5 zp6g2WOSsO7Qk8YfvpAf3;Xiwy=CbI2e)lal`E9dXh1xDgGTSy7*Co)G`@2a?8e2x* z?A8~dth((Q0P2Gcu}AqIUZ- A$;uXdqD(8R$l$19=Sh6o= zBI47Qg>w2`d}3v)T^pTMC-06<`Yf8FjLJGYDzco@q(R^D+$QE{TPd>iQZ79N&T&yC zGG*R0RW!0#JP%SlGSw5cXIV6&ZHFUbp_o%qsRqfcuWIJnjp?;>O~%o+edba#YvCaN zC5;>YBd-g$;&EcIf3l1#to?kS|MdE~5_)mHiW@%L&yF$pdCEX8=XMpA^*9{rGn% *xim-KIL2k+ ^hd#cnOl;H zKrL1&>A6HR2$Z#GD& d|q{BBjVKPyU{UV8EelF&qfEnSf*+DB3h(n6fui4g8f;h zSY|iU#j>_Opwk0&`dH%mfNm*M&Sk-d-&Ay{({vPx6b&kMnPqwtg(_T`pc3^9mQAlL zl`7yGCWVj*8=*e5Gbfb6k@cM;)yvI948E=sb$2;w{9>+DWUT5J{9#cT*U0SI63;5& zEo}OI)Ve=>p&iQQqbwFvnIv1dWvD1b@qo!-dS>wq_=oJ52Vvox!zA2?Gs20qW5>k* zs}uF}c!W4E%b{b6#Z!w-S++w%h|6RS`iQ~Q70eEYO{Pas*}A4Jb7rI52AeMJ^88tS zC~%u1O_kfTld(9=M5Qd6w(gP^xmi%&$2e5wPf=<1<>S!Gq5FwG^IHU?vS*(bW>9*V zLB%EO#{~N%z=z#FxSV#zHX3JH#d($3B{Vg_v9|ml?~-or%g(UE!JW+elP8NeyTz zPNvV?RtdhiVQ%i>ru`$0C`Q%AV)w09emRL*H;!o6s1wHm%y!KFFNejmXfjMpNkK+g z#Z;kx7?#a>g% JBGbU#>^PmGhNoymC{vW-gYwjHRD4T!!v#h3z_tgj`nR(nd)1v`;Vz4J(p;36A;H zin`!tA9hmKDcg%I1832*Y`8^ka-SSkbZGRs^V5TXQA#^2cks4o^YJ6WiWD5UNh_Aw zJeT0Wwa_EZDA0NY1qHY(a8w_%a6_UtU8Th~!#OyR*sbz<(3o9;WFh9YAr$bV*dVy% z*`t_`E}IK8# Ww(YXB>7%I_`WrWecTo9*F}Z+|(sc z6FxsD0mkSz6@ozPlG*``)@P;#l+=!nMBx*4z2V7^XnZ;UAr4 bgMe16VXZ$&8m)RaINZ;3)8Bu%e+!g zW7C6!SIVo&h< ;SnunVM36_WSG{oB=N^$CJakjmf!<`3)!mhy1%F3 zxE2+w>-&NV*_xtsdtdM%SyH4f?-?d!E5hsUo`U0AQLL`+3o2wQiqg$}!GmN)k-E5N zn6RzLC8<;(Dze@9Cyxr{z_t|6BvGLRShnGv3@V%g(;Ct)uN;;r`GM**6VRZ{?GTU` zH@HuX4>ydd#N9SJzQPzp6)-anK G- zM3&IUH}5`AQ+>x%Fv&F&o4Kr3As#cRm_13Rfmlg^&4Uv`glm#OZ;oBfEAb!;;TVvP z*E`0ehwFbGJ~^dnIZqeB;~R ANQHAPWV+T018pfl-*5vm&JJwf=tP{t6hq}_S$DyzM^!@sm(y@y%BD+9dai2{r zp3r{X20!pgpyg&$e(-)B5KnC1zJ?$C_7Eswl#CwAEoAaz$Tb13UwvfXzkOymUp{>O z_~rfW%^fO@V)%aZ?eqVlkYvhde7C(2jF+M8%jO2aK-aIi@S0}!!>>wb59|qC%ZI$d z!4Bx=1rYf4=mH2TSs<1V`U~)lW`ZdG>Qq31>+Bl2D@6Jgr=e-eu1>`7-#;T6uveEf z1lhOG8N?CNsSF}o)N2G`^yn4_@%i@qf=I$Tc0pABJ+~klRA&~__X;Nn=v+CHRlIHl z<3%I&A_m*ha+*ByBG6%>!q+^I1bLFUCJoV-I(7}srMDJ(-UT0!9Uy&uuOE0?vav{@ zu?rk*{Xcz &h_{2{g7j08hDe zGtJ! nRWs&ss-SH(KHwJ*ZE{>$GEQd}SPoDu*DVbv2$3@-{5A| K^#8w3ho5o1y5Zga$i)uVzKys;f_DNuaoy?Fl&6oBNlvDrS2>99nhO* z?`Wp#N=Gx*SH4e7EdAk^Z>kDDmUVi)7phO}SS?4cFcRNdx|A-dMXEPV@a&U5;eE>! z;gQu~DZA&^@1=BhZO8iuWvTV26t;+Op4ys!Dz@eOuHF0O)e6VI(pz3wWuFrLagbh@ zeoMnExfgXV3!W*Lk>#Mp_bLn0Q{CPD7O;aO5ZpU+LnseYSv7mVybS)hNPcz7;JNTQ zfFUT4#3CM#V=Dr9JO^b$7<_}K01g#4_4~!%r|Gar0Efw*%zE?nBRa=Ne2PzB?$J5^ z`}a?XBxaqr-w_o7Ea*PhEPVYuY@SDXhJe-0p)6Hh<`p){aJC{2MQh`eJNX~rcQQmi zc0lF6=0&4_X3B|u6TlJc92ruZJWGpXPzwFO#Pc^UYv;8Yj>!7tp-B`82c0?hpEKwF zbEbmE&%V)I=Ad tA!67}P6NB-dr(c66#AxcXCWpP3@iXErjf_mhYkmZq!BGDWuI zu5b2mhwB@j+;L|=|N7qXMW3?y(s;l3#e|PC%h+kTMj=+U5SO?WS<$cbaHuH##g28v zUVLx<@$&^!9!~<_%CUrsS5>AHjVPo2;D6ZOB4)o{<`Sx)?j{VON569kVH)?{`OOe4 zW^(UYFQSqS-(=!*nK)+<1fcsa^0F0i`20o?mXL`eW>NNR(MnQx$(y~3Wm#GlF$g`o zwM(fy`?rhfygIsz**to@OSsx{x61@8%1TAaqT-oy&3Lo{BlJsIyoc%+6MA-cefU^e zZoC3WeS=pJX>RDB>g(5Ed|uIk%8w%~j0|QAYN^B7L{g@L?Q-XhaxjE>lg1(}V?JFO z@ySFH`Q2H (0==UjU)VTY5S1O3D{Ge2LN7QD z9-s4}Z`#JWa;R&a>xI7dUaxQ&l0Catijl+%U0u=s?ruSWB>Fq1Q$c(5oR?DhG{{T1 zGG6brhuz_@efoZlQUerjuYXf!DVp@2LOC6K(heetG>hQcXKWhvy-bivs*KBGOl1L2 zbU%(8gV(Db8q=*<22)UZmuAXix9xK!aM=D3n>&yFl%eRD1$H251+PE2Z#-SVqu!10 zQ0ZbWXpcWuDu*^+U+db&n``d}bcZ^10Cz(54)A>O&5W9t&3QBEsWWhfN3lu9BOe^z z>Uh25n>}1VR!^TJCQj%AczoYH0Hfz*767B4Ux6U>oj(BJ)EhbapN3s!@wkh!NIX)9 z0x A_MMW4=C_B1#%Hfp zH5WDe_Vw;QI{Dopgpb**TH5tm*FnH)E!-d=u+Ip~U#?*Eqk#3A_(8(*E-jdpB|Q~b z5n&w{SPdclm=Fb@`G1~o%z}hEf+w7?T}6D=e>P NkE3+Xt`=u`7aN%q> zaJ(?>^8C5(ly|7z(I+ vM;}jrYehOc2xXz4FKe-LnwLUmO%qo zh^{`fH5OOGUSt*1hq3M)&!xhZ^Ft62k(J30*0g19M-SIk(+FNCdllNG;)y9Q674k^ zL2jc(ux!42TF}^?Hn@PZcRI&UY+A2PHo)AXuFL2Tta>Xh(K;||Ep$*2o3&|06^+wz zp*}F3dk+|z*!RpMXnvoAkf6DpcP&5@SCjR$vAFxTS+&%6B3gqu< xnRK8!%`Y?G+M${z3OQ5NRv$dp1oc11 zyMsEShr1KIfV^R<+P1y@1U&kQoFzKS&7bRuNae0sk6k?RToz(Q1-kRQ9=lAlH6MN) zu3wR!6{V_!tBSClfVKF`A1hXYT=1r=1