diff options
author | Marc Espie <espie@cvs.openbsd.org> | 1999-09-27 08:34:33 +0000 |
---|---|---|
committer | Marc Espie <espie@cvs.openbsd.org> | 1999-09-27 08:34:33 +0000 |
commit | 77614c163793067dea3b646b462c21c418f27a56 (patch) | |
tree | c6d93dd493289918e85f2e629a25f70276e88faf /sys/arch/amiga | |
parent | 3ba9b91dc74073aa6c5cb8026e706106733c408a (diff) |
The device-streams tools, including binaries in uu.gz format.
Diffstat (limited to 'sys/arch/amiga')
21 files changed, 4258 insertions, 0 deletions
diff --git a/sys/arch/amiga/stand/device-streams/COPYING b/sys/arch/amiga/stand/device-streams/COPYING new file mode 100644 index 00000000000..a43ea2126fb --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) 19yy <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/sys/arch/amiga/stand/device-streams/README b/sys/arch/amiga/stand/device-streams/README new file mode 100644 index 00000000000..a2f18032287 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/README @@ -0,0 +1,57 @@ + Utilities in archive + - rdbinfo: Print Info on RDB devices. + - streamtodev: Copy a stream to a device. + - devtostream: Copy a device image to a stream. + - xstreamtodev: Same as streamtodev with extra options. + - xdevtostream: Same as devtostream with extra options. + +------- + rdbinfo, streamtodev, devtostream, xdevtostream and xstreamtodev + are all: Copyright (C) 1993 Christian E. Hopps + + The word program below refers to all the above programs. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +------- + +Here are some programs I whipped together for use in NetBSD. I hope +that these replace ``devtofile'' and ``filetodev''. They are much safer +programs to use, plus that can use streams not just files. e.g. + + devtofile --rdb=BSD_TRANSFER --quiet | tar -xvf - + +although streamtodev seems to have a bit of a problem with tar, tar terminates +before streamtodev has read all of tar's input... + +Anyway all 4 stream programs will not allow you to cross partition boundries, +and they only work on devices that have RDB's. The 2 x{program}'s add the +``feature'' of letting you specify start and end blocks within a partition's +boundries. I never use this but with it comes almost the same functionality +as ``filetodev'' and ``devtofile'' (still with some safeguards). + +type {program} --help for a template and options. + +One thing I should point out, all the options are search restrictors, if not +specified then they are treated as matching everything, e.g. ``streamtodev'' +will grab the first partition on the first unit of the first device it finds +on the dos list. Play around with ``rdbinfo'' for a while if you don't +understand this; all the programs use a similar algorithm. + +I have tested these somewhat, but I cannot guarentee they work perfect +therefore I insert my standard disclaimer: + +Chris... +email: sycom.mi.org!ro-chp!chopps + diff --git a/sys/arch/amiga/stand/device-streams/devices.c b/sys/arch/amiga/stand/device-streams/devices.c new file mode 100644 index 00000000000..5c27180c299 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/devices.c @@ -0,0 +1,157 @@ +/* -------------------------------------------------- + | NAME + | devices + | PURPOSE + | handle exec devices in a standard way. + | NOTES + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#include "util.h" +#include "devices.h" + +/* returns structure with device open. */ +struct device_data * +alloc_device (char *name, ulong unit, ulong flags, ulong iosize) +{ + struct device_data *dd = zmalloc (sizeof (*dd)); + if (NULL == dd) { + return (NULL); + } + dd->port = CreateMsgPort (); + if (NULL == dd->port) { + free_device (dd); + return (NULL); + } + dd->io = CreateIORequest (dd->port, iosize); + if (NULL == dd->io) { + free_device (dd); + return (NULL); + } + dd->name = copy_string (name); + if (NULL == dd->name) { + free_device (dd); + return (NULL); + } + dd->unit = unit; + dd->flags = flags; + + if (open_device (dd)) { + free_device (dd); + return (NULL); + } + + return (dd); +} + +void +free_device (struct device_data *dd) +{ + if (dd) { + close_device (dd); + DeleteIORequest (dd->io); + DeleteMsgPort (dd->port); + zfree (dd->name); + } +} + +int +open_device (struct device_data *dd) +{ + int error = -1; + if (dd && !dd->open) { + error = OpenDevice (dd->name, dd->unit, dd->io, dd->flags); + if (!error) { + dd->open = 1; + } else { + if (-1 != error) { + D(debug_message ("warn: unable to open \"%s\" unit: %ld flags 0x%lx", + dd->name, dd->unit, dd->flags)); + D(debug_message (" reason: error %ld", error)); + } + dd->open = 0; + } + } + return (error); +} + +void +close_device (struct device_data *dd) +{ + if (dd) { + if (dd->open) { + if(!CheckIO (dd->io)) { + AbortIO (dd->io); + WaitIO (dd->io); + } + CloseDevice (dd->io); + dd->open = 0; + } + } +} + +/* returns actual number of bytes written or -1 for error. */ +ulong +device_read (struct device_data *dd, ulong offset, ulong bytes, void *buffer) +{ + struct IOStdReq *io = (struct IOStdReq *)dd->io; + io->io_Length = bytes; + io->io_Offset = offset; + io->io_Data = buffer; + + if (!device_do_command (dd, CMD_READ)) { + return (io->io_Actual); + } + return (-1); +} + +/* returns actual number of bytes written or -1 for error. */ +ulong +device_write (struct device_data *dd, ulong offset, ulong bytes, void *buffer) +{ + struct IOStdReq *io = (struct IOStdReq *)dd->io; + io->io_Length = bytes; + io->io_Offset = offset; + io->io_Data = buffer; + if (!device_do_command (dd, CMD_WRITE)) { + return (io->io_Actual); + } + return (-1); +} + +/* returns the error from DoIO () */ +int +device_do_command (struct device_data *dd, UWORD command) +{ + int error = -1; + if (dd) { + if (dd->open) { + dd->io->io_Command = command; + error = (int) DoIO (dd->io); + } else { + dd->io->io_Error = -1; + } + } + return (error); +} + + diff --git a/sys/arch/amiga/stand/device-streams/devices.h b/sys/arch/amiga/stand/device-streams/devices.h new file mode 100644 index 00000000000..58b87b32d65 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/devices.h @@ -0,0 +1,51 @@ +/* -------------------------------------------------- + | NAME + | devices + | PURPOSE + | provide simple routines and access to an exec device. + | NOTES + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#if ! defined (_DEVICES_H) +#define _DEVICES_H +#include "util.h" +#include <exec/ports.h> +#include <exec/io.h> +#include <exec/devices.h> + +struct device_data { + struct MsgPort *port; + struct IORequest *io; + char *name; + ulong unit; + ulong flags; + int open; + +}; + +struct device_data * init_device (char *name, ulong unit, ulong flags, ulong iosize); +int open_device (struct device_data *dd); +void close_device (struct device_data *dd); +void free_device (struct device_data *dd); + +#endif /* _DEVICES_H */ diff --git a/sys/arch/amiga/stand/device-streams/devtostream.c b/sys/arch/amiga/stand/device-streams/devtostream.c new file mode 100644 index 00000000000..01b2155cb69 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/devtostream.c @@ -0,0 +1,437 @@ +/* -------------------------------------------------- + | NAME + | devtostream + | PURPOSE + | dump all data on a device to a stream. + | + | NOTES + | only works for RDB partitions. + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#include <dos/dos.h> +#include <dos/dosextens.h> +#include <dos/rdargs.h> +#include <cstartup.h> +#include <string.h> +#include <ctype.h> +#include <fcntl.h> +#include <signal.h> +#define __GNU_LIBRARY__ 1 +#include <getopt.h> +#undef __GNU_LIBRARY__ +#include "getdevices.h" + +#if defined (SASC) +/* we will handle this ourselves. */ +int __regargs chkabort (void) +{ + return 0; +} +int __regargs Chk_Abort (void) +{ + return 0; +} +#endif + +struct partition *find_partition (struct List *dl, char *dev_name, char *part_name, + ulong unit, ulong start_block, ulong end_block); +void dev_to_file (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end); +int check_values (struct partition *p, ulong st, ulong end, int exp); + +struct option long_options[] = { + { "output", required_argument, NULL, 'o' }, + { "rdb-name", required_argument, NULL, 'n'}, +#if defined (EXPERT_VERSION) + { "start-block", required_argument, NULL, 's'}, + { "end-block", required_argument, NULL, 'e'}, + { "expert-mode", no_argument, NULL, 'x'}, +#endif + { "device", required_argument, NULL, 'd'}, + { "unit", required_argument, NULL, 'u'}, + { "buffer-blocks", required_argument, NULL, 'b'}, + { "verbose", no_argument, NULL, 'V'}, + { "help", no_argument, NULL, 'h'}, + { "version", no_argument, NULL, 'v' }, + { "quiet", no_argument, NULL, 'q' }, + { NULL, 0, NULL, 0 } +}; +char *short_options = "?qvVhn:d:u:b:o:" +#if defined (EXPERT_VERSION) +"xs:e:" +#endif +; + +char *cmd_vers_string = "\0$VERS devtostream 1.0 (93.10.10)"; +char *version_string = "devtostream V1.0 -- Copyright 1993 Christian E. Hopps\n"; + +char *help_string = "Usage: %s [options]\n" +"Options:\n" +" -[vVxghnsedubo] [--output=file] [--rdb-name=partition_name]\n" +" [--device=device_name] [--unit=unit_num] [--version]\n" +#if defined (EXPERT_VERSION) +" [--start-block=block] [--end-block=block] [--expert-mode]\n" +#endif +" [--buffer-blocks=blocks] [--verbose] [--quiet] [--help]\n" +"\n" +"Number Formats: (where `n\' are alpha-num. digits)\n" +" 0[xX]nnn | [xX]nnn | nnn[hH] | $nnn - for Hex\n" +" nnn[oO] - for octal\n" +" nnn[bB] - for binary\n" +" nnn - for decimal (also default for non-recognized)\n" +"\n" +" given the above you can also postpend a [MKk] for Megabyte\n" +" Kilobyte and kilobyte respectively. [range checking inuse]"; + + +char *opt_outfile_name; +char *opt_rdb_name; +char *opt_device_name; +ulong opt_unit = -1; /* -1 for invalid */ +ulong opt_start_block = -1; /* -1 for invalid. */ +ulong opt_end_block = -1; /* -1 for invalid */ +ulong opt_verbose; +ulong opt_expert; +ulong opt_debug; +ulong opt_quiet = 0; +ulong number_of_buffer_blocks = 100; + +FILE *mout; +FILE *min; + +int +main (int argc, char **argv) +{ + int ret = 0; + int opt; + int opt_quit = 0; + int opt_version = 0; + int opt_help = 0; + int longind = 0; + struct List *dl; + FILE *file = NULL; + + signal (SIGINT, SIG_IGN); + + mout = stdout; + min = stdin; + + if (argc) { + while (EOF != (opt = getopt_long (argc, argv, short_options, + long_options, &longind))) { + switch (opt) { + case 'q': + opt_quiet = 1; + break; + case 'v': + opt_version = 1; + opt_quit = 1; + break; + case 'V': + opt_verbose = 1; + break; + case '?': + case 'h': + opt_help = 1; + opt_quit = 1; + break; + case 'n': + opt_rdb_name = optarg; + break; + case 'd': + opt_device_name = optarg; + break; + case 'o': + opt_outfile_name = optarg; + break; + case 'b': + if (!(string_to_number (optarg, &number_of_buffer_blocks))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; +#if defined (EXPERT_VERSION) + case 'x': + opt_expert = 1; + break; + case 's': + if (!(string_to_number (optarg, &opt_start_block))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'e': + if (!(string_to_number (optarg, &opt_end_block))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; +#endif /* EXPERT_VERSION */ + case 'u': + if (!(string_to_number (optarg, &opt_unit))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'g': + opt_debug = 1; + } + } + if (!opt_outfile_name) { + mout = fopen ("*", "w+"); + if (!mout) { + return (20); + } + file = stdout; + } + if (opt_quiet && opt_expert) { + message ("--quiet-mode (-q) and --expert-mode (-x) not allowed at same time.\n"); + opt_quit = 1; + ret = 20; + } + if (opt_version) { + message (version_string, argv[0]); + } + if (opt_help) { + message (help_string, argv[0]); + } + if (opt_quit) { + return (ret); + } + /* there should be NO messages before this point!! */ + dl = get_drive_list (); + if (dl) { + struct partition *p = find_partition (dl, opt_device_name, opt_rdb_name, + opt_unit, opt_start_block, + opt_end_block); + if (p) { + if (opt_outfile_name) { + file = fopen (opt_outfile_name, "w"); + } + if (file) { + if (!isatty (fileno(file))) { + int def = 'N'; + ulong st, end; + if (!opt_quiet) { + message ("found partition: \"%s\" capacity: %ld.%ld Megs", + p->name, megs (p->total_blocks*p->block_size), + tenths_of_a_meg (p->total_blocks*p->block_size)); + message ("start block: %ld end block: %ld total blocks: %ld", + p->start_block, p->end_block, p->total_blocks); + message ("block Size: %ld", p->block_size); + } + st = opt_start_block; + end = opt_end_block; + if (st == (ulong)-1) { + st = p->start_block; + } + if (end == (ulong)-1) { + end = p->end_block; + } + if (check_values (p, st, end, opt_expert)) { + int do_it = 0; /* default do not. */ + if (!opt_quiet) { + message ("dumping: start block: %ld to end block: %ld [size: %ldK]\n", + st, end, ((end-st)*p->unit->bytes_per_block)/1024); + def = ask_bool (def, 'y', "write from partition \"%s\" to file \"%s\"", + p->name, opt_outfile_name ? opt_outfile_name + : "stdout"); + if (tolower (def) == 'y') { + do_it = 1; + } + } else { + do_it = 1; + } + if (do_it) { + dev_to_file (p->unit->name, p->unit->unit, + p->unit->bytes_per_block, file, st, end); + } else { + message ("ok, quiting..."); + } + } + } else { + warn_message ("Pipes and re-direction will work but interactive\n" + "input/output is prohibited."); + } + if (opt_outfile_name) { + fclose (file); + } + } + } else { + warn_message ("could not locate a partition with your specs."); + } + free_drive_list (dl); + } + if (!opt_outfile_name) { + fclose (mout); + } + } + return (0); +} + +int +check_values (struct partition *p, ulong st, ulong end, int exp) +{ + if (st > end) { + message ("error: Your end block [%ld] is less than your start block [%ld]!\n", + st,end); + return (0); + } + if (st < p->start_block || st > p->end_block || + end > p->end_block || end < p->start_block) { + warn_message ("ERROR: start and end blocks cannot cross partition boundries."); + return (0); + } + if (st != p->start_block || end != p->end_block) { + if (exp) { + message ("Please note the values you gave for start and end\n" + "do NOT match the partition in question."); + } else { + message ("error: you must set specify the `expert-mode\' argument to gain\n" + " access inside the partition (ie. not the exact\n" + " same block numbers as the partition's)."); + return (0); + } + } + return (1); +} + +int +check_break (void) +{ + if (SIGBREAKF_CTRL_C & SetSignal (0, SIGBREAKF_CTRL_C)) { + return (1); + } + return (0); +} + +void +dev_to_file (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end) +{ + struct device_data *dd = alloc_device (name, unit, 0, sizeof (struct IOStdReq)); + if (dd) { + ulong num_buffers = number_of_buffer_blocks; + ulong total_blocks = end - cb + 1; + ulong bw = 0; + void *buffer = zmalloc (num_buffers*bpb); + if (buffer) { + while (cb <= end) { + if (num_buffers > (end - cb + 1)) { + num_buffers = (end - cb + 1); + } + + if (check_break ()) { + break; + } + /* Read from device. */ + if (!opt_quiet) { + fprintf (mout, "reading: %08ld -> %08ld [%3ld%%] \r", cb, + cb + num_buffers - 1, + ((bw+(num_buffers/2))*100/total_blocks)); + fflush (mout); + } + if (bpb*num_buffers != device_read (dd, cb*bpb, num_buffers*bpb, buffer)) { + fprintf (mout, "\n"); + warn_message ("couldn't complete operation, read failed."); + break; + } + + /* Write to file. */ + bw += num_buffers; + if (!opt_quiet) { + fprintf (mout, "writing: %08ld -> %08ld [%3ld%%] \r", cb, + cb + num_buffers - 1, + (bw*100/total_blocks)); + fflush (mout); + } + if (num_buffers != fwrite (buffer, bpb, num_buffers, file)) { + fprintf (mout, "\n"); + warn_message ("couldn't complete operation, write failed."); + break; + } + cb += num_buffers; + } + zfree (buffer); + fprintf (mout, "\n"); + } else { + warn_message ("couldn't allocate io for operation."); + } + free_device (dd); + } else { + warn_message ("couldn't open device \"%s\" unit: %ld for operation.", + name, unit); + } +} + +/* all the arguments, except the drive list itself, are search limiters. */ +/* they are generalized with: NULL for strings and (ulong)-1 for ulongs. */ +/* also the function returns as soon as all non-generalized criterion are met.*/ +struct partition * +find_partition (struct List *dl, char *dev_name, char *part_name, + ulong unit, ulong start_block, ulong end_block) +{ + struct Node *dn, *un, *pn; + /* walk list of devices. */ + for (dn = dl->lh_Head; dn->ln_Succ; dn = dn->ln_Succ) { + struct device *d = ptrfrom (struct device, node, dn); + + if (dev_name == NULL || (!stricmp (dev_name, d->name))) { + /* walk list of units. */ + + for (un = d->units.lh_Head; un->ln_Succ; un = un->ln_Succ) { + struct unit *u = ptrfrom (struct unit, node, un); + + if (unit == (ulong)-1 || (u->unit == unit)) { + /* walk list of partitions. */ + for (pn = u->parts.lh_Head; pn->ln_Succ; pn = pn->ln_Succ) { + struct partition *p = ptrfrom (struct partition, node, pn); + int do_it = 1; + + if (part_name && stricmp (p->name, part_name)) { + do_it = 0; + } + if (start_block != (ulong)-1 && + (start_block < p->start_block || + start_block > p->end_block)) { + do_it = 0; + } + if (end_block != (ulong)-1 && + (end_block > p->end_block || + end_block < p->start_block)) { + do_it = 0; + } + if (do_it) { + return (p); + } + } + } + } + } + } + return (NULL); +} + + diff --git a/sys/arch/amiga/stand/device-streams/devtostream.gz.uu b/sys/arch/amiga/stand/device-streams/devtostream.gz.uu new file mode 100644 index 00000000000..d47fb701b3c --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/devtostream.gz.uu @@ -0,0 +1,296 @@ +begin 754 devtostream.gz +M'XL("&8@[S<``V1E=G1O<W1R96%M`,5\#W13UYGG?;(L/V1)%D9Q'<?C7(0P +MLI`EASC$<1TJRP848<N.#(SSM\_&TK.#;*FR34@.2V4PX":DX]`TDW8[.>R< +MG@YMG,1E,AU6RV%,-Y/23-M#*)O-9-B09J"A&=IP&$Y.AJ%X?]]]3[8,26=[ +M=L]9F:=WW[W?]]WOW_WN=^]]@K&"?V7:QZ#?)<86'V.LX"JNWU`Y].'.ZZZ0 +MB]WW;]3LW<Z,ZU&RC:<9;T+%`XJA^OC])V:OU7387JN)V*:JAR0'7\FF5,OY +M"1[@;E9_?D(Q\9+)EUBCL^1`QC0&K$Q-LVUB>LIJZ=O(O5:+*2/J`K;3SB9P +M($5>F6T,9U0FG4+=R;G6B9/`<#++$',QQV`Y:GX&.B<.3-E.-U^TO<['(J_\ +MWJ48?('@E&TZQ4"+U;'(*]=_03RU7)6>2N'I]^_4!$H<<5.J3V'LUS5;V0NV +M0^&7P"]C._E6-O76B;=../N9_9<__>5/N2'-2F^MN<]VY.38HQE#`%(&;#.A +M#P.!>3[;SAH,X4Q<3CG\#!R7\0!@CG)#5^;TV.+#C*&T"_KY9/%1QJF,NY,; +M%O^0,R[=_^;LIW8\^V4EW/PO[&'PFM'O^T%EVL]<`>YA+K7<FRAQ\(#3S2#! +M[$&T'7)2:1=/`$H.)6SCO)^Y:OJ9T78DDG5:(EEO4XHI1NYG1E?"]MIR83E= +M<Z7A*=OKJH5T]L"4[6>D-5^8>VT'52,/1"8CV:7G0,.-FM.JQ9FPG21<].8# +MWK3*B1>GUW9(I;KOZ6T[`#<-OO<JI50#W!E51MU1PG,"`VV]_/:VLU_=&1GM +M2P[[$@.]Z9[T$^S%:\P5^G!%O<_/6CU)%MK!@J^R)EP-N.IQU7WSS;H=3(*4 +MU%.V9::SH_FB=55-R'8)=SON5\+[5%;PG5"2U842+.SWLJM^J[\HDJVZU/$Q +M<W@8+XS"F]AI7IC^TN28VI;^`K[7I"WX3FS*J!O_E%JGNC+JJD<R:A/N;:@U +M/Y!1TRB;E>^EI)I`P:3R8DKR!U@3K@;E`-79SBE/S=75*VQV9TW"'+*=06E$ +ME-Y'Z3%1>@<E)90H>,[O-8<B6;NALP->PV;;4M(.!V$3%<`T`69<@REY3X=Q +MWP!3+OJ^B)(-%GDG7@6<;^-Z(9)MNMK9@;9+\&^'P@Q/K86FPE,%DVHY("^H +MI8!Z,9*]Y5QWA\;W#D<8FE8M_EO\7NEAM+R)/J%WK:8@@YHCHJ9)-7$3*#9$ +MLB9#=8`7J\Q0`8C]N"9P@6?;&5SO^XM[F/''T'LYZ'LQ(CZ`K[RCVM#S!WX) +M''9W=L"KS32Z_1Y6&<G>_O5N(:?T8BH"'#?Q&W^,)YF7NZ4JIUMR1K+N4TX6 +M;`XU7_C:^Q/G)@R("`6S+G9^U^G,Z5WO/W7N*;_!+_G=$LD'W[W%".PFWR&I +M"G45N,I""6-I).NXB/H0ZIUX7H?G,^"3<TC@A"2ACS&F7?@V,![-Q"TZ!V7@ +MR14=FWNNP#.'I!?\&)ZXO+@:>ICD!BT[12WV/KRV4DC!V%,8@2ZGGW&7]%S& +M210&F(T;,)(#D>R*:R2-G^4H@:O-X&H=46J^:#S"27,&'O#+P*SSUY!\QDF, +M@R>HSTBVM)[\FW36?-&R2*YC3&:J*<U/912#DZ6>.)R)VX2=*Q63=H<E*U5W +MC@]0X;C<?K,?_.!RX^*0A9']%-+:3"2[Y$?='8H9Y9,HGX*MX'.JPV^.9!LN +M:"V%56@YTMWA+XYDC7^I0<3-T-$EP+P.7V-M9[WGWL-(CXR&/BPR>M"OU\\J +M,>;+,>8=Q_9N<?A-_B)0:@,EDM^"Z!7EM5+9L4S,[JR5*HZ-]<I'QWJ-1S-] +M\*7"KQ,<45:\QUZ6RN*FHR]+%6I5>(]J0>O/T,K`&R!-U=#3%0%I2$EM9_G[ +MD5&_+<72@=]^38M=UW\A,V91C2D)$,S[Y<@H8I(C].'=]>`S!#X#X+.I.BGB +M4P.T7Q?\*W^1WQK)FNUD*=V;7X,?/0=+MQW8$QV#![C]S<SK-$'K=9%L=:F? +M1;*+(]`1O`G0:?A%6S;3BTED<D\T`[RZPYDM1H+N0:00XZ%>^%"$%U+KR;&N +MS`=?<\%:I\><AO-CIW952^=WOSUV?C?Y(R\`C#>2=7VJ>U,A)']3L\"J"[XI +MNJ^.D[>@WSJG*9)=GA%XA:(\HGL@R)-=S2^07.2UAS-J)2C]3J?T(LJX+_X9 +M60CSYP&B]M:K^IAM/;FGBR1QNR2,S+%J`_C;=0-_W?/\%57H5$,:?W>](;RY +M&.WU\`8_Z:U^F\X)M*-6`&>-CN-`&2-H<5!P(K^+>4)AUZ>(-J(KQDE10H.\ +MXR,!`2\M&@)\*2P`">7+\`X[61'U!X!QE:#@I1?AI0[A`94T*\$#.N$!;?"` +MD`L>`"\(P`N:_)M8/>)!?7@2X_W7*?;LC#_$W(B*I1A!E30.;KND16]V%'!N +M?S^SL3J4Z@3&(1W#E9H]AAD&69)[>A]@QP6<ER(-X$8(2ANW@.7P,@>-5`F1 +M[+8#1%TU4J1)S1[-J.7`X8B594?'8K(+4>KHKBVB-9M1RZ@M>TBJZ#7ANZS/ +ME&)SL<`$"W+%13WZ.YE7&2<>48(V9Z,D(<HTLSGFQG!E9/3^CM"'2U=C)-@B +M6=N3W8CGD!14X1'?(>TVR=T=E"6D"Y%;I#T!IY6>1C#6?A_Q!+A5K?!;$67& +MQ6BH5-\GK^MA#/.=<EK@$60BA3#\[$QU*/P--;B3I8J.9?KJYD;?2IHY3)/D +M':!1#KTSFGD,)M^KC$>R1:6='=%]RIN@T44TE"PWMYU-C'=V:-RSU;!B)5HW +M"3LX(*D#&H\B:T2)W__LC"M$=2>O,9L>):Z+60]ZX!N`(Q-6#RO8#S]ZFR#) +M[I&L]07T7X[[)&0+,X?R/?3*J-<'J-<R^(^(>/!RQ`]K1OA(RE\,+SR!Y^]" +M/G!OK29OA%P6V#A(WF0A&]J70ENXS"T7F,WWM4BV\6!W!^HMX4/0HMT9XNUZ +M-F:&+2HQ%I`'6DT4ET'_/=C*T=F1FM7B8#_BHZ8+B73!J]N1!1OA@R\@>Z\\ +MG]&B&GO*&=9H_OXC\/(DLE'Y?,;I8<;S8[R9=!"=(/U3R1G0H3:2#O4R:;'< +M,HD,WKREB?Q\\A!S^5AT'\H6S(*.2)9_XD2NQB_Y&.J,H$Y/'_B891_CC&TA +M#W509(8F,Z3)T(<%1HQ'.^EQ!^-%7?MH))SY"^4*-R&^SVBZUJ2"/ELCV>*W +MA:<YM#4%.*IT!I;ULTK&FW^#65".9._93'PN'606YL:WG7E3L]"T*[3=@+A= +M_'PGZ=E!^H];_#)\]SG8G4E[X9=])S/',@DF17G1KS(G,SE?($SX)*Q<&"8O +MM61HD:6Z_+7PV%I8MY8A;Y<1?8M?@<^X0#-`<*!:)WQP@%5:)J.M71M@DTOP +M-^@&,X-1CRH_%ORL1VX1(DAH+K`,&2*5H=70LF;6H->WHKY)K[>C/L!K6+VS +MAO*'VW?@WH3["&#J"`:>=7#M!79H_05VA'K0\I3;-P8#H<"%"<H.1):`L89( +MM`C\K\9L\3OP79GC.34[3=Z(5AKC[(C07"6-(X+(^:?BU/6DT</,+^^$)D:$ +M!DP8N>SZH=0LP8":*UZ9RTT`]QIZW$&C'-1M6M1.9+J%7[`RQ#2[VD1C)7_D +MBIAC3['J]C^?$5&B%=9[EZ"T4;OH`]"#)RYZM[N#1H;F02O(@]P4&7V4'<$K +M%R%3U7)?Z:J>0U5ZW7H$9M)[6&F8R'NK7-!/D6;]@C:2"5&^*M_R?A,D.06* +MAVG.@\W_TO*-SN;H1LSZ!X"[DFS]^W+-UE*?Y24:/RRSA4E-H>T2,II%1N'1 +M7'AT)0]`VE)XPH94X/R$/EXG*>JC_H"(9%1:#9[YLI!4:K>',J$9;^A_S01] +M<-SO2Z5\0"I=%F+F99`*^2G6G!CCB!Y_\B#NT,R?1)<%I#*4W=$QKK4$]):& +MK@S:*IPU4IF+/3<6W;4L*%5QBA!4[T366H6K`E>9EL$NPOPE9VENF<_O*R__ +MX?S>MTOD]\C;%ZT!]@[*VSTKF9TD6ZKQC&_=R_B<E[4"'K/^HDK8NT',<3F/ +M@_X7/8\6@_`XYTUM;Z.77VO>Z"V$-U91%"[*DG\DSI&W^:WP#IDL7/3=[@X/ +MLD;&D-N6(6-P(V-P(4)QFF,0@3`?%&W4/"=N1&0>TBT4K\8J@_R1]8G\=#/O +MXF+&7!%`)-9:PJ*EB?HQ(7=!BZRWU(D6YXKUS+)B'3R+ZCII):5J[78MY^7% +M\.CWQ>@P@1\+1H)3C,P4'V1&G9,$WX1OQ?<R0RPTG28I%48X$N'8=\X":W7X +M9>:(UP%+YO!B)["=\&A]C+56L="^T$_B<DI:B4BKR)39!('!BT`KLZ#_541) +M]3KG^K_N#0?B=GI&F>OW:OV^AJCD^"FHAVXY=%N)F=0%>N4N0"U?QUS+US/O +M\@W,#7T;A'S=8O28X(D<L\<LLI>9_V,*!8)"V>=0,*WQLPHQ^Y!>O$*:2M+F +M'>L1!^>E:JADH;VA-Q0SM2W>P6;9[31#*3/D*Q1A_`[PX`8EE]=;(GQI\2>> +M@+\=N5Y[N#Q^K6OBV9^[:=_#$$J8[:*]5%MEQBT;G]F(_&TGS1<C@)``X2`( +M.^UY4-Y@2KFF;XE;HL]$<W!MX7&USGY7:)9&?]Z*T9:K2_.38XH\]]0_/::N +M3DE',LG5I7>%KH?&0L=S6.7`RM6-\%.[%'GNJ?_PKKB)^F-GJ+]2HG8SYNP" +M3.TI>7B76H_>ZO^(WH`3-^Z4E:$_LJ_>7%]VHG2S/JXOT(?VU#L]AKX,BF&G +M.3A5(N?;"#,8X@[IWWF!]`^7P=C_X<]56VHVFXF7IIS3P(B;:]:5R")//D$E +M\"RGVJ?!$^!(S]7I]L/H+5YEV<-8R6RO.;0VN/8W>P#_]92S)J#C[L^7M87X +MON,/RKI5ES64DR2'\P=DW0I9RRU["F9G9WM-O]IS?H]BGN/`7+T'.5FETSHY +MUG;6?64^&MIOR=-D`:@;H\\H'W&K1UM3NVGT`2[PY_^`O&G%,9:(DL:6.[%: +MP,P9U:.AY!"1JR]E/IJ)<WM1*!.\&^MQD35C5.YR!7Q/X_X[9!9F90TOBA:5 +MLM`8-]V>L3N40SEXUX8YC,[JP$[F>PJE+'"*X^-B=-OU?8D9K&G<(M89*3X1 +M1RYD[\A&BZ)8FZ7,QS+QC\3N`2(`SV@Q!..VDF+'-]_<R9"#6E7+O#?X9&0( +M%KY!?_X'K\R+3NZ-9F@'H&IUM[;[5<V+>+LSK!A*W^G*]%WEX;=^@MQA@V*P +M_Z-X!D9PE<QHU4)11],O^A%1HG)<FW$04QTBIL[US66MGS_YA9ZIP$N=&TK? +MB5^C><#-<GL;RQR(@G6(@MX-'[,&OY7VD[3ULI,BC$6WH;2=@4)1FD^.828I +MHO'1CQJG27B8P6G"K,P0><ITW)W:2G[Y-=RO("J5P@9NU)^@_:0P[24D:=7T +M^U/$G7V):DF;IR75I,T=S<B$G*'PK9#D:]\XP1=U9=+FPW?+#I5VDJ[TL.N/ +M8K6#V<3]NK9&)XM!`@ME9I7O02.4Y=G`+>/MT.-QH4>K9K.%^KNM=4Y_9$G2 +MH=VU*7P`ZU(/,XOUUBH1^XWP,)F'79W*!\)7&%$*3]G.J<X-M$(CO5DTV?F[ +MT(-3*R_=)O:=OZQ#7U1]!(UVE]Z^V?<,,.TZYD&T>/66)M+4'.8YM7X!OD^' +M*EN`KZ!EM5Z^-H]_$X<-@-.MS$_/<ZC3;M1;L@MH&]$2S/&9HTU^![W9Q7C! +M2E9KO_T=P+;JL)3).S2/8^SO+MHF8FS)&MUB`L]^BRJRT.E]T+(5.?\SRD72 +M,5E+A[=AI#GTF;I<6^T=W9<P?^%O^N&%T;W*9=#'V.`EDSN897J*<$K?#7VX +ME.SIX-X2X^14"7.R\V,^B7Q$3F-$>+4:WO[6<=\^\"[W'"#(7)T3[;1[Y6S_ +MY8^=7G/;@0R7SF=\&:QFL.J;[2?\DU/F-E`VYM&1*<[,ACDPG.P`VGZ)GFE5 +MA(AI!)?C.I<-.I?UVJG'ER@742!A&R3<"*X[@U/F4!CTXVVTQV]N"T[9/@4- +M1G1*EXS4'C;$S2.&FJ#M6O1IQ3VR$L\R8.BI`MK?"-]N$SF@B6IIU[<F8+L& +M'_I4-?.$[=.P'>N)[2D)?%R+;Q.20Z+#&=4^C5XQTA`9KT\C6[:0])C_C37- +M)8SDFMZ76",D'BUG([6OV>,RUHI2>''<C357MUJ9:TNO/&R/VW)/T0GT:(J" +MMI(E*B0'W;$>BA`,>.[SWU6.B%7VG!AQ#03[.7R5$U^',W%9IX0([2RJ:9ZG +M"E\J$Q8&/G"-I,'4K,*,W]4L\QG<KW/ZB?MJ=GXW'VU@VU;^"-R[V?EQ/AK2 +MN'>%25<F0>=AHD,<$GP-X,VAE(3ZUGSZT0E!4T8OQFV28MC&WOKO-2'HGO3$ +M#-=OXL5"O+RV6'6$]R(+UEM2*Z=A*\-)/ZS&`OEG8L@L`G8[8N>]%#N1W064 +MB_XDZV:M3U+6T<KM:AH<!`[`ZHC/7GPS.A/1\L)X&^;NP"3:"-9/NV>(T([G +MNSN`XX)V':)^+:O33[9"K%YQTID09F>TL'IJT\\3&E+VMUYEK=$]REYQCA2D +MDZ)X$SRX4ZW*R4GV]=\"2_>'$E9X*!9C'XOX\BGZK7H+G)!&,1M_26&&J^+T +MB4E>K*/JA"]`VK!=96S<2?NMWV=&U;(6^JH)FT/(A=X0?47S='HM.I&JA>[* +M_(M%KWNU7F_[0*SFW/F0VCH8<!I_K^F01\0^M.!OR4[B3^?MT91$J];I0UB= +MM='X.+PO81<\(D;4C,KP!J5>\%-!-?Z[Y&N"[@<Z765>[B75>71->AW6=U0+ +M#3RLFM#3PWR/MDIFLFISNC'/!_@898#2:;W>@O*)\%ZU<:'_I6L/V]7J?$]2 +MRVGTZ_**G=*K"3'>A@2_FQ?B"_V5"\\!_\6RQG_%0:%!3SZL3E'XF(!UZ[`B +M_C=?+`Z1?LC[25*I4G!13L^W!]C*'#?TW,/^[=U.VM/PZG'*2)B(9.92/ULY +MTHA(%Q&\!L4S/VP8-(U\%=\5E./"SZGWL-;[K9\(3LOS6K;K+73B9R=>V&2J +MD5;]TVXFQ9_$MR%>I>E(-=>$S()OQ4CQ^!L_K;G/]BE6YX*OO-:`'G,\@J]* +MNW].(NKQ!;W'Q[0>25[%1GBDNQKHSARBZ)[#0G9Q33LA$S-%N3936,R8,VD. +MM.?FP.!?T9^8=8N@LQ_0G(P9)D/S;#YF\<F;,>=.>8JU\_%_2\QC+\!][D9< +M6F'>A.U;V/?]`1U[,Z2?T:0O3Q!F)/L%#T4?ZN6!'%1=?OZVI(KR-]K'12Y@ +M[#F<RP3RJ#*=)Y&M:>=O]BN=R",%5K%BP@R\@_#FI-%S`O,;H0]+ZG-[,I@S +M3)&LN=?#_(61;.GW]'Y#J;YL)FGGA?G9H^*K;L<,__>NT`-/N0L?&/_;-_N, +MP?^L?!H>?\RPG1W9D[#Q5K<Q.L[EX%TR4WY'>0SFJ4]$KGCI!BX"8J^=WG.H +M1,:UI#I1?`;YN2?%T+O,MS+C#W_>BU5@F,YKQ%.?S=5%N:@=L;DZK)RJV5!\ +M)KQ/["!!BD[D^317(R9,%9]9VLZ,F$7D[HZ:`.@N0O]BKYSV&9K%FSN^"?3R +M!)9SUR*3W>(\XK/KZ8V1T(?<$,E:/^*DF3)$'MDKWN"8=8<SFX^/L.<D;F@[ +M&S!J>UX%7_`D2BR*HWI3RG'R969TYDXA?)X-W!J_@+6R16D#3'GJ.R>A"V1A +MM0QS<TEYS2"3;1.^6EH;B-$W9>FG-U1BI;S#*S?_EEGT_2F7;YUS`R^:?P^E +MI#S^2MO9"Y3])=$CY?;P)%K7^%CU?9Z0LB[%[+?D5C%8B9K3K)2-\`.[%".5 +MO!+:EWQV&S=-CL7=T6>B3W?M"^]3Y?`MJC&\)/X*RG8J8\8WAY?@/JN=2KA? +M%_ZO\Y%B:68O+[W5PEC/H!G?3PX9C6BV2.)9$L\2PXHJ;@Q+\=,YW!2C5;G= +MCG6YMG*>4"YS6=A#IO;(IMDKSHZT.9(M<IB:65WI<>CL$E]D_]7?_31^-6B? +M_+/((X+6`G@G,S2S(@W^UQ.?!5]WQZH[Z^]:?7?#/3V]6_IB\1S^_1W.CE6$ +M75+Z[_8S%R;BE_-POZ;Y5D[FT(=UW!7"R)&J)8N=K51E?-=2]A,-V<LA?=U@ +M!32Q:,B!W'KLU*Y38^&"N/%41OG@0$9YSSG&Y<FGNC)M9XT6S9Y8K87D6E;` +M;HO7<:]U>R1;8E@98$9<]K@Y91'[$+-*V<J$=3MSI/[U^,NL//@RL^""_K6] +M6*(#/W9X0M7M"B=K?[XWE!V'?<_06M%MU'5(;Y#(3N%3JU=[)0_SA"+98LX1 +M,\RGJK7SSC+:QY%7,HD5Q6TU.S"8SMKVIPI1>QBUA:Q(M='>'<642%8ZW-V! +M6A-J[4X3;T_!DL7=XN2TPKF2R2YKM4D?92<]+)I1'^:%RE"UV65]?A>UY]K0 +M$OS.;D^8ZIJOLHTN>9NDUWLP8B2GB2B;K],N0WSF1LI1BI4%2IG^O`.K@_V1 +M;-4A3:-M9Q.)R*AU@?RT3WDW-.!C=%X-RI6<3D)^05$S;DF5Z;9@["@LQJ`) +MA]#$^Z2)N;:#F.GVTWZKLQ;\%,_Q\S9)&L_GI$K'283WJ#(H0E]8'Q8J#[LV +M_(^_3UFG/;.S<3-1$5*_S8/.PA2]B6$34;QJ/32@6.Q+TE;DQH:*F>C3?_MF +M[)+8Z;5^^VEG(=^0J@#W[U-D$W2-\+VG(??%7.R#S#+R7`MYS]TF\:8*9`>. +MB^26WQ9RF^?D[A:2%7;M%I+EY#KF)+E*<W+-:<+#"RFCZ=(NBU+!34H9ET[N +M5>R$+T[)6;6!*+2=52[F?)'VX8D'^:#@(2IXH/C3EG+,(.*F[=-C<7@^C1&E +M(8P:T>K+T02],]!E$7Q/YH-T>E/92'OXR#(#T%TCQHV1(AGMTXM]:3KY\NYD +MM^^`;Z]HOCJ;J0F55*)G7IVP9EP;=C#%Y-I0'8WNQ0QF$N?&EWAQW)>RDT_K +MHX-RTXG@-X)HA2>::C98,XK!];3':]T1G;+N4`P>T\)]*^!6K@@P2]R>MF#5 +M*:=4TAVHK./MSJW,0KM8J8*95UD==&B#_KA^V91*>A>U2*8V58Q+R;934DQB +MK[9`]B.2W*D:Y9^P0I1M;)4HFU"VZN4BE&64P_J;"M>AL2DO4QM1;T9].7*& +M5V:_EUI,=L3L;*$3./CU%-H7H=T4]+,5BDE^E:AHL#I%GT;1!?X*?H?Z#]Q, +M[?1ZK1/K]J8O_?7>,/#4>J?513CK%(^7X'XK%S%)M8&"A6B+NHL$H]N2:%A6 +MK&?&%:V(U85*=?YHYBMS=I5[N9?&5,6;<Z-;[-4R>N>R,_3A':M;KK+Q%-/G +MV'<\FMT<B%6'=C+,QD>JW+.SO*CE8U:9VZ<,WKV]LIGV-4+6%UHN6@^NOVA] +MS=O^[(EOOIEB3C;RGT[OVN:.O'+]NX)*+WK<CYRV,S+J\?"ND9XM6WG'ME@Z +MGD@^SCT>QM9VW[>1L8&AD=&!D8'DT-P[H>',8XQ5M6;"8[A;6L=Z,`Q:QR*C +MN)>W9JB4UV)JI?T]0ZBY7HHSY@P%0LVA8#W#BM$T?KS.$`K4,W$/KC*X;@=D +MP3:[I9EE^M#^JV_=WV)IEAF5?_.M!U#FHGS^6YM:PLU;4?KG;W6UU+-?'PH% +M@\%?_R#4DCF^FM49Z@M"S:\?G]Q%L%TM)\?2;%5!J.7#(Z'`\>;JVZD7RHOJ +MD,I42Z%@J.7UXV_,S!P_W4)43NYJ.TN9<.C#%-I5'D8>$,PHY=7LC>.AX.O' +M">;M7:'FF>.A0#!P<C>@;2(.>&VO&0/2%5\@<O5Z(!<7"A`7:(^G^(H'(Q/C +M<A7E5F&F.F2&46E;90H=YQ)/8/1.*J6H,ZB6_*C@V11=AQSM3<K!?ZF=^\V( +M/>)ZS)VK$3=I+^9!6K%LN%C2^T_'X?-_&7T:\94COGZ27H3O2V(/]R/[$FC\ +M0'2JY$%7>_<S:>>T%-\8?9IO<$VX0DH#,#RH\46?IIF8QF]Z[>28:DDOHF_% +M'BQ5-CJNL2\H,K[-BL'QR^C3^/XGX($2\B\6/QI]&E!.%^J)`[54\&`1/)B( +MA_@%9&6VX&V6*4;+D0<'V6PW<1\WT5O2BK$9$L"7W?[[6'D+[7K?Q]RTIX)R +M><U]U@S*+OV=XU8_YK#,8E8I[D@7Q;V,-2$./BK>O[A(-+$"YZK1R91TRT5; +M7?O%$E[YC_%KZ(?G[V._)=XP2OL/8S3%*PC/BRPW[::]1?&.Q1"]UUQP+B__ +MK5Q((WW/@:]Q"7T@!A>\(-KDA5%%>Q<@;D-&<,8IYVID>I?U]O.9ZL`W?JJ? +M2;[+`TNW(C)]%Y!'\JC\5L>IB[>BY84Y&G5*O>XK;Q)%W%^G6L`\Z9078`9$ +M[X_.808V(\IC=3-E'8<%`)EAP2FKU\E8,Y-JFJWN-'U'6(`%:P+6<-J`IQ1* +M";(9//;12+8L@2AV!5'$B"A2'QF-W-?6R)A'^#Y\="-E)CXZ?T&LJH1V4QU' +M,TD#G27!IBOF8U;_BGGY/0',_8?8E!K!2)DZG^$!CYLUQ(V>6G80.4>#LQ!2 +M_,(E-+.MF'*F:E-T]^U'F;E_!=I`US67BVDCCV+=M6V(I=^](99:\MHW$R:B +MY@5$S3-K+UHOK;]H,U+DG(N;310WNP)J/A8_OP^S;UG+Q>)SRR:VTQM0]'[B +M1A%/-PW'TKRY-YD>X='85T9CPR.Q/A%56SHB&^^+;%H+10<[HAN9!\#!=*QG +M:R/_C%BKYQ=&'Z-,)KQOJ^D8[#9H3BW23_N<%%D4HV<3K8:26)_'K^`RZSD- +MO6&@G['06E.\6:M\//=F+;W)4<=4'[W![TP47_GA3U4G7P1LH_?+W7^&2-;( +M41N<*KZ",6),&<7*91)M<^L++HL<(?3L#*V&]#K,K=-VE5H^33'D;;*V;J!Z +MREF[QK8:I]'6%8J.(;XB$CY[(@>36RLB!MF[,J7EAV^-6\*(,%V9QRX3K2%D +M3I'1E)2_OA%0,E9KGQ!$[QR$H*7U:W%J?$XH1OL_$K6^3X/E_"88T2I3JV(* +MEHL3JIOI9))E/_QIS/++F;=F%B_MRL2O*B8Z%8P+V)R<XFP$JY)X*:Q!>P+] +MO#V294,H/4KV$2=E,Y&KTHGJ]DU/US5]=7:F*S1S/N-E\A)6HEHL6S-L]GK< +MZ%TY>YFR2NE@M995,J7JZ+XM1EX$RYKH]'#NC)+HV\0YHK[NYG+<@(PQ$_JP +M:9736V+15T%E)7+;V;8FR-4\/98L=4FGO\^,IEUH<4SO2A@4V5G#F'I:>;]: +M,NU&K7UZ]^`;:JFK);BKWL,,6[/GGWI[5_=NY8(K@&?VV`_D'R!W9<'=J]%J +M:/GJ[/FGPX\!+K#^<H,QC&EZZ^K@>,-*M+6B;?\[N[O'S^WOWHT6PV-&UIIA +M=[4"NM1C/+^_?E7(:`AFV%/!N_:$C,`"?;7M_/[6\?670]<$K34:K?/[@WL: +MJ;^UH/G,.WNZQ[MWG]M/_6HT[YZG>6>.YMV@^3^_S^3J&F;\T53Q^T.6'^$I +MWAC^/GJI1URS\,!AQ(6:`<9*,.OQ?BP5#S$6_V3I`.W%<.")7SOEWI/S:7JD +M,4KQ)*?=E'@79LVJS1E#AG9N+!DFS5X;8NS(-/7*V'0U^J+WC)TMT^!@B*QC +M/_Q]Y-;NM;]A]G!TJUW(KFML>CQ9H3UOE<_O7WLY9%3.5).-XLX6Y9C\$6E_ +M_679&-PS/:XV>8W?R3RP%ZLGHU)W[NNZ1M9E$)?//7/W.F:X&Y'GKK7,\*0Q +MO&ZK+:?Q_<&[]H:,H"H_GWE^S[(6>+RY&VO^MAV(9HSX?LS(O<7ONYFF`>)8 +MUT(CK;B$[)826?F9,T`R+$N46!BKN:_$LJR5&?%D9Y9JX_-[5/<#NU47T5]_ +MN=MXUPXB=NX9XH?X.O<T:X'M6IA!<02A&;U]?\Y+YGF*7&5F7`;R<\PU=IIK +M/*$__X?YF<09X`/L2'IV63,[0G,B(I@7<\<'VJRJK2'$[T&RVF^U?,QIU=<5 +MC'W[R:^^NR?5?'XBDKU>[=+VV4PN,]J_3?N9B.,[>!`SP(O::@+9_]Q<"_P' +MZ1=-D>SO+XK=SR9@%E<7TGH8L<,3O%-F/$B[`%?/H-7%`T'[Y"XGZQX[O#M1 +M%LT0W7__<75`,0>7*"9M-\696UN<<181KX+C[]&[X.+MNB,TZL7<8X^,KHUL +M;IR/C12S_/1+0&2\V^N67=-^1E@BNT+!L?47+7*IW7%GN60P,%DU1D/*I>H0 +MS,8&+?AV#9GP+>EOCO]:[!E9HGY6CNM6P-(NTLJX(2HPXE4I,Y[KX@TI&35V +MUJV:\+T][D[9`>L$C#U>*2#*+&ZV'72-&T.*&>5NE`T;P4]P%]I)^P\Z[!8# +MJQOLQ/<]0R8CRHI-WL4*\=P\V(CGNU]CB55N2:VJEMZ8";6>P&5I!1?RV^,Q +MH[-`,8FU\:VG:`T@:V5P<1!K-JQ15$/KF"C=BKYL0B=.TDEZ]J^%?E3;WY[` +MK"0[GPJ.*0;G!)?:SEJJ,!_.K_<Q'WL2MG*%UNN8$3V;:-[=<-%J3YFPXB_? +ME(F74Z8_^3*SJS9D]/3^F?UX<R3[VT[>[ND$]-LT`V!>OOJO[^;V<_Q6)V:, +MZ#=;?@N[+8X^>]N8;.&W:F\F#SIHOY7>7DM+1*=`[*;17EK.TMJNR(O7#!;: +MGT.6;,%E]+>CQ6]P^!<A4SG80KO\V>)49P?YA6IKIE]OM&L4#5FYEA6RV^*T +MKV-DMXD=5/$+1<^7WP-5+<[]L7P:^G)\ZIPE#8Y\WD))0R7XJP1W/]"X,Y_2 +MN;,+[M"?3JGB/^0OEV,D:5_05.\5>\VN]JZ]2JN\$H:]375UO<3DP3(\65E5 +MW$8[^=&7:'?%;E=L?`-FT`;%).YU8I?/WK67%SIFTN;L&%8Y>X>._,W/Q1QL +M#)927N55<GD([<LL-7I"])O'_W8"6?I%ZRKP_#QXM;(*S"[P`<A3DI8BV8MM +M/I8T[V15?E:B,,D=W@>9?DLR*2;<(>/.6=3;NZ"Y03MY6/1EG4?&KNV\\Q?P +ML)1T+*,VIA]>)_T83R.!T[L.[XH[@`TI=?U4BKV]GY'^TXN/C:DZ;5'[(\`8 +M`+..6L%)+=8G^U0YB#M:G\_G]E]>!+>RSNV3G\EKGWCWU$$9R&_.T0[:7$]M +MY/<KD3L218P#!SV#9GAE@,F@6THRYB1$'W:E/*\'G8[@<5:,EW&Q#YB72\+6 +M=M(]9B.)SA;$KT7$6]Z7UG@09B`5[*;'L&NINIF76#GRV^:3&5&RR/\B.*76 +M]U)W4MVFC-J9:EO'J)P.G!J;'A-0$OAXB5F4>K%W?)NJ4?Q!:DB''%HGW0!I +MIF\!-1Y^"?II`R9T'F\E_[IP%'IJG.M=H96FO=P)?RS-D$?BLG3MB8Z+M2FM +MGFUB=QK]"N]<0_M(TZ":,(;W#/TXO"=9)NJKZ=<ASD*BAC[.O9/A1M+%[S!K +MRI=RNA/OTH6X%='OH-`$/"CN)<M@1!N=)X+?(C_`RF=&[$JB3_EEX5<O"ZLP +M]I1XI[:5]B@?,Z79RF9F$?N5[OQ(=R'NHUU66;.A8CGV,NU\:99=2;_A,-*9 +M`"Q"O9?F>DI=H],":,0%[^$[&<54]%9.;_#UL-EUT)IAYZR(MQ?T")HGTTYZ +MU\\$7LK%#FL`5&$->LLNDITU^UC*(GJS"?YES1>OO`L^*%IC]?[1ZBCY2V;^ +M]"A'?S[""F^C]ZNXA[RM?"?S>JWC3S+8N%RSSNP(QBIZ3J^<'%-Y>C6^35V@ +MJ?`=]/X-1MZ?SK0R.E7V,,7RI)3JF49=W+"#T:E8ND?LO"S&=\5#R`^4U>$] +MFV?2T@$L&"5Y_]C.P*_^3'&+.G8`?_O'E(H\"%P&JM/\,^/W6B?$K_4XQN;K +M=,KK)JM0#.O%>MI$NZM*W6?T6Z%4H$T2)R1&.B&Y,-G=H9AV2HIAIT$VL9(X +M[<R6/'MBP[\PN^>$Y\2*5E:Y`B,=EP67[/F)6(M<ZEYP%B5^W>4(?5R`^95L +MJQBKVSU=9#6R<OPR[%J5<L(JTYZY]0YOKYY(+4W#K>A_,O!;Z3=5-.Z1FXW0 +MGIB;+3SOTNR$;SN3M;TR/^V5*9XD>UCT[`WZV1=Q->*Z!U<#,@3.[L:<M#$U +MBURQ$W6KZ<W1M1^S)H5^Z88LRVZG]RP'XS3/L<6)1T\&ZK[(3)%_AS_7L2C^ +M&L3W_!\4#:I4"H@,Y(M*E;@W*F7B?H]B$_<&D:W4L;NCK^J_+;3']Z>D:?`8 +M-VF<I3U4?]@>K_(BYW-N[G[>N=C?S#8FY%;P?'N`?9%P%0MFT(V1[#EZZ\>K +M\^Q#[%A'K2E!8QI9&/U:F=_?_2RGMXLZ$R9-9D&A#!0Z(]E__H6'Q4W01Z=B +M_"?4:US,Z:$-/N)(5Y)?/T"_P"]%NX&MUK.NU3DYHA/T*QS[8CK#`X\NC);J +M5.>!S"`S5%GH_YFH23"#XU3SJB_:H4>[47(:3/E_4OW"9[WV$MN6*^>5.J5Z +M#5\ZEL.4ZEV0-&6`)E=CKH]V'W!V\B6K,@HSA+4GYS=07I/3A]O^F'&GU#J. +M.<,"R]\+:6IA?V<8GC)7LQ(U=M3<,U?#6=,.B1MY.)+]U56Q^]49-X7'52:= +MHS(BI`1;=;I1?F%/LI*'WWJ=%SH!_?%KZ3H>%F\SC/==I=^RGMG#"[OH-T5& +M>RFXOAM9*+UQU8G[Y6"I0ON:@F)*)HMIVM;EL\];=3M<43'/2V7W,U=Z=%I2 +MV>R#Z23\H0K\-\SQ7Y?'_V,*FUTC6DNU%L"L06D[NW>'08?9Z\$00TQWQ=FL +M`UE"4R3[P6K@R;D>79W<'#>NO<HN\[!^@O2FAU8BG5N-TWN21O]:\:O=3L1# +M:9YK>$@3QMV]>N2:HK$'G(W3>Q-RFI&W*\:_@+>#NR^J50I6V?8*1-MO=NU- +M7*&<+<511CN>'D,.82$;P0YDNW5V?3=Z9.6T036-U$X;XJO">[?Z#I..2Q4S +M:*$DJ!&%2_.T;VY;V#,XK*:3&VT']'-CD$6\DXML%#65S*XTI);#:I9X-?VN +M<9K>P7R5E2OE].X.[7=C!1@2OR"FWZ>7ZSQ8J$^"MY=#5Q::>\(L_B.*?^@] +M=S9O<^;V/X^$%YS=LEZQ(SCW*WI]KVZB>S)XB!F7(F+GGZWK:YS05OC:L4S2 +M5+=C=E8I/;^O^6+Q.9[:SL2>YS/;&9?U.1)X_B(?4Z-I]=C88#CUY+',$+(? +MY,%G['7;F=*86KV.'<L,UJ4L=-?;OB[:JBS[L-#T#SK$_8Z$UM8IV@RI0A^= +M"\'E(O\5*PQ%B_5TYJ;]?SCT6?<[?!FUYWM"C#74TQZ%^%6>^!1<QO41KO^2 +M'!U)C8XPEN[KK1WJ&8PQUA?;-K`%]]&A`=3WCL;CL71M;R*Y9>LPVQ9+]R:' +M8ZP_ADF`GH8'DD/L*Z,#L1$V_S_RB$^2T0\VYI^'<)7F/6,ARBKRGDD&GO?< +M2R_[L/G/9ERK\Y[[<37E/6_#U9KW_!5VP^=+7]FVN7^HL:]QM+&W,=E(51\Q +MU^:UT2X.D4>2PR/I6,\@O\-7Q]WWW.F[HP[_:@CJ>G[S9FJOK>4MR=03Z0&U +M?X3?<<\]=_*6_O3`\,A`SQ!?Z^.A9"HU+#0MN38-]ZBQ1KY\F#^43-%.]O`C +MY@ZMT&CF^-0^M&WS=K5_:#C6-]J;?(0_5%NKV>3>^$`B)IYSMKDWU9,>$=OA +M7Z;'1P0^VC6+W:O=M":J)@/>2U]?'AH=%#6ZP>80%QCW7NV6`R0[B[*PKBB1 +MU1\QFR.C@[VQ-%^73`_VC`PW<O?C_;%TC"M#*W@/[CV)5']/+;KT\;X!=6!D +MN$9T5_?0]NY'AH:&^`X^7\+W0_VA1U!R444MCR?3/!3;+C"H,=GQB%Z;W#+2 +MDYBK[PWFZGL'AGK23^0:],J^V):!P9X$=_<DAI-XBO>,)D9$RU!RJ#8=VY)4 +MAP:>C/75F`6B.K`M-L1'^L%\;W);C#^1'.5;8$N!G8+I4[&A/M[#'VK?L/41 +M0:8]IO;T/C$2$^@;!A))>N`]@-J:>TC'AE.Q+2,@G7C"QQ]*]PRI,;ZE/[9E +MZ\"0R@>&1J%?X2/*;-XG-SH\['<'7MUPXF^V+<7?N5&M%%;6UL>RJ6GJO> +M7@.Q1L!M(OEX#'R.\&'X`!\9&(SYS.QQ%D^.`FO.>1JY<_FP$P*F>K8,C#P! +MYTST^7"14,.,#8\`D`MG$$V<D_!YSR-)6$*K&!8U&*STP+N@4JVB;W0P!2D; +M^4W$1I(WDGMH.(>VX1%PFQZ`[N+IY.`\PQJ_P*01(1Z(R[XDQ:WD5B__"IT1 +M#:D^'^)%YT`J-BRTE([5]@VDR0*@\/A`(L$?3Z:W\M[1$2A_));N$;8Q#PQA +MK/FU(<<'AGDJG>P?Z`43?:"V)3D*#DFYX+>'+)S'U>,#(_WD*FE.AA[VL5@Z +MG4PW\@>H:DY(_A`D>X0H)V+#PW`R^)6&-*\:#6:IF:V-1CNB.:V1$'-DALDA +MB9$MZ23(S'/12\9-#\30?V<BUC,<(W9CPIFW]21&H0SR9K4';DV.NX"TN2_) +M(QT;.<;QEGZ!,D]W8(B+4SHZ?,M)1I0&1X?A7[$1(?1`_`F!IN0Y)$4!=70P +M-C1")E-[!H;$(,&G9\L64L'`T/!`7^R&[MP#,9]0-%7'ML,X.2SARYJ:AD3D +M@7F'%V*O&*[Q,83G/N%SR^L:8+3:-7H!RKTST;=\^2/<BNE/6'1H!?28'$PE +M8M!4$ISW$!4O)Q(\W@,O@_')$_\OZ>G.K!/,AZ:Q*AQJ(*E%MQR2;QX&=4-< +M"^K:"*!8KHV9&U#PT<;X4.SQ?`RF^TRN-R](]/1B#,$P\'-A#0'W>$\:86&^ +M42CBQCX3/>HPK]N^/+%=[PUN!Z]:[FL8QM<=J^F['O/<7&`!5COF&L0CHB*( +M)!=(I-.)M@8)2&^?AXT+(*^N0"UV#H\.,L&83E7CK1\>,90D0K[/EB4OWHC8 +M\@=DVW%3I!SNU:!BO7,!4"L!-N\37!@$><N-`;:=Z9*`JSD'&(P-)M-/"(O. +M]:OKA?Z'A<]6C-"+/D!&2%"*H41V&+->@OV'^)^C6'R08F)Q\R6*2%OP[Y%& +M>&U?K'<4XV!!R:SKF8GR@H_4V=%U7W?;`U]NZ8A&U[9LQ"S&V'),%5H"Q)7E +MPRLH'O8,]@ZHH\E1I$KYK;6UU-Z7C`WG!LKCG.9B/:B8;Z"UY8^"!FPZAODB +M+2:)/#""&AV:SPP6LO,'V@4#I('/@?!"O3TTV2!EVD+S==WRI/ESH='?\BTK +M;N":JCZ';=8R-T/=X%&^G%4"^5EY?EE:<,VYL9L^_*9/R+[P,S[WT2O&Q$?Z +MC(_6ODM\#)_QH59^8[K^_^53<I`QZZK_",JZ\?]%7X:\<D:0%=F?#7]Y'U%G +M%&LY?+SK`+;_AKJ'Y^#F<.]X_F9<T<6)A75W'+X9[HZC.6A_S^A(TK\E@96` +M__&>`;'$VX*H>$>='__N7%7G;ZBC8\/"FS[60OMB@X%*AL*RPJHE>JW5NF3) +M3;!$5:Q="[5>;7;P>0W7:5PSN.C]N,5,^*D5<-9IS496P!5`<1+DESC:K^)Z +A$U<6UP]P?1O74[B>Q/48K@=QA;4^"B[_;R9`AY9,5@`` +` +end diff --git a/sys/arch/amiga/stand/device-streams/getdevices.c b/sys/arch/amiga/stand/device-streams/getdevices.c new file mode 100644 index 00000000000..0a56d0d078d --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/getdevices.c @@ -0,0 +1,326 @@ +/* -------------------------------------------------- + | NAME + | getdevices + | PURPOSE + | build a drive list from RDB from exec.device's + | found on the Dos list. + | NOTES + | This code relies on peoples hard drive controllers + | working properly. I used similar code in some + | cross dos configuration code and it seemed to + | lock some amiga controllers up when it polled + | each unit. I don't wish to do all the checks + | I did then, so if your controller is one of these + | types (you'll find out I guess) sorry. + | + | known working types: + | ---------------------- + | scsi.device. + | gvpscsi.device. + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#include <dos/dos.h> +#include <dos/dosextens.h> +#include <dos/filehandler.h> +#include <devices/hardblocks.h> +#include <string.h> +#include "util.h" +#include "getdevices.h" + +struct List * +get_drive_list (void) +{ + struct DosList *dl; + struct device *dev; + + struct List *drive_list = zmalloc (sizeof (*drive_list)); + if (drive_list == NULL) { + return (NULL); + } + NewList (drive_list); + + D (debug_message ("Walking (LDF_READ|LDF_DEVICES) dos list.")); + /* walk the dos list and fetch our device names. */ + dl = LockDosList (LDF_DEVICES|LDF_READ); { + while (dl = NextDosEntry (dl,LDF_DEVICES)) { + char * name; + + name = get_hard_drive_device_name (dl); + if (name) { /* if the drive has a device */ + /* name. */ + add_name_to_drive_list (drive_list, name); + } + } + } UnLockDosList (LDF_DEVICES); + D (debug_message ("done walking (LDF_READ|LDF_DEVICES) dos list.")); + + /* now get the units. */ + dev = ptrfrom (struct device, node, drive_list->lh_Head); + while (dev->node.ln_Succ) { + ulong i; + for (i = 0; i < 7; i++) { + struct device_data *dd = alloc_device (dev->name, i, 0, sizeof (struct IOStdReq)); + if (dd) { + /* we have a unit. */ + do_unit (dev, dd); + free_device (dd); + } + } + dev = ptrfrom (struct device, node, dev->node.ln_Succ); + } + return (drive_list); +} + +void +free_drive_list (struct List *l) +{ + struct device *d = ptrfrom (struct device, node, l->lh_Head); + while (d->node.ln_Succ) { + struct Node *n; + struct device *next = ptrfrom (struct device, node, d->node.ln_Succ); + D (verbose_debug_message ("zfree()'ing \"%s\"", d->name)); + while (n = RemHead (&d->units)) { + struct unit *u = ptrfrom (struct unit, node, n); + free_unit (u); + } + zfree (d->name); /* free name. */ + zfree (d); /* free node. */ + d = next; + } +} + +/* this function returns an error or 0 for success. */ +/* -1 for NO MEM. */ +/* 1 for already on list */ +int +add_name_to_drive_list (struct List *l, char *dev_name) +{ + if (!find_name (l,dev_name)) { /* not on list. */ + struct device *d; + + verbose_message ("found new device \"%s\"", dev_name); + d = zmalloc (sizeof (*d)); + if (d) { + d->node.ln_Name = d->name = copy_string (dev_name); + NewList (&d->units); + if (d->name) { + AddTail (l, &d->node); + return (0); + } + zfree (d); + } + warn_message ("cannot allocate, unable to process \"%s\"",dev_name); + return (-1); + } else { + return (1); + } +} + + +char * +get_hard_drive_device_name (struct DosList *dl) +{ + struct DeviceNode *dn = (struct DeviceNode *)dl; + if (dn->dn_Type == DLT_DEVICE) { + struct FileSysStartupMsg *m = BADDR (dn->dn_Startup); + D (debug_message ("checking dos device \"%b\" for info.", dl->dol_Name)); + if (m && valid_mem (m)) { + ULONG *envec = BADDR (m->fssm_Environ); + char *name = BADDR (m->fssm_Device); /* null term bstring. */ + name++; /* inc for bstring adj. */ + + if (valid_mem (envec) && valid_mem (name)) { + if (envec[DE_TABLESIZE] > DE_UPPERCYL) { + ulong dev_size = envec[DE_UPPERCYL] - envec[DE_LOWCYL] + 1; + dev_size *= envec[DE_NUMHEADS] * envec[DE_BLKSPERTRACK]; + dev_size *= envec[DE_SIZEBLOCK] << 2; + if (dev_size > (1024*1024*2)) { + return (name); /* if larger than 2M */ + } + } + } else { + D (verbose_debug_message ("\"%b\"'s startup message is non-standard.", dl->dol_Name)); + } + } else { + D (verbose_debug_message ("\"%b\" has no startup message.", dl->dol_Name)); + } + } + return (NULL); +} + +ulong checksum (ulong sl, ulong *buf) +{ + ulong ck = 0; + while (sl--) { + ck += *buf++; + } + return (ck); +} + +void +do_unit (struct device *dev, struct device_data *dd) +{ + struct unit *u = zmalloc (sizeof (*u)); + if (u) { + int i; + u->name = dev->name; + NewList (&u->parts); + u->unit = dd->unit; + u->flags = dd->flags; + u->rdb_at = (ulong)-1L; + u->rdb = zmalloc (512); + if (NULL == u->rdb) { + free_unit (u); + return; + } + /* scans the first 200 blocks for the RDB root. */ + for (i = 0; i<200; i++) { + if (512 != device_read (dd, 512*i, 512, u->rdb)) { + verbose_message ("warn: unable to read \"%s\" unit: %ld flags 0x%lx", + dd->name, dd->unit, dd->flags); + free_unit (u); + return; + } + if (u->rdb->rdb_ID == IDNAME_RIGIDDISK) { + if (!checksum (u->rdb->rdb_SummedLongs, (ulong *)u->rdb)) { + u->rdb_at = i; + u->cylinders = u->rdb->rdb_Cylinders; + u->heads = u->rdb->rdb_Heads; + u->blocks_per_track = u->rdb->rdb_Sectors; + u->bytes_per_block = u->rdb->rdb_BlockBytes; + u->total_blocks = u->cylinders*u->heads*u->blocks_per_track; + verbose_message ("found drive %.8s %.16s %.4s [capacity:%ldM]" + "\n at unit %ld on device \"%s\"" , + u->rdb->rdb_DiskVendor, + u->rdb->rdb_DiskProduct, + u->rdb->rdb_DiskRevision, + (u->total_blocks*u->bytes_per_block)/(1024*1024), + u->unit, u->name); + if (u->rdb->rdb_PartitionList != (ulong)~0) { + get_partitions (dd, u); + } + AddTail (&dev->units, &u->node); + break; + } else { + warn_message ("found RDB at %ld on unit %ld of \"%s\", failed checksum", i, u->unit, u->name); + break; + } + } + } + if (u->rdb_at == (ulong)-1L) { + verbose_message ("\"%s\" at unit: %ld has no RDB.", u->name, u->unit); + free_unit (u); + return; + } + } +} + +void +free_unit (struct unit *u) +{ + if (u) { + struct Node *n; + while (n = RemHead (&u->parts)) { + struct partition *p = ptrfrom (struct partition, node, n); + free_partition (p); + } + zfree (u->rdb); + zfree (u); + } +} + + +void +get_partitions (struct device_data *dd, struct unit *u) +{ + ulong bpb = u->bytes_per_block; + struct PartitionBlock *pb = zmalloc (bpb); + if (pb) { + ulong partblock = u->rdb->rdb_PartitionList; + while (partblock != (ulong)~0) { + ulong nextpartblock = (ulong)~0; + + if (bpb != device_read (dd, bpb*partblock, bpb, pb)) { + verbose_message ("warn: unable to read block: %ld from \"%s\" unit: %ld flags 0x%lx", + partblock, dd->name, dd->unit, dd->flags); + break; + } + if (pb->pb_ID == IDNAME_PARTITION) { + if (!checksum (pb->pb_SummedLongs, (ulong *)pb)) { + if (pb->pb_Environment[DE_TABLESIZE] > DE_UPPERCYL) { + struct partition *p = zmalloc (sizeof (struct partition)); + if (p) { + ulong *e; + CopyMem (pb, &p->pb, sizeof (struct PartitionBlock)); + e = p->pb.pb_Environment; + p->name = p->pb.pb_DriveName; + p->name[p->name[0]+1] = 0; + p->name++; /* adjust for size */ + /* byte. */ + p->node.ln_Name = p->name; + p->unit = u; + p->start_block = e[DE_LOWCYL]*e[DE_NUMHEADS]*e[DE_BLKSPERTRACK]; + p->end_block = (e[DE_UPPERCYL]+1)*e[DE_NUMHEADS]*e[DE_BLKSPERTRACK] - 1; + p->total_blocks = p->end_block - p->start_block + 1; + p->block_size = e[DE_SIZEBLOCK] << 2; + + /* the size stuff is convoluted to avoid overflow. */ + verbose_message ("| partition: \"%s\" sb: %ld eb: %ld totb: %ld", + p->name, p->start_block, + p->end_block, p->total_blocks); + verbose_message ("| Block Size: %ld Capacity: %ld.%ldM", + p->block_size, + (p->block_size*p->total_blocks)/(1024*1024), + (10*((p->block_size*p->total_blocks)/(1024) % 1024))/1024); + + nextpartblock = pb->pb_Next; + p->unit = u; + AddTail (&u->parts, &p->node); + } else { + warn_message ("failed to allocate memory for partition"); + } + } else { + warn_message ("found PART at %ld on unit %ld of\"%s\",\n tablesize to small", + partblock, u->unit, u->name); + break; + } + + } else { + warn_message ("found PART at %ld on unit %ld of \"%s\", failed checksum", + partblock, u->unit, u->name); + break; + } + } + partblock = nextpartblock; + } + zfree (pb); + } +} + +void +free_partition (struct partition *p) +{ + zfree (p); +} + + diff --git a/sys/arch/amiga/stand/device-streams/getdevices.h b/sys/arch/amiga/stand/device-streams/getdevices.h new file mode 100644 index 00000000000..237d86aef08 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/getdevices.h @@ -0,0 +1,80 @@ +/* -------------------------------------------------- + | NAME + | getdevices + | PURPOSE + | header for getdevices.c + | NOTES + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#if ! defined (_GETDEVICES_H) +#define _GETDEVICES_H + +#include "util.h" +#include "devices.h" +#include <devices/hardblocks.h> + +struct device { + struct Node node; + struct List units; + char *name; /* name of exec device. */ + +}; + +/* structure that holds all info on this paticular unit for an exec device. */ +struct unit { + struct Node node; + struct List parts; + struct RigidDiskBlock *rdb; + char *name; /* just a pointer to the */ + /* lists data. */ + ulong rdb_at; /* what block the rdb is at. */ + ulong unit; /* unit number of drive. */ + ulong flags; /* unit number of drive. */ + ulong total_blocks; /* total blocks on drive. */ + ulong cylinders; /* number of cylinders. */ + ulong heads; /* number of heads. */ + ulong blocks_per_track; /* number of blocks per head */ + /* per cylinder. */ + ulong bytes_per_block; /* number of bytes per block. */ +}; + +struct partition { + struct Node node; + struct unit *unit; /* back pointer. */ + struct PartitionBlock pb; /* partition block. */ + char *name; /* name of the partition. */ + ulong start_block; /* block that partition */ + /* starts on. */ + ulong end_block; /* block that partition ends */ + /* on. */ + ulong total_blocks; /* total number of blocks for */ + /* this partition (e-s+1) */ + ulong block_size; /* size of blocks for this partition. */ +}; + +struct List * get_drive_list (void); +void free_drive_list (struct List *l); +int add_name_to_drive_list (struct List *l, char *dev_name); +char * get_hard_drive_device_name (struct DosList *dl); + +#endif /* _GETDEVICES_H */ diff --git a/sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu b/sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu new file mode 100644 index 00000000000..cc00be8fa75 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/getopt.lib.gz.uu @@ -0,0 +1,47 @@ +begin 754 getopt.lib.gz +M'XL("&8@[S<``V=E=&]P="YL:6(`E5=O:%O7%3_WZ;UG556\E]3-1##IFW`< +M*?[SO.(.$[Q4=>Q.%8YEU!`\"/%39+UG#T5ZDR4O"V%3&M<.^T?(^JD?RAAE +M:TM8A.G***5+.R@M]$-"2S_D0S/&3+HMK%O9ARV8=+]S]5XCIW'&;'[2N^>> +M>\[O_+GW/A&%;A"1XA9K%:\V6"`*?8*QJ!5/UO#\%SQ>^_U-HB*$Z1M"';3( +MV%>AJ/&P:Z0;Z<O-54<UM]EZ[J?V38\FKYN-J?H=_5`7]+M[*Q3#FJ[3],9J +M*?+5W\[3/.56[,\FKR<N3]7-KYP_3='FQ6#-U[I8U^RGZ/F+%([3^IE!875, +MO4[4FX)42LQ#5]\:7+4>M,+Y"ZP9R.*8[Q'KS\0/??`VGM4+#5.L-P8;U@/0 +MI,_G>?V5BZ3"<K3-3MAZ$+,9S*IQNH"Y#^`Y^REU)U,4!<MEG^5(P/*%#>I) +MWWA\N-\B&Q%.(L+#8#T]AOD,[#N3GL!:E<?X#K.='0_5!M84)U)3DF.DYGYL +M)VI]&(>APZ-=Z1)%.<J9;*;AZBRU]9856"0W8I9@VW!(G/1$DWTLR<@1T5K# +M-5CB1JQM>;K=G,G:+%>;9UPU^02%.:[F:NF`C+@>H]K`JX83/O@)B<QV)Y&Y +M1#-N=S!7[5LSG,Y@E#L'CWJ.N;S.5C@._GZSX4ZQ#CAW6X_%B'E/@[<SPKI; +M\(HQK[6&$_8MA<V.>`?X?6$5O;135ACKL9;EJO>Y3>J+K<K<@_V3<8O9]]+Z +M6;,^0DM]KX%]@M:7S7JZQ;Y'UD.7=HZR'6;(^DGH$WD"\O%V^[ESTF887M0E +M82M+=/4/R31RSWDBY?:7N$29RZO;W:[,BF,$,UY?$[52KEBH&J7&+M$H,`(, +MFQ5*&88;K7ZS*5P]=XE2]DVK0C,T?HHP-VX:;A4,4NA#LH35CT^97_1C%!F> +M-#&'_I6ZEF&E*-'J&JSI07:[I'R"ACR!N5$K3<-V'-R'G2B\C-,PSW%G87;$ +M,ZY>HO'<L_8*-$;<,7R..J/(6-C='<3)];4>1J5-8-QG8C`O?KX*)IS1F:SW +MN$W*+?;DDNC?9]&0[`5$FS%<HN5XA88S+Z,;HA/(5S)#9!.](WWEVG*ZD3OG +M#2!W.ZWMTNN!=J]VHEW3D"<0]%K\2FV:7>W\?&['/`$VP\V7>'_R_EA;+1F2 +M(\Z(9#V,0MG#DL\NEEB/A3>DW>>WBMNWJP>RF2Q+D8&CK@Y/1\UGV9^9@,7. +M>`(]GC+/>(A:?.C+HWA^-[/B[M_<?]6!-</M;>\D-\:[WX^7^+2Z59+[K2SY +M'MF\7N8O)CN'^5_>E,%][;J^1=EC4O>/[3E\XJ:0M>7NYTA%MV01X_$C*>H+ +MV/`X3_^Y-IU%3_7[YY3<9SC)(CLLZJOMQTDW);F.R;&YIIS0:S_$YZ[TF?1; +MZ'-X%\HFIK&VF:'V&>9"Y[W]R&)_,T'".85/Q=G=RI$;83[RS)+G[\_?2SZ% +MRAYI\6J;3?EGSC[)J]NPOHB(/4YO]LCQVIV\CG.71.Z(V'JP:O)Z_\;'N!7\ +MFR)VYSX3?`<:P1TX]FO^Q\VUS>I`SEZ!]1AN&-R:4*;0O_FTX/N7J&,G$"72 +M_P7\";@&?`A<`=X`7@/6@&>`>0`[2L>1IMT&;@%_!:"KO0F\"+P`S!&IF%?_ +M#N">5S\&/@)^!?P,.`VPSC'@"+"?.&!2]1:WT&>`@=>%/P/@H\"^\CZP#)P" +M'`!KE1QP`!@$N@%>@PVF*`CM;0#<!7P*\!;@+(8`="&!,\$F_0[@XQGZ';L0 +MU[L`UNFO`-#5P4G?`7!^H*,A/QK6:"L`[&B8UY`_K1/<$;\*?^IN`++0<\`/ +M@),`.(94N+D,5($R<!Q`[,HW@$<!^!"P(9`_\3R`]>(<@+P+V!%+`!I2(&8Q +M#J!^8A3<-P#4COX!H&Z$/!&Z@GX!_`1`OFB)Y%_H4Q!79F=GC^<7N6M(0]SP +M+^";D%-ZE'-Q5NK,',P>>3+007T$<DO?`:!/NM3)ETJ50IY:?40K4H87O&)Y +MR9>)DI0MUJJ%$YXO4WH"6;DEA"RT',A*Q;+O4^L%D'L5>T-%;4*_]+DO5([+ +M8!X`#?2*#K&./:>AUS343D.=5-1/;0`1:=?QJ@OEFN.O0;[T'P'PK:'/M'<` +M])WZ&P#]I7:"D#8[VWI3G<7"8K6<+TF70A5^C)C"N&/0S^L_^8.?LM.'GR:5 +M]Y;L87['!>=#$[EO3:!F(>Z[8W3G3TQGGWYJ9O+;LP>SN=S$P<,T,$"T9Q%' +MCE=;J)1->\_B7G-AT<R?.+[@UBOUQ<BFV8$!GI^K%!?+>VLFE^-[9KYLYJMN +M_42Q7(O<9:OP?VE#MUK\;GVA6ES<K,9:]7*U6*BXY853Q;G-=.XS+PG`S58: +M_69A/E_-%Y!QLU"9*YI#>RJ1+;7A;T]A[UVL6;0%;=G_LGY0AIB"AN3Q0GF. +MAVHP+E:K/`[[];U7+?_&^OX<_[8)M=KBZ_SCAK[\^X8>^5\GMH4W*PEY:OMW +M@G]JWW]M^B2)^ZV^Y]['/L%[&F*\:[^S''<71<]NN0^D#F_4(=Z\@4JI4G;] +9G&KMLME*N?3]UKK1^^V7_P+#6FL6)`X``'<7 +` +end diff --git a/sys/arch/amiga/stand/device-streams/protos.h b/sys/arch/amiga/stand/device-streams/protos.h new file mode 100644 index 00000000000..cdbd5cd7cee --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/protos.h @@ -0,0 +1,47 @@ +/* START: "getdevices.c" */ +struct List * get_drive_list (void); +void free_drive_list (struct List *l); +int add_name_to_drive_list (struct List *l, char *dev_name); +char * get_hard_drive_device_name (struct DosList *dl); +ulong checksum (ulong sl, ulong *buf); +void do_unit (struct device *dev, struct device_data *dd); +void free_unit (struct unit *u); +void get_partitions (struct device_data *dd, struct unit *u); +void free_partition (struct partition *p); +/* END: "getdevices.c" */ +/* START: "devices.c" */ +struct device_data * alloc_device (char *name, ulong unit, ulong flags, ulong iosize); +void free_device (struct device_data *dd); +int open_device (struct device_data *dd); +void close_device (struct device_data *dd); +ulong device_read (struct device_data *dd, ulong offset, ulong bytes, void *buffer); +ulong device_write (struct device_data *dd, ulong offset, ulong bytes, void *buffer); +int device_do_command (struct device_data *dd, UWORD command); +/* END: "devices.c" */ +/* START: "util.c" */ +int string_to_number (char *s, unsigned long *num); +char * stripws (char *s); +char *fgetline (FILE *fp); +int flush_to_eol (FILE *fp); +char *concat_strings (const char *before, const char *after); +void free_string (char *string); +char * alloc_string (char *s); +int ask_bool (int def, int other, char *f, ...); +void * zmalloc (size_t b); +void zfree (void *mem); +struct Node * find_name (struct List *l, char *s); +void verbose_message (char *f, ...); +void debug_message (char *f, ...); +void verbose_debug_message (char *f, ...); +void message (char *f, ...); +void warn_message (char *f, ...); +void vmessage (char *f, va_list ap); +/* END: "util.c" */ +/* START: "system" */ +#include <clib/alib_protos.h> +#include <clib/exec_protos.h> +#include <clib/dos_protos.h> +#include <pragmas/exec_pragmas.h> +#include <pragmas/dos_pragmas.h> +extern struct Library *DOSBase; +/* END: "system" */ diff --git a/sys/arch/amiga/stand/device-streams/protos_template.h b/sys/arch/amiga/stand/device-streams/protos_template.h new file mode 100644 index 00000000000..bb64ad9493a --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/protos_template.h @@ -0,0 +1,8 @@ +/* START: "system" */ +#include <clib/alib_protos.h> +#include <clib/exec_protos.h> +#include <clib/dos_protos.h> +#include <pragmas/exec_pragmas.h> +#include <pragmas/dos_pragmas.h> +extern struct Library *DOSBase; +/* END: "system" */ diff --git a/sys/arch/amiga/stand/device-streams/rdbinfo.c b/sys/arch/amiga/stand/device-streams/rdbinfo.c new file mode 100644 index 00000000000..5ec8942e0df --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/rdbinfo.c @@ -0,0 +1,268 @@ +/* -------------------------------------------------- + | NAME + | rdbinfo + | PURPOSE + | get info on all or some RDB devices. + | + | NOTES + | only works for RDB partitions. + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#include <dos/dos.h> +#include <dos/dosextens.h> +#include <dos/rdargs.h> +#include <cstartup.h> +#include <string.h> +#include <ctype.h> +#include <signal.h> +#define __GNU_LIBRARY__ 1 +#include <getopt.h> +#undef __GNU_LIBRARY__ +#include "getdevices.h" + +#if defined (SASC) +/* we will handle this ourselves. */ +int __regargs chkabort (void) +{ + return 0; +} +int __regargs Chk_Abort (void) +{ + return 0; +} +#endif + +void get_info (struct List *dl, char *dev_name, char *part_name,ulong unit, + ulong start_block, ulong end_block); + +struct option long_options[] = { + { "rdb-name", required_argument, NULL, 'n'}, + { "start-block", required_argument, NULL, 's'}, + { "end-block", required_argument, NULL, 'e'}, + { "device", required_argument, NULL, 'd'}, + { "unit", required_argument, NULL, 'u'}, + { "verbose", no_argument, NULL, 'V'}, + { "expert-mode", no_argument, NULL, 'x'}, + { "debug-mode", no_argument, NULL, 'g'}, + { "help", no_argument, NULL, 'h'}, + { "version", no_argument, NULL, 'v' }, + { NULL, 0, NULL, 0 } +}; +char *short_options = "?vVxghn:s:e:d:u:"; + +char *cmd_vers_string = "\0$VERS rdbinfo 1.0 (93.10.10)"; +char *version_string = "rdbinfo V1.0 -- Copyright 1993 Christian E. Hopps\n"; + +char *help_string = "Usage: %s [options]\n" +"Options:\n" +" -[vVxghnsedu] [--rdb-name=partition_name] [--expert-mode]\n" +" [--start-block=block] [--end-block=block] [--debug-mode]\n" +" [--device=device_name] [--unit=unit_num] [--version]\n" +" [--verbose] [--help]" +"\n" +"Number Formats: (where `n\' are alpha-num. digits)\n" +" 0[xX]nnn | [xX]nnn | nnn[hH] | $nnn - for Hex\n" +" nnn[oO] - for octal\n" +" nnn[bB] - for binary\n" +" nnn - for decimal (also default for non-recognized)\n" +"\n" +" given the above you can also postpend a [MKk] for Megabyte\n" +" Kilobyte and kilobyte respectively. [range checking inuse]"; + +char *opt_rdb_name; +char *opt_device_name; +ulong opt_unit = -1; /* -1 for any */ +ulong opt_start_block = -1; /* -1 for any */ +ulong opt_end_block = -1; /* -1 for any */ +ulong opt_verbose; +ulong opt_expert; +ulong opt_debug; + +FILE *mout; +FILE *min; + +int +main (int argc, char **argv) +{ + int ret = 0; + int opt; + int opt_quit = 0; + int opt_version = 0; + int opt_help = 0; + int longind = 0; + + signal (SIGINT, SIG_IGN); + + mout = stdout; + min = stdin; + + if (argc) { + struct List *dl; + while (EOF != (opt = getopt_long (argc, argv, short_options, + long_options, &longind))) { + switch (opt) { + case 'v': + opt_version = 1; + opt_quit = 1; + break; + case 'V': + opt_verbose = 1; + break; + case 'x': + opt_expert = 1; + break; + case '?': + case 'h': + opt_help = 1; + opt_quit = 1; + break; + case 'n': + opt_rdb_name = optarg; + break; + case 'd': + opt_device_name = optarg; + break; + case 's': + if (!(string_to_number (optarg, &opt_start_block))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'e': + if (!(string_to_number (optarg, &opt_end_block))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'u': + if (!(string_to_number (optarg, &opt_unit))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'g': + opt_debug = 1; + } + } + if (opt_version) { + message (version_string, argv[0]); + } + if (opt_help) { + message (help_string, argv[0], short_options, + 2 + strlen (argv[0]), "", + 2 + strlen (argv[0]), "", + 2 + strlen (argv[0]), ""); + } + if (opt_quit) { + return (ret); + } + dl = get_drive_list (); + if (dl) { + get_info (dl, opt_device_name, opt_rdb_name, + opt_unit, opt_start_block, + opt_end_block); + free_drive_list (dl); + } + } + return (ret); +} + +int +check_break (void) +{ + if (SIGBREAKF_CTRL_C & SetSignal (0, SIGBREAKF_CTRL_C)) { + return (1); + } + return (0); +} + +void +get_info (struct List *dl, char *dev_name, char *part_name, + ulong unit, ulong start_block, ulong end_block) +{ + struct Node *dn, *un, *pn; + int ctrlc = 0; + + /* walk list of devices. */ + + for (dn = dl->lh_Head; (!ctrlc) && dn->ln_Succ; ctrlc = check_break(), dn = dn->ln_Succ) { + struct device *d = ptrfrom (struct device, node, dn); + + if (dev_name == NULL || (!stricmp (dev_name, d->name))) { + /* walk list of units. */ + for (un = d->units.lh_Head; (!ctrlc) && un->ln_Succ; ctrlc = check_break(), un = un->ln_Succ) { + struct unit *u = ptrfrom (struct unit, node, un); + int unit_printed = 0; + + if (unit == (ulong)-1 || (u->unit == unit)) { + + /* walk list of partitions. */ + for (pn = u->parts.lh_Head; (!ctrlc) && pn->ln_Succ; ctrlc = check_break(), pn = pn->ln_Succ) { + struct partition *p = ptrfrom (struct partition, node, pn); + int do_it = 1; + + if (part_name && stricmp (p->name, part_name)) { + do_it = 0; + } + if (start_block != (ulong)-1 && start_block != p->start_block) { + do_it = 0; + } + if (end_block != (ulong)-1 && end_block != p->end_block) { + do_it = 0; + } + if (do_it) { + if (unit_printed == 0) { + message ("Device: \"%s\" Unit: %ld Capacity: %ld.%ld Megs", + u->name, u->unit, + megs (u->total_blocks*u->bytes_per_block), + tenths_of_a_meg (u->total_blocks*u->bytes_per_block)); + message ("DiskVendor: %.8s DiskProduct %.16s DiskRevision: %.4s", + u->rdb->rdb_DiskVendor, u->rdb->rdb_DiskProduct, + u->rdb->rdb_DiskRevision); + message ("Cylinders: %ld Heads: %ld Blks-p-Trk: %ld [Blks-p-Cyl: %ld]", + u->cylinders, u->heads, u->blocks_per_track, + u->heads * u->blocks_per_track); + message ("Total Blocks: %ld Block Size %ld", + u->total_blocks, u->bytes_per_block); + unit_printed = 1; + } + message ("\n--| Partition: \"%s\" Capacity: %ld.%ld Megs", + p->name, megs (p->total_blocks*p->block_size), + tenths_of_a_meg (p->total_blocks*p->block_size)); + message ("--| Start Block: %ld End Block: %ld Total Blocks: %ld", + p->start_block, p->end_block, p->total_blocks); + message ("--| Block Size: %ld", p->block_size); + } + } + if (unit_printed) { + message ("###"); + } + } + } + } + } +} + diff --git a/sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu b/sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu new file mode 100644 index 00000000000..1e9bf39133c --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/rdbinfo.gz.uu @@ -0,0 +1,261 @@ +begin 754 rdbinfo.gz +M'XL("&8@[S<``W)D8FEN9F\`Q7L-<!S5E>Z=\6C4'K7DMCPHPFC%I3V(T7@T +M,QAA"T60T4BVF[$T$B/9)<)?RY:F)3S2S(XDQU!^SDC^#3:L<!*6\+(4E:*R +M#@BB^+$L3\_EE7DL:UB2,HX?C[!^..'9V&$5XN>E4JS76.\[MWOT8T-V4_6J +MWMC=?7_..??<<\X]Y]S;+<86_`LS?W;K:6-LT9N,+8CB^BV5M7/;KW@T#[O[ +M7ZG;OY4YUJ)4<"S#>!T:.G1[Q=%[CDU?KFPI^+PR5G"AHM_FYLO9F"&?W<O# +MW,NJS^[5G7S1Z(NL5EUT(.L<!E:VLK[@G?$Q5VM7._>[6IU9T1:62]4Z<&"+ +MO3Q=&\T:S'8";>Y<;\$[QX&A,KF?>9B[KQ1]2F6]+!\8DTOKIV2)#\=>_L*C +MVP/AR%C!9VD&6BS$8B]?^07QU'#)]E@:M2_>!UY[PIGNTAG[N'(S>[I@*OHB +M^&5L.]_,QMX]]NXQM8<IOWSKEV]Q>X857U]Y=\'EX\,/9NUAS#(L.[1SX?`L +MGTVG[?9H-B&EW4$&CDMX&#",V]NR)X<7'V)4&H%\_K#X,.-4QE/E]L4_XXS; +M[GE[^G,%]:"D1^O_F=T/7K/6<S_F^UF0><+<QSQ&J3\IM_.PZF68P?1SZ)M2 +MJ33"DX"2M&3!,=[#/)4]S%%P.391?CXV4?&]--,=/,@<GF3!YS<+S5F2*XZ. +MR9(AD\SN'9,5DEH@ROT%9PP'#\=&@3^)ZR3WRZ6&K"9E-^%BM$`4<C4X\:+Z +M"Z8,:ONQU;=-!2?@>[=>3"W`=1@2<(G+`)[MZ-O(;VPZ_>WML:&NU$`@V;LQ +MTYEYA#U[F<G:N:`[$&1^7XJ%MK&M+/)3YL'%<96AP889TB@37S_3VE(_Y=I2 +MJ<DA/-OQK([N@=3'M!0KTY+L_J#?5AXL#.;')FXXWO)[YO8QGA>');'S/"_S +MC=%A(Y;Y&NXUF2+<.]JH)[N>[D=07O%`UJB]+VM$1<MC:'&BY-9_E+9Y63#, +M//K3:1NTZ]%'Q=.K[[5ZN,ZFMU<F\_?+92@-BA*U/:PE%TP$_?G[8Q/R5&L+ +M[(1-;]AJ2]L(9YL;$!H@CE@0;UL0U?,@*@#QJ@5QT((HG@?A$-SX=7;E4A22 +M,^3@=9##UMA$\?N`AQR-=KZ>2]'2Q.6VO4].<JD]R]>KN?I156H?YNL]N?KK +M'JE]!&.^&;3C_D;0AOOK028D"[H+#H%N%K+U1'?"7IQZ*#9A?Z<BS`L,#WHQ +M%YHQ<2R7X>+!@D[&:@+[8A,+NH!5RIU-I[V??0BMQX:"16F6"?_N.Z8-7?F% +MQ)AL8#:Z/<W\#\6&8!M^[=PM*WU!UN4/,ATV<K\GQ3HJ4JP=MM(*^Z@+KF<: +MYEB78/8ZGD)YU&#V%6GVY&108S7@JCCH967!@MC$G[E,Z=D9X&J"/:R(-9J8 +MMD_1TDB8MC.$";HA8%>GIX]D#1=\F'=\#Z!>$3AA"^<IX(0%SG["$?KP`LO/ +M788[Z`IZ;<6QB;*G:$S#`8K>]/3AK%$$+/_A@[82LVTB:RC4,G'0MM1PILF6 +MO*#O!545SU""L7'T5X.'$%9_.#:A<I5%ZK7Z\]_Y]=XS>^WPC0NF/>SLR,GL +MR9%?/W;FL:`]:,.,O;@X-'<L-J&<4"$7WLO*&LZSYYK/LX/!&*O!\[7`$\$@ +M)+$0<)\#[@6,U(Z1ZC!236SBIE<#65"IPU6#JUI+.@*`V@FHKL!!%D9;"&U) +MM*6AV1HA@1#-AGMMY:K7IH)&YC_"K:T8=)X`'2^PZP('86E>VU)<)6B?0#O) +M2$.[BOI%U!G&XYWLBTG20;`55YC5P?X3)#/#I27SG+&)11]TM`#FAZ1;P#1: +M,$5HVTOTT*:9;5],-IU.GH%-^F-#][1HYVY:"7]3%)LH>K2CQ1.&S4`SB!8_ +M#+IB$ZN:.EK(`V;RX#<SOK!:2+5!V.\7,5^8%QI+@X6=S+:SHP6TRXQ?8^6X +ML`(^;&W13PH\@DRF&8\_.5FA1;]K1+:S=/Z1;%<(8X8B?QW,#RYG9;$)YRCF +MJ(!&*2R8T2JR.P-8R[&)_.+6EO@>_6W0:",:^@1W@?^=K2TF]VPEUD89>M>+ +M->#&7-VPTS@B(DK\GB<G/1JU';_,BJR5=T6L7S=PU@%'(JQ.MF!_1XO^'D'2 +M"HI-%#Z-\4OQ',7<HLRM_QBC,AKU7AJU!*NRU$?0!<%"0&7%:DL'"Z`-&?7G +M,3]P7UB!><F8EXQU$:%U*9=@#.4F2`N7"S9:%/A.;.+V,QTM:)>C!R%%1=5X +MLQ5I7-!%&>R6:#K!"=&'I16Y6UO2T_`<MJ;3/:S#DH6-9,$KFA'A'5A+3R,S +M*3N;151UD8=7HR;-+SX!+X\BTDIGLZJ/.<X.\WJ207POR9]*:MB":B<96F62 +M8JD\BNS$M:F.O,3H0>8)L/@>E&6L(3>B:$9%+"I/!AC:'*!.M0<#3-[#.&.; +MG(C/;O)VD&26)*F=6^"`EU-(CML8SV_;0][CU%_IGY'?Y).FK,U909Z-L8F" +M]X2EN<U\"1R5J>%E/:R,\?K?LJ*@%)NH?H;XO*F/R<R+N\+\Z6E(VJ-MM3/@ +MPT.1CDG^"3DHP7:_![TSVV[89=?Q[)%LDMGB//\WV>/9G"T0)FP26LZ+DI7* +M64H@X?^K8+%5T&X50TZ2%P7UEV$S'M`,$QRHAH0-PA?)H_'&MG70R078&V33 +MB3AF^F?VNN!G+?.HPFM!<N%E8?A`E"%5;5D]_+K9WHCV.JM=07N85[)JM9*\ +M5]GG>-;A>6$9>27+^ZV&]UL+ST<CF/ZT['@DK(7/[R5_*?PFUAJ\-WQBWJ.Q +M"=>GX+LLQW-Z>IRL$;VTQMEK0G)EM(X((F>?NFK)R:27#TJO0Q*#0@).K%QV +MY6!ZFF!`S9,HF_76>?#"KFVTRD&]B-8)V46'L`M6`M^F&!3CE+DK5_@<)<TJ +MFO]R4GB)1FCO`X(R5^W"CT`/EK@0WI!6AFE!MY`%D;?U!R`%RI<6/M'1(KP` +MLUU2R8=COGXOS?DP6=:'R*2<9+TW/`?YY)O:7]!$<T*,+)^K^:!32SI+0/$0 +M96#0^8_D[[;6Q]L1,P\`=SGI^HM24]>V+OE%6C\LNXG9ZK2MM@K@.81%<V'1 +M93R,V1;#$M:EPV?W6NMU%)QSM!\0GHQ**\$S7Z;9BA5%RVJ3?NU_348",-R? +MV(IYKZUXF<9<RS`K5D3Y--8XO,?2]_"$9);^8EG85H*R-S[,S9[#5L\K;5GT +M+54K;24>]KWA^,BRB*V<DX>@=C58B4A5B4B%?ER(8LX-L0EIPHS8N1BXM/^/ +MQ\#`B(B!B&W.$6!OH]CF6\XHYO&;3)YQMZR,SUA9(^"1BRTL@[YK"&+&XDC^ +M'Z#'+BQ.O;HO?RE&^=BT1G\>K+&<O'#^!-E'\@Q96[`0UB&1AO.?[VCQ(1-C +M3#N77X(\S(L\S`,/Q2G&P`,A'N2WFY:3<,`S]UL:2E1DX4TH]^OJ:$'[!M[& +M1<2\)0Q/;/9$14\=C>,L[FA!CV3UA$2/>LM:)M^R!I9%;:T=E$F9_8KHM_," +M6/2OQ>IP@A\9*T$5*S/-^YC#XB3)U^.N!UYB\(7.DS1+G1&.C7"4[=/`6AE] +MB;D3(6!)'%:L`EN%15MKK+&<:7NT?\`>S[8<GE:7*"^,`(/G@U9VWO@KB)+A +M5V?&O^*/AA,*U5'FUK/">MY%5'+\+*B&;#ED6X9(Z@&]4@^@;E[#/#>O9?Z; +MUS$OY&T7\^L0J\<)2^2('M--I_V3_V$*"P2%DJ^@X+PKR):*Z$-R\8O9E)$T +M;UT+/S@[JYHRINW6WM1=U+=X&YMF-U*$TB?)5LC#!-W@P0M*'K]?UDC'B]_T +MA8/-V`4W6SN-GWMI7X==1GX[]2L?D4V"*[G]\7;L_+93O!@$!'8@^1T"8I)\ +M(JS`F?:,7Y>0XX_'<W!-V(V$E-NU:5K]]5,+FZ408Q(SBG)M&7Y\6)=F:CWC +MP\;*M.VU;&IE\>W:%6U8.YK#*@56KFV0GQC1I9E:SZ&1A)/&8Z=HO&*B=BWF +M]#Q,LY8Z-&)48[3J/V$TX"0<VR6]_T\<:V-N+(4H72N/*_/D8=8VC@]C++MN +MW^Z*C,G:7!TA@L'OD/PY[>!D'^V?RG[V<Z,H/3V1312GU7%@)%R5:V1-Y,G' +MJ`2>I73S.'@"',FY(M-\"*,ERN5=C"V:WNC25D=6_W87X)](J]B_FKC[Y\ZU +M@?B^]8_.=;,U5RTWDQS.'YGK9LRU5-ZU8'IZ>J/S-[O.[M)=,QRX*G8A)RM3 +M"T>':9\ZZPV5Z^9(<@&H.^*/ZY_P0I^Y3_72Z@-<^"__$7G3+4=8,DX24Y_% +M;@&1,VYY0YM;>*ZNM.MP-L&5?"T;6<7<FLB:L2I'/.'`/CP_16;ATN_B^?'\ +M8J8-<^>-6<6M'\S!>];-8+16A+>SP&,H30"G(+%3K&[A'VE-8T_C%;[.0?Y) +M<"1WM"`;S8]C9YMV'<DF/B%/2AZ`9TT?@G5;1K[C^V]O9\A!"PUYUAH"$C($ +MF:^SZO_HEWC^\=WQ;!"9Y`V':+>$S+J"Y_-F-:K;B]]ORW9=XM%W_P&YPSK= +MKOQ*U($162$QVK60US'EBW%$Q%G*S(@#G^H6/G5F;"Y9XT2M3$7"*.N*WT]< +MICC@94(/;NW<,C>\8(C.D]9A5QHL%'M<OQR*3=SX!-FOI4/;5@8*^1D^.HQ( +MDD_KHP<MJE-8F%UU(BHS>)YO6KB7`F/T7+85SVIXI6+HP(LUT4BG&O!)9:03 +M9#8GB#MEB2%G7.,VPVG&CGID0JH6O1XS^<YWC_&%;=F,Z]`JR8U<TB]7=[(K +M#V*W@VCB?0,:<YL:PPQDRLR6?A,2H2RO"-PRW@PY'A5R+#1U-E]^I9,S\B-- +MD@P5S_KH`>Q+?<PE]EMVX?L=L#")1SVM^D?"5AA1BH[)'D-=1SLTDIMLSKU\ +M`^20L,H7Q;G:0Q:TWP@0-/I[K/X3@<>!J5BU,O2DK?)K)*D93(]1/0\_8T$= +MF(O_9Z?0\ZC5LW46_VH._^P5P&VSX%IG.;1H;[=Z5LZCG47/[AR?.=ID=Y"; +M(M8+=K(6;#M@]UKE"T3?M#C&_FZJX)UNIDQ8&A-XRG6&R$+']T#*A<CY']>G +M2,:D+0O^,:PTMQ6I2\W=WN$]2=?7_J8'5AC?K5\$?:P-OFAT&Y/'QP3.!NW< +M3:1/-_?+C:-C<EAE9X<#-K(1*8,5X3=;>/.[1P-[P+O4>8`@<VTJ^CVVLR-J +M\R]?5_WYHP>RW'8V&\AB-X-=WW0/X1\?RQ\%Y<8Y="3R,]-1#@R5'4#?+S$R +M[8K@,1O!Y4Z+RQJ3RT7C6(4>[=PWJJT3NZ:9T[JQ_/U1T$\TT7EE_BCB3`UH +MT'EY8_&2P:I#]H1KT%X9D>OB^W3OX'+4)<!0;2FD_S1L^YC(`9W4JCO%J6<= +M;*C&</&D7!-5L)_8FK8A&M4EMHB98T:'LH8RCE&QTN`9KXPC6Y9I]HC_CLIZ +M.4SS&M^3O$O,>*B4#5:]HB0D[!5MT<4).HOK,,IR?9GEAY1$4:X6WXL1G7'0 +MUB>("LV#GM@/Q0@&/!\,WEX*C^56Q(JK(=BOX*N4^#J434@6I3#/5_,KZV>I +MPI9*A(:!#UP'23`]K3/'\Z9FOH3[-6J0N*]@9W?PH1JV9?FKX-[+SN[D0YK) +MO2=*LG(*.O<3'>*0X"L!G[\_;4-[XUSZ\;V"IH11'%MLNGT+>_>_5VJ0/<F) +MV:]<PXM,O+RRV'!'=R,+MGK2R\>A*_OQ(+3&PG2*BZL&5S6=YRD*?.>=Y#N1 +MW87UJ6"*=;#&1RGK:.2*D0$'8=AA#?RS'W=FG4<C+TPT(7:'8;\UXLR/3L_@ +MH8NQMP".!])UB_;5+"3.*NOHC%>G<]9J1&?TL&KJ(\M";TU:>?>GK#&^2]\- +MB!HC(LY]86_YWS/*<_,D_0:O@Z;'M*0+%GK]27%J![Z0[S[S+C@AB2(:?T-G +M=CJ=K\:>UH]]5$C8`IT@*P9C.[&SJX[^A#D,>37D51G-WX]<Z$TQ5GR.3"_' +M]Z:K(+N2X&(QZMO6J`^*W9QW+J2Y#P:<R=_G%F0U^2Z3/^42\6?Q]F#:1KO6 +M\8/8G371^CBT)ZD('N$C*H<D6(->+?A92BW!VZ7+1%>J,.F6GIJ=M_*C.72= +M5ML3'2W4"@G<;S@QTOU\EW6N+1E%JA=Q/LR'*0.TG;3:992/17<;M?/M+U-U +M2#$JYEJ244JKWYJO."F]E!3KK5_PNV$^OI!?J;`<XK_)XK],2-`W%]:B*&Q, +MP"9-V*\)_U\_)>TG^9#UTTQM98*+4JK?&&;+<]Q0O9/]ZP>M=*;AM_R4@S#A +MR5S%0;9\L!:>+B9XC8@Z/V3O<PY^&_>EE./"SFGT)ZS1,X+3TCD]AZV>#NHA +M7MAHNI9V_>->9DL\BKL]46[*R'!5:OF";]U!_OB[;U7>+==@=R[XFM-K^<6$ +M3_!5I@1G9D0CGC)'+/G8')'FJQ<1'LFN$K++WT_>/8>%[.(R\AJ/%2E*S4BQ +M<#=B)L5`)1<#(W]-_T34S8?,7J"8C`B3I3@[#[/I6DS$=8^X"LSW?_^:G,6> +MAZM<C4L[S&NP`_/'OB=L8DLGM.1"ASG[Z\X3)KS[C\G[T"CWYJ#&YN9ORC.4 +MO]$Y+G(!1^>A7"8PA^HVBR>1K07S*8\K2K<BCQ18!;H3$7@;X<W,QLH)I(AV +M;E%U[DP&,<,9F\C_T,>">1A7M<;5TET3V93"\^9FCWJ@HAD1_N\]VKV/>?/N +MW?FW;W<Y(O]9_SRZ\V'[5O;:KF01;_0ZXCNY%+E=8OJGE,<@3OU!Y(H7YG.1 +M?UB<M5=3/H.,:TE%<B%'?NY+,XPN\<W,\;.?;\0N$+42L]95Y&FC7+0(OKDB +MJI^H7+>01_>($R3,HA5Y/L5J^(2QA?RF9N9`%)$Z6BK#H+L0XXNS<CIGJ!=? +M)03V8I1'L)V['!OM$.\COKP=.=?7?$FY27=7K$^[C[_$'&KNK4+`MXX7)L[# +M:IOT)L!TI']X''-#5E7%$&OECLH^)A6\$ZBB7)]64\$%N8?>IG<7\Q:_5/\[ +M)EOG39[`&G4=SY]]9RYW)%YN.GV>LKD41J1</4COO)>Y`ZSB;I^FKTDSY;K< +MK@0[2U>&%;-!?F!$=U#);T/_DB_OX\[1X80W_GA\7]N>Z!Y#BEYG.*)+$B^C +MK%`9$=P578+GM/F6P?N&L&>+CS3+,*6T^'J9L<X^%^Z/]CL<Z)9MHFX3=1O# +M#BGAB-H2)W.X:4:[;$7!/MO<">_5+W()\PMB;NB/K9_^3&W)N&(3CDEG/0L5 +M'X7,+O"%RF_^[JW$I8@R^A>Q!P2M>?`JL]>S?!/^X[U?!A^Z=<5MU;>O7%5S +M1^?&35W=B1S^/2UJRPK"7E3\;\JI\WL3%^?@?L>TE=R<M7,A[M&P$FP5-EEA +MRPT)]RK*9N*:4HK9A_J60A(+^]W(E8=/C)P8CBY(.$YD]8\.9/4/U6$NC3[6 +MEFTZ[9!-?6+WI4E5;`&[(1'B?M=A[*]>7AYF#EQ*PI66Q;G"M%ZR/.DZS-SI +M?SGZ$BN-O,1D7)"_>;9*=+1SW.W3*IIU3MK^:FLH.0K]GJ*]G]=AR=`!?$D5 +M-K5RI=_F8SX-.X)W.'R`M+W"?']90N<RTG)F8_F)HLIM6!RG"XZG\]!Z"*UY +M+-\HHK,X\A&Q"1MV\FAUHE51G;PY[:)3>?$F=*FZG$F>P@JG7WS3,7W<Q^)9 +MXWZ>I_=7N#R%3XU0?ZX//9$?[O!%J:W^$FOW2%ML5KL/*\:F.HFR]`*=&B0F +MKZ8<)]^W0"^QZMLJPP7'L1LN,R7:=#J9C`T5SIL_G3NN@@0"#)F=!Y[P&(?_ +MS7^4O&!"3I=8NF#L,#3&(`FWD,2O21(S?<]%Q@J.T_FI6@5^"F;X>8]FFG#/ +M<G+]`0LG&=UE2*`(>6&_EZ??[UGW/_X^73CNFYY.N(B*F/5[/*+FI>E,?4)X +MY?*UD(`N*TLRA<AU[4LGX_O^]NWN"^+DMO"9?6H>7Y=>"NC]/"QVZWFZ`[:W +M#_.>(E]&\\:<)>2M,EG/*B>R2DYSCTTXC].\G2-BWJZ9>7>(F>6U[1`SR\WK +MB$KS*L[-:T82/IY'&4J;><GZ4N[42[CM^&Y=(7SQUIM5V(E"TVE]BFP1.[]6 +M[=RM*QLNL9UI9OG#]WVF!;IA5P>W,WC.R^7>Z6F>WX`]9.Z,*+)J:UD][2DU +MUZF&*=>9M5.NS_W-3Q[[_MMIIK+!_W1R9(LW]O*5YP65C9#!?N03K;$AGX^W +M#79NVLQ;MG1G$LG4M[C/Q]CJCKO;&>OM'QSJ'>Q-]<]\:Q3-/LQ8>6,V.HRG +MW#C<B>73.!P;PK.T,4NE.3W.1CI;L6OUU;8$8ZH6UNJU2#5#MN[<>31DU\+5 +M3#PC*^R>&P&Y8(LBU[-L%_I_\X-[&N1ZB5'YMS^X%V4NRF=_L+XA6K\9I?_] +M@[:&:O;Q02T2B7S\@M:0/;J2A>S5"[3Z-XZ.CA!L6\/QX0Q;L4!K./>:%CY: +M7W$CC4+O84((.Q4V+:(UO''TS<G)HR<;B,KQD:;3E(5HY]+H-W@4/CN2U4LK +MV)M'M<@;1PGFO1&M?O*H%HZ$C^\`=)'P'_Z"SQUAVV>!<.S2E;#I3^@]0(#1 +M_GIAC2_I>F,;TU=0'(PRPRTQ[!"*5CBUH]R&K/'^V*A>C#:[(>>L`A9QRK<^ +MO@;Q]&W*?WZU3;QSF13G<]7P<RMAXTW8RSY#V>*Z*?E'_W04Z^Y'\7U8"QQK +MX0^9A;A?$.=GGRA+(/$#\3'Y&4]SQ^,9==R6:(_OX^L\>SV:7@,,'UH"\7WD +M-6&O19G5H\/8/RZDNZY$BO5V]V7V-5W"W:7;W;^,[\/]GX`'2HB5+'$XO@]0 +MJ@?MQ(%1+'B0!0].XB%Q'A&T*'*#/,8H-C[3QZ8[B/N$D[Z^TQWUF`%LV1N\ +MFY4VT(GCW<Q+^UF42ROO=KUA?<U6C:LQ"'^37<S*Q!.A73Q+6!UV"<^*=]]3 +M1!.['VXX5*9G&J8*!ING9+WL5XG+&$>?>X;XKOBZ(Q,\A-646$IX?F0D&2^= +MZXCWV_WTS=R",W-RE;+Y-#)W'/@.MV$,'7!/BSZA04\=8PL^A1X_,M_#)HK@ +MO4^I4JY%^CVSLQO/9BO"WWW+>A_T`0_?M)E)['E`OC:'RN\LG%"B$3U/S]`( +MZ=66K;Q-%/%\@UH!\Z@JS<,,B]$?G,$,;QAS32*S'',=@P8`F661,5=:9:P> +M.^=Z5S)#]P,LS"*58=<3&3MJKZ`T3CJ#Q3Z+C+T:4><S>!$'O$AU;"AV=U,M +M8SYA^[#1=HHB`3K[AJ\J@W33+8>S*3N=XT.GM\SZK)Y;9N?O"\-/'V1C1@PK +M9>QLEH=]7E:3</BJV'.(#S5J'F;Q"X^0S)8"BF\5SOB.&P\S5\\MZ`-=STS< +M-%<>^;K+6^!+G[_*E\IS^C<09J56X(<6^>JI@NJU4P4:><X9OUE'?K,M;,S% +MXF?WU%^:+D$6YUVV=RM]?3(%2;0+?[I^H#O#ZS>F,H,\WOWG0]T#@]U=PJLV +MM,3:[XZM7PU!1UKB[<P'X$BFNW-S+?\27VOZ$>R"&$6=Z)[-SB/06Y\KO=!Z +MTZ*29]$=OO64N::P-TI\ALMEQ1]ZNVN=;U.>+[X4U'\_\Z4@O44/,2-`7X>J +MR84U/WO+4/E"8#O\#W7\!3Q9+4=K9&QA#=:((^T06>8H^F9R0>M[2(V^AYQI +M0SP=5PSJ^3S-$&,E,\>C=LHOVH8W.\;1UZ;%A^%?X0F?/):#R>7U\$%*6[:X +M]-#U"3D*#].6??@BT>I'#AX;2MOFYJ("2D)F_0>"V#@#(6B9X\JY[S1UA_(K +MHM;U>:247P,C>B7JU9V14O%VX%HZV53)S][JEG\Y^>[DXIO:LHE+NI/>R"0$ +M;&Z>XEP:&62B&-J@_5@/;XY-L'Z4'B3]B+<4D[%+MF,5S>OWA>J^/3W9IDV> +MS?J9M(0M,F1Y<Y9-7TDX_,NG+U(68GM.9*!$J?SPGDT.G@_-.NG-S<S[(:)? +M)-[A6'LD+B7LV,5EM7-U*U2_W&1EK"6RUG2ZJ0[SJA\?3A5[;"=_PAS.$?2X +MQT>2=EU2*QDS3NJ_KK`Y=Z!5&=_1]Z91[&F(C%3[F'WSQ-G'WAOIV*&?]X11 +M9P^_(+W`\AF+[%B)7GO#MZ?/[HL^#+CPVHLUCBC"].:5D9TUR]'7B+[][^_H +MV'EF?\<.]-@?=K#&++N]$=#%/L?9_=4K-(<]DF6/16[?I3F`!?I&T]G]C3O7 +M7M0N"UIWF;3.[H_LJJ7Q5H/FX^_OZMC9L>/,?AK7I+EJEN9M.9JK0/-__H1) +M%97,\>K80D^__"IJB=KH3S!*-?Q:$P\?@E^H[$7RTJ0KO`=I_4'&$G^XJ9?V +MP1QXXBOZF2^Y33G2&B5_DI-N6GR'<->*#5E[EG;-<I;9IB_W,_;:.(W*V'@% +MQD(\/J@VC(.#?M).ZZ&?,#GA7?U;ID3CFQ4Q=TMBXSM32\WZ9NGL_M47-8=^ +MJH)TE%`;]"/2)R3]M1<E1V37^$ZCSN_X8?;>W<AT'7KHS!.61-9DX9?//+YJ +M#;.O@N>Y?36S/^J(KME<E)/X_LCMNS4'J$I/99_:M:P!%N_JP/ZL:1N\&2.^ +M'W9P_T*/EYD2((XM*=12=BSF+LN:_HX:ICDL2\I-C%7>+3<M:V0.U%J97.%X +M:I?AO7>'X2'Z:R]V.&[?1L3./$[\$%]G]K$&Z*Z!V75W!)*Q^O?GK&26I]@E +MYL)E)SM'K%$HUOBTO_S'V4BBAGDO>RTSO:R>O48QD;XI1NSXR(RJ@U?`^1A] +M&\4FS+\!"#"UD-K\E)L^\^BW/]B5KC^[-S9QI8)V;$:)ZO2XT/\,G27!CV_C +M$42`9U4G?;VO%L[&6N!_D[Z6CTU\,25.GNJ`65"11WL7^`Y?Y#:)\0CMV"Z= +M0J^'A[&['E%9Q_"A'<F2>);H_MOK%6'=%5FB.\V=KYK;99Q2\XE7P?&/,?>0 +M^++I-5KU(O8HL:'5L0VUL[Z1?%:0_L($&>_6T+++YI^GR)I'BPROG5K85*RX +M;RNUV>U,,AQQ3;]0H6'7SOIDW#W]3MQMUE>['XO]O1P/LE)<UP.6=OS+$_:X +MP$B4IUVHAQ(U:0DM"NLPG+AO37C3"F!5P"B),@%1(GO95M!UM&NZ"^4.E.WM +MX"<R@GZ2_C?=BFQGH;Y6W._H=SI0UHND$9:'>GU?+>JK7F')%5Z;45YA>W-2 +M:SR&2VX$%])[.[L=Z@+=>2,B&KO^!.T!)+,,+IZ3@F"UU+`W#HO2]1BK2,A$ +M)9EDIO^+D(]1]+?'$)4D];'(L&Y7]W);TVFY'/%PB,V)Q[YDP?VZ1-_MQ$9] +MZRGNKIMRM:>=DR^QTO791"EE^J,O,<4H0D9/W_XH1^MC$[]_GC?[6@']'D4` +MQ.5+__)!;N\=+%01,>+?;_@=]+8X_N0-PY+,KS>_"NUST]D8?3F4L1&=!>+D +M@\X]<IHV=[#/7K;+=):"+%G&Y0@VHR=H=P<7(E-YKH%.6"<6]K2VD%T81<AZ +M%+79I&B?P-X[C]V0H#VX@]T@3KO$7[[X'OH05$T_]Z?R:>_*\6EQEK*[Y_*F +MI>QEX*\,W+U@<B>];7&G".XPGD5IZ;_+7R['2-$9CK/:+\X%/<UMN_5&:3D4 +M>X/A:7N127TEJ!6R\D01G:+&7Z23.$71B_@Z1-`:W2F>(7$BH[3MYGGNR8QK +M8AB[G-W]K_W-ST4,=D2**:_RZ[D\A,Y,;G+X-/I[FO]V#%GZE&L+>'X*O!:R +MI8@NL`',9U'&%IOX]+D`2[FVL_(@6Z0SFS>Z!W/Z'<U)=^*).6Z?1KO2!LGU +M*61A\9<L'AF[O/VV7\#"TK8C6:,V<_\:V^NH#89/CAP:2;B!C5E:\BD3YS#O +MD/PSBX\,&Q9MT?HJ8.R`64.]X*0*^Y,]AA2IHK_!84_-Y?9W%\&M9''[Z)?R +MVB6^^W-3!C)50Z<=,R,UD=TO1^Y(%+$.W%0'S6>7AYD$NL4TQ]P,,8:BE\X9 +MP:(C>)P6ZV6G.+.9DTM"UPK)?I%"9S85=XLO]<47MA?N\L'-8%;0F^7#+J=# +MDR^R4N2W]<>SHB1+_RPXI=X/T[=1V_JLT9IN6L.HG`F?&!X?%E`V\/$BD_5J +M<<YW@V%2?"'=;T'VK[%=!>FBNX#:&7T1\FD")F2>:"3[^F<%<JJ=&5VGG:92 +MJL(>B[-DD;CDMEWQG6)O2KOG(G&2B'&%==[%ES-Y'%23CNBN_M>CNU(EHKV" +MOLQ7\X@:QJAY/\L=)(M/$36E"SG9B>^8-%X([_><D`0L*.$GS6!%.]1CD1^0 +M'6#G,PDKR:<QI9>$7;TDM,+88^)[QD;ZQO-A9X8MKV<RE0WO7$_WR42`3L0D +M4X>Z?.0E0#A-S2ZG[^<=='X+C=#HQ;F1TI?I9!<2\<!Z^'9&/A6CE=+74YUL +M>@VD9M\^+?SM><N#7N4!<5>89)Z1!.F,1/>EV/W:[Q<PYH\$V==QU>*Z`U<- +M(@-GJ^"+VM/3R!%:T;:2OM9:_7M6I]-?ER"Z*@I]V]27(/_&%B<?/!X.?9TY +M8_^&>818'/]JQ'WVGQ<7%Z6PB#Q?U\O%LU8O$<\[]"+QK!%1*L16Q7_*_#12 +M5$GL3]O&P6/":7*6\5'[(251[D>L5S=T/*4N#M:S]J34")YO#+.O$ZXNPW.V +MQR;.)]^U*('G`&QF#?6F!8UQ1%_(*,3OZ7B2TQO]UJ33G+.@4`(*K:"`Q";A +MA#Q:=<<_H=WD8D8.3:/#ACM3AKOS7JQRO1C]=K;2BK8K<_.([Z4OWY7%=,X. +M'CVPX8ITZX%L'[.7R_1WJY5)9G>?J%_Q=05R5!PVU>Z<^\]6/;]NM5Y@6W+E +M.:566[6);SN2P[15>S#3M!V27`D?'^\XH+;R)2NR.K-'S9KZ793ORLG#JSSL +MV&YKW`E?(4/S=V(V5="_&H6ES+0L1XN"ECMF6CBKVV;C#AZ-37R\09QZM":< +MT9WTUV]4QLJP05>M7I2?WI4JX]%WW^!Y*J#_S^%,B$?%&\2=79=\Z#^UB^>U +MT7?\#J487*]"]D%?.;3B>3%2K--YEJ"8EDACIK2M^2FS6MT*4]1=L[-2@LR3 +M&1JW&6SZFYD4[*$<_-?,\!^:Y?_LFSJ;ODOT%IL]@+GK1OHCTCNWV2V8CWQ8 +M8EC+G@2;=B,ZU&'>!X`GY4;TM')7PK'Z$KO(H];7AF_[*`-MQ7Y_5\H17,U: +M_:CI?)MMEFM82!W6W9VZZ5'':.T!IWU\=U+*,+)VW?%7L'9P]W6C7)<0!Y?" +MUWV_;7?R,XK5:8XR^E%[&+%#)AU!#Z2[-8IU"CFX?-QN.`>KQNV)%='=FP.' +M2,;%N@NT4!+4B,*%6=K7]LT?&1Q6(.?^S#SYFLVWK_)!LO@.#ED(6LJ8HM>D +M;X;6Y$0%_2W1.'WW]%-6JI?2^W(ZYT3FKXF_='327TQ9/,@T)L$KI9"5C-54 +M&F6)5^G+.?/O/T4\W-LQ&CG('#=I3)K[/LO*5;7-L)TCV90SM&UZ6B\^NZ=^ +M:J&7I[<R<7;U^%;&)<N7`B^8'V!&/&,<&>Z+IA\]DNU'%*N?*N!*:"O3:],K +MU[`CV;Y06J:GV><Z(?K*Y3W8,`3[W.)Y:]+L^Y[HLZ?S`G2^#Q.*_5=DBKKY +M/A&[IBGS[^7I]XTBW!QF_;;G&%NQG_::XB];Q&_!15R?`/MBIFMC57]G7S=C +M`X.=F<&JC<G4ILVLN[_+*G5U;^G=A-ZA_MY!QK9T9S:F!KI9]]9T-X#[4EW= +M@-@X9)A%UM,-9T]0`[VI?C;[-_SBUV^-GZL/T"Y_3KV;C@;FU+'E0`R8K=,L +M`VSVMP'7RCGUK;@B<^H(RRPVI]Z#JWU.?0N[ZO>-+1NV&CW]M0.UW;5=M4.U +M@GF9>3:LCK=Q"*JW/Y'BMP9"W'O';8%;0_A?21!JKFL#]555\894^I%,K]$S +MR&^]XX[;>$-/IG=@L+>SGZ\.<"V53@\(+=@:UP]T&MVU_.8!?E\J3:>5`P^X +M6LQ"K8OC5W6?R=%`=]?0`_R^JJJ<MNY,0U?B@/,AJHJ^.3IY0&"C;8Y.[Q1W +M$S*GW3EMLUJ<0395?Z?YF!V'+.%.NCW4/]0G6BQ]SR!:5B+ZR"(><,6&^C9V +M9_B:5*:O<W"@EGN_U=.=Z>9Z_RV\$\_.9+JGLPKD`KRKU^@='*@4I$+W;>UX +MH+^_GV_CLR7<[^O1'D#)0PU5/)'*<*U[J\"@SE3+`U9K:M-@9W*F?6,DUPYM +M=68>R758C5W=FWK[.I/<VYD<2*&6Z!Q*#HJ>_E1_5:9[4\KH[WVTNZO2)1"- +MWBW=_7RP!\QO3&WIYH^DAO@FJ%A@IU,#@VE(F7?R^YK70<!$IKG;Z-SXR&"W +M0%_7FTQ1A7<":G.NDND>2'=O&@3IY",!?E^FL]_HYIMZNC=M[NTW>&__$(1* +ME@/?,_LS;;=1:*F6JS</J)ROAWI@6,DNSALZTYV;>@<?$=4`-8&1`=;8.[!Y +M`UA,9=`1J!G@U-":274-;1I$PZTKS98XR))N":AZ@#4\DNSM[X*Z+>):=V=7 +MKAQ);AZH2E>U9S:;#?=9#<`1#0^P]A3T`3C8W"P2*KP-@J4Z<U55;>.M.=NV +M9O,5,R#0-K)ODXA%<#7D.:=^S9!,X,T.:S8N6[8,,DRDAH#=W_TM;MJ\&)Y! +MJ_VI02@6.)V#W7X^U-^Y,=G-!Z'G3&I3]\"`"?>MS@PXGNW,0#;F!(9FM)%( +M=AH#/+3UYN16:[2N#+1M:L"4.LF9W[<I-V=@-6-A=0X**H)(JG\>?R:=>&.$ +M@*S^6=B$`/+S1&=OLKO+-*:!H3XF&+.HFKSU=`[`U(E0X,OGLG%6K(E,JN^/ +MS6T;3U^EQ(&-)E2W]1Q,#9HEP,[Y7:68:W7?S*R9@*N<2GA?=U\J\XA893/C +M6G*AO_3\<L$(N;C,80=IH@-DA2`[`#>09/\N_E<(%C^$:02C;_#[;DYNPO\' +M:A'VA'^MY?-*+DO.3)3G_6RM+6UW=S3=^U!#2SR^NJ$=5LO8S3!A,U!P_>:! +M6WCO`._LV]AK#*6&$%+F]E9547]7JGN@_Q;3=+_%R3EEC*&^[OY!UU6T-OU) +MT(#-=/_Y4"^\U7PP@AKJGW65\]GY(_V"`9+`5T#X(=[.3.>F0<2030A1/'1S +MRO65T!COYDVW7,4U-7T%VZPA-02-SEWDED4%<EH)LSEYR-RR;=XU8\9>^O%K +M?IHR_[=SYF<U#(N?[4M^9O^(^-F_Y$>]_.J$YO_+;]%SL.=K<JNK?ZZG_U^, +M99]3SM*M4,3#(E8T%TJT.40^C%_%LQC]^%5MK\S`S>`N__1:7/H5R//;_*YK +MX?SN''2P<V@P%=R41#X4_%8GY=",;8)7O#44Q/_;5H2"-2$Z0L^[YE>8IRRV +MVZEDSRO)*U]BM186+EER#2Q1%?E_GL4C\MR",*Y27.#)=0&-Q4S8:4$(]<], +M';D`M^`0HS\^8S;`V\H!0W1.X7H'UV%<])W)#W'1'H+>3L$WLOO-<19<_+]! +'ZO0BM$L``#\^ +` +end diff --git a/sys/arch/amiga/stand/device-streams/smkfile b/sys/arch/amiga/stand/device-streams/smkfile new file mode 100644 index 00000000000..308d1819c52 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/smkfile @@ -0,0 +1,60 @@ +# Makefile for stream-device utilities. +# +# Copyright (C) 1993 Christian E. Hopps +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +protos=protos.h +stdsrcs= getdevices.c devices.c util.c +stdobjs= getdevices.o devices.o util.o +srcs=streamtodev.c rdbinfo.c devtostream.c $(stdsrcs) +objs=streamtodev.o rdbinfo.o devtostream.o $(stdobjs) + +copts= nostkchk # DEFINE DEBUG_ENABLED_VERSION=1 debug=s + +all: $(protos) devtostream rdbinfo streamtodev xdevtostream xstreamtodev + +streamtodev: streamtodev.o $(stdobjs) + slink SC SD ND to $@ from lib:c.o streamtodev.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib + +devtostream: devtostream.o $(stdobjs) + slink SC SD ND to $@ from lib:c.o devtostream.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib + +rdbinfo: rdbinfo.o $(stdobjs) + slink SC SD ND to $@ from lib:c.o rdbinfo.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib + +xstreamtodev: xstreamtodev.o $(stdobjs) + slink SC SD ND to $@ from lib:c.o xstreamtodev.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib + +xdevtostream: xdevtostream.o $(stdobjs) + slink SC SD ND to $@ from lib:c.o xdevtostream.o $(stdobjs) lib getopt.lib unixemul.lib lib:sc.lib lib:amiga.lib + + +.c.o: + sc $(copts) gst=custom:system.gst $< + +$(protos): $(stdsrcs) + protoman db=$(protos) $? + +clean: + -delete \#?.o + -delete devtostream rdbinfo streamtodev + copy clone protos_template.h protos.h + +xstreamtodev.o: streamtodev.c + sc $(copts) DEFINE EXPERT_VERSION=1 gst=custom:system.gst objname=$@ $< + +xdevtostream.o: devtostream.c + sc $(copts) DEFINE EXPERT_VERSION=1 gst=custom:system.gst objname=$@ $< diff --git a/sys/arch/amiga/stand/device-streams/streamtodev.c b/sys/arch/amiga/stand/device-streams/streamtodev.c new file mode 100644 index 00000000000..821086f35a5 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/streamtodev.c @@ -0,0 +1,456 @@ +/* -------------------------------------------------- + | NAME + | streamtodev + | PURPOSE + | dump all data from stream to a device. + | + | NOTES + | only works for RDB partitions. + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#include <dos/dos.h> +#include <dos/dosextens.h> +#include <dos/rdargs.h> +#include <cstartup.h> +#include <string.h> +#include <ctype.h> +#include <fcntl.h> +#include <signal.h> +#define __GNU_LIBRARY__ 1 +#include <getopt.h> +#undef __GNU_LIBRARY__ +#include "getdevices.h" + +#if defined (SASC) +/* we will handle this ourselves. */ +int __regargs chkabort (void) +{ + return 0; +} +int __regargs Chk_Abort (void) +{ + return 0; +} +#endif + +struct partition *find_partition (struct List *dl, char *dev_name, char *part_name, + ulong unit, ulong start_block, ulong end_block); +void file_to_dev (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end); +int check_values (struct partition *p, ulong st, ulong end, int exp); + +struct option long_options[] = { + { "input", required_argument, NULL, 'f' }, + { "rdb-name", required_argument, NULL, 'n'}, +#if defined (EXPERT_VERSION) + { "start-block", required_argument, NULL, 's'}, + { "end-block", required_argument, NULL, 'e'}, + { "expert-mode", no_argument, NULL, 'x'}, +#endif + { "device", required_argument, NULL, 'd'}, + { "unit", required_argument, NULL, 'u'}, + { "buffer-blocks", required_argument, NULL, 'b'}, + { "verbose", no_argument, NULL, 'V'}, + { "debug-mode", no_argument, NULL, 'g'}, + { "help", no_argument, NULL, 'h'}, + { "version", no_argument, NULL, 'v' }, + { "quiet", no_argument, NULL, 'q' }, + { NULL, 0, NULL, 0 } +}; +char *short_options = "?qvVghn:d:u:b:f:" +#if defined (EXPERT_VERSION) +"xs:e:" +#endif +; + +char *cmd_vers_string = "\0$VERS devtostream 1.0 (93.10.10)"; +char *version_string = "devtostream V1.0 -- Copyright 1993 Christian E. Hopps\n"; + +char *help_string = "Usage: %s [options]\n" +"Options:\n" +" -[vVxghnsedubo] [--input=file] [--rdb-name=partition_name]\n" +#if defined (EXPERT_VERSION) +" [--start-block=block] [--end-block=block] [--expert-mode]\n" +#endif +" [--device=device_name] [--unit=unit_num] [--version]\n" +" [--buffer-blocks=blocks] [--verbose] [--quiet] [--help]\n" +"\n" +"Number Formats: (where `n\' are alpha-num. digits)\n" +" 0[xX]nnn | [xX]nnn | nnn[hH] | $nnn - for Hex\n" +" nnn[oO] - for octal\n" +" nnn[bB] - for binary\n" +" nnn - for decimal (also default for non-recognized)\n" +"\n" +" given the above you can also postpend a [MKk] for Megabyte\n" +" Kilobyte and kilobyte respectively. [range checking inuse]"; + + +char *opt_infile_name; +char *opt_rdb_name; +char *opt_device_name; +ulong opt_unit = -1; /* -1 for invalid */ +ulong opt_start_block = -1; /* -1 for invalid. */ +ulong opt_end_block = -1; /* -1 for invalid */ +ulong opt_verbose; +ulong opt_expert; +ulong opt_debug; +ulong opt_quiet = 0; +ulong number_of_buffer_blocks = 100; + +FILE *mout; +FILE *min; + +int +main (int argc, char **argv) +{ + int ret = 0; + int opt; + int opt_quit = 0; + int opt_version = 0; + int opt_help = 0; + int longind = 0; + struct List *dl; + FILE *file = NULL; + + mout = stdout; + min = stdin; + + signal (SIGINT, SIG_IGN); + + if (argc) { + while (EOF != (opt = getopt_long (argc, argv, short_options, + long_options, &longind))) { + switch (opt) { + case 'q': + opt_quiet = 1; + break; + case 'v': + opt_version = 1; + opt_quit = 1; + break; + case 'V': + opt_verbose = 1; + break; + case '?': + case 'h': + opt_help = 1; + opt_quit = 1; + break; + case 'n': + opt_rdb_name = optarg; + break; + case 'd': + opt_device_name = optarg; + break; + case 'f': + opt_infile_name = optarg; + break; + case 'b': + if (!(string_to_number (optarg, &number_of_buffer_blocks))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; +#if defined (EXPERT_VERSION) + case 'x': + opt_expert = 1; + break; + case 's': + if (!(string_to_number (optarg, &opt_start_block))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'e': + if (!(string_to_number (optarg, &opt_end_block))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; +#endif /* EXPERT_VERSION */ + case 'u': + if (!(string_to_number (optarg, &opt_unit))) { + opt_quit = 1; + opt_help = 1; + ret = 20; + } + break; + case 'g': + opt_debug = 1; + } + } + if (opt_quiet && opt_expert) { + message ("--quiet-mode (-q) and --expert-mode (-x) not allowed at same time.\n"); + opt_quit = 1; + ret = 20; + } + if (opt_version) { + message (version_string, argv[0]); + } + if (opt_help) { + message (help_string, argv[0]); + } + if (opt_quit) { + return (ret); + } + if (!opt_infile_name) { + min = fopen ("*", "w+"); + if (!min) { + return (20); + } + file = stdin; + } + /* there should be NO messages before this point!! */ + dl = get_drive_list (); + if (dl) { + struct partition *p = find_partition (dl, opt_device_name, opt_rdb_name, + opt_unit, opt_start_block, + opt_end_block); + if (p) { + if (opt_infile_name) { + file = fopen (opt_infile_name, "r"); + } + if (file) { + if (!isatty (fileno(file))) { + int def = 'N'; + ulong st, end; + if (!opt_quiet) { + message ("found partition: \"%s\" capacity: %ld.%ld Megs", + p->name, megs (p->total_blocks*p->block_size), + tenths_of_a_meg (p->total_blocks*p->block_size)); + message ("start block: %ld end block: %ld total blocks: %ld", + p->start_block, p->end_block, p->total_blocks); + message ("block Size: %ld", p->block_size); + } + st = opt_start_block; + end = opt_end_block; + if (st == (ulong)-1) { + st = p->start_block; + } + if (end == (ulong)-1) { + end = p->end_block; + } + if (check_values (p, st, end, opt_expert)) { + int do_it = 0; /* default don't do it. */ + if (!opt_quiet) { + message ("dumping to: start block: %ld to end block: %ld [size: %ldK]\n", + st, end, ((end-st)*p->unit->bytes_per_block)/1024); + def = ask_bool (def, 'y', "write from file \"%s\" to partition \"%s\"", + opt_infile_name ? opt_infile_name + : "stdin", p->name); + if (tolower (def) == 'y') { + do_it = 1; + } + } else { + /* in quiet mode we always work. */ + do_it = 1; + } + if (do_it) { + file_to_dev (p->unit->name, p->unit->unit, + p->unit->bytes_per_block, file, + st, end); + } else { + message ("ok, quiting..."); + } + } + } else { + warn_message ("Pipes and re-direction will work but interactive\n" + "input/output is prohibited."); + } + if (opt_infile_name) { + fclose (file); + } + } + } else { + warn_message ("could not locate a partition with your specs."); + } + free_drive_list (dl); + } + if (!opt_infile_name) { + fclose (min); + } + } + return (0); +} + +int +check_values (struct partition *p, ulong st, ulong end, int exp) +{ + if (st > end) { + message ("error: Your end block [%ld] is less than your start block [%ld]!\n", + st,end); + return (0); + } + if (st < p->start_block || st > p->end_block || + end > p->end_block || end < p->start_block) { + warn_message ("ERROR: start and end blocks cannot cross partition boundries."); + return (0); + } + if (st != p->start_block || end != p->end_block) { + if (exp) { + message ("Please note the values you gave for start and end\n" + "do NOT match the partition in question."); + } else { + message ("error: you must set specify the `expert-mode\' argument to gain\n" + " access inside the partition (ie. not the exact\n" + " same block numbers as the partition's)."); + return (0); + } + } + return (1); +} + +int +check_break (void) +{ + if (SIGBREAKF_CTRL_C & SetSignal (0, SIGBREAKF_CTRL_C)) { + return (1); + } + return (0); +} + +void +file_to_dev (char *name, ulong unit, ulong bpb, FILE *file, ulong cb, ulong end) +{ + struct device_data *dd = alloc_device (name, unit, 0, sizeof (struct IOStdReq)); + if (dd) { + ulong num_buffers = number_of_buffer_blocks; + ulong total_blocks = end - cb + 1; + ulong bw = 0, btw = 0, bytetw = 0; + int last_write = 0; + void *buffer = zmalloc (num_buffers*bpb); + if (buffer) { + while (cb <= end && !last_write) { + /* read from file. */ + if (!opt_quiet) { + fprintf (mout, "reading: %08ld -> %08ld [%3ld%%] \r", cb, + cb + num_buffers - 1, + ((bw+(num_buffers/2))*100/total_blocks)); + fflush (mout); + } + bytetw = fread (buffer, 1, bpb*num_buffers, file); + if ((bytetw != (num_buffers*bpb)) && ferror (file)) { + fprintf (mout, "\n"); + warn_message ("couldn't complete operation, read failed."); + break; + } else if (bytetw == 0) { + break; + } + + /* write to device. */ + if (bytetw != (num_buffers*bpb)) { + btw = bytetw/bpb + (bytetw % bpb ? 1 : 0); + if (bytetw % bpb) { + warn_message ("warning non blocked input received, early termination."); + last_write = 1; + } + } else { + btw = num_buffers; + } + + if (check_break ()) { + last_write = 1; + } + + if ((cb + btw - 1) > end) { + message ("error: stream tried to overwrite device boundries, trimming."); + btw = end - cb + 1; + last_write = 1; + } + if (!opt_quiet) { + fprintf (mout, "writing: %08ld -> %08ld [%3ld%%] \r", cb, + cb + num_buffers - 1, + ((btw+bw)*100/total_blocks)); + fflush (mout); + } + if (bpb*btw != device_write (dd, cb*bpb, btw*bpb, buffer)) { + fprintf (mout, "\n"); + warn_message ("couldn't complete operation, write failed."); + break; + } + bw += btw; + cb += btw; + } + zfree (buffer); + fprintf (mout, "\n"); + } else { + warn_message ("couldn't allocate io for operation."); + } + free_device (dd); + } else { + warn_message ("couldn't open device \"%s\" unit: %ld for operation.", + name, unit); + } +} + +/* all the arguments, except the drive list itself, are search limiters. */ +/* they are generalized with: NULL for strings and (ulong)-1 for ulongs. */ +/* also the function returns as soon as all non-generalized criterion are met.*/ +struct partition * +find_partition (struct List *dl, char *dev_name, char *part_name, + ulong unit, ulong start_block, ulong end_block) +{ + struct Node *dn, *un, *pn; + /* walk list of devices. */ + for (dn = dl->lh_Head; dn->ln_Succ; dn = dn->ln_Succ) { + struct device *d = ptrfrom (struct device, node, dn); + + if (dev_name == NULL || (!stricmp (dev_name, d->name))) { + /* walk list of units. */ + + for (un = d->units.lh_Head; un->ln_Succ; un = un->ln_Succ) { + struct unit *u = ptrfrom (struct unit, node, un); + + if (unit == (ulong)-1 || (u->unit == unit)) { + /* walk list of partitions. */ + for (pn = u->parts.lh_Head; pn->ln_Succ; pn = pn->ln_Succ) { + struct partition *p = ptrfrom (struct partition, node, pn); + int do_it = 1; + + if (part_name && stricmp (p->name, part_name)) { + do_it = 0; + } + if (start_block != (ulong)-1 && + (start_block < p->start_block || + start_block > p->end_block)) { + do_it = 0; + } + if (end_block != (ulong)-1 && + (end_block > p->end_block || + end_block < p->start_block)) { + do_it = 0; + } + if (do_it) { + return (p); + } + } + } + } + } + } + return (NULL); +} + + diff --git a/sys/arch/amiga/stand/device-streams/streamtodev.gz.uu b/sys/arch/amiga/stand/device-streams/streamtodev.gz.uu new file mode 100644 index 00000000000..6b2fb88a5ed --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/streamtodev.gz.uu @@ -0,0 +1,305 @@ +begin 754 streamtodev.gz +M'XL("&8@[S<``W-T<F5A;71O9&5V`,5\#W23UY7G^V19%D*6A%%<AVC,BQ!& +M%K+D$`<<UTEE88@B;-F1#>,T(?UL+'UVD*VOLDR<');*8,!-2,>A:2;M,CV< +M.3D=FCB)RW0ZK)?#F&PFI9FVAU`VF\FP(<U"H"E).$Q.3H:A>'_W?9_\AR2= +M[=D]9P6?OO>]=^]]]]U[W[WWO??)C!7\*],^!OTN,5829<RXE+&"WU$Y<F'' +M=4_$P^[]-VKV#S'C/2C9RS*,UZ/B?ME0<?R^$]/7*EOLD<J8/531+SGY2C:N +M6,^/\A#WLIKSH[*)V\=>8'5N^_Z<:1A8N<H&NVMBO/A@=SOW%Q\TY41=R-[C +MK@<'4NREZ;IH3F'2*=1US[2Z3@+#S:S]S,.<?66HD4'GP?WC]IZ&2_8./AQ[ +MZ0\>V1`(A<?MC2H#+5;-8B]=_S7QM/:J]+B*IS^\!;Q#29/:+3/V?N56]JR] +M/OH"^&5L!]_*QM\X\<8)=P]S_.87O_D%-V18R<V5]]J;3@X_E#.$,,J0O3UR +M(12:Y;/IK,$0S27-JC/(P'$I#P&FE1O:<J>'%QUF#*6=D,^GBXXR3F7<W=RP +MZ"><<>F^UZ<_<^`Y:):C#;]G#X+7G'[?!RJ-0>8)<1_S*&7^E/T0#[F]#".8 +M/HBV>C>5=O(4H,R1E+V,]S!/90\SVIMBD^X3L4G_9RJ3C3S(C)Z4/;)<:$Z7 +M7$ETW-ZA6$EF]X_;99):(,K]]AK%R$.Q,>`?Q'4.-3V*U9VR=Q,N>@L`KU'A +MQ(O;;Z]7J.Y'>MMVP#6"[SUR"=4`MUTQHZZ5\'`_A+8NOK3I[+=VQ`:[TP.! +M5&]7IC/S*/OA->:)7%A1$PBR1E^:1;:S\,NL'E<MKAI<U=][O>%2\6N5$?L( +M[L_A/EJ]G4D8-?4\N>[=UI;H7H45'(BD674DQ=J#?JDT6!PLBDTN'6_YF#E] +MC!?&84WL-"_,?&UL6&G*?`7?=V>L^$YMS"GMN+[>1A"'\!W8G%-J_SRG6.[/ +M*1D\6^0?J5)EJ&!<_J$J!4.L'E>MO)_J[$/RXS-U-3*;WE&9LIRQJRAE12F+ +MTL.BE$))CJ0*)H)^RYG8I.,8N,XEV723*FUW$C91`4P]8`[J,#_08;PWP)2) +MOG,HV:+C!>-*&?2R72D!YD]CDZ6O=K1H/&UW1B%%Q1J\"1(90LOSH`>9:C4% +M!U#SK*BI5TS<)#/#@Z"32I:#SE5<G\4F[S[3VH*>1C%;G&BO7P?YQR9-QRI" +M?*'"#$M`Y1"NYW"!9[N**QM<V,D*=T#N9>#!CQGQ'FPEI=A`\7I0`LW1UA98 +MM85F=]#'7+%)'NT0XY1^J,:`XZ4Q)1_F:>;G7JG<[97<L<G*[[A9N"'2</'; +M[XZ>&S7`(Q1,>]CYG:=SIW>^^_BYQX.&H!3T2I"!D<4F;YH"=GW@D%2.NB6X +M2E$?0/TAU$=0[\9S%YZ?!9^<8P1NC"3R,>:T!]\&QN.YI%7GH!0\>>+#,\]+ +M\,PQTNU!3$]<?ERUG4SR@I:#O!9[%U;K$J-@['',0(\[R+A'>CKG)@J]S,8- +MF,FAV*3W"(TFR/*4P%4&7!F(4L,EXUN<)&?`O`=>L%(JH9ENG(#=/TI]QB9+ +M+I-]D\P:+EG_RES-F)DII@P_E9,-;J8^>CB7M`E;<,DF[0YMNQ1OG@]0X;B\ +M04L0_.#RXN(8"R/]R22U=V*3SDQ'BVQ!^2.4OP-=P4H49]`2F_QJF=926(^6 +M;$=+<&%LLO`A#2)I@8Q&8Y-UG\`>6=-9_[EW,--C@Y$+148?^O4'F0MSO@QS +MWGELSQ9GT!0L`J6'08G&;X7WBO,JJ?18+N%P5TE+C@UWF8\.=QF/YKIA2X7C +M!$>49?^Q%Z72I.GHB](2I3RZ6[&B]8/8Y.*CX`V0ID:4)P2D096:SO)W8X-! +MF\HRH0^_K?FNZ[\V,V95C*H$".;_1FP0/HE'+JRI`9_MX+,)?$8JTJP5O#9" +M^M7AOPD6!8MCDY9?DJ8T:S:HL*,):+IC_^[X<-YWX?+C\@8;6*W;1+,R-EGQ +M2A`VNN@ZY`7+`J9[\F76T06S@W:\F`>?"=N)\4)0JS\YW)9[[]N>(*LY/>PV +MG!\^M;-".K_KS>'SN\@.>8%;6,+RH[H5%6+$%R'YD=CD[>.!<;K7_I"LA)N( +M&GIO#"[$<(;@08.L.C:YQDICH+D*2ZUWFP#A!J3_<$[QF%>R0G:+XHJDBJPZ +MS0Z4;;"\/:0CF4E-T6',Y/5YW.7O$^[$L!+ADGCV""Y1)YY*H\.;IK+L:9@= +MXR=WHJTZW^:Y"DIEH$YV[=5]F%<V!3&3674GN]Z$N:59L9<7GH1LVW(3D-L6 +MXDZ%/'_9T0):'6.[X[D,055#YIHO:2+N3NYNRX&WZE/0C$>"YQBN,$"..^?+ +MT9.=E6/12]J85W5K<ERS2<@1-`2_UP1>H2A?UF<PU$3SPD*0#IKUD.(24#JE +M4Z+R:?`:$=*S$:TWP,_;\.5_N$;X\/KP86:FP=_V@8####,;@%4"BP%U\Q58 +MMH,L$/45P+A*4)AAES##N+!>%T546&]KWGH]L%Q8<`@67!_<R&K@RVJB8_!5 +M[ZOLJ:E@!#)=J)1@]KMH#M]R68L\["C@O,$>9H.>$%T%QB$=PZ-.'T-T1(;G +MG=@+V!$!YR<O";@L06D^![`<,\1)7D8J`?7]1%TQDI=4IX_FE#+@</CYTJ/# +M";,''O;HSBVB=3*GE%+;Y"%I29<)WZ7=)I7-^#$369'LH1Z#K<POCQ"/*%4C +M,L9IA"A35';.^!]7;/"^ELB%6U?#_F'%ML<Z$(LP4E!%-GB`I'O7]HX6RG`R +MA<B+,KZ0NYB>LO`3?XCY0KQ861(LAH<<$;/7I;Q+&N]D[)W6%OFTP"/(E(H0 +M\M14123Z726\@ZE%QW+=U3.>8R5%/=.8/N_*('=&4=-@"KP,_4T6E;2VQ/?* +MKX-&&]&0)[FEZ6QJI+5%XYZMAA9=:-TH].#$2)V0>!P9+TK\OJ>F/!&J.WF- +MV70/=UU$;,B!;P".F;`Z6<$^V-&;!$EZCTT6/XO^RW`?P]BBS"G_"+TRZO5^ +MZK44]B.\-?P'?%]Q3MB(&EP(*WP0S\]A?."^N(*L$>.R0L=ALB8KZ=!Q*Z2% +MR[+V(K,%OAV;K'=BOJ8!=0A2=+@CO%G/)"W0A0MSP0I:)HHIH(^H:'.VMJC3 +MF@_O81VZ+"22!:]H1@9OA`T^BY6'ZWQ.\\CL<7=4H_F'#\#+8\BDS>=S;A\S +MGA_F#22#^"C)GTKND`[53C+4RR3%,NL85A^6+?5DYV.'F"?`XGM1MB*".Y&[ +M?.I&GLDO!QCJC*!.3^\%F'4OXXQM(0MU4E2!)',DR<B%`B/FHX/DN)WQHK:] +M-!/._)7\"3<A-DUILM9&!7DB=BU\4UB:4UL/@2.7.[2LA[D8;_@=(K@9$?9U +MXO/6/F9E7GP[F%^=AJ0]D2$#XLS"9UI)SDZ2?](:-,-VGX;>F;0'=ME],G<L +MEV)2G!?]-G<RE[<%PH1-0LN%4;)2:XX6B(HG6`6+K8)VJQ@R$?,/0/TEV(P' +M-$,$!ZK5P@9[F<LZ%F]LVP"=7(:]03:=;-JH>Y57!#_W("^*$"0D%UJ&[);* +MD&ID&6*E7M^(^GJ]WH'Z$*]D->Y*\M1+M^..>+8TNXRB"&!@60?7762'[KG( +MCE`/6HZUM#T<BH0NCE)F(S(<S#5XH@7@_W5XZH_`MRO/LSH]0=:(5IKC[(B0 +MG(OF$4'D[5-VZW+2Z"%K60"OMC`K)&#"S&77#ZG3!`-JGJ0KGU<!+H(>M],L +M!W6;YK53N0YA%ZP4/LVAU--<F3MSA<]QJ*RB^2^GA)=HA/;>)BAMUBYX#_1@ +MB0O>[FBAF:%9T`JR("]YQ@!E=K#*!<C<M+Q=NJKG?RZ_5_?`3'H'JR0366^Y +M!_(ITK1?T$1C@I<OGZOYH`DC28+B88J'T/E?6[_;VA!O1^:R'[@K2==_*--T +M+75;7Z#YPW);F%0?&9(0KQ88A45S8=$N'L)H2V`)&]30^5%]OHZ1UT?]?N') +MJ+0://-E$:G$X8CD(E/^R/^<"@=@N#^62GBO5+(LPBS+,"KDUE@O8X[#>_S9 +MUW&'9/XLOBPDE:+LC0]SK26DM]2VY="VQ%TIE7K8T\/QG<O"4CDG#T'U;N3< +MY;B6X"JE_!OC_A'B[R3%EMFUB>O*'U^;!':*M0G6'`M.`7L[K3E\*YF#1G:K +MQC.^=2OC,U;6&$E9$/47N*#O6A'C\A8'^5M\:!'K!&&-\]N00YO?UZS17PAK +M+"<O7#1)]I$Z1]86+(9UF$G#1<]UM/B0\3*&O+P4&8,7&8,''HI3C($'0CPH +M:M<L)VF$9^[7-92LP`J)[)%UB]QZ$V_C(F*N",$3:RU1T5)/_9B0NZ#%K+=4 +MBQ;WBGN8=<5Z6!;5M=(J4-':'5J^SA?"HM\5L\,$?JR8"6XQ,U7>QXPZ)RF^ +M$=]RX$4&7V@Z3:.4&>%(A./8,0VLU=$7F3-9#2PSAQ6[@>V&1>MSK+&<1?9& +M?IXTJ])*>%K93)E-&!B\"+1R\_I?1904OWNF_^O^:"CIH&>4N7ZOT.]W$Y4\ +M/P4UD"V';%V(I![0*_,`:OEZYEE^#_,OW\"\D+=!C*]#S!X3+)$C>DPC>YGZ +M/Z90("B4?@D%T]U!MD1$'Y*+7XS&1=*\[1[XP=E1U;I89$_D-=E";8NVLVFV +ME"*4/$6V0AXFZ`0/7E#R^/WV`Z3C19_Z0L%FY'K-T;+DM;;1IW[EI3T:`RSR +M.=%>HJV0D];V)]N1O^V@>)&EE0@@#A&$@]:S5I'G>R9N2EKC3\;S<$W1$:7: +M<4=DFF;_G-6N+5^7X2>'9?/,4P_6(*M5Z4@NO;KDCLCUR'#D>!ZK#%CYNBP_ +MM5,VSSSU'-Z9-%%_[`SU5T+4/H\Y/0]3>TH?WJG4H+>:/Z$WX"2-.\QR_Y_8 +M5U>^+P=1^KP\KL^3A_;4-3&,O@RR88<E/&X_,%='B&#P.R1_]T62/TP&<_\G +MOU)LZO1D+EFBNB>`D;14KK<?$'GR"2J!9[/:/`&>`$=RKL@T'T9OR7+K;L;L +MTUV6R+KPNM_M!OQW5'=E2,?=-W>L:XGOV_[H6+?J8XWD1Y+'^2-CW8JQEEEW +M%TQ/3W>9?KO[_&[9,L.!I6(W<C*7NWALN.FL]Y-9;^BX:8XD"T#=&']2_H`7 +M^[3]`"_-/L"%_O*?D#>M.,92<9+8<C=6"XB<<=T;2D[AN;I5R]%<DCN*(KGP +M&N:,B*P9LW*G)Q1X`O>/D%E8Y+MY4;RHA$6&N6EISN&4#^7A/1MF,%HK0CM8 +MX'&4)H&S,#DB9K=#WU.9PIK&*WR=D?P3<>1!]HYLM"B.M9EJ.99+?B!V/N`! +M>$[S(9BW+O(=WWM]!T,.6JQ89ZTA8$:&8.4;].=_\IMYT<D]\1SM6)2O[M!V +M[BIX$6]V1V5#R5MMN>ZK//K&SY$[;)`-CG\6S\`(KS(S6K60U]'DBWY$Q'&- +M:!$'/M4I?.I,W]RL]?-GO]8S%3-ZV5#R5O(:Q0$O$WIP1BXL<\(+5L,+^C=\ +MS&J#Q;07IJV7W>1AK+H.I2$&"D49/C:,2%)$\Z,'-6Z3L#"#VX2HS.!YGM=Q +M=VBK_!4J[J/P2B70@9?VTFDO##[)13I!9G.*N',L5JP9RX2DF+38T8!,R!V) +MWHR1?/N[)_B"MES&<GB-V:F(7;!.=OTAK'803;RO0F-.36,8@94R,]<[D`AE +M>39PRW@SY'A<R+%8T]E\^=W2.",_TB3)T.'9&-V/=:F/6<1Z:Y7P_498F)E' +M/:WR>\)6&%&*CMN'%/<&6J&1W/1='?XVY/`SK7SK-K%G_@T=.J<$"!KM1_3V +M38$G@>G0,0^B94IOJ2=)S6`.*37S\%_1H4KGX<MH>5TO7YO%_QR'M8#[I5X^ +M/<NA3OO7>LOD/-I&M+R9YS-/F^P.<G.(^8*5K-:^]"W`OJ7#4B;OU"R.L7^X +M9'<EV.*[=8T)/,=-BLA")_9"RL7(^9^4+Y&,25LZO`TSS:E'ZC)MM7=T;\KR +ME;_K@17&]\A70!]S@]O'MC,K_"MP2MZ.7+B5].GD?ONS8^/VI]WL_'!`(ALQ +M9S`C_%H-;W[C>&`O>#=W[B?(?)T;[;2SY6[^S2MNO^7=_3DNG<\%<EC-8-4W +MW4/X)\<M[X+RLW/HF,G/3$<Y,-QL/]I^@YYI502/^2RX'-&YK-6YK-%.;+Y& +MN8B,$39AA.W@NC4\;CD3!?UD$YU/6-Y%G*%3K*>)3LGB;-5A0]*2-52&[6/Q +M)V1O=B6>S8"AIR60_D78=I/(`4U42SO6P!R##>U3+#QEWQ=U8#TQI$K@8RRY +M38P<(SJ<4QP3Z!4S#9[Q^@2R92N-'O'?6-E@?YK&-;$W=;<8\6`9RU;]U)$T +M8ZTH11<EO5AS=2BN?%MFY6%'TI9_BH^B1U,<M.5)HD+CH#O60S&"`<^?!>\H +M@\<J?5K,N%J"_1*^:*?<>CB7-.N4GN9%[J+*AEFJL*52H6'@`]=($E2G969\ +M3M/,%W"_GG:;%5<%.[^+#]:R;2M_!NZ][/P('XQHW'NB)"N3H/,@T2$.";X2 +M\)8SJH3ZQKGTXZ."IAF]&+=)LF$;>^._548@>Y(3,US_'"]6XN6GBQ1G=`^R +M8+U%73D!71E.!J$U%II[GH?,(N1PP'?>1;X3V5U(OA1,LP[6^!AE'8W<H63` +M00AVN`_^V8]O.L\Q:GFAV,D-P7[W$6R0=L_@H9W/=+0`QP/I.D7].E:MG\I% +M6(WLIC,O1&>TL!IJT\]":E7'&R^SQOAN>8\X)PO325BR'A9\3BG/CY/T&[P) +MFKX6217#0K$8^UCXEWWHM_P-<$(2133^FLP,5\7I&I/\6$=5"UO`:*,.A;$1 +M-^VW_I@9%>LZR*LR:CF#7.@UT5=\CDROQ4?5*LBN-+B(>EVX1.OUEO?$:LX[ +M%U);!P-.\+<PHD,>$2="@K_%.X@_G;>'5(E6K1.'L#IKHOEQ>&_*(7B$CZ@< +M-,,:Y!K!SQ*J"=YAOB;H;M/IRK/C7EPQAZY)K\/ZCFHA@0<5$WIZD._65LG, +MK-C<7L3Y$!^F#%`ZK=?3Z<&)Z!ZE;K[]9:H..Y2*N9:DE-'LU\<K=DJOIL1\ +MZQ?\;IJ/+^17)BR'^#^@\;_DH)"@;RZL3E'8F(`]JL,*_]]P:>$9D@]9/XU4 +M<@DNRNAY:8BMS'-#SYWLW]YN;1%G*)J?,A(F/)FE),A69NO@Z6*"U[!XYH<- +M?:;LM_"]A')<V#GU_H[6^\V?"D[+9ENL5KWE#+40+VQ,K:-5_X272<G'\&U( +MEFLR4BR5$8O@6S:2/_[N+RKOM>_#ZESP-:<UI/L<G^#+Y0C.C(AZ].L]/JSU +M2..5;81'LJN$["QGR+OGL9!=7--.]T2D*-,BA=6"F$DQT)&/@>&_H7\BZA9! +M9L]33$:$R5&<G8NY\.3G,6=.6!9J9_O_EIK%GH?[](VX^EG7?.S`_+[O"^G8 +MFS#Z=FWT92G"C$U^Q4?>AWJY/P]5/3=_6UQ.^1OMXR(7,'8>SF<"<Z@RG2>1 +MK6EGAXY/6I%'"JR%L@D1>#OAS8Q&SPDLKT4NV&OR>S*(&:;8I*7+QX*%L<F2 +M'^G]1M3NR5S:P0OG9H]RH*(9$?X?/9'['_<6WC_R]Z]W&\/_6?XL.O*P88@= +MV9VR\4:O,3["S>$[S$S^B/(8Q*E/1:YX^08N0F*OG=[1<"'C6ER1LJK(SWTJ +M0^]FOI49?_*K+JP"HW1>(YZZ;9XVRD4=\,T54?E4Y0:K&MTK=I`PBE;D^12K +MX1/&K>JMS<R(*&+N:*D,@>X"]"_VRFF?H4&\=10812^/8CEW+3;6(<XCOKB> +MWG:)7."&V&3Q!YPD4PK/8_:+MT^FO='<IN-9]K3$#4UG0T9MSZO@*[Z4_:#L +MK-BH.D^^R(SN_"E$P+>!%R<OPLH/RDV`&5</G(0LD(55,<1F^WAE'S/;78$J +M6AN(V1>R]M#;-8D2WN(W-WS(K/K^E">PWKV!%\UYAV8\^5+3V8N4_:71(^7V +ML"1:UP18Q;V^B+Q>98Z;\JL8K$0M&5;"LGS_3ME();^$]L5?W,9-8\-);_S) +M^!-M>Z-[%7/T)L4879Q\"64'E1'Q+='%N$]KIQ+>5X7]ZWRH+,,<924W6QGK +M[+/@^[%^HQ'-5DD\2^)98EA1)8U1*7DZCZLR6I4['%B7:ROG4?D*-PM]F*D] +MMG'Z$W=+QA*;+'*:&EAUR7'([#)?X/CM/_PB>37L&/N+V&9!:QZ\FQD:6)$& +M__[H%\%7W[;J]IH[5J^IO;.S:TMW(IG'OZ_%W;**L.TE_^XX<W$T>64.[K<U +MV\J/.7*AFGLBF#E2A61UL)6*&=]5E/W$(XXRC+ZZ;PDDL:#?B=QZ^-3.4\/1 +M@J3Q5$Y^;W].?L<]S,UCC[?EFLX:K9H^L5J+F*M8`;LE6<W]-FMLTFY8&6)& +M7(ZD1;6*?8AIN71ERF9E3O5?C[_(RL(O,BLNR%_;BR4ZL&.G+U+1+'/2]I=; +M0^EQZ/<,K16]1EV&1N";W<*F5J_V2S[FB\0F%W(.GV$Y5:&==Y;2/HYY)9-8 +M4=)6N1V3Z:R=JX6H/2Q._8L4&^W=D4^)34J'.UI0:T*MPVWBS2HTN;!#G)PN +M<:]D9D]QA4F?92=]+)Y3'N2%<G^%Q5/\S$YJS[>A)7Q@ER]*=0U76;O'O$W2 +MZWV8,9+;1)0MUVF7(3EU(^4X^<H"N51_W@Y)<JS67)I$F\ZF4K'!XGGCIWW* +M-9!`@-%Y-2B[.)V$_)J\9M*JENJZ8.PH-,8@":>0Q+LDB9FV@_`!G/9;W57@ +M9^$,/V_22)/.64Z6[M=Q4M'=BAD4(2^L#POE!ST;_OL_JL43ONGII(6HB%&_ +MR</N0I7>(K$)+UY^#R0@6QV+,\7(C0U+IN)/_/WKB<MBI[?X!T^X"_D&=0FX +M?Y<\FZ!KA.T]@7%?ROL^C-F,/-=*UK/&)-ZRP=B!XZ%QF]\4X[;,C+M#C*RP +M;9<867Y<Q]PTKI+\N&8DX>.%E-&T:9=57L)-<BF73NZ1'80O3LE9A8$H-)V5 +M+^5MD?;AB0?S0<%#7/!`_J=)=4[!XV8<$\-)6#[-$;DVBAK1&LC3!+TSD&41 +M;,_,^\3IS4NTAX\L,P39U6'>&,F3T3Z]V)>FDR__#K9T.VQ[1</5Z1PRM`GT +MS"M2-J=GPW8FFSP;*N+Q/8A@)G%N?)DO3`94!]FT/CLH-QT-?S>,5EBBJ7*# +MS2D;/$_X_#;DS#:';/"9YN];`=>U(L2L24?&BE7G`54AV<GT9DRS>RNSTBZ6 +M6C#U,JN&#&V0']<OF^RB]VB+S-2FB'DIV79(LDGLU1:8@_`DMRM&\\]9(<HV +MMDJ432@7Z^4BE,TH1_4W%:Y#8N-^IM2AWH+Z,N0,+TW_2%U$>D1TMM()'.QZ +M'.T+T&X*!]D*V61^F:AHL#K%@$;1`_X*/D+]>UZFM/K]-M?Z/9G+?[LG"CRE +MQEWL(9SULL]/<!^:BYBDV$#!2K1%W26"T75)-*PK[F'&%8WPU85RQ=S9S%?F +M]6KNPEH8<\IU]\SL%GNUC-X7;8U<N&WUVJML1&5ZC'W+I^G-"5]U:`=#-&XJ +M]TY/\Z*U'S-7?I\RO&;(U4#[&A&;?^TE6\T]EVP1?_-3)[[WNLK<+/N?3N_< +MYHV]=/TY0:4+/>Y#3ML:&_3Y>%NV<\M6WK(MD4FFTH]PGX^Q=1WWMC/6VY\= +M[,WVIOMGWF>-YAYFK+PQ%QW&W=HXW(EIT#@<&\2]K#%'I3DMID;:WS-$&FJD +M)&/N2"C2$`G7,*P832/'JPV14`T3]_`J@V<I(`NV.:P-+->-]M]^_[ZUU@8S +MH_+OOG\_RER4SW]_X]IHPU:4_M?WV];6L/</1<+A\/O/1];FCJ]FU8::@DC# +MJ\?'=A)LV]J3PQFVJB"R]L*12.AX0\52ZH7RHFJD,A52)!Q9^^KQUZ:FCI]> +M2U1.[FPZ2YEPY(**=H5'D0>$<W)9!7OM>"3\ZG&">7-GI&'J>"04#IW<!6B; +M\`-^>\08DCX)A&)7KX?R?J$`?H'V>*RC/LQ,S,M5E%M%F>(T,\Q*VRI3Y#B7 +MH,N)V)A<@CJ#8IWK%7P;X^N1H[U..?AORL2YWY38(ZY![%P-O]F$?C^B%<N& +M2_9/_^4X;/ZOXT_`OW+XUT\S"_!]6>SA?N!8#(GOCX_;/_(T=SR9<4](R?;X +M$WR#9]03D6N!X4--(/X$16*:OYEU8\.*-;.`OF5'N$1N=UYC7Y'-^+;(!N=O +MXD_@^U^`!TK(OUCR:/P)0+D]J"<.E!+!@U7P8"(>DA>1E=G"MUC'&2U'/NIC +MTQW$?=)$;WC+Q@:,`+;L#=[+RM;2KO>]S$M[*BB75=YK<Z+LT=\Y;`PBAN46 +M,9>X(UT4]U)6#S]X1;Q_<8EH8@7.%:.;R1G,A5>;+]E_ZOKGY#7T\].Y^]AO +MB#>,,L'#F$W))83G1Y:;\=+>HGC'HI_>P2XX-R?_=<VGD;ES_[>YA#[@@PN> +M%6WF^5Y%>Q<@:4-&<,9MSM>8Z3W<I>=S%:'O_D(_DWR;AV[="L_T'""/S*'R +MH8Y3G6Q$R[,S-*KE&MU67B>*N+]*M8!YS&V>AQD2O3\T@QG:!"^/U<VXK0P: +M`&2.A<>+I]R,-3"ILJ'X:(:^WV,A%JX,%;^3,50VV+`JL)&E?P197,&J\5UX +ML4_@18SP(C6QP=B]376,^83MPT;;*3,)T/D+?)4+TE5;CN;2!CI+@DY7S/JL +MGA6SX_>%$/L/L7$EAIDR?C['0SXOJTT:?57L('*.6G<A1O%KCY#,MH64,U68 +MXKN6'F66GA5H`UW/3"ZFS3SR==>VP9<^=X,OM<YIWT28\)K;H45UW27;"#SG +ML^0Y9_QF/?G-MI`R%XN?WXOH6XJ5P="RT2%Z`XK>3VP7_G3C0"+#&[K2F2R/ +M)[XYF!C()KJ%5UW;$FN_-[9Q'00=;HFW,Q^`PYE$Y]8Z_@6^5L\OC`%&F4QT +M[U;3,>BMSZ(NT$_[W.199*-O(ZV&TEB?)S_!9=%S&GK#0#]CH;6F>"M8_GCF +MK6!ZDZ.:*0'ZM8$[91W]R2\4-U\`;*/_&QU_`4]6QU$;'K>.8HX85:-8N8RA +M;69]P<TB1X@\-46K(;T.L77"H5#+9RI#WF;6U@U43SEKV_!6XP3:VB+Q8?A7 +M>,*G3N1A\FM%^"!'6ZZD[/#-26L4'J8M]_`5HM6/S"DVJ$ISUS<"RHS5VJ<$ +MT34#(6AI_5K=&I^CLM'QST2M^[-P&?\<C&@U4ZML"I>)$ZK/T\FE2W_RBX3U +M-U-O3"VZM2V7O"J;Z%0P*6#SXQ1G(UB5)$N@#=H3Z.'-L4G6C])#I!]Q4C85 +MNRJ=J&C>^$1U_;>FI]HB4^=S?F9>S.R*U;HUQZ:O)XW^E=-7**N4#E9H6263 +MRX_NW6+D1="LB4X/9\XHB;Y-G"/JZVYN3AJ0,>8B%^I7N?WV@_HJJ-1^H.EL +M4SW&U3`QG"[Q2*=_S(RFG6AQ3NQ,&62SNY(QY;3\;H5DVH5:Q\2NOM>4$L_: +M\,X:'S-LG3S_^)L[.W;)%STA/+.'GS<_C]R5A7>M1JMA[;>FSS\1?1APH7NN +MU!JC"--;5X=':E>BK1%M^][:U3%R;E_'+K08'C:RQAR[HQ'0)3[C^7TUJR)& +M0SC''@_?L3MB!!;H*TWG]S6.W',E<DW0NENC=7Y?>'<=];<.-)]\:W?'2,>N +M<_NH7XWFFEF:M^=IK@'-__%C9JZH9,:?C5NS_=:?X2E9%_TQ>JF!7SO(0X?A +M%RI[&;,?E!V\!TO%0XPE/[VUE_9B./#$+[7R[\D%-#G2'"5_DI>N*MZ%N7O5 +MIIPA1SLWUAR3IJ_U,W9D@GIE;*("?=%[QNZU$^"@G[3SW.$?([?VKOL=<T3C +M6QUB[+K$)D;22[3GK>;S^]9=B1CE,Q6DHZ1[K7S,_`%)_YXK9F-X]\2(4N\W +M'LC=OP>K)Z-<?>X[ND36Y^"7SSVY9CTSK('GN6,=,SQFC*[?:LM+?%_XCCT1 +M(ZB:G\D]LWO96EB\I0-K_J;M\&:,^'[8R/W6K)=I$B".=2G4T8I+C-UJ/R#_ +MTAVB,2Q+V0\R5GFO_>"R1F;$TW/,6F%\9K?BO7^7XB'Z]USI,-ZQG8B=>Y+X +M(;[./<'60G=KF4%VAB$9O7U?WDIF>8I=919<!K)SQ!H'Q1I?Y"__:3:2N$.\ +MEQW)3"]K8$?$N_(1YD?L>$^+JMH:0OR695+[G5F`N8OU=05C/WCL6V_O5AO. +MC\8FKU=XM'TVD\>"]A_0?B;\^'8>1@3XH;::0/8_$VN!_W7Z-59L\@^7Q.YG +M/3`75A32>AB^PQ>^W<QXF'8!KIY!JX>'PHZQG6[6,7QX5ZHTGB.Z__Y*14BV +MA!?+)FTWQ9U?6YQQ%Q&O@N,?T;O@XNVZ(S3K1>QQQ`;7Q3;5S?I&\EE!^A4C +M,MZAZF77M)]`V@]X(N'A>RY9#Y0XG+>7208#,RO&>$2^7!&QHKW/BF]/OPG? +MDO[F^/MBS\@:#[(R7#<#EG:15B8-<8&1+%<M>*Y.UJIFU#A8AV+"]U#2JSH` +MZP:,(^D2$*56+QL"76-[1+:@W(&RH1W\A'>BG:3_=:?#:F#5?:WXOK/?9$19 +MMIEWLD(\-_35X7G-3UEJE5=2RBNDUZ8BC2=P61O!A?G-D83172";Q-KXYE.T +M!C!K97!Q$&LVK%$40^.P*-V,OFQ")FZ226;Z;X5\%-O?GT!4,KL?#P_+!O<H +MEYK.6LL1#V?7^XC'B+OC,JW7$1%]&RGN;KA4_)QJPHJ_;&,N64:9_MB+S*'8 +MD-'3^V>.XPVQR0];>;.O%=!O4@1`7+[ZKV_G]W."Q6Y$C/CWUGX(O2V*/W7+ +ML-G*;];>3.YSTGXKO;V6D8A.@=A-H[VTO*:U79$?7C-8:7\.6;(5ES'8C):@ +MP1E<@$SEX%K:Y9^TGFNEWY%8%5L#_8:C6:-HF#17T6]ADK2O8V2WB!U4\>M* +MWS?>`57-S_VI?!JZ\WSJG*4-SKF\1=(&%_AS@;OG=>[6Z]PY!'?H3Z>TY#_D +M+Y]CI&E?T%3C%WO-GN:V/7*C>244>XOB:7N!F?M*\53,RI,VVLF/OT"[*PZ' +M;.,;$$%K99.X5XM=/D?;'E[HG,I8)H>QRMG3?^3O?B5BL#%<0GF57\[G(;0O +M<ZO1%Z'?;_[7$\C2+Q6_%ILT6L!K,5N"Z`(;P'CL&2DV>:DIP-*6':P\R.PR +MD[S1O1C3AS0FV80[QKAC&O6.-DBNST$6%G]1YY&Q:SMN_S4L3)6.Y92ZS(/K +MI5?PE`V=WGEX9]();(Q2EX]+[.W]DN2?671L6-%IB]J?`<8`F/74"DZJL#[9 +MJYC#N*/UF;G<_OZ'X-:L<_O8%_+:+=X]=5(&\KMSM(,VTU,3V?U*Y(Y$$?/` +M2<^@&5T98F;0+:$QYD>(/AQRV9P>=#J"QVDQ7T;$/N"<7!*Z=I#L[0[:!ZRX +M5_Q:1+SE??EN']P,1@6]Z3[LFEH]]0(K0W[;<#(G2E;S[P6GU/J.>CO5;<PI +MK6K3>D;E3.C4\,2P@)+`QPO,*M?HOQC3*#ZO]NN0_>NE&R`M]"V@1J(O0#Y- +MP(3,DXUD7Q>/0DYU,[W+M-)TE+EACR4YLDA<UK;=\1&Q-J75LTWL3J-?PI8. +MTS[2!*BFC-'=_:]$=Z=+1?T/Z-<A[D*BAC[.O97C1I+%1XB:YLM?)#LZ];)3 +MIGJO7ZJ(!!O$;T5<<Z4FU6KR_.@C/WN,08*P-VWT4KFZ`Z.G9R:50'HHM>64 +M&O5!K5:7WGRK+!42.4<ZU:V$GD\+"PIH5IFL($NZ0)'6-0=F`O[&R.\K/1G_ +M?MOWV_;$=P/'+&;E^]$]:<9&=6S34=!*5PN+$]*Z>,;+HGL>=FBT>"&-YL-^ +M^:$C>U(FS=+>'I$C7VRI%P]Z66H^9HWLB8XD'1JF7L=EQ\I&9I;9=$JOL2$/ +MOSQ[#B/>7XSP8D2<@\+Z()^DG_J@4;E/A+]/<P^KS2FQ$PP]FU\44GM1S`3& +M'A?O,3?2OO##I@Q;V<"L8H_8.S>ZO'\E0#O;NF1EZ[$7:;=1XW0E_6[&2.<P +MF@Z3)?F>U&MT0@,9>S!C^0Y&<2Q*6K7RYDXVO1YZ,.R8%C'NHAZU!F?'M(/> +MKS2!ES*QJQT"5<P`>K,Q-CEM"3#5*GJS"?[-FE3_-0D^*$*Z(.%7XF1MN=D3 +MNSS]V:@F9CB]T\9]-,/+=C"_WU;V&,.\*M-FQ'06_A$]9U:.#2L\LQK?)MBB +M4>;;Z9TG6,:?3S4R.LGW,=GZF*1V3J`N:=C.Z"0RTREVNQ;A>\D#R,GDU='= +MFZ8RTGXLTB7SON$=H=_^A>P5=6P__NT;EI?,@<!EH#K-)^2"?ILK:*)?'F-T +MK72R[B6M4-SHBNZ&/G[.BN3J+^AWB;P$;9(XE3+2J=0%^F6$:8<D&W88S"9F +M3])NN/VI$QM^SQR^$[X3*QJ9:P5L%I<5E]GW<['^N]PQ[_Q/_*+.&?FX`#D- +MZ58V5C3[VDAKI.7D%>BU7'5#*_6^F34F;ZX856_-P*SH+U\$B^EW;.0OD`]G +M:1_2R^:?,6IZPK>#F;7]R2#M3\J^-'M0].P/!]E7<=7ANA-7+;(RSM8@#VA7 +MIY&?MZ)N-;VMN^YC5B_3KPN1V3H<]&YK7Y)R"[8H]=#)4/57F2GV[[#G:A;' +MOUKQ/?L/@@95*H5$UO=5N5S<Z^12<;]3MHE[K<@0J]F:^,OZ[SD=R7VJ-`$> +MDR:-LXR/Z@\[DN5^Y-GN31W/N!?!/[:GS(W@>6F(?95P92NREO;8Y'L'WM`I +M@><`_/5Z:E4%C0EDOI!1-;^OXRE.;W2UIDS:F`6%4E!H!86O^UC2!'FTRL9_ +M0;W&Q8P<FF`CSHR+[/I^^HL-)6@WL-5ZIKLZ/X[X*/WRR;&(SDW!HP>SI4)M +MW9_K8X9R*_U=DLH4,SA/-:SZJ@-R=!@EM\$T]Y]4,_]9K[W,MN7+<TJM4HV& +M+QW+8THU'HQ4-4"2JY%?Q3OVNUOYXE4YF1FBVI/[NRC?G9>'U_&P<8?4.(*( +M8X7F[\)HJJ!_=Q26,E.S$C4.U-PY4\-9_7:)&WDT-OGN'K'CV)HT14<0A\Y1 +M&1Y2@JY:O2@_NSOMXM$W7H5?!O1'H4PUCXHW2$:ZK]+OA\_LYH5M]#LNHZ,$ +M7*]!YD]ON;7B?B5<(M->LJ"HFDECFK3U\3EFM3H$4Y0MLZ-R!)DG,S@A*6SZ +MZYDT[*$<_-?.\%\]R__93Q$U[A:M)5H+8.Y&:8C=M=V@C['$ARD&G^Y)LFDG +M,K-ZU+T"/'.^1T\KMR2-ZZZR*SRJG]J][J/57^M6X\3NM#&X3OQ2NA7^4)KE +M&A92CWEWE^ZYQFGN`:=]8D_*G&%D[;+QKV#MX.ZK2KELAL]:`F_[O;8]J4\H +M3U8YRFC'T\/(VZRD(^B!=+?>H9\`9%=.&!13MFK"D%P5W;,U<)AD7");0`LE +M08TH7)ZE_?FV^3V#PPHZ+=-VG;_4!UG%>]!8`:#&Q1QRK;H<6K,BNTBSL@EZ +M[_5E5B:7T?M2=,:`57=$_&J;_H9!F<Z#E?HD>$<99&6EV!-ER9^1_T/O^?<A +M;.[\GO.1Z+SS<M8E=F%G_NJ"OC\ZVC$6/L2,M\)CSWV?05]71K;"UH[ETJ;J +M[=/3<LGYO0V7K$-<'6)BG_G)(<;->HP$7K`HP)1X1CDVW!=5'SN6ZT?&V7#) +MICJJAYA<IZY>SX[E^JI5*]WU-K=H*[?NQ>(^V.<4]]M2HJWXG&@SJ(4!.HN# +MR<7^"U9ULN;KZ9Q3^_M)]+FW'%]&[;D.]]K+M"\D?@DI/@57<'V`Z[7>?G4P +MRS+=757]G7T)QKH3VWJWX#[8WYMEK&LPF4QDJKI2Z2U;!]BV1*8K/9``3->@ +M4M67[@9<3P+A@%H&>M/][)N#O8DLF_U;3N*#R8KL>/:YG_8MYSQWT[I_SC.- +MIGS.<Q<N/YO];,)5,^<9:1L+S7GNP;5^SO,V7+$YS]]D-WR^]LUMFY2>_KKN +MNL&ZKKIDG6#>R#R;UL7;.`2230]D,XG./GY;H)I[[[P]<%LU_E<2U)*YS9NH +MO:J*KTVKCV9ZE9XLO^W..V_G:WLRO0/9WLY^OB[`(VE5'1!:D$(;!SJ51!U? +M/L`?2*MTLC"PV=*B%>HL')^J![9M&@)G`XGNP:[T9OY`5970UUW)WE1"/.85 +M=Y?:F<F*TXEOT.-F@8YV39UW:3>MB:I)NW?1US?Z!_LV"TA=A3.8\U1_EW;; +MK`.2%8BRT+<HD1ULMEAB@WU=B0Q?G\[T=68'ZKCWD9Y$)L'E_A6\$_?.E-K3 +M684^`[R[5^G-#E2*[JH?&.K8W-_?S[?SV1*^'^B);$;)0Q55/)G.\$AB2&!0 +M8[IELUZ;WI+M3,W4=X7S]5V]_9V91_,->F5W8DMO7V>*>SM3`VD\)3L'4UG1 +MTI_NK\HDMJ25_M['$MV5%H&H]&Y+]/-L#YCO2F]+\$?3@WP+="FP5:A>3?1W +M\T[^0/.&K9L%F>:$TMGU:#8AT#?TIM+TP#L!M37_D$D,J(DM69!./1K@#V0Z +M^Y4$W]*3V+*UMU_AO?V#D*^P$7B9V4]^ONAR%S.0>ZN^62F(5U4EAM1$9J9Z +MJ!(#RH+/5/J1!#C,\@&HGV=[^Q(!"_.Q1U8REF')]"!P9ZRGCKN7#[@Q0+5S +M2V_V41AGJCN`BP8UP-A`%H!<&(-HXIP&/^<YFX8FM(H!48/I2P^\#2+5*KH' +M^U0:939=QS]'+YN^D>(#`WG,#9LQ;Q[)]$)^R4RZC],DT-@%ULP(1`UQVMW; +MS]);_?R;=&K7KP0"`<9:>]7$@)!6)E'5W9LA'0#ED=Y4BC^2SFSE78-9B#^; +MR'0*[5C$=`NF![,J-0QP-9/NZ>T""]V@MB4]"`9)R&"WDW0\AXU'>K,]9"P9 +M3JH>"+!$)I/.U/'[J6IFC/P!#&PS44XE!@9@9K`L#6E6,AK,K1:V+AYOB>>% +M1H.8(3-`)DF,;,FD06:6BRY2;Z8W@?Y;4XG.@02QFQ#FO*TS-0AAD#TKG3!L +M,MUYI"W=:1YK:>>8R5MZ!,HLW=Y^+LY-Z3@T/S*BU#<X`#M+9,6@>Y./"C1Y +MCF&2'U`&^Q+]6=*:TMG;+Z8)/IU;MI`(>OL'>KL3-W3G[4T$A*"I.C$$Y>2Q +MA$UK8NH7O@?J'9B/O6*@,L#@H&$0"@RINA9*J[I;+T"XMZ>ZER_?S(L1'(5& +M^U=`CND^-96`I-+@O).H^#F1X,E.6!V4_TAGII^LN)^$3-UCB@EC`=B6!$RG +MV\\3G9D4))#(],$/::+*RTJ/&%FH1A@]/$M&,VW-5<\JSD]`?7UDP9KU_U^. +M0I]`^C#F0I.G$&;<F]:\:AXI,`N#NOX\BV+J41#1)NH-*!3XA6_I3SPR%X/I +MEIKOS0\2G5V8R32),VEA`P*.)%PWIU&(_\8^4YW*`*\>6IX:TGN#S&#+RP.U +M`_BZ;35]UR"^SC@T8#4CQL$;$A5!)#UO1#J=>&.8@/3V6=BD`/+K`M1\]L!@ +M'Q.,Z50UWGI@A_UI(A3XXK',<7+"G_V1L6W_G(<>Z-*@$ETSCE<K`7;.)SS? +M^?*U-SKV9J:/!%S-&$!?HB^=>51H=*9?72[TES:^6#!"+OJTS-)`R7$3V0%$ +MVQ3[#_&_1+#X(.W%@NMKY`>WX/_F.EBMR$'K^+R219<S$^5Y'ZFUI>W>CJ;[ +MO[&V)1Y?M[:=554QMAPA2DN\N+Q\8`5YX<Z^KEYE,#V(%&UN:U45M7>G$P/Y +MB?((IQQ`=V66&VAM^9.@`9M)($IE1&B:`T90@_VS&<E\=OY(NV"`)/`E$'Z( +MMY-"'%*U+90M5"]/6[X4&OTMW[+B!JZIZDO89FMGXN(-%A7(:T6DZ])<_<RY +MSUXS9NRE#__<)^*8_QF9^>@5P^(C?<%':]\I/H8O^%`KOW&A\/_E0V?UQ:_] +M1U#%%_]?]&684\X)LB+KM.'?G(^H,XKU)3Y50++Q&^K*9N!F<%?%/X]+']N# +M\^M6]7\>;M50'CK8.9A-![>DL`()/M+9*Q:;6^`5;ZL.XO_MJZJ#M=5T?%SX +MN4]QH6.1P4`E0V%I8?EBO;:X>/'BS\$25;&>+M1Y?`[7&"ZL+6WMN$*H+&'" +M3FT0E*U1TU$QX`H.,/KQ/Y/J<94"YARNT[A>Q?537(!A3^,:P47\T_JW7>NG +,X,K_!F3+/G4460`` +` +end diff --git a/sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu b/sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu new file mode 100644 index 00000000000..83f3f7a0e45 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/unixemul.lib.gz.uu @@ -0,0 +1,50 @@ +begin 754 unixemul.lib.gz +M'XL("&8@[S<``W5N:7AE;75L+FQI8@"=5G]H&]<=_S[I)%\=Q;FV7O"*R=Z$ +MXTB.[3.K`R9TJ68[F:+:EF,/XX0QG2+=G=W)NILL96XP3%G=VI11O':$T94R +MQAAAA$8SI2OY(\1C&VQLHUGWQQAC&6-9LJTT61FA%)/N\][I'-EUV)C@(^F] +M[_=]OY_OC_O>(PK>)**`;98=M]R;(PK>PIJ5S84R_O\=?U?XGM5%BM0N$ID0 +M)6^RUBZ'--Y-K:L728O2C7.]3&\:NTS4F<"NW.&CU]9[EW55WR7V&W?%.?$_ +M.OK.>K2;E)>JG-VH]E;UAW35UWW[(BFPW=I@:=>F5(G22Y"]`]_IV]0>3U#K +MR/58=:PB>7;[/%_;H+;DS2?[>W5*=#J4!.?A0<A2L&T==AG.*6*-7TW8<'MJ +MCUJJ&Q#[QF/)`FG"WW0Z5;7#T%.,L'<&Y\ENY@58TBQB,RZK"8MG9%S@OE:U +M-;%C-^N[LW3OI]-I(R+BK)VSE?CG9-Z4VG+AB(RMTD;EGC<T2QVZ12SUL!6# +M==5N]V6E@VN:U>*O)E;@,3PAN%P65@1K\7NE:H_[.D/O4H?65OND=21%UEUK +M0&@_@%F78+96M=2Z+8TW19O`<--N;=G:*RN'\S@K]A7W(X.4L%>%'?@?@R[X +M=]*-9WEE@,X<?!/\8W1CB5>2'O\.F?^PL!.\(NP(AD(_#GTBEV'_!XWV)U;B +M25DUU:9`J5&B::6#-69KD$4@FRKUU)A%@3$=M:'^13I+@Y>HCSO4KVEVI/19 +MZ(8G+E&_\2XT5!I`52.0#G#-GHGJU(^N(IWIW?@F47MT5R15M1(<,G0C187N +MB:B::K,V)E>^N5Y;L40U(XM,3U"W?ISZ#)Z"1RL"^Y'Z3N`L<[5KETA4(F*L +MIIZSGT@];PWX<>B'VDC_!+HM!@S+#@=[[ONX&E71YX*)YCYI4.`;PKY-="?N +M$#S+ZB*^E&:?`KL^'D=_5IW(450CGB(RB%YMR-B&IB6KR:OZP[KG\]A_\=DJ +M?;:Y##[Z:A=0MQ'1R6O+!4UZQG,;KZA(MM$O_NN'U`UIM_R_Q,*N[B05GG@, +MM0Y'$]$+%'$1`SLO*]S56'OW8$VSVX2%>DSD39IQ/*]62G9+U]9>D5JRMI+C +M*SY'$>=6)ER]!B:28[OTT"8Z\%,).N![$FO/&RH?J\\"V<F8%LV/Z'2@?'@M +M8(U)'H-RS=<"<^'RU_#]6/)<<AU])EA<;F"A&6T-DEN-$L&%5MW#R$ZL%B-F +MG<5WP-KGQ6\W"SYR+LB)]O(OXL=1DRF/5X,T47^JN[PIH^F;$<$C4[=Z%/$: +M+>*<R&$<.202UOU3(]>[-_Z$&3M6P7OB`PC%X\N(PFB(T#W@;\#O@%\!/P=^ +M`KP.7`"^#^#]$CH%/`%T$2G05>!=>0-X`5@"^@`.[`5:X.?WP%7@+>!5(`], +MX?7U/>!%`#8#3P-(5^"+0"O0#%IW@?>`OP"_`:X`X,)>`\X#J\`X,`ST(P[H +M$WS1VP#X$VP3;!-L4D*\+Q%G!+S!-P2^(7`)10'X"RG@BOB5?P-_!7!>@5P! +M+P7Q*B,`8@Y"'H0\^&V@"K@`*A6$_^`^(`PW=X!_`'\`D)_`&O`\\'4`?`.] +M`+@P^&/O`\@Y0ZX9<LU>`8H`_#'T/8L!X,B02Z8!X,_`E>"#P(/^#/P1^"X` +M3O0M8$&,9`"^"+DA^*-V0#0#/L';@DPFDSF=G1?O7)$7J@'JLW)_>B@]=<S? +M1YXH(O>SA8*3RY+7+Q23>W/FW)QS1A@)`J@_B2F>@"P(^[B>F,4SGE-QYD-Y +M9KY<*N;F7&\O<+?.9=8Y+?6:4`OD+H080E]"SE%/1>06,09GY'G++<T6RU9= +M%_T16@1P6H&.@GX.(B?!@N\K-U.JQQ)"_,H/A=.,=W$2^Q?J.?E7/09*CW]A +MDA31+\'WZ_<J\!L].O'YH\AE$-QHA.Y_1%R4&4]/'I_.X.CQ]%@F/3%\=()Z +M>HCVS^/A=\NS3I$;^^</\-EYGIT[/6M7G,I\\U9I3LCSCCE?Q-01J?XJSQ9Y +MMF17YLQBN?GCMDKF5RJS)7-^JYK0JA1+9LZQB[-GS?Q6!P^4=_/<3+:4S97- +M$L\Y>9/W[7?J/G>TUK,_=V`;)['U`%*RYV3>H8QM/W%R/5O,BZ7BK\V2K)>* +M=2A3+U2FX!3MC%,L/"./1NHUVZD^_\0Z7/<7WG9>,IWW#@O[2GTK`P[F`GW, +MMKQC>VV_TQV;++[G1&+SAEV0D+,XN4#,OXN(&^[)1,,]7,'=-N+=O*?370F\ +M>Q2^VU"R:RZ-7.?R1GRB4;\5^O+NKC?IN[WW5Z=W:I<1SM)'B^+<YDVZX<:_ +MI[];IPZ<YK@CAL7)+M)##7Z3;OYRU=%XJ$1\U`AHZY/5_(=&;^<H;N\_ZTB> +M?"$6.KGTXU_FE<'O&!^DEIX.+-!;SQ5:^'!,F5CBZN`AE8SWP!TL[MT5++KO +M;&=Q(HT(Q&V^_:G;]&AG@=KY+KO+)7A7^9=)^=&O3[>X#*N]WBK?TC'IW0FF +MTYTIX[?QIZ@]M6PIN%$@BO&J3O!5XPE^D=H_/4H*;K#J=!IWW';^$/Q7Q]/B +MS59_MX6\-F.82PPS@J'1V&>PU_*`.0A])N;D^?H[HUOTTK:9*'0X?C&GQ46- +M\*ZCYFTS3,R$1[;-*K&W5^Z9"[/E^[-CGS='99?Y,_=-X(C<+YF^0.B6/2Y# +MTZ.//^Z??]WS4S+-39OL%!/S%[/9*3V3L2J%PN;SMK#IJ%/J+-QW@,^4IY/S +IMUYD6^8^:_T_9J4ZY%0*>5YTO*F6RY9-[C'K;2;_6?L/(.>0)=`.``"4 +` +end diff --git a/sys/arch/amiga/stand/device-streams/util.c b/sys/arch/amiga/stand/device-streams/util.c new file mode 100644 index 00000000000..d3bfeb0a683 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/util.c @@ -0,0 +1,342 @@ +/* -------------------------------------------------- + | NAME + | util + | PURPOSE + | provide some standard useful utility functions. + | NOTES + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <error.h> +#include <ctype.h> +#include <stdarg.h> +#include "util.h" +#include "string.h" + +/* Utility functions */ + +/* string functions. + */ +int +string_to_number(char *s, unsigned long *num) +{ + char *ns; + int base, errsave = errno; + unsigned long res; + int len; + s = stpblk(s); + ns = s; + len = strlen (s); + if((!strnicmp(s,"0x",2))) { /* check 0[xX]nnnnnnnn */ + /* Hex number */ + s += 2; + ns += 2; + base = 16; + } else if((!strnicmp(s,"x",1)) || /* check [xX]nnnnnnnn */ + (s[0] == '$')) { /* check $nnnnnnnn */ + /* Hex number */ + s++; + ns++; + base = 16; + } else if((len && tolower (s[len-1]) == 'h') || /* check nnnnnnnn[Hh] */ + (len>1 && tolower (s[len-2]) == 'h')) { + + /* Hex number */ + base = 16; + } else if((len && tolower (s[len-1]) == 'o') || /* check nnnnnnnnnn[Oo] */ + (len>1 && tolower (s[len-2]) == 'o')) { + /* octal */ + base = 8; + } else if( (len && tolower (s[len-1]) == 'b') || /* check nnnnnnnnnn[Bb] */ + (len>1 && tolower (s[len-2]) == 'b')) { + /* binary */ + base = 2; + } else { + /* assume decimal */ + base = 10; + } + errno = 0; + len = strlen (s); + res = strtoul(s,&ns,base); + if(ns == s || (res == 0xffffffff && errno == ERANGE)) { + errno = errsave; + return(0); /* failed */ + } else { + errno = errsave; + if ((len && s[len-1] == 'M') || + (len>1 && s[len-2] == 'M')) { + /* result should be in Megabytes */ + if (res <= 0xfff) { + res <<= 20; + } else { + errno = ERANGE; + return (0); + } + } else if ((len && tolower (s[len-1]) == 'k') || + (len>1 && tolower (s[len-2]) == 'k')) { + /* result should be in kilobytes */ + if (res <= 0x3ffffff) { + res <<= 10; + } else { + errno = ERANGE; + return (0); + } + } + *num = res; + } + return(ns - s); /* it worked */ +} + +char * +stripws (char *s) +{ + while (isspace (*s)) { + s++; + } + return (s); +} + +/* string = fgetline(fileptr) :: replacement for fgets. no length limits. */ +/* ------------------------- */ +/* fgetline function returns a dynamic string of any length. The string is */ +/* the next line from ``fp'' arg. Returns NULL for failure or EOF the */ +/* reason can be detirmened by feof() and errno. On an error that is not */ +/* EOF will flush the buffer to EOL if possible. The returned string has */ +/* the newline stripped. */ + +/* sorry about the asm like comments I wrote this for a school project and */ +/* the prof is decidedly in favor of verbosity. I think the code is clear */ +/* enough alone, and most of these comments clutter the clarity. Oh well.*/ + +char *fgetline(FILE *fp) +{ + enum local_constants { locbufsize = 40 }; + char *retstr = NULL, *temp; + char locbuf[locbufsize]; + char locbuflen = 0; + + while(1) { /* do forever. */ + while(locbuflen < (locbufsize-1)) { + int ch = fgetc(fp); /* get next character from */ + /* stream. */ + + if(ch == EOF) { /* check for end of file. */ + free_string(retstr); /* free_string retstr */ + /* if EOF. */ + return(NULL); /* and return NULL. */ + } else if( ch == '\n' ) { + locbuf[locbuflen] = 0; /* got newline null term. */ + temp = concat_strings(retstr,locbuf); /* and concat local */ + /* buffer. */ + free_string(retstr); + return(temp); /* return new string. */ + } else { + locbuf[locbuflen++] = ch; /* add to local buffer */ + } + } + /* we need to reset out local buffer. */ + locbuf[locbuflen] = 0; /* null terminate. */ + temp = retstr; + retstr = concat_strings(retstr,locbuf); /* concatenate locbuf to */ + /* older string. */ + locbuflen = 0; /* zero local buffer. */ + free_string(temp); /* free old string. */ + + if(retstr == NULL) { + flush_to_eol(fp); /* flush to EOL on fail. */ + return(NULL); /* and return NULL. */ + } + } +} + +/* flush ``fp'' to end of line, if possible. returns 0 on success or EOF for */ +/* error. */ +int flush_to_eol(FILE *fp) +{ + int ch; + while(EOF != (ch = fgetc(fp))) { /* loop until EOF */ + if(ch == '\n') { /* if newline, return. */ + return(0); + } + } + return(EOF); +} + +/* Concatenate 2 strings into a new one. Both or either of the inputs */ +/* ``before'' and ``after'' can be NULL. returns NULL for failure */ +/* setting errno acordingly. */ +char *concat_strings(const char *before, const char *after) +{ + char *string = NULL; + int len1 = 0, len2 = 0; + if(before) /* if non null */ + len1 = strlen(before); /* get length */ + + if(after) /* if non null */ + len2 = strlen(after); /* get length */ + + string = malloc(len1 + len2 + 1); /* allocate storage for */ + /* new string. */ + if(string) { + memcpy(string,before,len1); /* copy ``before'' */ + memcpy(&string[len1],after,len2); /* cat ``after'' */ + string[len1+len2] = '\0'; /* null terminate. */ + } + return(string); /* return string (or NULL) */ +} + +/* free_string() - frees a string gotten from misc string routines. input */ +/* can be NULL. */ +void free_string(char *string) +{ + if(string) /* if non NULL */ + free(string); /* free string. */ +} + +char * +alloc_string (char *s) +{ + char *d = malloc (strlen (s) + 1); + if (d) { + strcpy (d, s); + } + return (d); +} + +int +ask_bool (int def, int other, char *f, ...) +{ + char buffer[20]; + va_list ap; + va_start (ap, f); + vfprintf (mout, f, ap); + fprintf (mout, "? [%lc%lc]:",toupper (def),tolower (other)); + fflush (mout); + if (fgets (buffer, 18, min)) { + char *s = stripws (buffer); + if (s[0] != 0 && s[0] != '\n') { + def = (int) s[0]; + } + } + if (buffer[strlen (buffer)-1] != '\n') { + flush_to_eol (min); + } + return (def); +} + +void * +zmalloc (size_t b) +{ + void *mem = malloc (b); + if (mem) { + memset (mem, 0, b); + } + return (mem); +} + +void +zfree (void *mem) +{ + if (mem) + free (mem); +} + +struct Node * +find_name (struct List *l, char *s) +{ + struct Node *n = l->lh_Head; + while (n->ln_Succ) { + if (!stricmp (s, n->ln_Name)) { + return (n); + } + n = n->ln_Succ; + } + return (NULL); +} + +void +verbose_message (char *f, ...) +{ + if (opt_verbose) { + va_list ap; + va_start (ap, f); + vfprintf (mout, f, ap); + fprintf (mout, "\n"); + } +} + +void +debug_message (char *f, ...) +{ + if (opt_debug) { + va_list ap; + va_start (ap, f); + fprintf (mout, "debug: "); + vfprintf (mout, f, ap); + fprintf (mout, "\n"); + } +} + +void +verbose_debug_message (char *f, ...) +{ + if (opt_verbose && opt_debug) { + va_list ap; + va_start (ap, f); + fprintf (mout, "debug: "); + vfprintf (mout, f, ap); + fprintf (mout, "\n"); + } +} + +void +message (char *f, ...) +{ + va_list ap; + va_start (ap, f); + vfprintf (mout, f, ap); + fprintf (mout, "\n"); +} + +void +warn_message (char *f, ...) +{ + va_list ap; + va_start (ap, f); + fprintf (mout, "warn: "); + vfprintf (mout, f, ap); + fprintf (mout, "\n"); +} + +void +vmessage (char *f, va_list ap) +{ + vfprintf (mout, f, ap); + fprintf (mout, "\n"); +} + + + diff --git a/sys/arch/amiga/stand/device-streams/util.h b/sys/arch/amiga/stand/device-streams/util.h new file mode 100644 index 00000000000..cd20df60677 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/util.h @@ -0,0 +1,67 @@ +/* -------------------------------------------------- + | NAME + | util + | PURPOSE + | header for util.c + | NOTES + | + | COPYRIGHT + | Copyright (C) 1993 Christian E. Hopps + | + | This program is free software; you can redistribute it and/or modify + | it under the terms of the GNU General Public License as published by + | the Free Software Foundation; either version 2 of the License, or + | (at your option) any later version. + | + | This program is distributed in the hope that it will be useful, + | but WITHOUT ANY WARRANTY; without even the implied warranty of + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + | GNU General Public License for more details. + | + | You should have received a copy of the GNU General Public License + | along with this program; if not, write to the Free Software + | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + | + | HISTORY + | chopps - Oct 9, 1993: Created. + +--------------------------------------------------- */ + +#if ! defined (_UTIL_H) +#define _UTIL_H + +#include <exec/types.h> +#include <exec/memory.h> +#include <exec/nodes.h> +#include <exec/lists.h> +#include <dos/dos.h> +#include <dos/dosextens.h> + +#include <clib/exec_protos.h> +#include <pragmas/exec_pragmas.h> +#include <stdarg.h> +#include <stddef.h> +#include <stdio.h> + +typedef ULONG ulong; + +#include "protos.h" +extern ulong opt_debug; +extern ulong opt_verbose; + +/* Macros */ +#define copy_string(x) alloc_string (x) +#define ptrfrom(st,fl,p) ((st *)(((char *)p) - (offsetof (st,fl)))) +#define valid_mem(m) (TypeOfMem (m)) +#define megs(x) ((x)/(1024*1024)) +#define tenths_of_a_meg(x) ((10*(((x)/1024) % 1024))/1024) + +extern FILE *mout; +extern FILE *min; + +#if defined (DEBUG_ENABLED_VERSION) +#define D(x) x +#else +#define D(x) +#endif + +#endif /* _UTIL_H */ diff --git a/sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu b/sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu new file mode 100644 index 00000000000..ec129057b13 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/xdevtostream.gz.uu @@ -0,0 +1,298 @@ +begin 754 xdevtostream.gz +M'XL("&4@[S<``WAD979T;W-T<F5A;0#%?`]T6]69YWV*++\HLJ0XPC7&8RY" +M<61%EDPPP;B&RK(3A&++1DZRID!Y=BP]F\C6JVP'P\FFLN/\*809DU*&=IF> +MG#F<3EH,N!FFD]7F9)PN0U.FY80TRU(F"Y1)(*4I<#(<3B>3QOO[[GNRY00Z +MV[-[SLIY>O?=^WW?_>[W???[OGOO4QA;\J],_YB,N\38\E\Q9KZ>L26_H7+D +M@QV7/1$/N^O?J-D_QLQWHN0HSS#>A(I[%%/UL;N/SUVJZ7!$:F*.4/60Y.*K +MV;1J.[N7A[B7U9_=JUBX8^HYUNAV[,]:QH&5K6EV5,Y,EQSHV\C])0<L65$7 +M<O2[F\"!%'MAKC&:59ET$G5]\ZV5)X#A9K8AYF&NP7+4**!SW_YI1W_S>4<W +M'X^]\`>/8@J$PM..5HV!%JMCL1<NOT8\M5R4'M7P](<W@7<P:='Z%,;>K]G* +MGG8T19\#OXSMX%O9].O'7S_N[F?.7_[LES_CI@PKO;;F+D?;B?&O94TAC#+D +MV!CY(!1:X+/M'9,IFDW*FBO(P'$9#P&FDYNZLJ?&EQ]B#*4)R.>SY4<8IS+N +M;FY:_B/.N'3WJW._=^(Y*"O1YM^R^\!KUKCO`Y76(/.$N(]YU')_RG&0A]Q> +MAA','4!;DYM*$SP%*#F2<I3S?N:IZ6=F1ULLYQZ+Y?P'-::8>9"9/2E'9*70 +MG"&YTNBTHUNUD<SNF78H)+5`E/L=]:J9AV)3P._$]21J^E6;.^7H(UST%@!> +MJ\J)%[??T:12W?>-MNV`:P7?NY52J@'N1E5&72?AX7X0;;W\^K9WOK$C-MJ7 +M'@ZD!GHS/9F'V?<N,4_D@U7U@2!K]:599#L+O\B:<#7@JL=5]^U7Z[8S":.D +MGG*M_LZ.YO,EK]1$').X/XO[WN@>E9DMD32KBZ18*NB7XL&28'$L=_U]'1\S +MEX_QHCA9TQV\*/.5J7&U+_,E?&_,V/#-V.2FK/I@%]K9SS<1E!WE\/U9M0WW +M^U!31K5LG_A^#75VE#+*?DVJ"9FKE4<U*1AB3;@:%#:W@VH=8RB-S-?7XRE9 +MD[*>=F@HW2=*(RC%12F%4B22,ON"?NOI6,ZYN;,#UL3FZC5INXNPB0I@/(+R +M=I0J`%UE0'L-:,MBZ,N?`<9MP)AUF,OO70%S$C`5.HSC70/FZ!4P+XA>LR@] +M"]VGDE7`@8S-@5BNZ5)G!]HF,9-<"C,]N@XZB4Z;J]5R0&Y72P%5'\M=\WYW +MARZ)[:XH=*K:@M=`/R^AY>?H$QK6:\QEJ,F)FB;5PBV@V!#+6<S5(;Y,92;P +M2>.A<1//#@W72'!9#S/_!!HN!WT_-/<>K#*EVM'S6%`"AU_M[,#\L9(?"?I8 +M)>QAJEN,4_J>%@..E_A-/LC3S,^]4I7;*[EC.>\I-PLW1YK/??/=O6?VFN![ +MELQYV-F)4]E3$^\^>N;1H"DH!;T2C>\1\&P!=E/@H%2%N@I<9:@_&,NY/D)] +M!/5N/$/"KK?!)^<8@1LCB7P,[^'!MXGQ>#9I,S@H`T^>^/C\<P6>.4:Z/0A' +M@,N/JZ&'25[0<I)_9.]B?E2*43#V*.:ZQQUDW",]F743A0%FYR;XC%`LM^HR +MC2;(\I3`U7EP%2%*S>>+8IPD9^*AH`S,NF`-C:^H&C/N8>HSEBM=2S.)9-9\ +MWO97<AUC,E,M&7XRJYC<3'OX4#9I%WJN5"SZ'9JL5+UY/D"%X_(&K4'P@\N+ +MBV,LC/2G0&I%FV.Y%8>[.Q0KRDF43T%7L#G5%;3&<@T?&BVPG!6Y[H[@LEC. +M_*P.D;1"1I.`>06VQMK>\9]Y&SXE-AKYH!C3BG%_D%7"NY3#N[B.[M[B"EJ" +MQ:#T'BC1^&WPDW%>*Y4=S2:<[EJIXNAXKWQDO-=\)-L'6[)X"(XH*_ZCSTME +M2<N1YZ4*M2JZ2[6AM1>M)O!&D$<@I\\$I$F3VM[A[\9&@W:-94*_^Z;N)2^_ +M)C-F4\V:!`CF?R`V"N_GBGQP:SWXC(#/$/ALJDX+3]@`Z=>%_R98'"R)Y:RE +MI"G#FE^"'?F@Z;;]N^+CL`!OL)GYW19(O2Z6JT8<BN66=T)&L"9`9V`7;;EL +M+\+5U*YX%GAUA[);S`3=P^84,1_JA0W%>!&UGACORK[W30^T=6K<;3H[?G*B +M6CJ[\XWQLSO)'OD2P/AC.<]%PYJ*(JEB1=?`F@\#TW1?VT_6@G[KW)98;N6$ +MP"L2Y6V&!8(\Z=7Z71H76>VAK%H)2I,&I0,H[\8X7B,-(5+O)VJOOVC,V=83 +MN[IH)%Z/A)DY7FT"?Q-7\/?5`OYF#*I1G;];C@MK7H;V>EA#D.16/V9P`NFH +M\+'%IPP<V&;Q&^"D57`BOX6(!'\X3;3A75V1E&S2(6\Z+R!@I3+BU'(7-(`1 +MRI_".IRD1=1[@7&)H&"EYV&E+F$!E13_8`&=L(`V6$#$`PN`%81@!4W!3:P> +M_J`^.H7Y_K[&GI@-1I@77K$4,ZB2YL%U%W3OS8X`SAOL9W96AU*=P#AH8'BT +MN:-9U8I\S#NS!["3`LY/G@9P(P2ESUO`<EB9BV:J5`KJ3Q)UU4R>1IL[DE7+ +M@</A*\N.C"=D#[S4D8DMHC6'6$EMN8-21:\%WV5]%HW-^P(+-,@5#_48[&1^ +M99)X1*F.8B&-$&6*E:[Y.5P9&V7L[H[(!S>LQ5RPQW+V1[KAT3%6T(5-/$/R +M;9*[.R@CR10AC\GX0NX2>AK!;/M#S!?B)6I%L`1^9E+,ATKU7;*['L;>[NQ0 +M3@D\@DQI<,1/S%9'HM]2PSN85GPTVU<W/_]64^RP3)%]@$8Y),\H]I@L@1<9 +MC^6*2SL[XGN45T&CBV@H.6YM>R<UV=D1&R7NV5KHL1*MFX0F7!BK"S*/(T-% +MB=_]Q*PG0G4G+C&[X2<NB[@'2?`-P)$)JX<MV0=+>H,@2?.Q7,G3Z+\<=T2U +M8)2YE.^C5T:]WD.]EL&"A,^#G<.#E&2%E6C!9;##^_#\+,8'[DNJR1XQ+ANT +M'"9[LI$6G3=`6KBL+>>8/?#-6*[Q0'<'ZFW1@Y"BTQWA[4;F9X4N*C$;;*!E +M(<\,^AGHRM79H<WIGK"?=1NRD$@6O+H=&;<95O@T5@J59[.Z7V./NJ,ZS3]\ +M"%X>0>8KG\VZ?<Q\=IPWDPSB>TG^5'*'#*B-)$.C3%(LMTUAM6#=TD26/G60 +M>0(LO@=E&^*@*Y;CG[F1%_)/`@QU9E"GI_<"S+:'<<:VD(VZR#=#DEF29.2# +M)6;,2"?)<3OCQ5U[:"Z<_BOE4VZ!AY_59:V/"O)LC>66O2$LS:6O7\!1I3MT +M8S^K9+SY-XB#<BQWVV;B\X9!9F->?#N97YN#I#V1,1,\][*G.DG.+I)_TA:4 +M8;M/0N],V@V[[#N1/9I-,2G.BW^=/9'-VP)APB:AY:(H6:DM2PLZU1.LA<76 +M0KNU#&L$^;N@_@)LQ@.:(8(#U3IA@P.LTC85;^W:`)U\`GN#;!`;C,R1_43P +M<R>RBPA!0G*A&Y$C4AE2C=S8S!J,^E;4-QGU3M2'>`VK=]=0!G']=MR;<!\! +M3!W!P+(.K#O'#MYYCAVF'O1,Y?J-X5`D=&XOY0<B3\!<@R]:"OY?1;SX"'Q7 +MYGG6YF;(&M%*<YP=%I*KI'E$$'G[5-R&G'1ZB/U+X=>6C0@)6#!SV>6#VAS! +M@)HG69G/3@`708_;:9:#NEWWVZELM[`+5@:OYE2;:*X4SESA<YP:JV[_RUGA +M)5JAO;<(2I^U2]\#/5CBTK>Z.VAFZ!:TBBS(2[XQ0/D1K'+IGW=WZ-FO=-'( +MHBK]7L,',^EMK&HL9+U5'LBG6-?^DC8:$_Q\5:'F@Q:,!!G5TD,4]:#SO[9] +MJ[,YOA%Q?S]P5Y.N_U"NZUKJLSU'\X=EMS"I*3(F50//+"R:"XNNY"&,MA26 +ML$$+G=UKS-<I\ONHWR\\&976@F=^8T0J=3HCV<BL/_*_9L,!&.X/I%(^()7> +M&&'6&S$J9*A8WV*.PWO\V5=QAV3^+'YC2"I#V1L?YWI+R&AIZ,JBK<)=(Y5Y +MV)/C\8D;PU(5)P]!]6[DK56X*G"5Z3GLTN\C`N<HNBQD^)47_GB&'Y@0&3XR +M]Z4G@;V=,G??:N:DD=V@\XQOP\KXO)6U1E)6$Z15"7TWB"B7MSC(W^I#BTE8 +MG/NJM@?1R_NZ-?J+8(U5Y(6+<V0?J3-D;<$26(=,&BY&SNM[@.(BLMLRY`Q> +MY`P>>"A.,08>"/&@>*-N.4DS//.0H:%D-=899(^L3V2HFWD7%Q%S50B>6&^) +MBI8FZL=2VMV!%MEHJ1,M[E5W,MNJ];`LJNNDM92JMSOUK)<O@T6_*V:'!?S8 +M,!/<8F9J?)"9#4Y2?!.^E<#S#+[0<HI&J3#"D0C'N6,.6&NCSS-7L@Y8,H<5 +MNX'MAD4;<ZRUBD7V1'Z:E#5I-3RM(E-N$P8&+P:M[*+^UQ`EU>^>[_^R/QI* +M.ND996[<JXW['40ES\^2>LB60[:5B*0>T"OW`&KE>N99>2?SK]S`O)"W28RO +M6\P>"RR1(WK,(7^9_3^FL$10*/L""I8[@JQ"1!^2BU^,II*D>=.=\(,+HVJH +M9)'=D5<4*[4MW\[FV/44H919LA7R,$$7>/""DL?O=SQ#.E[^F2\4;$>VUQXM +M3U[JVOO$+[RTQV*"13XKVDOU=6;2MO'QC<C@=E"\&`&$!(B#!.'\A'PBK,"B +M>6:N2=KBC\?S<&W12;7.>4MDCF9_P9K1GJ_+\!/CBCS_U#\SKJ[5I,/9]-K2 +M6R*7(^.18WFL<F#EZT;XR0E%GG_J/S21M%!_[#3U5TK4KL:<6X2I/Z4/3:CU +MZ*W^3^@-.$GS#ED9^A/[ZLWWY21*5\OC\B)YZ$^],^/HRZ28=EC#TXYG"G6$ +M"`:_0_)WGR/YPV0P]W_T"]6NS>6RR5+-/0.,I+5FO>,9D2<?IQ)XEK7V&?`$ +M.))S=:;]$'I+5MEV,>:8Z[5&UH77_687X/]<<]>$#-Q]A6-M(;YO^J-CW6J, +M-9(?21[GCXQU*\9:;MNU9&YNKM?RZUUG=RG6>0ZLU;N0DU6Z2Z;&V][Q?KK@ +M#9W7%$AR":B;XX\K'_(2G[ZJ]M+L`USH+_\)>=.JHRP5)XFM=&.U@,@9-[RA +MY!*>JT^S'LDFN;,XD@W?BA6YR)HQ*R<\H<!CN'^$S,*JW,&+X\6E+#+.+==G +MG2[E8![>LV$>H[,ZM(,%'D4I!YQER4DQNYW&SL0L5C5>X>O,Y)^((P^R=V2C +MQ7&LSC3KT6SR0[%_``_`L[H/P;RM)-_Q[5=W,.2@):IMP1H",C($&]]@//^3 +M7^;%)W;'L[0'4+6V6]__JN;%O-T=54RE;W9E^R[RZ.L_1>ZP03$Y?R6>@1%> +M(S-:M9#7T>6+?D3$J9S4(PY\JDOXU/F^N:SW\V>O&9F*C%XVE+Z9O$1QP,OR +MNQLWNN`%Z^`%_1L^9@W!$MI1TE?,;O(P-D.'TA@#A>(,GQI')"FF^=&/&K=% +M6)C);4%49O`\/S1P=^AK^967<-\+KU0*'6!][::U?7F4=A/2M&KZPTGBSKE" +MM66L,Y)JT6-',S(A=R1Z+4;RS6\=YTN[LAGKH5MEETI[27M[V.6O8;6#:.)] +M65^ED\8P`AME9I5O0R*4Y=G!+>/MD.,Q(<<276>+Y7==Z[S\2),D0Z=G4W0_ +MUJ4^9A7KK37"]YMA83*/>CJ5]X2M,*(4G7:,J>X-M$(CN=GTL?.W((<?Z^4; +MMHD][@<,Z*P:(&BT'S;:-P<>!Z;3P#R`EEFCI8DD-8\YIM8OPO^)`56V"%]! +MRZM&^=("_E4<-@#NYT;YU`*'!NW7C);<(MIFM+R1YS-/F^P.<G.*^8*5K-Y^ +M_9N`?=.`I4S>I5L<8_]PWE&98"ON,#0F\)S7J"(+G=D#*9<@YW]<.4\R)FT9 +M\';,-)<1J<OUU=Z1/2GKE_ZN'U88WZU<`'W,#>Z8VLYL\*_`*7TK\L$-I$\7 +M]SN>GIIV/.EF9\<#$MF(G,&,\.LUO/WU8X$]X%WNV4^0^3HWVFG_RMW^RY^X +M_=9W]V>Y=#8;R&(U@U7?7#_AGYBVO@O*3Q?0D<G/S$4Y,-QL/]I^B9YI502/ +M^32XG#2X;#"XK-=/6+Y"N8B"$;9AA!O!=6=XVGHZ"OK)-MKEM[Z+.$.G3D\2 +MG=(5([6'3$GKB*DF[)B*/Z9X1U;C608,/55`^N=@VVTB![10+>W[`G,*-K1/ +MM?*48U_4B?7$F":!CZGD-C%RC.A05G7.H%?,-'C&RS/(EFTT>L1_<TVSXTD: +MU\R>U!UBQ*/E;*3V)6=2QEI1BBY/>K'FZE8K\VV9U8><27O^*;X7/5KBH*WD +MB`J-@^Y8#\4(!CS_/GA+.3Q6F=C32C80[!?P54Y\'<HF98/2D[S875S3O$`5 +MME0F-`Q\X)I)@MJ<PLS/ZIKY'.[7NX/$?34[NY./-K!MJW\,[KWL["0?C>C< +M>Z(D*XN@<Q_1(0X)O@;PUM.:A/K60OKQO8*FC%[,VR3%M(V]_M]K(I`]R8F9 +M+E_%BXUX>6FYZHKN1A9LM&BK9Z`KTXD@M,9"A>=OR"Q"3B=\Y^WD.Y'=A93S +MP33K9JV/4-;1RIUJ!AR$8(?[X)_]^(9\KS'K>6&R#;$[!/O=1[!!VCV#AW8] +MU=T!'`^DZQ+UZUB=<5H68?6*FTZ%$)W1PNJIS3A1:-"<K[_(6N.[E-WB)"E, +M9T7))ECP&;4J/T[2;_`::/I2)%4""\5B[&/A7_:AWZK7P0E)%-'X*PHS713G +M3TSR8QU5)VP!HXTZZ4S033NN/V!FU;8.\JJ)6D\C%WI%]!4OD.FE^%ZM%K(K +M"RZG7I=5Z+U>]YY8S7D+(?5U,.`$?\LB!N1AL1,M^%NQ@_@S>/N:)M&J=>8@ +M5F=M-#\.[4DY!8_P$36C,JQ!J1?\5%!-\!;YDJ"[S:"K+(Q[174!78M1A_4= +MU4("]ZETAG4?WZ6ODIFLVMU>Q/D0'Z<,4#IEU-M0/A[=K38NMK],[2&G6EUH +M26HYS7YCO&*G]&)*S+<AP>_FQ?A"?N7"<HC_9W3^*PX("?H*80V*PL8$[!$# +M5OC_YO/+3I-\R/III%*EX**<GJ\/L=5Y;NBYA_W;6YVTI^$W_)29,.')K*5! +MMGJD$9XN)G@-BV=^R#1H&?D&OBLHQX6=4^]OZ[U?^YG@M'RAQ68S6DY3"_'" +MIK1&6O7/>)F4?`3?IF25+B/56A.Q"KX5,_GC;_VLYB['/JS.!5\%K2'#Y_@$ +M7Y7.X/R(J$>_T>.#>H\T7L5.>"2[&LC.>IJ\>QX+V<4E_8Q,1(IR/5+8K(B9 +M%`.=^1@8_AOZ$U&W&#+[(<5D1)@LQ=E"S&4GKL:</^=9II_%_UMJ`7L1[I-7 +MXM(*\RKLP.*^[PX9V)LQ^HWZZ,M3A!G+?<E'WH=ZN2</55>8OZVHHOR-]G&1 +M"YA[#N4S@0*JS.!)9&OZ"9SSTT[DD0)KF6)!!-Y.>/.C,7("ZRN1#QSU^3T9 +MQ`Q++&?M];%@42Q7^GVCWXC6E\NFG;RH,'M4`M7MB/#_Z(G<\ZBWZ)[)OW^U +MSQS^+\KOHY,/FL;8X5TI.V_UFN.37`[?(C/E(\IC$*<^$[GB)U=P$1)[[?1. +M124RKA75*9N&_-RG,?0N\ZW,_*-?]&(5&*43&_'49_=T42[JA&^NCBHG:S;8 +MM.@>L8.$470BSZ=8#9\P;=-N:&=F1!&YNZ,F!+I+T;_8*Z=]AF;QEE!@+WIY +M&,NY2[&I;G$>\?GU]'9*Y`-NBN5*/N0DF3)X'MDOWA:9\T:SFX^-L"<E;FI[ +M)V36][R6?,F7<AQ07-6;-->)YYG9G3^%"/@V\)+D.5CY`:4-,-/:,R<@"V1A +MM0RQV3%=,\AD1V6@EM8&8O:%;/WT-DRBE'?XY>;?,9NQ/^4)K'=OX,4%[[Q, +M)U]H>^<<97]I]$BY/2R)UC4!5GV7+Z*LUYCSFOPJ!BM1:X:5LA&^?T(Q4\DO +MH7W%Y[=QR]1XTAM_//Y8UY[H'E6.7J.:HRN2+Z#LI#(BOC6Z`O<Y_53"^[*P +M?X,/C668L[ST6AMC/8-6?#\R9#:CV2:)9TD\2PPKJJ0Y*B5/Y7$U1JMRIQ/K +M<GWEO%>YP&6A#YG:8YOF/G5W9*RQ7+'+TLSJ2H]!9I_PI<Y?_\//DA?#SJF_ +MB-TO:"V"=S-3,RO6X=_?^WGP=3>MN;G^EK6W-MS6T[NE+Y',X]_=X>Y80]B. +MTG]WGCZW-WFA`/>;NFWEQQSYH(Y[(I@Y4K5D<[+5JHSO6LI^XA%G.49?-U@! +M22P=<B&W'C\Y<7(\NB1I/IE5WMN?5=YVCW-YZM&N;-L[9INN3ZS6(G(M6\*N +M2]9QO]T6RSE,JT/,C,N9M&HVL0\QIY2M3MEMS*7]Z['G67GX>6;#!?GK>[%$ +M!W;L\D6JVQ5.VOYB:R@[!OV>IK6BUVS(T`Q\V2UL:NU:O^1COD@LMXQS^`SK +MR6K]O+.,]G'DU4QBQ4E[S79,IG<<7"M"[2'4%K%BU4Y[=^138CGI4'<':BVH +M=;HMO%V#)I=UBY/3"O=J)GM*JBW&+#OA8_&L>A\O4H:JK9Z2IR:H/=^&EO`S +M.WU1JFN^R#9ZY&V24>_#C)'<%J)LO4R[#,G9*RG'R5<N4<J,Y^V0)(_EJ@[J +M$FU[)Y6*C98L&C_M4]X*"008G5B#<B6GDY#7R&LF;5J9H0O&CD!C#))P"4F\ +M2Y*8;SL`'\!IO]5="WZ6S?/S!HTTZ2K@I,K`245WJ3(H0EY8'Q8I]WDV_(]_ +MU$IF?'-S22M1$:-^@X?=11J]BV$77KSJ3DA`L3E79$J0&YLJ9N./_?VKB4_$ +M3F_)=Q]S%_$-6@6X?Y<\FZ!KANT]AG&?S_L^C%E&GFLCZ[G5(MY5P=B!XZ%Q +MRV^(<5OGQ]TM1E;4M5.,+#^NHVX:5VE^7/.2\/$BRFBZ],NF5'"+4L:E$[L5 +M)^&+4W)6;2(*;>\HY_.V2/OPQ(-\0/`0%SR0_VG37+/PN!GGS'@2ED]S1&F( +MHD:T!O(T0>\T9%D,VY/Y()W>5#;2'CZRS!!DUXAY8R9/1OOT8E^:3K[\.]CU +MVV';JYHOSF61H<V@9UZ=LKL\&[8SQ>+94!V/[T8$LXASXT_XLF1`<Y)-&[.# +M<M.]X6^%T0I+M-1LL+L4D^<QG]^.G-GN5$P^R^)]*^!6K@HQ6]*9L6'5^8RF +MDNQ`93UO=V]E-MK%TI;,OLCJ($-Z(Y`;EUVII/=>BV5J4\6\E.P[),4B]FJ7 +MR$%XDIM5L_Q35H2RG:T190O*)4:Y&&49Y:CQIL)E2&S:S]1&U%M17XZ<X86Y +M[VO+28^(SC8Z@8-=3Z-]*=HMX2!;I5CD%XF*#FM0#.@4/>!OR4>H?\_+U$Z_ +MWUZY?G?FD[_='06>6N\N\1#.>L7G)[C?R<5,4NV@8"/:HNX\P1BZ)!JV57<R +M\ZI6^.HBI;IP-O/5>;W*O5@+8TY5O#H_N\5>+:/W.SLC']RTMN4BF]28$6/? +M].EZ<\%7'=S!$(W;JKQS<[RXY6-6F=^G#-\Z5ME,^QH1N[_EO+W^SO/VB+_] +MB>/??E5C;C;RGT]-;//&7KC\K*#2BQ[W(:?MC(WZ?+QKI&?+5MZQ+9%)IM(/ +M<9^/L77==VUD;&!H9'1@9"`]-/_^:33[(&-5K=GH..ZVUO$>3(/6\=@H[N6M +M62H5M%A::7_/%&FNEY*,N2.A2',D7,^P8K1,'JLS14+U3-S#:TR>ZP&Y9)O3 +MULRR?6C_]7?N;K$URXS*O_G./2AS43[[G4TMT>:M*/W+=[I:ZMG[!R/A</C] +M'T9:LL?6LCI3_9)(\\O'IB8(MJOEQ'B&K5D2:?G@<"1TK+GZ>NJ%\J(ZI#+5 +M4B0<:7GYV"NSL\=.M1"5$Q-M[U`F'/E`0[O*H\@#PEFEO)J]<BP2?OD8P;PQ +M$6F>/18)A4,G=@+:+OR`WQ$QAZ1/`Z'8Q<NAO%]8`K]`>SRVO3[,3,S+-91; +M19GJDAEFI7V-)7*,2]#E3&Q**46=2;45>@7?IOAZY&BO4@[^RWYQ[C<K]HCK +M$3O7PF^VH=^/:,6RX;SCLW\^!IO_Z_AC\*\<_O6SS%)\?R+V<#]TKH#$]\>G +M'1]YVKL?S[AGI.3&^&-\@V>O)Z(T`,.'FD#\,8K$-'\SZZ;&55MF*7TKSG"I +MLM%UB7U)D?%M54RN7\8?P_<_`P^4D'^QY)'X8X!R>U!/'*BE@@>;X,%"/"3/ +M(2NSAZ^S33-:CGPTR.:ZB?NDA=[(5LS-&`%LV1N\BY6WT*[W7<Q+>RHHE]?< +M97>A[#'>;VX-(H9EE[-*<4>Z*.YEK`E^\()X_^(\T<0*G*MF-U,RF`LOMY]W +MO%3YJ^0E]/-2X3[VZ^(-HTSP$&93LH+P_,AR,U[:6Q3O6`S1.]1+SA3DOY6+ +M:61NV_]-+J$/^.`E3XLV>;%7T=\%2-J1$9QVR_D:F=YFO?YLMCKTK9\99Y)O +M\=`-6^&9G@7DX0(JOS-PZI*M:'EZGD:=4F_8RJM$$?>7J18PC[CE19@AT?O7 +MYC%#F^'EL;J9MI=#`X#,LO!TR:R;L68FU327',G0]WLLQ,(UH9*W,Z::9CM6 +M!7:R](\@BPNQ7%F*WM6#%S'#B]3'1F-WM34RYA.V#QO=2)E)@,Y?X*LJ(5VM +MXT@V;:*S).ATU8+/ZE^U,'Y?"+'_()M68Y@ITV>S/.3SLH:DV5?+#B#G:'`7 +M812O>81DMBVCG*G:$M]Y_1%F[5^%-M#US.=B^LPC7W=I&WSILU?X4EM!^V;" +MA-?<#BUJZ\[;)^$YGR;/.>\WF\AO=H740BQ^=@^B;QE6!F,W[AVC-Z#H#<6- +MPI]N&DYD>'-O.C/"XXFOCR:&1Q)]PJNV=,0VWA7;M`Z"#G?$-S(?@,.91,_6 +M1OXYOM;(+\P!1IE,=,]6RU'H;="J+35.^]SD612S;Q.MAM)8GR<_Q64U<AIZ +MP\`X8Z&UIGBW5OEX_MU:>I.CCJD!^K6`.V7;^Z.?J6Z^%-AF_P/=?P%/ULA1 +M&YZV[<4<,6MFL7*90MO\^H++(D>(/#%+JR&C#K%UQJE2R^\UAKQ-UM<-5$\Y +M:]?X5O,,VKHB\7'X5WC")X[G8?)K1?@@9U>VM/S0M4E;%!ZF*_O@!:(UA,PI +M-JI)A>L;`25CM?890?3.0PA:>K\VM\[G7L7L_!51Z_M]N)Q?!2-:96I5+.%R +M<4)U-9ULNNQ'/TO8?CG[^NSR&[JRR8N*A4X%DP(V/TYQ-H)52;(4VJ`]@7[> +M'LNQ(92^1OH1)V6SL8O2\>KV38_5-7UC;K8K,GLVZV?R"N90;;:M639W.6GV +MKYZ[0%FE=*!:SRJ94G5DSQ8S+X9F+71Z.']&2?3MXAS16'=S.6E"QIB-?-"T +MQNUW'#!6066.9]K>:6O"N)IGQM.E'NG4#YC9,H$6U\Q$RJ3([AK&U%/*N]62 +M92=JG3,[!U]12STMX8EZ'S-MS9U]](V)[IW*.4\(S^S!'\H_1.[*PCO7HM74 +M\HVYLX]%'P1<Z,X+#>8HPO36M>')AM5H:T7;OC=W=D^>V=>]$RVF!\VL-<MN +M:05TJ<]\=E_]FHC9%,ZR1\.W[(J8@07Z:MO9?:V3=UZ(7!*T[M!IG=T7WM5( +M_:T#S<??W-4]V;WSS#[J5Z=YZP+-F_,T;P7-__D#)E?7,/./IVTC0[8?XRG9 +M&/T!>JF'7SO`0X?@%VH&&',<4)R\'TO%@XPE/[MA@/9B./#$+ZOR[\D%=#G2 +M'"5_DI>N)MZ%N6/-YJPI2SLWMBR3YBX-,79XAGIE;*8:?=&;QNZ6&7`P1-IY +M]M`/D%M[U_V&.:/QK4XQ=D-B,Y/I"OUYJWQVW[H+$;-RNIITE'2W*$?E#TGZ +M=UZ0S>%=,Y-JD]_\3/:>W5@]F96Z,W]N2&1]%G[YS..WKF>F6^%Y;EG'3(^8 +MH^NWVO,2WQ>^97?$#*KR4]FG=MW8`HNW=F/-W[8=WHP1WP^:N=\VXF6Z!(AC +M0PJ-M.(28[<YGE%^[@[1&&Y,.0XP5G.7X\"-K<R,IV>9K=K\U"[5>\].U4/T +M[[S0;;YE.Q$[\SCQ0WR=>8RU0'<MS*2XPI",T;XO;R4+/,4N,BLN$]DY8HV3 +M8HTO\I?_M!!)W"$^P`YGYFYL9H<I)L*#^1$[WM.CJKZ&$+\(R>F_"PLP=XFQ +MKF#LNX]\XZU=6O/9O;'<Y6J/OL]F\5C1_EW:SX0?W\[#B`#?TU<3R/[G8RWP +MOTJ_GHKE_G!>['XV`7-9=1&MA^$[?.&;9<;#M`MP\31:/3P4=DY-N%GW^*&= +MJ;)XENC^^T^J0XHUO$*QZ+LI[OS:XK2[F'@5''^?W@87;]<=IEDO8H\S-KHN +MMKEQP3>2SPK2KPZ1\8[5W7A)_\FBXQE/)#Q^YWG;,Z5.U\WEDLG$9-4<CRB? +M5$=L:!^TX=LS9,&W9+PY_K[8,[+%@ZP<U[6`I5VDU4E37&`DJS0KGNN2#9J, +M&B?K5BWX'DMZ-2=@W8!Q)BL%1)G-R\9`U[PQHEA1[D;9M!'\A"?03M+_JLMI +M,[&ZP4Y\WS9D,:.LV.4)5H3GYL%&/-_Z$DNM\4IJ5;7TRFRD]3@N6RNXD-^8 +M3)C=2Q2+6!M?>Y+6`+)>!A<'L&;#&D4UM8Z+TK7HRRYDXB:99.;^5LA'M?_] +M<40EV?UH>%PQN?=RJ>T=6Q7BX<)Z'_$8<7=:H?4Z(J)O$\7=#>=+GM4L6/&7 +M;\HFRRG3GWJ>.54[,GIZ_\QYK#F6^UTG;_=U`OH-B@"(RQ?_]:W\?DZPQ(V( +M$?]VR^^@M^7Q)ZX;EVW\6OW-Y$$7[;?2VVL9B>@L$;MIM)>6U[2^*_*]2R8; +M[<\A2[;A,@?;T1(TN8)+D:D<:*%=_MPRK;.#[$*U-]/O-]IUBJ:<7,N*V'5) +MVM<QL^O$#JKX-:3O@;=!5?=S?RJ?IKX\GP9G:9.KD+=(VE0)_BK!W0]U[JPG +M#>Z<@COT9U"J^`_YR^<8:=H7M-3[Q5ZSI[UKM](JKX9BKU,]7<\Q>;`,3R6L +M*FFGG?SX<[2[XG0J=KX!$;1!L8A[G=CE<W;MYD6NV8PU-XY5SNZAPW_W"Q&# +MS>%2RJO\2CX/H7V9&\R^"/V^\K\=1Y9^ON05\/P4>"UA%8@NL`&,QY&18KGS +M;0&6MNY@54'F4)CDC>[!F'Y'8U(LN&.,.^90[^R"Y`:=9&'QYPT>&;NTX^;7 +M8&&:=#2K-F;N6R_]!$\CH5,3AR:2+F!CE(9\*L7>WL])_IGE1\=5@[:H_3%@ +M3(!93ZW@I!;KDSVJ',8=K4\5<OO;[X%;V>#VD<_EM4^\>^JB#.0W9V@';;ZG +M-K+[U<@=B2+F@8N>03.Z.L1DT"VE,>9'B#Z<2GE!#P8=P>.<F"^38A^P()>$ +MKITD>X>3]@&K[Q*_%A%O>7]RAP]N!J."W@P?=DFKFWV.E2._;3Z1%26;_%O! +M*;6^K=U,=9NR:J?6MIY1.1,Z.3XS+J`D\/$<LRGU8N_X.E6G^$-MR(`<6B]= +M`6FE;P$U&7T.\FD#)F2>;"7[.G<$<FJ<[UVAE::SW`U[+,V21>*R=>V*3XJU +M*:V>[6)W&OT*Z[R#]I%F0#5ECNX:^DET5[I,U%?3KT/<140-?9QY,\O-)(N/ +M$#7E3_*R$^_217@)O-\!(0E84-)/FL&,-KN/A[]#=H"5SZS8E42?\O/"KIX7 +M6F'L4?%.;2OM43YHR;#5S<PF]BN]A9[N7#)`NZRRKD/%=O1YVOG2-;N:?L-A +MIC,!:(1Z+\WWI%VBTP)(Q`/KX3L8^53T5DYO\/6PN?60FFG'G/"WYPP/6C"F +M'?2NGP6\E(L=UA"H0AOTEETL-V<-,,TF>K,+_F7=%C]]"WR0MZZ,Y3Y<&R=[ +MR2Z<'N7I+WA886WT?A7WD;65[V!^O[W\$08=E^O:F1O!7$7/F=53XRK/K,6W +MI0LT%;Z=WK_!S/M/LZV,3I5]3+$](FD],ZA+FK8S.A7+](B=E^7XKK@7^8&R +M-KIK\VQ&VH\%HR3O&]\1^O5?*%Y1Q_;C;]^X4E$`@<M$=;I]9H-^>Z7XO1[' +MW'R93GF]I!7R8;U83UMH=U6I^YQ^*Y0*M$GBA,1,)R3GIKH[%,L.23'M,,D6 +MYDC2SJSCB>,;?LN<ON.^XZM:6>4JS'1<-ERR[Z=B+?))]Z*S*/'K+E?DXR6( +MKZ1;Q5S=[NLBK9&6DQ>@URK-#:W,^.;7.[R]>J]V0P9F1?]K0K"$?E-%\QZY +MV0CMB7G9XO,N74_X=C)9WRL+TEZ9XDNS^T3/_G"0?1E7(Z[;<#4@0^#L5L2D +MC=H<<L5.U*VE-T?7?<R:%/JE&[(LIY/>LQQ,4IQCRU-?.Q&J^S*SQ/X=]ES' +MXOAK$-\+?Q`TJ%(I)#*0+RM5XMZHE(G[;8I=W!M$ME+';HV_:/RZT)G<ITDS +MX#%IT3G+^*C^D#-9Y4?.Y][<_91[>;"9;4S)K>#Y^A#[,N$J-D30C;'<&7KK +MQV_P'(#O6$^MFJ`Q@RR,?J_,[^Y^@M/;19TIBSYF0:$,%#ICN7]YS<>2%LBC +M4S'_,^IU+N;ET`8;<64JR:[O@;=72M%N8FN-K&MM?ASQO?0K'.=R.L,#CQ[, +MEFJM<W]VD)FJ;/1_6M2DF,EULGG-EYV0H],LN4V6PC^I?O&S4?L)VY8O%Y0Z +MI7H=7SJ:QY3J/1BI9H(DUR+6Q[OWNSOYBC59A9FB^I/[6RC?D9>'U_F@>8?4 +M.HF888/F;\=H:J%_=Q26,E^S&C5.U-PV7\-9TW:)FWDTEOOU1;'[U9FT1"=5 +M)IVA,CRD!%UU>E%^>E>ZDD=??YD7N0']\4N9.AX5;S-,]EVD7[.>WL6+NN@W +M169G*;B^%5DHO7'5B?N%<*E"^YJ"HB:3QG1I&^-S+FAU#*:H6!=&Y0PR3V9T +M1E+9W%<S:=A#%?AOF.>_KH#_!Q4V=X=H+=5;`','2F/L]NTF`V:W#U,,/MV3 +M9',N9`E-L=Q[:X$GYWOT=')KTKSN(KO`H\8)TJL^6HET;C7/[$J;@^O$[W8[ +MX0^E!:YA(4V8=[<;GFN:YAYP-L[L3LD91M:NF/\*U@[NOJQ6*3)\5@6\[;>[ +M=J<^I9Q-XRBC'4\/(H>PD8Z@!]+=>J>Q&SVR>L:D6D9J9TS)-='=6P.'2,:E +MBA6T4!+4B,(G"[2O;EO<,SBLII,;?0?T"WV03;R3BVP4-97,J31H*Z$U6[*: +M?M<X0^]@OLC*E7)Z=X?VN[$"C(C?$-,OU,L-'FS4)\$[RR$K&\6>*$O^F/P? +M>L^?S=O=^?W/P]%%9[>L5^P(SO^.WMBKV]L]%3[(S#?`8Q>>K1MKG,A6V-K1 +M;-I2MWUN3BD]NZ?YO&V,:V-,['D^/L:X;,1(X`6+`TR-9]2CXX-1[9&CV2%D +M/\WG[9JS;HPIC=K:]>QH=K!.L]'=:'.+MBK;'BPT@X,N<;\I)=I*SH@VDU84 +MH',AF%SLOV*%H>B^GL[<]/][ASYW?A5?9OWYMI<8:SA`>Q3B5WGBL^0"K@]Q +MO9(>'=%&1QC+]/76#O4,)A@;'NG)C-3VIM);MK+$4%^^-*8E4#V8[DNPOL2V +M@2V`'!T:`&;O:#*9R.A@PVQ;(M.;'DZP_@3"!#T-#Z2'V-='!Q(C;.'_!Q*? +M-*.?="P\#^$J+7@>QE55\(P>$4,6/F.XZ@O:L;1E307/))5PP7,OKLX"_,VX +MN@N>^W%]K>!Y&ZYDP?/7V16?KWQ]V^;^H<:^QM'&WL9TX]AP8Z)1#+")>3:O +MBW=Q"&HD/3R22?0,\IL"==Q[V\V!F^KPKX:@-A<V;Z;VVEK>DM8>S@RH_2/\ +MIMMNNYFW]&<&AD<&>H;XN@"/I#5M6&A0VKYIN$=--/*5P_S>M$8[Y,/W6SOT +M0J.5XU-[[[;-8VK_T'"B;[0W?3^_M[96U_7MR8%40CSG=7Z[!HV+;?8'Z/%^ +M@8]V7<^WZS>]B:I)[;?3UP-#HX.BQE#S/&*!"=TNO@74O#$5UBV8U3SV(H/2 +M88?SW9!MB;*P*%$B2[O?:HV-#O8F,GQ].C/8,S+<R+T/]2<R":X,K>(]N/>D +MM/Z>6C`<X'T#ZL#(<(WHKN[>L>[[AX:&^':^4,+WO?V1^U'R4$4M3Z8S/)(8 +M$QC4F.ZXWZA-;QGI2<W7]X;S];T#0SV9A_,-1F5?8LO`8$^*>WM2PVD\)7M& +M4R.B92@]5)M);$FK0P./)/IJK`)1'=B6&.(C_6"^-[TMP1].C_(ML`2!K<%P +M-$B4]_![VS=`F$2F/:'V]#X\DA#H&P92:7K@/8#:FG_()(:UQ)81D$X]'.#W +M9GJ&U`3?TI_8LG5@2.4#0Z.0K["PPW,%G_P,\[&'5C-F2%]HC7MKOUXCNEBD +M3%2/U6!8(^`VE7XH`3Y'^#`LB(\,#"8"5O802Z9'@35O>HW<O7+8C0%J/5L& +M1AZ&::?Z`KAH4,.&5^+"&$03YS3X@N>1-#2A5PR+&DQX>N!=$*E>T3<ZJ&&4 +MC?PJ8B/I*\G=.YQ'VW`_N,T,0';)3'IP@6&=7V#2?!(/Q&5?FKQI>JN??YU. +MKH;40"``MS.@)8:%E#*)VKZ!#&D`%!X:2*7X0^G,5MX[.@+ACR0R/4(WUH$A +MS-2@/F'YP##7,NG^@5XPT0=J6]*CX)"$"WY[2,,%7#TT,-)/II+AI.CA`$MD +M,NE,([^'JN8'R>_%R.XGRJG$\#",#':E(RV(1H>YP<K6Q>,=\;S4:!#S9(;) +M((F1+9DTR"QPT4O*S0PDT']G*M$SG"!V$\*8M_6D1B$,LF:U!V9-AKN(M+4O +MS6,=&SGF\99^@;)`=V"(B[-#.A+,CXPH#8X.P[X2(V+0`\F'!9I28)#D!=31 +MP<30"*E,[1D8$I,$GYXM6T@$`T/#`WV)*[KS#B0"0M!4G1B#<O)8PI9U,0T) +MSP/U#B_&7C5<$V!P[GW"YE;6-4!IM7<8!0CWYE3?RI7W\Q($9:'1H5608WI0 +M2R4@J30X[R$J?DXD>+('5@;EDR7^7](SC-D@6`A-<U48U$!:]VYYI,`"#.J& +MN!X2]!E`D4"?,U>@&#-\*/%0(3PS+";?EQ\$>GHQ@Z`66+G0A8![J"<#I[#0 +M*,1P98^I'G68UXVM3(T9O<'H8%,K`PW#^+II+7W7(T;.NQ5@M2/2P!L1%4$D +MO6@\!IUX:YB`C/8%V*0`\AOBTSWG\.@@$XP95'7>^F$/0VDB%/C\L11X&^%9 +M_LC8ME_E)X=[=:A$[[S[TTN`+?B$%[M`WG*E>VUGQDC`U;SZ!Q.#Z<S#0I_S +M_1IRH?_UX?,%(^1B3(\1&BAY4"([C)B78O\A_A<(%A^DO4CVOD+^:`O^W=\( +MF^U+](YB%BPJ60TY,U%>])$Z.[KNZFZ[YX&6CGA\7<M&Q##&5B)0Z,D35U8. +MKR)OV#/8.Z".ID>19A6VUM92>U\Z,9R?)@]QBL2&2[%>06O+GP0-V$P"T2(C +M0D0!&$&-#BWD!8O9^2/M@@&2P!=`^"'>'@HU2)BV4+2N6YFV?B$T^ENY9=45 +M7%/5%[#-6N;CTQ46%<AK)<0*\O+"LK3HFC=C+WWX59^(<_%G<OYC5(R+C_0Y +M'[U]0GQ,G_.A5GYEPO__Y4/GQB6O_$=0)>?^7_1E*BAG!5F1^]GQ5_`1=6:Q +MOL3'?P@`_(JZX_-P\[AK3%?CTL=^W^*Z-557PZV97_<%>T9'TL$M*:P#@@_U +M#(A%Y19XQ9OJ@OAW\YJZ8$,='6467?4I*7(N-YFH9"HJ*ZI:8=26E*Q8<14L +M417KZ2*#QV=Q3>'"&M&^$5>(Z>MIV*D=@K*WZCHJ`9RY#-58<TOP6E(<5R4N +G.A*FLU2B>1K7SW$=P47O_CV#:Q\N>F,@I?>WY,+_!BSZ[KA85P`` +` +end diff --git a/sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu b/sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu new file mode 100644 index 00000000000..538801fc530 --- /dev/null +++ b/sys/arch/amiga/stand/device-streams/xstreamtodev.gz.uu @@ -0,0 +1,306 @@ +begin 754 xstreamtodev.gz +M'XL("&<@[S<``WAS=')E86UT;V1E=@#%?`UT4]>5[KE"EH60Y8M17(=HG!,A +MC"QD22$..*Y#9=D01=BR(P/C_%\;2Q<'V;J594*R>%0VYJ>$=`A-,VU?IXLU +M*ZM#&R=QF4XGSX_%F+Q,2C-M%J&\O$R&UZ1Y$&A+4A:3E=5A*'[?/O?*EB'I +MO*[WUGJ">W7N.7OOL\_>^^R]SSE79FS>OS+]8S*^)<8JDHR96QF;]VLJ1\_O +MN.:)>MB]_T;-_FW,?`]*Y>-9QIM0<;]BJCE^WXGIJ[4=Y6=JX^6G:P8E)U_. +MQE7[N;T\S+VL_MQ>Q<++#[S`&MWE!_.6$6#E:YO+)R;&'?5]Z[G?46_)B[IP +M^55W$SB0XB]--\;R*I-.H>[W,ZT3)X'A9O9!YF'.@2K4?`(ZEPZ.EU]MOEA^ +MD8_$7_J#1S$%PI'Q\G<T!EHLQ.(O77N3>&JY(NW3\/2'=VK#<E/*HO4IC'U8 +MNX5]L_QD[`7PR]@.OH6-OW7BK1/NS4S^Q4]_\5-NRK**FVOO+7__Y,@C>5,8 +MHPR77XB>#X=G^6Q[SV2*Y5-6S1EDX+B2AP%SEINZ\J='%AYA#*51R.?3A4<9 +MIS*^W=RT\(><<>F^-Z9_+^,Y:%5BS;]E#X'7O/&]'U3>"3)/F/N81ZWRI^4F +M'G9[&48P?0AM)]U4&N5I0%FCZ?)QOIEY:C<S<_G[\<DE]?')NCZ-*68>9&9/ +MNOS,4J$Y0W(5L?'RBZJ=9';_>/DG)+5`C/O+3ZAF'HX?`+X=5R=JKJIV=[K\ +M]X2+W@+`>T?EQ(O;7WY2I;KO&6W;`?<.^-ZM5%`-<"^H5M2=)3PW,-#6RV]M +M>^\K.^+#?9FA0+J_-]N3?8)]]RKS1,\OJP\$6:LOPZ+;6>1EUH2K`5<]KM`W +MWFB^Z'B@-BI7X;L!WZ[0=B9AU-3SY-JVSH[8'I69+=$,"T73;&O0+Z6#9<'2 +M^"2OZO@=<_H8+TF0-:WF)=DO'1A1^[)?P'U]UHX[8V,;\NIC76AG/^LR2I(- +M]]4/Y]7HG^?5R@W4ME_<WT2]`Z6L<E"3:L/FL+)/DX)AUH2K06'3.ZA6MJ.4 +MFZFOQU.J-KU`D\TH/21*5I02HL10BD;3YM:@?X$6GUQ8@='D4VRZ7I.V.PF; +MJ`#&(RC+*"T&=(,.+9\UH"USH:]]"I@F`V9*A[GVP74PIP!3;\!\QX`Y=AW, +M2Z)7)TK/Q\;-8;4J-B[+:@4PH_')RM>[._11;G?&H"_5'KP)LG\3+>.@!^WI +M->80:KXM:II4"[<HS/00Z+!4->A\#=?^^.3J7W9VH"<7YB5Z,S6M@:;CDY:I +MFC!?H#+38E#!>&C<Q+-LQF4-+NAA)3N@X2KPX(?6/G#[9:8Z0/%@4`+-?9T= +MF#\V\B-!'W/!'MJZQ3BE[VIQX'AI3*G'>(;YN5>J=GLE=WRR]H";19JCS1>^ +M^O[>LWM-\#WSICWLW.CI_.G1]_>=W1<T!:6@5R(9/!N?O.E58#<%#DO5J%N, +MJQ+UKZ+^!ZB/HMZ-YT_Q_&WPR3E&X,9(HK^#]_#@;F(\D4_9#0XJP9,G,3+S +MO!C/'".5@W`$N/RX&GJ8Y`4MF?PC>Q_SPR5&P=@^S'6/.\BX1WHV[R8*_<S! +M3?`9X?BD=Y)&$V0%2M%TB05<F8E2\\62-"?)F>!A@!>LE2K(IY2T8H8]07W& +M)RLNTTPBF35?++O=&F+,RE1+EI_**R8WTYXXDD\YA"VX%(O^#6V[5&^!#U#A +MN+Q!6Q#\X/+BXA@+(_TID%I)-C[IS'5W*#:41U$^`%W!2E1GT!:?_.)BH^4D +M6K9V=P07Q"=+%!TB98.,H-W&3V&/K.T]_]E?PJ?$AZ/G2\T^].L/,A>\2Q6\ +MB_/8[DW.H"58"DK70(G&;X>?3/`ZJ?)8/BF[ZZ3%QT9ZK4='>LU'\WVP)4N8 +MX(BRXC_VHE29LAQ]45JL5L=VJ7:T[HA/+CH&W@CR'92/"$B3)K6]Q]^/#P<= +M&LN&/_JJ[B6OO6EES*Z:-0D0S/]H?!C>CT?/KZH'G^O!9QOXC-9D6"=X)>F' +M(G\3+`V6Q2=M;Y*F=&LV:;"C5FBZ^^"NQ$C!2^+RX_(&FUF#VT*S,CY9\UJ0 +M07<,\H)E`=,]^3+K[H7903M>S(/?"]N)\Q)0:SHYTI7_X*N>(*L_/>(VG1LY +M-5HCG=OY]LBYG62'?)Y;6,+28X85E433I=LA^:KXY!TO!<;IN^$060FW$#7T +MOC:X`,/9!E\=9/`!JQPT!IJKL-0F-^ROANS5?R2O>JS+60F[176!YB&#Y@,H +M_S6XWTLZ4IC4%H.WEM86<)=>(-R)$37*)?%<([A$G7BJBHULG,JQ9V%VC)\< +M15NHT.:Y"DI5H/XS4/<9/LRK6(*8R2S4PZZU86[I5NSE)2<AVZ[\!.2V"=Q9 +M$7$6OMG=`5K=!W8E\EF""D'FNB]I(^Y.[NK*@[?0*6C&(\%SC-28(,?1N7+T +M;)V5HS6BCWE%2I?CJFXA1]`0_%X3>"6B?-F8P5`3S0L;0<HTZR%%1`9KRJ!$ +MO&X&KS$A/0?1>@O\O)M7V!^N$CZ\OA,PS^KPMU\4<)AAUN>`Y83%@+KU$UBV +M3!:(^DE@7"4HS+"+F&%<6*^+8C>LM[-@O1Y8+BPX#`MN"FY@]?!E];$#\%4? +M:NR9J6`4,EV@5F#VNV@.WW)9CSSL*."\P<W,`3TAC@N,PP:&1YL^EE=MR"6] +M$WL`.R;@_.0E`9<C*-WG`)9CACC)RT@5H/XL45?-Y"6UZ:-YM0HX''Z^\NA( +MTNJ!ASTZNDFT3B+.4]OD86EQKP7WRCZ+QF;\F(6L2/%0C\%.YE?&B$>40A3' +M:80H4YQWSO@?5WR8L?LZHN=O6XD9X(A/.I[L1C3"6$$7F>=W2+YW;^_NH&PJ +M6X(<+.L+N\OH*0=/\8>X+\S+U,7!,OC(,3%_7>K[I/,>QA`KE=,"CR#3&H+( +M,U,UT=C7U<@.II4>R_>%9GS'<HI[E@/&S*N"Y!G%39,E\#(T.%F*?".Q1WD# +M-+J(AC+);6WOI<<Z.^+#Q#U;"3VZT+I!:,*)L3HA\P2R:Y3X?<],>:)4=_(J +M<Q@^[IJ(V9`$7P<<*V'UL'G[84EO$R1I/CY9]DWT#[LK@Y</QIA3^1YZ9=3K +M_=1K)2Q(^&MX$'B_LKRP$BVX`'9X"<_/8WS@OJR&[!'CLD/+$;(G.VE1O@W2 +MPF5KN<`<@:_&)YM@SZBWQPY#BK([RMN-K-4&7;@P&Y#OEEDHJD33\S'+',[. +M#FU:]^*;X3UU64@D"U[3CM6"&5;X3:QR7.?RND]F^]PQG>8??@->GD36;CV7 +M=_N8^=P(;R89)/:2_*GD#AM0ZTF&1IFD6&4_@)6.;5,36?J!P\P38(D]*-L1 +MPYW(7CYU4TY[*<!09P9U>OH@P.Q[&&=L$]FHD^(*))DG24;/SS-C1LHDQ^V, +MEW;MH;EPYJ^43[@%T6E*E[4^*LBS-3ZYX&UA:4Y][06.7.[PDLW,Q7CSKQ'# +MK8BQ;Q"?MPTP._/B+C._-@U)>Z+;3(@T"Y[K)#D[2?XI>]`*VWT6>F?2;MAE +MW\G\L7R:20E>^JO\R7S!%@@3-@DMEY"ODNUY6HRJGF`=++8.VJUCR$7F!T#] +M)=B,!S3#!`>J(6&#_<QE/Y!H[5H'G5R"O4$V/6S:;/B55P4_]R`SBA(D)!=> +M@OR6RI!J=`FBI5'?BOHFHUY&?9C7LGIW+?GJ6[?C&Q'MUMP2BB.`@64=6G.! +M';[G`GN%>M"SK%O71\+1\(6]E-N('`=S#;YH/OA_!+[Z8_#M*O"L34^0-:*5 +MYCA[14C.1?.((`KVJ;@-.>GTD+?,_QXDD1,2L&#FLFN'M6F"`35/RE7(K`!W +M!CUNIUD.Z@[=;Z?SW<(N6"6\FJPVT5PIGKG"Y\@:JVG_RRGA)5JAO7<)2I^U +M\S\`/5CB_'>[.VAFZ!:TC"S(2[XQ0+D=K'+^U[H[],Q=NF)D@"Z_U_#!3/HE +M5F06LMYJ#^13JFM_7AN-"7Z^NECS00M&<@44CU!$A,[_VO[USN;$>N0N!X&[ +MG'3]ARI=UU*?_06:/RR_B4E-T6U2#?#,PJ*YL&@7#V.T%;"$=5KXW%YCOAX@ +MOX_Z@\*346DE>.9+HE*%+$?ST2E_]'].10(PW.]+%;Q?JE@29;8E&!6R:ZS- +M,<?A/?[L`7Q#,G^66!*6*E'V)D:XWA(V6AJZ\FA;[*Z5*CWLV9'$Z)*(5,W) +M0U"]&UEW-:[%N"HI`X^F;8V(P),47697)Z[+?WQU$A@5JQ.L.FPI8&^G58=O +M.9-I9+?I/.-N6!F?L;)6P"/NSW=!WPTBRA4L#O*W'4.+25B<^X8V9-'6#W5K +M])?`&JO)"Y=.DGVDSY*U!<M@'5;2<.GSW1V^1RDN(C.O1,[@1<[@@8?B%&/@ +M@1`/2M?KEI,RPS,/&AI*U6"-1/;(^D1VO9%W<1$QEX7AB?66F&AIHGXL%=T= +M:+$:+2'1XEYV#[,O6PO+HKI.6@>J>KNL9^Q\`2SZ?3$[+.#'CIG@%C-3XP/, +M;'"2YAMP5P(O,OA"RVD:I<((1R(<><<TL%;&7F3.5`A85@XK=@/;#8LVYEAK +M-8ONB?XD9=6DY?"TBI5RFP@P>"EHY>?TOX(HJ7[W3/_7_+%P2J9GE+GQ76-\ +MKR8J!7[FU4.V'+)U(9)Z0*_*`ZBE:YEGZ3W,OW0=\T+>)C&^;C%[++!$CN@Q +MC?QEZO^8PCQ!H?)S*%A6!]EB$7U(+GXQ&A=)\_9[X`=G1]7@8M'=T=<5&[4M +MW,ZFV:T4H90ILA7R,$$G>/""DL?OET.DXX6?^L+!=F1[[;&JU-6NO<_\W$O[ +M0:9H>D&#:*_0U\@I^_JGUR.#VT'Q(D=K$4`(*Y$OD4\4F;YGXJ:4/?%TH@#7 +M%AM30_*=T6F:_47K74>A+LM/CBC6F:?-6(6LU*17\IF5%7=&KT5'HL<+6%7` +M*M3E^*E1Q3KSM/G(:,I"_;$SU%\%4;L1<WH.IOZ4.3*JUJ.W^C^A-^"DS#NL +MRN"?V%=OH2^9*-THCVMSY*$_]4Z,H"^38MIABXS+H6(=(8+![Y#\W1=(_C`9 +MS/T?_EQU:-.3^52%YIX`1LI6NU8.B3SY!)7`LU5KGP!/@",YUV3;CZ"W5+5] +M%V/ET[VVZ)K(FE_O`OS7-'=MV,#=7SS6%N+[]C\ZUBW&6*.%D11P_LA8MV"L +M5?9=\Z:GIWLMO]IU;I=BF^'`5K,+.9G+779@I.T][R>SWE"^J4B2\T#=G'A: +M^0TO\^D[`EZ:?8`+_^4_(6]:=HRE$R2QI6ZL%A`Y$X8WE)S"<_5IMJ/Y%)=+ +MH_G(*N:,BJP9LW+4$PX\A>^/D5G8E-6\-%%:P:(CW')K7G8JAPOPGG4S&)TU +MX1TLL`^E2>`L2(V)V2T;NRI36-5XA:\SDW\BCCS(WI&-EB:P.M-LQ_*IWXB] +M#W@`GM=]".:MBWS'-][8P9"#EJGV66L(6)$AV/DZX_F?_%9>>G)W(D][%M4K +MN_6]NQI>RMO=,<54\4Y7ON\*C[WU$^0.ZQ23_,_B&1B1%59&JQ;R.KI\T8^( +M.*XQ/>+`ISJ%3YWIFUOU?O[L32-3L:*7=17OI*Y2'/`RH0=G]/P2)[Q@"%[0 +MO^YW#)Z%=L/T%;.;/(S=T*&TC8%":98?&$$D*:7YL1DU;HNP,)/;@JC,X'E6 +M&[@[]'7^,@W?%/DJH`,OZD_0;AA\DHMT@LSF%'$G+U+M6=N$I%KTV-&,3,@= +MC=V,D7SUZR?X_*Y\UG9DE=6IBGVP'G;M$:QV$$V\KT%C3EUC&(&=,C/7+R$1 +MRO(<X);Q=LCQN)!CF:ZSN?*[I75&?J1)DJ'LV1`[B'6IC]G$>FN%\/UF6)B5 +MQSR=R@?"5AA1BHW+=M6]CE9H)#>[/G;^+N00T\NW;17[\X\:T$XU0-!H;S/: +M-P:>!J9L8!Y"RWJCI8DD-8-I5^OGX&\TH"KGX"MH><0H7YW%OX'#!L`I1OGT +M+(<&[5ZC97(.;3-:'BOP6:!-=@>YR6*^8"6KM]_Z#F#3!BQE\D[=XAC[AXOE +M$TFV:+6A,8$GWZ2*+'1B#Z1<AIS_:>4BR9BT9<`[,-.<1J2NTE=[1_>D;5_X +MN\VPPL1NY3+H8V[P\@/;F7UBG'`JWHV>OXWTZ>1^V7]@7/:ZV;F1@$0V8LUB +M1OCU&M[^UO'`'O!N[3E(D(4Z-]II;\O=_HM7W?X%N8-Y+IW+!_)8S6#5-[V9 +M\$^.+\B!LK^(CMBSGXYQ8+C90;3]`CW3J@@>TP\NQPPN&PPNZ_73H2]1+J)@ +MA&T8X7IPW1D97Z#%0#_51B<4"W*(,QPTO$2G8E&N[H@I9<N9:B.R)_&4XLTM +MQ[,5,/2T&-+?#ML69P&JA6IISQJ8'M@05VT\+?.8C/7$-DU"-/*DMHJ18T1' +M\JH\@5XQT^`9KTT@6[;3Z!'_S;7-LI?&-;$GO5J,>+B*Y>I^)*>L6"M*L84I +M+]9<W:JKT)9=?D1..0I/B;WHT9(`;662J-`XZ!OKH3C!@.?]P3NKX+$JQ9Y6 +MJH%@/X>O*N+K2#YE-2AY>:F[M+9YEBILJ5)H&/C`-9,$M6F%F9_7-?,9W*^E +M_6;55</.[>3##6SK\A^#>R\[-\:'HSKW)#U/RB+H/$1TB$."KP7\`DV34-]: +M3#^Q5]"THA?S5DDQ;65O_;?:*&1/<F*F:S?P8B=>?K10=<9V(PLV6K3E$]"5 +MZ6006F/AXK-#9!9A68;OO)M\)[*[L'(QF&'=K/5)RCI:N:QFP4$8=LCAG_VX +M,^-,!'FAV,L-PWXYP09I]PP>VOE<=P=P/)"N4]2O82'CI"_*ZA4WG7HA.J.% +MU5.;<1K2H,EOO<Q:$[N4W>*D+$)G8:DF6/`VM;HP3M)O\"9H^D`T[8"%NL3> +M+O&%?JO?`B<D443C+RG,=$6<KS')CW542-@"1AN3Z3S333NNWV=FU;X&\JJ- +M+="0"[TN^DH4R?1J8J]6!]E5!A>*7E_2>[WE`[&:\Q9#ZNM@P.G\G3$@7Q%G +M0H*_13N(/X.W1S2)5JT3A[$Z:Z/Y<61/6A8\PD?4#EMA#4J]X&<QU03OM%XE +MNG:;05>9'?>BFB*Z%J,.ZSNJA00>4BWHZ2&^2U\E,ZOJ<'L1Y\-\A#)`Z;11 +M3^<')V*[U<:Y]I>M.R*K-<66I%;1[#?&*W9*KZ3%?!L4_&Z<BR_D5R4LA_@/ +MZ?PO/B0DZ"N&-2@*&Q.PG0:L\/_-%^T:R8>LGT8JN0075?1\:Y@M+W!#SSWL +MW][M[!"G*+J?,A,F/)FM(LB6YQKAZ>*"UXAXYD=,`Y;<5W!?3#DN[)QZS^J] +MW_RIX+2JJ.60T7*&6H@7=D!KI%7_A)=)J2=Q-Z6J=1FIMMKH`L&W8B9__/6? +MUMXK<ZS.!5]%K6'#Y_@$7RXY.#,BZG'*Z/$QO4<:K^(@/))=+62W0"/O7L!" +M=G%5/]\3D:)*CQ2PG?,2Q4"Y$`,C?T/_1-0MA<Q^0#$9$29/<;88<\')&S%G +MSE@6Z.\1_%MZ%GL.[K/7XQJG77.Q`W/[OB]L8&_$Z"_HHZ]*$V9\\@L^\C[4 +MR_T%J%!Q_K:HFO(WVL=%+F#N.5+(!(JH,H,GD:WIIX?R)YW((P76`L6""+R= +M\&9&8^0$MM>CY\OK"WLRB!F6^*2MU\>")?')BN\9_4:UOLE\1N8EQ=FC$JAI +M1X3_1T_T_GW>DOO'_OZ-/G/D/RN_CXT]9MK&7MF5=O!6KSDQQJV1.ZU,^9CR +M&,2I3T6N>.DZ+L)BKYW>!W$AXUI4DRX#UZI/8^C=RK<P\P]_WHM58(Q.;,13 +MG\/31;FH#-]<$U-.U:XK,\?VB!TDC*(3>3[%:OB$\3+S;>W,C"AB[>ZH#8/N +M?/0O]LIIGZ%9O.$4V(M>GL!R[FK\0+<XC_CL>GJS)GJ>F^*39;_A))E*>!ZK +M7[SI,NV-Y3<>S[%G)6YJ>R]LUO>\YGW!EY;K%6?-!LUY\D5F=A=.(0*^=;PL +M=0%67J^T`2:L?><D9($LK(XA-LOAV@%F+9\(U-':@&9?^6G[9GJ3)UG!._S6 +MYH^8W=B?\@36NM?QTMGW=>1PZJ6V]RY0]I=!CY3;PY)H71-@-??ZHLI:C<DW +M%58Q6(G:LJR"Y?C!4<5,);^$]D6?W<8M!T92WL33B:>Z]L3VJ-;83:HYMBCU +M$LHRE1'Q;;%%^)[63R6\KPG[-_C06);)514WVQGK&;#A_N2@V8QFNR2>)?$L +M,:RH4N:8E#I=P-48K<IE&>MR?>6\5[G,K4(?5FJ/;YC^Q-V1M<4G2YV69A:J +M.`Z97>+SY5_]PT]35R+R@;^(/RQHS8%W,U,S*]7A/]S[6?"AVU?<47_GRE4- +M=_7T;NI+I@KX]W6X.U80=GG%O\MG+NQ-72["_:IN6X4Q1\^'N">*F2/52':9 +M+5>MN-=1]I.(RE48?6A@,20Q?]")W'KDU.BID=B\E/E47OG@8%[YI7N$6P_L +MZ\JWO6>VZ_K$:BUJK6/SV"VI$/<[#L4GRTW+P\R,2T[9-+O8AYA6*I>G'8>8 +M4_O7XR^RJLB+S(X+\M?W8HD.[-CIB]:T*YRT_?G64'D<^CU#:T6OV9"A&?A6 +MM["IE2O]DH_YHO')!9S#9]A.U>CGG96TCV-=SB16FG+4;L=D>J_\1UH):H^( +M<_]2U4%[=^13XI/2D>X.U%I0*[LMO%V#)A=TBY/3Q>[ES.HIJ[$8L^RDCR7R +MZD.\1!FLL7G*GANE]D(;6B+?V>F+45WS%;;>8]TJ&?4^S!C);2'*MFNTRY": +MNIYR@GSE/*72>-Y>&R[_$59K+EVB;>^ET_'ALCGCIWW*59!`@-&)-2B[.)V$ +MO$E>,V77*@U=,'84&F.0A%-(XGV2Q$S;H<AX^8]HO]5=!WX6S/#S-HTTY9SE +MY-:#!DXZMDNU@B+DA?5AB?*09]U__T>M;,(W/9VR$14QZK=YQ%VBT7LD#N'% +MJ^^!!!2[O"A;AMS8M'@J\=3?OY&\)'9ZR[[]E+N$K],6@_OWR;,)NF;8WE,8 +M]\6"[\.8K<AS[60]JRSB/1N,'3@>&K?U;3%NV\RXN\7(2KIVBI$5QG7,3>.J +M*(QK1A(^7D(939=^V97%W*)4<NGD;D4F?'%*SFI,1*'M/>5BP19I'YYXL!X2 +M/"0$#^1_VC3G%#QN5IX82<'R:8XH#3'4B-9`@2;HG8$L2V%[5CX@3F]>HCU\ +M9)EAR*X1\\9,GHSVZ<6^-)U\^7>P6[?#MI<U7YG.(T-K1<^\)NTX[%FWG2D6 +MS[J:1&(W(IA%G!M?X@M2`4TFFS9F!^6F>R-?CZ`5EFBI7><XK)@\3_G\CN<3 +MXX[G%9//,G??"KBN96%F3\E9.U:=(4TEV2GT;DR[>PNSTRZ6-F_J91:"#!V0 +M'S<NA^*B=W9+K=2FBGDI.79(BD7LU<ZS!N%)[E#-UI^P$I0=;(4H6U`N,\JE +M*%M1CAEO*ER#Q,;]3&U$O0WU5<@97IK^GK:0](CH;*<3.-CU.-KGH]T2";)E +MBL7Z,E'180V*`9VB!_S-^QCU'WB9VNGW.R;6[LY>^MO=,>"I]>XR#^&L57Q^ +M@OO(6LHDU0$*=J(MZBX2C*%+HF%?=@\S+VN%KRY1:HIG,U]>T*NUE_MI3KE6 +MS\QNL5?+Z-W4SNCYVU>V7&%C&C-B[#L^76].^*K#.QBB\?O5WNEI7MKR.^8J +M[%-&5FUS-=.^1M0QU7+1<>*>BXXS_O9G3GSC#8VY6>X_G1[=ZHV_=.UY0:47 +M/>Y'3ML9'_;Y>%>N9],6WK$UF4VE,X]SGX^Q-=WWKF>L?S`WW)_KSPS.O#L; +MRS_&6'5K/C:";WOK2`^F0>M(?!C?5:UY*A6U6%II?\\4;:Z74HRYH^%H<S12 +MS[!BM(P=#YFBX7HFOB,K3)Y;`3EOJVQO9OD^M/_J6_>UV)NMC,J__M;]*'-1 +M/O>M#2VQYBTH_:]O=;74LP\/1R.1R(<_B+;DCZ]D(5/]O&CS:\</C!)L5\O) +MD2Q;,2_:<OZ5:/AX<\VMU`OE12&D,C52-!)M>>WXZU-3QT^W$)63HVWO428< +M/:^A7>4QY`&1O%)5PUX_'HV\=IQ@WAZ--D\=CX8CX9,[`>T0?L!??L8<ECX) +MA.-7KH4+?F$>_`+M\92Y?)B9F)<K*+>*,=5I99B5CA66Z'$N8>72&C^@5*#. +MI-J+O8)O0V(M<K0W*`<_-2[._:;$'G$]8N=*^,TV[I=':<6R[J*\[U^.P^;_ +M.O$4_"N'?_TT.Q_W2V(/]S?R(DC\8&)<'O6T=S^==4](J?6)I_@ZSUY/5&D` +MA@\U@<13%(EI_F;7'!A1[=GY=%?D2(6RWGF5?4&QXFY33,Y?))["_5^`!TK( +MOUCJ:.(I0+D]J"<.U`K!@UWP8"$>4A>0E3DBM]C'$7^X/#K`IKN)^Y2%WB97 +MS,T8`6S9&[R75;70KO>]S$M[*BA7U=[K.(RRQWCKL#6(&)9?R%SB&^FB^*YD +M3?"#N\7[%Q>))E;@7#6[F9)MN5C>W7Y1CKK^.745_42+]['?$F\898-',)M2 +MBPG/CRPWZZ6]1?&.Q2"][SWO;%'^ZYI+(WO7P:]R"7W`!\_[IFBSSO4J^KL` +M*0<R@C-N:Z'&2F_BWGHN7Q/^^D^-,\EW>?BV+?!,SP/RE2(J'QDXH50K6KXY +M0R.DU!NV\@91Q/=K5`N8)]W6.9AAT?LC,YCAC?#R6-V,.\:A`4#F663<L=[- +M6#.3:IL=G5FZ;V5A%JD-.[)9$YZ^B=*SI#-8[&ZL&M^G=_7@1<SP(O7QX?B] +M;8V,^83MPT;74V82H/,7^"H7I*MU',UG3'26!)TNF_59FY?-CM\71NP_S,;5 +M.&;*^+D\#_N\K"%E]M6Q0\@Y&MPE&,6;'B&9K0LH9ZJQ)';>>I39-B]#&^AZ +M9G(Q?>:1K[NZ%;[T^>M\J;VH?2-AUD;+96C1O.9B>=4]%\O]Y#EG_";]DN#Y +MKK!:C,7/[4'TK<3*P+YD[S9Z`XK>4%PO_.F&H626-_=FLCF>2'YY.#F42_8) +MK]K2$5]_;WS#&@@ZTI%8SWP`CF23/5L:^6?X6B._,`<893*Q/5LLQZ"W`9LV +MWSCM<Y-G4<R^#;0:RF!]GOH$E\W(:>@-`^.,A=::XKU@Y7<S[P73FQPAI@;H +MEPWN=)GKAS]5W7P^L,W^1[O_`IZLD:,V,EY&[SB:-;-8N1Q`V\SZ@EM%CA!] +M9HI60T8=8NN$K%++[S6&O,VJKQNHGG+6KI$MY@FT=443(_"O\(3/G"C`%-:* +M\$%R5[ZBZLC-*7L,'J8K_]AEHC6(S"D^K$G%ZQL!9<5J[5."Z)V!$+3T?NUN +MG<^]BEG^9Z+6]_M(%;\!1K1:J56Q1*K$"=6-=/*9RA_^-&G_Q=1;4PMOZ\JG +MKB@6.A5,"=C".,79"%8EJ0IH@_8$-O/V^"0;1.D1TH\X*9N*7Y%.U+1O>"K4 +M])7IJ:[HU+F\GUD7L7+5;M^29]/74F;_\NG+E%5*AVKTK)(IU4?W;#+S4FC6 +M0J>',V>41-\ASA&-=3>WIDS(&//1\TTKW'ZYWE@%5<JAMO?:FC"NYHF13(5' +M.OU]9K:,HL4Y,9HV*59W+6/J:>7]&LFR$[7RQ,Z!U]4*3TMDM-['3%LFS^U[ +M>[1[IW+!$\8S>^P'UA\@=V61G2O1:FKYRO2YIV*/`2Y\S^4&<PQA>LO*R%C# +M<K2UHFW_.SN[Q\[N[]Z)%M-C9M::9W>V`KK"9SZWOWY%U&R*Y-F^R)V[HF9@ +M@;[:=FY_Z]@]EZ-7!:W5.JUS^R.[&JF_-:#Y]#N[NL>Z=Y[=3_WJ-%?-TKRC +M0',5:/Z/[S-K32TS_WB\S#IH_S&>4HVQ[Z.7>OBU>AX^`K]0VX]!URLRWXRE +MXF'&4I_>UD][,1QXXE=AA??D`KH<:8Z2/RE(5Q/OPJQ>L3%ORM/.C3W/I.FK +M@XR],D&],C91@[[H36-WRP0X&"3M-!SY/G)K[YI?,SF6V"*+L1L2FQC++-:? +MMUC/[5]S.6I6SM20CE+N%N68]3<D_7LN6\V171-C:I/?_)W\_;NQ>C(KH;-? +M,R2R-@^_?/;I56N9:14\SYUKF.E)<VSM%D=!XOLC=^Z.FD'5^ES^N5U+6F#Q +MMFZL^=NVPYLQXOLQ,_>76;U,EP!Q;$BAD59<8NQV.:3\S!VF,2Q)R_6,U=XK +MUR]I968\-3![C?FY7:KW_IVJA^C?<[G;?.=V(G;V:>*'^#K[%&N![EJ827%& +M(!FC?7_!2F9YBE]A-EPFLG/$&IEBC2_ZE_\T&TG<8=[/7LE.+VEFKXBWY:/, +MC]CQ@1Y5]36$^#7+I/Z;M@!SEQGK"L:^_>17WMVE-9_;&Y^\5N/1]]DL'AO: +MOTW[F?#CVWD$$>"[^FH"V?],K`7^`_3+K_CD'RZ*W<\F8"ZH*:'U,'R'+W*' +ME?$([0)<.8-6#P]'Y`/(X;I'CNQ,5R;R1/??7ZT)*[;((L6B[Z:X"VN+,^Y2 +MXE5P_#UZ&UR\7?<*S7H1>^3X\)KXQL99WT@^*TB_F$3&NRVTY*K^<TLYY(E& +M1NZY6!:JD)UW5$DF$[.JYD14N503M:-]P(Z[9]""NV2\.?ZAV#.R)X*L"M?- +M@*5=I.4I4T)@I*HU&YY#J0;-BAJ9=:L6W+>EO)H,6#=@Y)1+0%3:O6P;Z)K7 +M1Q4;RMTHF]:#G\@HVDGZ#SAENXF%!CIQOVO08D99<5A'60F>FP<:\;SJ1RR] +MPBNIU372ZU/1UA.X[*W@POKV6-+LGJ=8Q-KXYE.T!K#J97!Q"&LVK%%44^N( +M*-V,OAQ")FZ227;Z;X5\5,??GT!4LKKW1484DWLOE]K>LU<C'LZN]Q&/?>GR +ML$+K=41$WP:*N^LN.AHT"U;\51ORJ2K*]`^\R&35@8R>WC^3CS?')S_JY.V^ +M3D"_31$`<?G*O[Y;V,\)EKD1,1+?:/D(>EN8>.:6$:N=WZR_F3S@I/U6>GLM +M*Q&=>6(WC?;2"IK6=T6^>]5DI_TY9,EV7.9@.UJ")F=P/C*50RVTRS]I/]M) +MOR2QJXYF^A5'NT[1-&FMHU_#I&A?Q\QN$3NHXI><OD=_":JZG_M3^33U%?@T +M.,N8G,6\13,F%_AS@;L?&-RM-;B3!7?HSZ"T^#_DKY!C9&A?T%+O%WO-GO:N +MW4JK=3D4>XOJZ7J!60<J\53&JE,.VLE/O$"[*[*L./@Z1-`&Q2*^0V*73^[: +MS4N<4UG;Y`A6.;L'7_F[GXL8;(Y44%[E5PIY".W+W&;V1>FWHO_U!++TBXX' +MXI-F&W@M8XL176`#&$]Y5HI/7FP+L(QM!ZL.LG*%2=[8'HSI(QJ38L$WQKAC +M&O5R%R0W().%)5XT>&3LZHX[WH2%:=*QO-J8?6BM]"J><N'3HT=&4TY@8Y2& +M?%QB;^]G)/_LPF,CJD%;U/X8,";`K*56<%*']<D>U1K!-UJ?*^;VM]\%MU:# +MVR<_D]<^\>ZIDS*07Y^E';29GMK([I<C=R2*F`=.>@;-V/(PLX)N!8VQ,$+T +M(2M513T8=`2/TV*^C(E]P*)<$KJ62?;E,NT#UMPK?BTBWO*^M-H'-X-106^& +M#[NJA:9>8%7(;YM/YD7);OVMX)1:?ZG=074;\FJGUK:643D;/C4R,2*@)/#Q +M`K,K]<9OQG2*/]`&#<C!M=)UD#:Z"ZBQV`N03QLP(?-4*]G7A:.04^-,[PJM +M-.4J-^RQ(D\6B<O>M2LQ)M:FM'IVB-UI]$O8TA':1YH`U;0YMFOPU=BN3*6H +M_S;].L1=0M30Q]EW\MQ,LO@84=-ZZ;-D1Z=>Y92IWNN7:J+!9O%;$5>QU*0& +M79X??^QG3S)($/:FCUZJUG9@]/3,I`I(#Z6NO%JO/:37&M*;:Y650B)G2:>& +ME=#S:6%!`=TJ4S5D2><ITKJ*8";@;\S\OLJ3B6]U?:MK=V(7<*QB5GX8VYUA +M;*^!;3D*6IF0L#@AK0MGO"RV^S%9I\5+:#0?#2J/O+([;=$M[=TQ)?K9EGKA +MD)>EYV+6*Y[86$K6,8TZKLC+6QG]OCIMU#B0AU^:/8<1[R]&>1DBSB%A?9!/ +MRD]]T*C<)R+?HKF'U>:4V`F&GJTO"JF]*&8"8_O$>\RMM"_\F"7+EC<SN]@C +M]A9'EP\O!VAGVY"L8C_V(NTVZIPNI]_-F.D<1M=AJJ+0DW:53F@@8P]F+-_! +M*([%2*MVWM[#IM="#Z8=TR+&73"BUO#LF';0^Y46\%(E=K7#H(H90&\VQB>G +M;0&FV45O#L&_59?JOZ;`!T5(%R3\:H*L+3][8E>@/QO5Q`RG=]JXCV9XU0[F +M]SO&GV285U7ZC)C.P3^BY^SR`R,JSZ[$W0);-"M\.[WS!,OX\ZE61B?Y/J;8 +MGY2TG@G4I4S;&9U$9GO$;M="W!<_B)Q,61G;M7$J*QW$(EVR[A_9$?[57RA> +M4<<.XM_^$65Q$00N$]7I/B$?]#LF@A;Z[3%&UTDGZU[2"L6-WM@NZ.,GK%0) +M?4:_BY7%:)/$J9293J7.TR\C+#LDQ;3#9+6P\A3MAI<_<V+=;YGL.^$[L:R5 +MN9;!9G'9<5E]/Q'KOTO=<\[_Q"_JG-'?S4-.0[I5S#7MOB[2&FDY=1EZK=;< +MT$J3;V:-R=MK]FJW96%6]%<V@F7T.S;R%\B'<[0/Z65SSQAU/>$N,ZN^/QFD +M_4G%EV$/B9[]D2#[(JY&7'?A:D!6QMDJY`'KM6GDYYVH6TEOZZ[Y'6M2Z->% +MR&QEF=YM'4A1;L$6IA\Y&0Y]D5GB_PY[#K$$_C6(^^P_"!I4J1066=\7E6KQ +MW:A4BN^[%(?X;A`98HBM2KQL_*)33NW7I`GPF++HG&5]5']$3E7[D6>[-W8_ +MYUX(_[@^;6T%S[>&V1<)5[$C:UD?G_S@.V\9E,!S`/YZ+;5J@L8$,E_(*,3O +MZWZ&TQM=G6F+/F9!H1(4.D'A`1]+62"/3L7\+ZC7N9B10QMLQ)EUD5W?CPBK +M5*#=Q%8:F>[*PC@2>^F73_)".C<%CQ[,EAJM\V!^@)FJ[?0W4&K3S.0\U;SB +MBS+D*)LEM\E2_$^JG_MLU%YB6POEHE*G5*_C2\<*F%*]!R/53)#D2N17B>Z# +M[DZ^:$5>8::8_N3^.LJK"_+PRH^9=TBM8X@X=FC^;HRF#OIWQV`I,S7+42.C +MYJZ9&LZ:MDO<S&/QR?=WBQW'SI0E-H8X=);*\)`2=-7I1?F;NS(N'GOK-?AE +M0'\<SH9X3+Q!,M9WA7Y!?&87+^FBWW&9Y0IPO0J9/[WEUHGORY$*A?:2!47- +M2AK3I6V,3Y[5ZC:8HF*;'94<9)[L\(2DLND'LAG80S7X;YCA/S3+_WN?(FJL +M%JT5>@M@5J.TC=V]W62,L<*'*0:?[DFQ:2<RLR;4O0H\:Z%'3R>WI<QKKK#+ +M/&:<VKWAH]5?YQ;SQ*Z,.;A&_%:Z$_Y0FN4:%M*$>7>WX;G&:>X!9_W$[K0U +MR\C:%?-?P=K!W1?5:L4*G[48WO8;7;O3GU">K'&4T8ZGQY"WV4E'T`/I;JUL +MG`#DED^85$NN;L*46A';O25PA&1<H=A`"R5!C2A<FJ5]8]O<GL%A#9V6Z;O. +MG^N#[.(]:*P`4.-BLM*@+876[,@N,JQJ@MY[?9E5*57TOA2=,6#5'16_VZ:_ +M8E!E\&"G/@E>KH*L[!1[8BSU8_)_Z+WP/H3#7=AS?B4VY[R<]8I=V)F_NV#L +MC^[M/A`YS,RWP6,7O\]@K"NC6V!KQ_(92VC[]+12<6Y/\\4R.]>V,;'/_/0V +MQJU&C`1>L#3`U$16/38R$-.>/)8?1,;9?+'<+(>V,:516[F6'<L/A#0[?>MM +MCA^+MFK['BSN@P-.\7U[6F_;)MI,6DF`SN)@<O'_@E6=HOMZ.N?4_U83?>[= +MAYM9?V[4&+OK(=H7$K^$%)]YEW']!M=O^P>UX1S+]O76#?8,)!D;RO5D<W6] +MZ<RF+2PYV%<H;=.2J![(]"597W)K_R9`#@_VYQCK'4ZEDED=;(AM369[,T,$ +MTSNLZN!L<Q(!@UJ&^C.#[,O#_<D<F_W+4N*#Z8S\>?9YD+9!BIZ'<+F*GD&5 +MU;#9SS9<*XK:^W`U%CV3?,)%S[VXXD7X&XVK\%$-F,)GLW$5/EMQ:47/7V;7 +M?;[TY:T;U<V#C7V-PXV]C:G&;4.-2<'01N;9N";1Q2'$7&8HETWV#/#;`R'N +MO>N.P.TA_*\E**VX>2.UU]7QEHSV1+9?W9SCM]]UUQV\97.V?RC7WS/(UP1X +M-*-I0T*WTG,;AGK49"-?.L0?S&AT7C'TL*U#+S3:.#YU#V[=N`W<#27[AGLS +M#_,'Z^J$%=R=ZD\GQ6/!'.[68`SBS.-1>GQ8H*.]R$CN%G>!-6,NQ76SAC.# +MK1O0W?J73IBJR9[NIMNC@\,##PM(PVAF,.<8F][+T,,&(-F=*`L+$R6RO(=M +MMOCP0&\RR]=FL@,]N:%&[GU\<S*;Y,K@,MZ#[YZTMKFG#GT&>%^_VI\;JA7= +MA1[<UOWPX.`@W\YG2[@_N#GZ,$H>JJCCJ4R61Y/;!`8U9CH>-FHSFW(]Z9GZ +MWDBAOK=_L"?[1*'!J.Q+;NH?Z$ES;T]Z*(.G5,]P.B=:!C.#==GDIHPZV/]D +MLJ_6)A#5_JW)09[;#.9[,UN3_(G,,-\$2Q#8&@Q'@RYX#W^P?1W40&3:DVI/ +M[Q.YI$!?UY_.T`/O`=26PD,V.:0E-^5`.OU$@#^8[1E4DWS3YN2F+?V#*N\? +M'(9\A86=FB[Z%&:<(7>A:>ZM^W*M(#['`%"]K18#RH'/=.;Q)#C,\2&HG^?Z +M!Y(!&_.QQY<SEF6IS#!P9VROD;N7#KDQ0*UG4W_N"9AVNB^`BP8U9'@L+HQ! +M-'%.@R]ZSF6@";UB2-1@<M,#[X)(]8J^X0&-1IG+-/(;Z.4RUU-\<*B`N>YA +MS+K'L_V07RJ;&>`TA71V@34S`E%#G/;U#[+,%C__,ITD#JJ!0("QSGXM.22D +ME4W6]?5G20=`>;P_G>:/9[);>.]P#N+/);,]0CLV,5F#F>&<1@U#7,MF-O?W +M@H4^4-N4&0:#)&2PVT,Z+F+C\?[<9C*6+"=5#P58,IO-9!OY_50U,T;^(`;V +M,%%.)X>&8&:P+!UI5C(ZS&TVMB:1Z$@4A$:#F"$S1"9)C&S*9D!FEHM>4F^V +M/XG^.]/)GJ$DL9L4YKRU)ST,89`]JSTP;#+=.:1M?1D>[UC/,9,W;18HLW3[ +M![DXRZ4CVL+(B-+`\!#L+)D3@^Y//2'0E"+#)#^@#@\D!W.D-;6G?U!,$WQZ +M-FTB$?0/#O7W):_KSMN?#`A!4W5R&Y13P!(VK8MI4/@>J'=H+O:RH=H`@WN' +M0:@PI%`#E%:WVBA`N'>D^Y8N?9B7(6`+C0XN@QPS`UHZ"4EEP'D/4?%S(L%3 +M/;`Z*/_QGNP@6?$@"9FZQQ03Q@*P34F83I^?)WNR:4@@F1V`'])%59"5$6]R +M4(TP>GB6K&[:NJN>59R?@`8&R()UZ_^_'(4Q@8QA%$.3IQ!FW)_1O6H!*3`+ +M@[K!`HMBZE$0T2?J=2CXZ+YE,/EX,08S++70FQ\D>GHQDVD29S/"!@0<2;BQ +MJ%&(__H^TSWJ$`]M6YK>9O0&F<&6EP8:AG"[?27=ZQ&=9QP:L-H1X^`-B8H@ +MDIDS(H-.HC5"0$;[+&Q*`/D-`>H^>VAX@`G&#*HZ;YMAAX,9(A3X[+$4.3GA +MS_[(V+;?X*&'>G6H9.^,X]5+@"WZ1.8Z7]YRO6-O9\9(P-6,`0PD!S+9)X1& +M9_HUY$)__>.S!2/D8DS+'`V4'#>1'4*T3;/_$/]S!(L/4G&DG5\B/[@)_Q]N +MA-6*K+>1SRG9##DS49[SD3H[NN[M;KO_T9:.1&)-RWI65\?84H0H/6WCRM*A +M9>2%>P9Z^]7AS#`2O.+6NCIJ[\LDAPH3Y7%..8#ARFS7T=KT)T$#-IM$E,J* +MT%0$1E##@[,9R5QV_DB[8(`D\#D0?HBWAT(<4K5-E"V$EF9LGPN-_I9N6G8= +MUU3U.6RSEIFX>)U%!0I:";.B%4)Q69ISS9BQES[\AD]4GOL9F_D8%2/B(WW& +M1V\?%1_39WRHE5^_U/C_\BD_Q)CC@?\(RK']_T5?IJ)RGFYE(NMTX%_11]29 +MQ9H7GSJL(!T_NJYN;`9N!G?%L1MQ!>>7YM:M>/=&N!5G"]#!GN%<)K@IC15( +M\/&>?K&\W02O>'LHB/]WK`@%&T)TI%URPZ>L1%YH,E')5%)94KW(J"TK6[3H +M!EBB*M;X)7JOY0VX/.#U*JX+N$ZC\B8F[+0<:WW'.[J.'(`SAU#])JZ#N.#W +MI)6XL(*6*G'1ROM37!_B>AO7Z[A^C.M[N)[#M9OI*U[J__+_!F`.QRX@6@`` +` +end |