pax_global_header00006660000000000000000000000064144475736440014534gustar00rootroot0000000000000052 comment=c2fe7f135c44e408dda55b3dffb10035c042c9b3 headache-1.07/000077500000000000000000000000001444757364400132055ustar00rootroot00000000000000headache-1.07/.gitignore000066400000000000000000000000401444757364400151670ustar00rootroot00000000000000_build .merlin headache.install headache-1.07/LICENSE000066400000000000000000000614441444757364400142230ustar00rootroot00000000000000 GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, 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 library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, 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 companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, 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 library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete 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 distribute a copy of this License along with the Library. 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 Library or any portion of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, 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 Library, 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 Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you 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. If distribution of 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 satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. 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. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library 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. 9. 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 Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library 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. 11. 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 Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library 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 Library. 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. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library 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. 13. The Free Software Foundation may publish revised and/or new versions of the Library 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 Library 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 Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, 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 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. 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 LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. 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. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! headache-1.07/Makefile000066400000000000000000000035501444757364400146500ustar00rootroot00000000000000########################################################################## # # # Headache # # # # Vincent Simonet, Projet Cristal, INRIA Rocquencourt # # # # Copyright 2002 # # Institut National de Recherche en Informatique et en Automatique. # # All rights reserved. This file is distributed under the terms of # # the GNU Library General Public License. # # # # Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ # # # ########################################################################## .PHONY: headache clean install test headache: dune build clean:: dune clean # install install: ifndef INSTALLDIR $(error "Please define INSTALLDIR.") else mkdir -p $(INSTALLDIR) cp -f _build/install/default/bin/headache $(INSTALLDIR)/headache endif # test bootstrap: headache dune exec -- headache -h example $(filter-out config_builtin.ml, $(wildcard *.ml*)) Makefile doc-src/Makefile doc-src/manual.tex test: bootstrap dune exec -- headache -e Makefile > example.txt diff -q example example.txt rm -f example.txt # documentation ifndef DOC_INSTALLDIR DOC_SRC= doc-src # default installation from ./doc-src to ./doc and update of ./README DOC_INSTALLDIR= doc .PHONY: install-doc install-doc:: cp -f doc-src/manual.txt ./README else # for installation from ./doc to $(DOC_INSTALLDIR) DOC_SRC= doc endif sinclude doc-src/Makefile headache-1.07/README000066400000000000000000000230571444757364400140740ustar00rootroot00000000000000 `headache` ********** Vincent Simonet =============== November, 2002 ============== This manual is also available in plain text (1), PostScript (2) and PDF (3). 1 Overview *=*=*=*=*= It is a common usage to put at the beginning of source code files a short header giving, for instance, some copyright informations. `headache` is a simple and lightweight tool for managing easily these headers. Among its functionalities, one may mention: - Headers must generally be generated as comments in source code files. `headache` deals with different file types and generates for each of them headers in an appropriate format. - `headache` automatically detects existing headers and removes them. Thus, you can use it to update headers in a set of files. `headache` is distributed under the terms of the GNU Library General Public License. See file `LICENSE` of the distribution for more information. 2 Compilation and installation *=*=*=*=*=*=*=*=*=*=*=*=*=*=*= Building `headache` requires Objective Caml (version 3.06 or up, available at http://caml.inria.fr/) and GNU Make. In addition, from version 1.03-utf8, the build requires the Unicode library Camomile and, from version 1.04, Dune. Instructions << make && sudo make INSTALLDIR=/usr/local/bin install >> Build the executable and install it into the specified directory. `headache` is available through OPAM (available at http://opam.ocaml.org/), the OCaml Package Manager. This is the preferred installation method. Be sure to install opam v1.2 or higher. Then the following sequence of commands should install the package: << opam init opam install depext opam depext headache opam install headache >> 3 Usage *=*=*=* Let us illustrate the use of this tool with a small example. Assume you have a small project mixing C and Caml code consisting in three files `foo.c`, `bar.ml` and `bar.mli`, and you want to equip them with some header. First of all, write a header file, i.e. a plain text file including the information headers must mention. An example of such a file is given in figure 1. In the following, we assume this file is named `myheader` and is in the same directory as source files. Then, in order to generate headers, just run the command: << headache -h myheader foo.c bar.ml bar.mli >> Each file is equipped with a header including the text given in the header file `myheader`, surrounded by some extra characters depending on its format making it a comment (e.g. `(*` and `*)` in `.ml` files). If you update informations in the header file `myheader`, you simply need to re-run the above command to update headers in source code files: existing ones are automatically removed. Similarly, running: << headache -r foo.c bar.ml bar.mli >> removes any existing in files `foo.c`, `bar.ml` and `bar.mli`. Files which do not have a header are kept unchanged. The current headers of files can be extracted: << headache -e foo.c bar.ml bar.mli >> prints on the standard output the current headers of the files `foo.c`, `bar.ml` and `bar.mli`. All files are kept unchanged. -------------------------------------------------------------------- << Headache Automatic generation of files headers Vincent Simonet, Projet Cristal, INRIA Rocquencourt Copyright 2002 Institut National de Recherche en Informatique et en Automatique. All rights reserved. This file is distributed under the terms of the GNU Library General Public License. Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ >> Figure 1: An example of header file -------------------------------------------------------------------- 4 Configuration file *=*=*=*=*=*=*=*=*=*= File types and format of header may be specified by a configuration file. By default, the default builtin configuration file given in figure 2 is used. You can also use your own configuration file thanks to the `-c` option: << headache -c myconfig -h myheader foo.c bar.ml bar.mli >> In order to write your own configuration, you can follow the example given in figure 2. A configuration file consists in a list of entries separated by the character `|`. Each of them is made of two parts separated by an `->`: - The first one is a regular expression. Regular expression are enclosed within double quotes and have the same syntax as in Gnu Emacs. `headache` determines file types according to file basenames; thus, each file is dealt with using the first line its name matches. - The second one describes the format of headers for files of this type. It consists of the name of a model (e.g. `frame`), possibly followed by a list of arguments. Arguments are named: `open:"(*"` means that the value of the argument `open` is `(*`. `headache` currently supports three models: - `frame`. With this model, headers are generated in a frame. This model requires three arguments: `open` and `close` (the opening and closing sequences for comments) and `line` (the character used to make the horizontal lines of the frame). Two optional arguments may be used: `margin` (a string printed between the left and right side of the frame and the border, by default two spaces) and `width` (the width of the inside of the frame, default is 68). - `lines`. Headers are typeset between two lines. Three arguments must be provided: `open` and `close` (the opening and closing sequences for comments), `line` (the character used to make the horizontal lines). Three optional arguments are allowed: `begin` (a string typeset at the beginning of each line, by default two spaces), `last` (a string typeset at the beginning of the last line) and `width` (the width of the lines, default is 70). - `no`. This model generates no header and has no argument. It is possible to change the default builtin configuration file at compile time. For this, just edit the file `config_builtin.txt` present in the source distribution before building the software. -------------------------------------------------------------------- << # Objective Caml source ".*\\.ml[il]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.fml[i]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.mly" -> frame open:"/*" line:"*" close:"*/" # C source | ".*\\.[chy]" -> frame open:"/*" line:"*" close:"*/" # Latex | ".*\\.tex" -> frame open:"%" line:"%" close:"%" # Misc | ".*Makefile.*" -> frame open:"#" line:"#" close:"#" | ".*README.*" -> frame open:"*" line:"*" close:"*" | ".*LICENSE.*" -> frame open:"*" line:"*" close:"*" >> Figure 2: The default builtin configuration file -------------------------------------------------------------------- It is also possible to add entries into your own configuration file that specify when the initial lines of the processed file have to be skipped. As previously, these entries are separated by the character `|` and each of them is made of two parts separated by an `->`: - Again, the first part is a regular expression used by `headache` to determine the file type. But here, it is according to its full filename (including the pathname). - The second part specifies when the initial lines must be skipped. It consists of the keyword `skip` followed by one of the named arguments `multiline_match:` or `match:`, then a regular expression. As long as the lines match a `multiline_match` parameter, `headache` skips them and checks the next line. If the current line matches only a `match` parameter, `headache` skips the current line and breaks the iteration there (of course, if nothing matches, `headache` puts the header before the current line). -------------------------------------------------------------------- <<# Script file | ".*\\.sh" -> frame open:"#" line:"#" close:"#" | ".*\\.sh" -> skip match:"#!.*" >> Figure 3: Example of a configuration file for skipping the shebang line of shell scripts -------------------------------------------------------------------- Figure 3 shows an example of configuration file that can used to skip the shebang line of shell scripts: when the first line of `.sh` files starts with `#!`, `headache` does not modify that line and considers that the header must start at the second line. -------------------------------------------------------------------- <<# SWI Prolog file | ".*\\.pl" -> frame open:"%" line:"%" close:"%" | ".*\\.pl" -> skip multiline_match:"#!.*" multiline_match:":-.*" >> Figure 4: Example of a configuration file for skipping the shebang line, as well as lines containing Prolog directives, such as Unicode usage. -------------------------------------------------------------------- Figure 4 shows an example of configuration file that can used for `SWI prolog` files: for a `.pl` file starting with the following three first lines, `headache` considers that the header must start just after the first two lines: << #!/usr/bin/env swipl :- encoding(utf8). % remainder of the file, that can be after the header >> ----------------------------------------------------------------------- This document was translated from LaTeX by HeVeA (4). ----------------------------------- (1) manual.txt (2) manual.ps.gz (3) manual.pdf (4) http://hevea.inria.fr/index.html headache-1.07/config.ml000066400000000000000000000021351444757364400150050ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) exception Error of string * int * int headache-1.07/config_builtin.txt000066400000000000000000000010151444757364400167360ustar00rootroot00000000000000# Builtin configuration file # Objective Caml source ".*\\.ml[il]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.fml[i]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.mly" -> frame open:"/*" line:"*" close:"*/" # C source | ".*\\.[chy]" -> frame open:"/*" line:"*" close:"*/" # Latex | ".*\\.tex" -> frame open:"%" line:"%" close:"%" # Misc | ".*Makefile.*" -> frame open:"#" line:"#" close:"#" | ".*README.*" -> frame open:"*" line:"*" close:"*" | ".*LICENSE.*" -> frame open:"*" line:"*" close:"*" headache-1.07/config_lex.mll000066400000000000000000000102341444757364400160300ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) { open Printf open Config_parse (* To buffer string literals *) let initial_string_buffer = Bytes.create 256 let string_buff = ref initial_string_buffer let string_index = ref 0 let reset_string_buffer () = string_buff := initial_string_buffer; string_index := 0 let store_string_char c = let len = Bytes.length (!string_buff) in if !string_index >= len then begin let new_buff = Bytes.create (len * 2) in Bytes.blit (!string_buff) 0 new_buff 0 len; string_buff := new_buff end; Bytes.set (!string_buff) (!string_index) c; incr string_index let get_stored_string () = let s = Bytes.sub (!string_buff) 0 (!string_index) in string_buff := initial_string_buffer; s (* To translate escape sequences *) let char_for_backslash = match Sys.os_type with | "Unix" | "Win32" | "Cygwin" -> begin function | 'n' -> '\010' | 'r' -> '\013' | 'b' -> '\008' | 't' -> '\009' | c -> c end | "MacOS" -> begin function | 'n' -> '\013' | 'r' -> '\010' | 'b' -> '\008' | 't' -> '\009' | c -> c end | _ -> (* TEMPORARY Error "Unknown system type" *) assert false let char_for_decimal_code lexbuf i = let c = 100 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) + 10 * (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) + (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in if c < 0 || c > 255 then raise (Config.Error(sprintf "illegal escape %s" (Lexing.lexeme lexbuf), Lexing.lexeme_start lexbuf, Lexing.lexeme_end lexbuf)) else Char.chr c (* To store the position of the beginning of a string *) let string_start_pos = ref 0 } let blank = [' ' '\010' '\013' '\009' '\012'] let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9'] rule token = parse blank + { token lexbuf } | "->" { ARROW } | "|" { PIPE } | ":" { COLON } | "#" [^ '\010' '\013']* ['\010' '\013'] { token lexbuf } | identchar+ { STRING (Lexing.lexeme lexbuf) } | "\"" { reset_string_buffer(); let string_start = Lexing.lexeme_start lexbuf in string_start_pos := string_start; string lexbuf; lexbuf.Lexing.lex_start_pos <- string_start - lexbuf.Lexing.lex_abs_pos; STRING (Bytes.to_string (get_stored_string())) } | eof { EOF } | _ { raise (Config.Error (sprintf "Illegal character %c" ((Lexing.lexeme lexbuf).[0]), Lexing.lexeme_start lexbuf, Lexing.lexeme_end lexbuf)) } and string = parse '"' { () } | '\\' ("\010" | "\013" | "\013\010") [' ' '\009'] * { string lexbuf } | '\\' ['\\' '"' 'n' 't' 'b' 'r'] { store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); string lexbuf } | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] { store_string_char(char_for_decimal_code lexbuf 1); string lexbuf } | eof { raise (Config.Error ("Unterminated string", !string_start_pos, !string_start_pos+1)) } | _ { store_string_char(Lexing.lexeme_char lexbuf 0); string lexbuf } headache-1.07/config_parse.mly000066400000000000000000000110471444757364400163720ustar00rootroot00000000000000/**************************************************************************/ /* */ /* Headache */ /* */ /* Vincent Simonet, Projet Cristal, INRIA Rocquencourt */ /* */ /* Copyright 2002 */ /* Institut National de Recherche en Informatique et en Automatique. */ /* All rights reserved. This file is distributed under the terms of */ /* the GNU Library General Public License. */ /* */ /* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ */ /* */ /**************************************************************************/ %{ open Printf type entry = | EntryModel of Model.generator | EntrySkip of Skip.param_skip list ;; (* Dispatch entry considering if it is a skip or a model. * List returned are reversed considering their initial order. *) let rec dispatch_entry acc_model acc_skip lst = match lst with | (rg_filename, EntryModel mdl) :: tl -> dispatch_entry ((rg_filename, mdl) :: acc_model) acc_skip tl | (rg_filename, EntrySkip rg_skip_lst) :: tl -> let nacc_skip = List.fold_left (fun nacc_skip rg_skip -> (rg_filename, rg_skip) :: nacc_skip) acc_skip rg_skip_lst in dispatch_entry acc_model nacc_skip tl | [] -> acc_model, acc_skip %} %token ARROW %token COLON %token EOF %token PIPE %token STRING %start configfile %type <((Str.regexp * Model.generator) list) * ((Str.regexp * Skip.param_skip) list)> configfile %start boot %type <(string * string * (string * string) list) list> boot %% configfile: opt_pipe item_list EOF { dispatch_entry [] [] $2 } ; opt_pipe: /*empty*/ { () } | PIPE { () } ; item_list: item { $1 :: [] } | item_list PIPE item { $3 :: $1 } ; item: STRING ARROW STRING parameters { let regexp = try Str.regexp ("^" ^ $1 ^ "$") with Failure msg -> raise (Config.Error (sprintf "Illegal regexp: %s" msg, Parsing.rhs_start 1, Parsing.rhs_end 1)) in if $3 = "skip" then let fun_parameters (id, str) = if id = "match" then try false,Str.regexp ("^" ^ str ^ "$") with Failure msg -> raise (Config.Error (sprintf "Illegal regexp: %s" msg, Parsing.rhs_start 1, Parsing.rhs_end 1)) else if id = "multiline_match" then try true,(Str.regexp ("^" ^ str ^ "$")) with Failure msg -> raise (Config.Error (sprintf "Illegal regexp: %s" msg, Parsing.rhs_start 1, Parsing.rhs_end 1)) else raise (Config.Error (sprintf "Unkown option '%s' for skip" id, Parsing.rhs_start 3, Parsing.rhs_end 3)) in let skip_lst = List.map fun_parameters (List.rev $4) in regexp, (EntrySkip skip_lst) else let model = try Model.find $3 with Not_found -> raise (Config.Error (sprintf "Unknown model: %s" $3, Parsing.rhs_start 3, Parsing.rhs_end 3)) in let generator = try model (List.rev $4) with Model.Error msg -> raise (Config.Error (msg, Parsing.rhs_start 3, Parsing.rhs_end 4)) in regexp, (EntryModel generator) } ; parameters: /*empty*/ { [] } | parameters STRING COLON STRING { ($2, $4) :: $1 } ; /***************************************************************************/ boot: opt_pipe boot_item_list EOF { List.rev $2 } ; boot_item_list: boot_item { $1 :: [] } | boot_item_list PIPE boot_item { $3 :: $1 } ; boot_item: STRING ARROW STRING parameters { $1, $3, $4 } ; headache-1.07/doc-src/000077500000000000000000000000001444757364400145375ustar00rootroot00000000000000headache-1.07/doc-src/.gitignore000066400000000000000000000001741444757364400165310ustar00rootroot00000000000000/manual.aux /manual.dvi /manual.haux /manual.html /manual.htoc /manual.log /manual.pdf /manual.ps /manual.ps.gz /manual.txt headache-1.07/doc-src/Makefile000066400000000000000000000034741444757364400162070ustar00rootroot00000000000000########################################################################## # # # Headache # # # # Vincent Simonet, Projet Cristal, INRIA Rocquencourt # # # # Copyright 2002 # # Institut National de Recherche en Informatique et en Automatique. # # All rights reserved. This file is distributed under the terms of # # the GNU Library General Public License. # # # # Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ # # # ########################################################################## DOC_SRC?= . MANUAL := $(DOC_SRC)/manual DOC_FILES= $(addprefix $(MANUAL)., pdf ps.gz html txt) .PHONY: doc clean-doc install-doc doc: $(DOC_FILES) clean-doc: rm -f $(addprefix $(MANUAL)., pdf ps ps.gz dvi aux log thm txt html haux htoc) clean:: clean-doc $(MANUAL).dvi: $(MANUAL).tex cd $(dir $@) && latex $(notdir $<) cd $(dir $@) && latex $(notdir $<) $(MANUAL).ps: $(MANUAL).dvi dvips -t a4 -o $@ $< $(MANUAL).ps.gz: $(MANUAL).ps gzip -c $< > $@ $(MANUAL).pdf: $(MANUAL).dvi dvipdfm -p a4 -o $@ $< $(MANUAL).html: $(MANUAL).tex $(MANUAL).dvi hevea -o $@ $< $(MANUAL).txt: $(MANUAL).tex $(MANUAL).dvi hevea -o $@ -text $< install-doc:: ifndef DOC_INSTALLDIR $(error "Please define DOC_INSTALLDIR.") else mkdir -p $(DOC_INSTALLDIR)/ cp -f $(DOC_FILES) $(DOC_INSTALLDIR)/ endif headache-1.07/doc-src/manual.tex000066400000000000000000000273041444757364400165440ustar00rootroot00000000000000%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % Headache % % % % Vincent Simonet, Projet Cristal, INRIA Rocquencourt % % % % Copyright 2002 % % Institut National de Recherche en Informatique et en Automatique. % % All rights reserved. This file is distributed under the terms of % % the GNU Library General Public License. % % % % Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %BEGIN LATEX \documentclass{article} \setlength{\textheight}{240mm} \setlength{\textwidth}{160mm} \setlength{\topmargin}{-22mm} \setlength{\headheight}{5mm} \setlength{\headsep}{12mm} \setlength{\footskip}{16mm} \setlength{\oddsidemargin}{2.2mm} \setlength{\evensidemargin}{2.2mm} %END LATEX %HEVEA \documentclass{article} \usepackage{alltt} \usepackage{moreverb} \usepackage{url} %BEGIN LATEX \newcommand{\mytt}[1]{\texttt{#1}} %END LATEX %HEVEA \newcommand{\mytt}[1]{`\texttt{#1}`} \newcommand{\headache}{\mytt{headache}} \title{\headache{}} \author{Vincent Simonet} \date{November, 2002} \begin{document} \maketitle %HEVEA This manual is also available in \ahref{manual.txt}{plain text}, %HEVEA \ahref{manual.ps.gz}{PostScript} and \ahref{manual.pdf}{PDF}. % ************************************************************************* \section{Overview} It is a common usage to put at the beginning of source code files a short header giving, for instance, some copyright informations. \headache{} is a simple and lightweight tool for managing easily these headers. Among its functionalities, one may mention: \begin{itemize} \item Headers must generally be generated as \emph{comments} in source code files. \headache{} deals with different file types and generates for each of them headers in an appropriate format. \item \headache{} automatically detects existing headers and removes them. Thus, you can use it to update headers in a set of files. \end{itemize} \headache{} is distributed under the terms of the \emph{GNU Library General Public License}. See file \mytt{LICENSE} of the distribution for more information. % ************************************************************************* \section{Compilation and installation} Building \headache{} requires \emph{Objective Caml} (version 3.06 or up, available at \url{http://caml.inria.fr/}) and \emph{GNU Make}. In addition, from version \texttt{1.03-utf8}, the build requires the Unicode library \emph{Camomile} and, from version \texttt{1.04}, \emph{Dune}. \paragraph{Instructions} \begin{alltt} make && sudo make INSTALLDIR=/usr/local/bin install \end{alltt} Build the executable and install it into the specified directory. \headache{} is available through \emph{OPAM} (available at \url{http://opam.ocaml.org/}), the \emph{OCaml Package Manager}. This is the preferred installation method. Be sure to install opam v1.2 or higher. Then the following sequence of commands should install the package: \begin{alltt} opam init opam install depext opam depext headache opam install headache \end{alltt} % ************************************************************************* \section{Usage} Let us illustrate the use of this tool with a small example. Assume you have a small project mixing C and Caml code consisting in three files \mytt{foo.c}, \mytt{bar.ml} and \mytt{bar.mli}, and you want to equip them with some header. First of all, write a \emph{header file}, i.e.\ a plain text file including the information headers must mention. An example of such a file is given in figure~\ref{figure:header}. In the following, we assume this file is named \mytt{myheader} and is in the same directory as source files. Then, in order to generate headers, just run the command: \begin{alltt} headache -h myheader foo.c bar.ml bar.mli \end{alltt} Each file is equipped with a header including the text given in the header file \mytt{myheader}, surrounded by some extra characters depending on its format making it a comment (e.g.\ \mytt{(*} and \mytt{*)} in \mytt{.ml} files). If you update informations in the header file \mytt{myheader}, you simply need to re-run the above command to update headers in source code files: existing ones are automatically removed. Similarly, running: \begin{alltt} headache -r foo.c bar.ml bar.mli \end{alltt} removes any existing in files \mytt{foo.c}, \mytt{bar.ml} and \mytt{bar.mli}. Files which do not have a header are kept unchanged. The current headers of files can be extracted: \begin{alltt} headache -e foo.c bar.ml bar.mli \end{alltt} prints on the standard output the current headers of the files \mytt{foo.c}, \mytt{bar.ml} and \mytt{bar.mli}. All files are kept unchanged. \begin{figure} %BEGIN LATEX \begin{center} %END LATEX \begin{boxedverbatim} Headache Automatic generation of files headers Vincent Simonet, Projet Cristal, INRIA Rocquencourt Copyright 2002 Institut National de Recherche en Informatique et en Automatique. All rights reserved. This file is distributed under the terms of the GNU Library General Public License. Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ \end{boxedverbatim} %BEGIN LATEX \end{center} %END LATEX \caption{An example of header file} \label{figure:header} \end{figure} % ************************************************************************* \section{Configuration file} File types and format of header may be specified by a \emph{configuration file}. By default, the default builtin configuration file given in figure~\ref{figure:config} is used. You can also use your own configuration file thanks to the \mytt{-c} option: \begin{alltt} headache -c myconfig -h myheader foo.c bar.ml bar.mli \end{alltt} In order to write your own configuration, you can follow the example given in figure~\ref{figure:config}. A configuration file consists in a list of \emph{entries} separated by the character \mytt{|}. Each of them is made of two parts separated by an \mytt{->}: \begin{itemize} \item The first one is a \emph{regular expression}. Regular expression are enclosed within double quotes and have the same syntax as in Gnu Emacs. \headache{} determines file types according to file basenames; thus, each file is dealt with using the first line its name matches. \item The second one describes the format of headers for files of this type. It consists of the name of a \emph{model} (e.g.\ \mytt{frame}), possibly followed by a list of arguments. Arguments are named: \mytt{open:"(*"} means that the value of the argument \mytt{open} is \mytt{(*}. \end{itemize} \headache{} currently supports three \emph{models}: \begin{itemize} \item \mytt{frame}. With this model, headers are generated in a frame. This model requires three arguments: \mytt{open} and \mytt{close} (the opening and closing sequences for comments) and \mytt{line} (the character used to make the horizontal lines of the frame). Two optional arguments may be used: \mytt{margin} (a string printed between the left and right side of the frame and the border, by default two spaces) and \mytt{width} (the width of the inside of the frame, default is 68). \item \mytt{lines}. Headers are typeset between two lines. Three arguments must be provided: \mytt{open} and \mytt{close} (the opening and closing sequences for comments), \mytt{line} (the character used to make the horizontal lines). Three optional arguments are allowed: \mytt{begin} (a string typeset at the beginning of each line, by default two spaces), \mytt{last} (a string typeset at the beginning of the last line) and \mytt{width} (the width of the lines, default is 70). \item \mytt{no}. This model generates no header and has no argument. \end{itemize} It is possible to change the default builtin configuration file at compile time. For this, just edit the file \mytt{config\_builtin.txt} present in the source distribution before building the software. \begin{figure} %BEGIN LATEX \begin{center} %END LATEX \begin{boxedverbatim} # Objective Caml source ".*\\.ml[il]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.fml[i]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.mly" -> frame open:"/*" line:"*" close:"*/" # C source | ".*\\.[chy]" -> frame open:"/*" line:"*" close:"*/" # Latex | ".*\\.tex" -> frame open:"%" line:"%" close:"%" # Misc | ".*Makefile.*" -> frame open:"#" line:"#" close:"#" | ".*README.*" -> frame open:"*" line:"*" close:"*" | ".*LICENSE.*" -> frame open:"*" line:"*" close:"*" \end{boxedverbatim} %BEGIN LATEX \end{center} %END LATEX \caption{The default builtin configuration file} \label{figure:config} \end{figure} It is also possible to add entries into your own configuration file that specify when the initial lines of the processed file have to be skipped. As previously, these \emph{entries} are separated by the character \mytt{|} and each of them is made of two parts separated by an \mytt{->}: \begin{itemize} \item Again, the first part is a \emph{regular expression} used by \headache{} to determine the file type. But here, it is according to its full filename (including the pathname). \item The second part specifies when the initial lines must be skipped. It consists of the keyword \mytt{skip} followed by one of the named arguments \mytt{multiline\_match:} or \mytt{match:}, then a \emph{regular expression}. As long as the lines match a \mytt{multiline\_match} parameter, \headache{} skips them and checks the next line. If the current line matches only a \mytt{match} parameter, \headache{} skips the current line and breaks the iteration there (of course, if nothing matches, \headache{} puts the header before the current line). \end{itemize} \begin{figure} %BEGIN LATEX \begin{center} %END LATEX \begin{boxedverbatim} # Script file | ".*\\.sh" -> frame open:"#" line:"#" close:"#" | ".*\\.sh" -> skip match:"#!.*" \end{boxedverbatim} %BEGIN LATEX \end{center} %END LATEX \caption{Example of a configuration file for skipping the shebang line of shell scripts} \label{figure:example} \end{figure} Figure~\ref{figure:example} shows an example of configuration file that can used to skip the shebang line of shell scripts: when the first line of \mytt{.sh} files starts with \mytt{\#!}, \headache{} does not modify that line and considers that the header must start at the second line. \begin{figure} %BEGIN LATEX \begin{center} %END LATEX \begin{boxedverbatim} # SWI Prolog file | ".*\\.pl" -> frame open:"%" line:"%" close:"%" | ".*\\.pl" -> skip multiline_match:"#!.*" multiline_match:":-.*" \end{boxedverbatim} %BEGIN LATEX \end{center} %END LATEX \caption{Example of a configuration file for skipping the shebang line, as well as lines containing Prolog directives, such as Unicode usage.} \label{figure:python-example} \end{figure} Figure~\ref{figure:python-example} shows an example of configuration file that can used for \mytt{SWI prolog} files: for a \mytt{.pl} file starting with the following three first lines, \headache{} considers that the header must start just after the first two lines: \begin{alltt} #!/usr/bin/env swipl :- encoding(utf8). % remainder of the file, that can be after the header \end{alltt} \end{document} %%% Local Variables: %%% mode: latex %%% TeX-master: t %%% End: headache-1.07/doc/000077500000000000000000000000001444757364400137525ustar00rootroot00000000000000headache-1.07/doc/manual.html000066400000000000000000000464651444757364400161340ustar00rootroot00000000000000 `headache`

headache

Vincent Simonet

November, 2002

This manual is also available in plain text, PostScript and PDF.

1 Overview

It is a common usage to put at the beginning of source code files a short header giving, for instance, some copyright informations. ‘headache‘ is a simple and lightweight tool for managing easily these headers. Among its functionalities, one may mention:

  • Headers must generally be generated as comments in source code files. ‘headache‘ deals with different file types and generates for each of them headers in an appropriate format.
  • headache‘ automatically detects existing headers and removes them. Thus, you can use it to update headers in a set of files.

headache‘ is distributed under the terms of the GNU Library General Public License. See file ‘LICENSE‘ of the distribution for more information.

2 Compilation and installation

Building ‘headache‘ requires Objective Caml (version 3.06 or up, available at http://caml.inria.fr/) and GNU Make. In addition, from version 1.03-utf8, the build requires the Unicode library Camomile and, from version 1.04, Dune.

Instructions

  make && sudo make INSTALLDIR=/usr/local/bin install

Build the executable and install it into the specified directory.

headache‘ is available through OPAM (available at http://opam.ocaml.org/), the OCaml Package Manager. This is the preferred installation method. Be sure to install opam v1.2 or higher. Then the following sequence of commands should install the package:

  opam init
  opam install depext
  opam depext headache
  opam install headache

3 Usage

Let us illustrate the use of this tool with a small example. Assume you have a small project mixing C and Caml code consisting in three files ‘foo.c‘, ‘bar.ml‘ and ‘bar.mli‘, and you want to equip them with some header. First of all, write a header file, i.e. a plain text file including the information headers must mention. An example of such a file is given in figure ‍1. In the following, we assume this file is named ‘myheader‘ and is in the same directory as source files.

Then, in order to generate headers, just run the command:

  headache -h myheader foo.c bar.ml bar.mli

Each file is equipped with a header including the text given in the header file ‘myheader‘, surrounded by some extra characters depending on its format making it a comment (e.g. ‘(*‘ and ‘*)‘ in ‘.ml‘ files). If you update informations in the header file ‘myheader‘, you simply need to re-run the above command to update headers in source code files: existing ones are automatically removed.

Similarly, running:

  headache -r foo.c bar.ml bar.mli

removes any existing in files ‘foo.c‘, ‘bar.ml‘ and ‘bar.mli‘. Files which do not have a header are kept unchanged.

The current headers of files can be extracted:

  headache -e foo.c bar.ml bar.mli

prints on the standard output the current headers of the files ‘foo.c‘, ‘bar.ml‘ and ‘bar.mli‘. All files are kept unchanged.


                             Headache
               Automatic generation of files headers

        Vincent Simonet, Projet Cristal, INRIA Rocquencourt

Copyright 2002
Institut National de Recherche en Informatique et en Automatique.
All rights reserved.  This file is distributed under the terms of
the GNU Library General Public License.

Vincent.Simonet@inria.fr           http://cristal.inria.fr/~simonet/
Figure 1: An example of header file

4 Configuration file

File types and format of header may be specified by a configuration file. By default, the default builtin configuration file given in figure ‍2 is used. You can also use your own configuration file thanks to the ‘-c‘ option:

  headache -c myconfig -h myheader foo.c bar.ml bar.mli

In order to write your own configuration, you can follow the example given in figure ‍2. A configuration file consists in a list of entries separated by the character ‘|‘. Each of them is made of two parts separated by an ‘->‘:

  • The first one is a regular expression. Regular expression are enclosed within double quotes and have the same syntax as in Gnu Emacs. ‘headache‘ determines file types according to file basenames; thus, each file is dealt with using the first line its name matches.
  • The second one describes the format of headers for files of this type. It consists of the name of a model (e.g. ‘frame‘), possibly followed by a list of arguments. Arguments are named: ‘open:"(*"‘ means that the value of the argument ‘open‘ is ‘(*‘.

headache‘ currently supports three models:

  • frame‘. With this model, headers are generated in a frame. This model requires three arguments: ‘open‘ and ‘close‘ (the opening and closing sequences for comments) and ‘line‘ (the character used to make the horizontal lines of the frame). Two optional arguments may be used: ‘margin‘ (a string printed between the left and right side of the frame and the border, by default two spaces) and ‘width‘ (the width of the inside of the frame, default is 68).
  • lines‘. Headers are typeset between two lines. Three arguments must be provided: ‘open‘ and ‘close‘ (the opening and closing sequences for comments), ‘line‘ (the character used to make the horizontal lines). Three optional arguments are allowed: ‘begin‘ (a string typeset at the beginning of each line, by default two spaces), ‘last‘ (a string typeset at the beginning of the last line) and ‘width‘ (the width of the lines, default is 70).
  • no‘. This model generates no header and has no argument.

It is possible to change the default builtin configuration file at compile time. For this, just edit the file ‘config_builtin.txt‘ present in the source distribution before building the software.


# Objective Caml source
  ".*\\.ml[il]?" -> frame open:"(*" line:"*" close:"*)"
| ".*\\.fml[i]?" -> frame open:"(*" line:"*" close:"*)"
| ".*\\.mly"     -> frame open:"/*" line:"*" close:"*/"
# C source
| ".*\\.[chy]"    -> frame open:"/*" line:"*" close:"*/"
# Latex
| ".*\\.tex"     -> frame open:"%"  line:"%" close:"%"
# Misc
| ".*Makefile.*" -> frame open:"#"  line:"#" close:"#"
| ".*README.*"   -> frame open:"*"  line:"*" close:"*"
| ".*LICENSE.*"  -> frame open:"*"  line:"*" close:"*"
Figure 2: The default builtin configuration file

It is also possible to add entries into your own configuration file that specify when the initial lines of the processed file have to be skipped. As previously, these entries are separated by the character ‘|‘ and each of them is made of two parts separated by an ‘->‘:

  • Again, the first part is a regular expression used by ‘headache‘ to determine the file type. But here, it is according to its full filename (including the pathname).
  • The second part specifies when the initial lines must be skipped. It consists of the keyword ‘skip‘ followed by one of the named arguments ‘multiline_match:‘ or ‘match:‘, then a regular expression. As long as the lines match a ‘multiline_match‘ parameter, ‘headache‘ skips them and checks the next line. If the current line matches only a ‘match‘ parameter, ‘headache‘ skips the current line and breaks the iteration there (of course, if nothing matches, ‘headache‘ puts the header before the current line).

# Script file
 | ".*\\.sh" -> frame open:"#"  line:"#" close:"#"
 | ".*\\.sh" -> skip match:"#!.*"
Figure 3: Example of a configuration file for skipping the shebang line of shell scripts

Figure ‍3 shows an example of configuration file that can used to skip the shebang line of shell scripts: when the first line of ‘.sh‘ files starts with ‘#!‘, ‘headache‘ does not modify that line and considers that the header must start at the second line.


# SWI Prolog file
 | ".*\\.pl" -> frame open:"%"  line:"%" close:"%"
 | ".*\\.pl" -> skip multiline_match:"#!.*" multiline_match:":-.*"
Figure 4: Example of a configuration file for skipping the shebang line, as well as lines containing Prolog directives, such as Unicode usage.

Figure ‍4 shows an example of configuration file that can used for ‘SWI prolog‘ files: for a ‘.pl‘ file starting with the following three first lines, ‘headache‘ considers that the header must start just after the first two lines:

  #!/usr/bin/env swipl
  :- encoding(utf8).
  % remainder of the file, that can be after the header

This document was translated from LATEX by HEVEA.
headache-1.07/doc/manual.pdf000066400000000000000000001115171444757364400157300ustar00rootroot00000000000000%PDF-1.5 % 12 0 obj <> stream xڍXYs8~_)ʂ yH2Yo9l}MA Ӎ$R)W nt}! ?"HeyP6Mp;xWqp x2`-SHl ^,WJ :e< "PjKݮDIjVל%%Đ߭#_ЯE +XH憋Y+[ +x䱜YYԆ,4a1 #tƳ A }^I Sʕ! ]y% s' b0\EHKEmP{@ԽK2ƳXgIrh;=cu F^abi0K 4DX #)x;_}peXE Dd@MDV=Ʉ!;H&Á 249<ٙmtZAcgŗlD&TSKi9uF7$~:XĢ ]P !uuׯTjvj鮮J\@]'SpCp_8z޸:g=m*1dF0Q6huϙP61[~7{ݞG6jյi*@H~-)o{;wi$'%R~ϢNQ_虊V,FĐ/(Z@gwvab+mep{6q*gU0G4Xd R;~fWÐ!/~,pG$"|= ScGp_|h)+Kr4#a z,L)4B|8vpIPv0TA3yj]J_%KJv|.<`==z6!Z%lRȯg*Ä%\.&zSI18˼!v2g>3'vF7)A0,k, ;aE|?> /A[2ln !jIyM|B\!, Wiq^A^Z> stream xڭYo޿O{%/(v 0GmQT@t[YE=3>N+5 Z>7/*ZRJ\dj{\}\ gaG"H<իJGZHr9yeM$cK\#@@mEdu_0YJ%f/`aIu B'r{ 8  {_U6ڝXo0Cю}w}gw4Wvjv^6vb _cqטGm?w\a;l<߮sQ5QFa"arK-1yV!SHy֞qOs>&EL8ˣ%DH [BHr@_=|tVpfr[ ' 3$룶TP$a?-=d/D *ڟ3L(\`Z%;24qWLN#^)TsC<=dpPO0BHi=4Q>$9ȁW fmYB'IvuW>ug*&J,>H$@ ZC{O4cl= w=M9mTnGL0}A_ B/w"~j4 S|OwaOg8Zv#*,tpZ%sU]$;K/OHad2NX#+COpitȎŀK4&k bݻG m;K-5p\L=_͓!o *| n*dց~yP~(v1C u'~$yqҝ'iC!sK2{?CQ?bDϛ?w2)A endstream endobj 19 0 obj <> stream xڥZo8MP@.jF(J{ pM%WpH}8t\w5E9 o _H"QKE[|[(K"OG,KbRRji^d,SB-6T8Na*[\?U,_7/k|*u͡-?y_65L}f)KiDhT 52"8CM azLy(RfLT德wXZic&"R/g辖{)/ ? Иck_ nI{%n'IŒP! #E֑w:Si2a_ַDoz79Fs6\Uvh3x&DF*-ԩnI;njq;"6"Ukv*BB%AIp ?=7,n)@W`jhˆ`XD֎aǡ Yo<{K`O*S:bqhz9)L, 9+ a:ko{6 03<ΦAt]֌f7Xz#cz~u,4 A-4Ƈ| &r47-:oepz@n2Aqc,N3ʌCeCxX@:}idLv1@Mf 5^''TCn I cľjˈus`6aRovLEѳ䐐 g&Y]B%N2M+w5waj!z Nɚ Z̥ L3"G= p ׊CM\j{G0e=roOCM}o@gZPc:|?! kf/7οv4&(A롐ySׄ[0Y@%i ON A&İ7"/Yf.@XڡꨣTwf,6s Ҥh0 "鶄(T(^_ xkC 6"\.&U@l"D=>{ ˓mc}r!bCa:_h&)]oKbߕsxáR?D74z^8uc_Hqpr=P'gL?0E"%=MF2b"If1}OC\TQ7cHhGKCģ%5fG#yYأqy4IK_v<Go ]|?@[[5:r@ubr?ԱaL0$<Ӭ Y4a/"6#SrRT==7blN_\⦬/t\+|u] vBߤ/;l _"7kƥqpcYf;e=OߐR0a/^f endstream endobj 22 0 obj <> stream xڕSMo@WL*-Q'>P)ST^uইxc'!p7o!JkxQ $"4 P,ƤOk:H<^23"O)RK TP eTM9;r'Z(r}&߇uWh&SN/"z~/ڻ(({P6u]_/L3l[oldϦ":{OϣWrs88}LvznDqq:م:ޅ7봠J+_vIΉZĉ\-n2U3l")2s@zۮC4mqS*g]0%Xdv#v`p `Tvߝ͟ˍ.PWk:()ȸ0`$޴b;Yցَ度s? ^F endstream endobj 25 0 obj <> stream x]Mk0sRƥ ۖ^c2@MBCIy'ÛTͩQAi5o 8rG@H,|b$Յw6!$sv=W˵itwmysjéQ ɗ8;{QڇhawPic~pB %eѸg8ZF$EPuIP,*3Kz2MCAF{寑od쭟<\ድ~]0bY*|kYUz|8 endstream endobj 27 0 obj <> stream xm}Hqy՚%EHʚDo+k Mm FmzEyV͚ϬkfbHe+XT\QTQTdA.?4(HAAWجkmZrda[X7FNFtBirIe|:8⦭ںrzᲒiw93}$JjHݗ:N O6l5/?:> stream x]?o w>c$DȎ%i8:pN-agȷ:L?ӍwnaIuef54E<:/5?z)5t<,tYWEf*Ӎ\JytƂ|uc /~ip5N}03Yr F m܀8θ,ˌΒ5]i;8&q:țc`&(ȂX #[{=;m7&o~2yy($JV,N:/> stream xڵUkPSg>rN-^zbܺ*Z\V/H$$=r ! $P*TVҕ˴Vvcww:ݮ;cvvvvΜygΙwyyCA7vnK ~ؤ5O52_e $>^$rR ?Ku _e$ shkjMVM[' ۺuK$<4tdgBL$q2]"G_%iJPv{N, Vk3~.HeJy A!V$g5RZIZЪxAD(NqRA(-# IXby' 5,X*8M"~\bԍ;H;m }lugTC50V(2aOn#*LX8Ѣ\Y ߝG ~=݌")T855F8S﬏amc/@do`>vۇ}?`Jױ9C4%L-LJ&<@Y(.mgªI'+!'>Ӎdr :f0vKpmWAZTft|<0ǣBİ9eg,ņ<{h( 릐Ɩ5[Q")RFnY[)cKB06Z ݇G uR{(qws>fACU P "PqFX{ גg*u4y Z酅"ZL};/R@adO=1,*R tMk+}D1Ӧ~X|cL U1d`u^r_b$ݥC 'zOwB xQKG{;'dx^Go ? ^_:_ccTRUUJI&~U^;&Nuy7+7ʧ)n9::u쏅Kp_# =?:cMߘlݲ['F wl A^Ud07 |3-=.uޠ.8EXY=X"hi vYm ~wvH xL:HD̡4CydWҽJSBNʋ$;ca=("!aG_= p'Оbx-E>f2?`:gC(b P~Aj$D=FD8 KthF-E>F. \,XHLMeԇ(A3}4QKd%hUWIۧqmUHecA/נ&tӻ̶A1"9vUrU(V/lZ4nΜ%>TU;Ci.^泂Q\#lf\نSp(2X [,/\;Zd!> MYTzzE"uSCl{F?6?"s# endstream endobj 31 0 obj <> stream x]n0 y ;MZPibBZiҮ41QcGeu?CaG ]iZpKY弜*ְ<z+NN*@aG $˹7iơB09NYg|wSلHs53pV.p2D 2y Zs'[딥Wx\0Ns6M`1Ł3kϤɂ&'=oԛg_U)t<uL^qZ&;kՌgnz endstream endobj 33 0 obj <> stream xڕV{Tg!!3"j N⳾:+BQjACQA^hԂ@AD!ǢJcvZuZ֥w=n{7gf~ekV-_?Y's7IlWi#J]$Q&fv02}/S2pFβ|J:xy͞57>!iTO6Y`iY^^ Kc Qtqj12{adTZ/O9tES~h1YIooHj^ri"QiQd8qyr[p l|+zKa4SJ5,FW>qrB ť ߡV SZrE3gzBWѳv'TтNQ7ҁ'3Ǿs~}qM}x)mtۚZEhƔ:} Î%*גXꑕ &HwJf:"?~GA12| (q[` aT)8QVGF..N7| |S 4||>{|/XÍǫiDKۮUAlh}bT)ܔYZo-wZF`ɏR2iz SF7N =V5='@9V-y!Ӂ5gEc$s̙#ؠ8Y\tͺIdN8LFjC%5 diD?]t%5"?T>uiY;JEepxթ/3[C[|Q6Dĉ@h: &c0j"#~)yq7?qˉ:L37Dt3!Iǣ4&95T՘hT>`tq PuBHqd@F|K4ř8j^ₛ>%i8͘#׎cgQipe2&Kk8hm:j~{YT-|jGf[ \{M? >fn3T'l0}^ZvZY!ûtӮvU;nd[-?>u.RS-\rF mg5d.z.™v>CI$VЭ ɈC_ k[-6h4V^)`P#.MgC*8ӳ=` ; 'ꟼp*N}PE:vAaAnFߪPj2GuEm֖ck3w&꩛l>Ìf&Zp$ gx/~vSq-单u% !OyoU[ҎD-SRuae!ԥ~ ĔۣvHڶ[w%->ڛGo BVl0V3kK3[i+qE7N_ ͛A3GEB73##@yDt^*%^-uYt m4cÛNڛDHͽ GBmni*7#=|ҽ$US>nv&[_2-< ;ODx{]_X S!?%/D8>#Gn28dr6G$ kn`dӖ9By?G\D_Z֤ՉԝBcBLjxG|Bɼ9H~B@to[jO_%P|MC(?OO6:p]z}F`xL4^Qa蟿(x@F $u[4dϘ5Rpʓ_37dJ ژ3ٳa& R{rvאָj >*Q:JLA8xwPQPe[2iXt1=9y-Tb #U0&75sKT)E^"ǹ5@QE8nTTek*W{PP*}seCY(ˊ"9c_$BMVlr\\2>]ox ) 'NTs4qc?uG VŬOl ;:!-k}_{h~c-{:yrJyVIp^I)V0@`jrTPyYd) 6^F+ !. /QgJWTVC l:ʆK/cǙ2 BO~s15 ~P$ !M7W݌$SANabA5VBBt(ai%9๟&`_M/VѡWYY Ŗ*^y@ (í5ds)pCvps;6!|^ R<_: endstream endobj 34 0 obj <> stream x]Mo0 ;M]%T8tF; C! ?;f=~b/IWaGU,^f \{h{5/+VCc<84@ӱ*g _Χ2X:8 pYW>0TEzB(8.Vv厶Xe1?0lI-LQ`}/2iYf߷@r˥SߍҜJs@.YJ [-rs9gΑ1/M4 u0=$'ZDjQ̣H2ZS!9J4d"' 1 2agtU7kq pI[kx\3r/dY endstream endobj 36 0 obj <> stream xڭy TS STiC=AkPkAE*γu @dP "!N<Ș@ZU֡jom;Z[zEϷ{H W.zG3/pR! wFQ yPHԺ>nfdT|KpHȀQn^^ƸswrʷE- Œ?VDl Mp9%$66j'ōŌ>j[ܖ1򭁛DFĺ-<93R -( :qpw0Y0q\ZGR>zC ʅS)zP=j>5AFQ)j<5&RRLj5CͥQBjZB-%Q˩JjZC%ZS)rN; uuHr( 7 uLptVFd=eS&[_KU}?k7O pro |?K;$c%]u]Y?fgx'4 ^tJ~8hQ硶(-E r&81d LWG4Ȍf f`JESoF%z1rXoRtYf{[iom~ס,rn; z`tt6."AWj!RL|{hv!^,zC|!nNl /K6WN IםDOZU$lcBeŵgVz}b,1Q?V 8#K Ќ=hLڨv/x-vHBSq,poA0Yl6rx+2pCDNKϯwRURЀ,᧑xYx vIN-hU:˃8GC]U}zKaW^i I.j䊡 +/`$),\R0LZ:MDshiA>*=Klx!BVckb*#"bb""*cjj*+k8g^0wÎ;(玐߄p+V/*0#l؜Lhop5yn28_a7g Бs kzH("s c6Cj'F]l%b C0t99t.,\`{އ0C$s=sPn!/!wĝ=?"-쌝?K Z n=(7^RlݔJ*Q*ɷ19O '(]c{^Q}1hxWV8W٣iĘBsvKO~ᴥB5rsw6rB!h_ن-n.F;ui:l(n7ߛ+KB4̰i* Ku< ÇrD9^t}S/]GnNF^:X涆Zz Z^m# m\*I)lI8,6kDHÿ8?ýhHc+i6*Uelŵg}}!R1#E 9q\ZA}5vΪ27~~@j ZX`]bl鱽0__HG/\{}ag(;YDY7 RnP<$KflbX [}SDFlY  usÝ9hTl7m[ǢSd{/ϙ_t݅ۘF/w7{MrEY˛_?L]S'=D-h2 z}>ߐ8w[g 꺼Elz6{l*= t IX}w~֮:*>Oo8ޑ ]e+ ~wPJ襐g#] p sZb@5\:dτtt!CEO&^~JO.^On㷹nJu2X]IZ !%^װYoxG]/EVuYkKm.'a D?8Mh "&9%Jc'~ YFG$hs@{9А]$E;VrjP\- j\{#`ďRMDY-@uhn*jExl @OCx\*~nYwyY_n[Bm4_*m7NbN% N( {\i1vFE3ou z,"cMjW67OQfo_*(pnž=GES4gWU#>\ۺ*)X$H |%0F\">䉜J8ѕVr ҈[CWFibLd-%|GMwКGIm-I[qp^Q .cZx'rxӑdmy2kZU)AdW߇<=.+Zy⋤<Χш|'={ga0ۿMU~(2n_-u 29b?@Lmبd'Es Zpɶ84@vF&? / Kѳ9L6 k ̳<I>h| vN;C{XMCd>{U3nY;L1?[ճ'axí D6{c .qЌk ſ+Mg'RYr *sFJ!J]3%62lf!*Jʛ#[4e ExQe_ՠ?jkwYDvs8~^Wˠ4[xcRIh2K_3Ӿ./\!~fKXf:WErJGW|uf33=l2G۪-:M~1=@ ;hv_Y?_9w] қW|9',6??3I7 vć{}mo64K#4J n#P(xAPG!'$p4a7)|?Fh~اnneJ(6F_64̻-//rW*;OkQmkߧйtU߾bGTS.XĢᚣ\97;'yK <<=ё|ihK\^?g)$~\3;Uƃ|b%hga(CiKT$'E3cI'i}/ݹzujWa: }"KLyI&K?m04f"MͥM 8)2zJwh5kV3!SI|*{M.cǫI\;g^_Vf jJЙ#cڔк9~9$V+L O% &h;R՚jN`tB !őU FY]&X-!yD9O]DZm}H.yF4^|;%_I{!7Y =q@#^Os Θnk/qR< h '? kWxd{&(㓄tͭ(a'Xm.6KCtd:Oժp;:U=vf(%LBC0>$J2B!dfW^u:#:Qhߨ3'@@s%#Q@ghЭ"z5A6/9S/ˎ1<~ٙJ6j}Vr 4a.L2f j2\ cV#(B{[VGkehjCd6'S%SIoYPT[#ݶGez]ҧ|nXv+VMoiVګVaL+$7ߎ( LRSGٯ k' f]]t$bkz\zW G* >]MWHhvN!Iy ʸ^k_EwIzrR*Y2rBR[Fk|ql"Y5wZNU`Eȿۃ_)'Yu~-k"e uO!5)JR'((-rV%("?,ž~.qT-to4 endstream endobj 37 0 obj <> stream x]Ok@~=kAD#HI[^PWY!߾3;i=|7:fe^a V3Lӂ8yЎD7۱7;4[3pׯ<1R]FЫNZ;{ji4 N"e*Hݿw18wcDRJ,s?[Ƃe"e,Ng 6ɿ[_U")F,E~9rq9 mmdb^XI P@"! ;rv(D27M}u{1`O/Mbp?44.{ endstream endobj 39 0 obj <> stream xڍXX֞̎ ub2I,QѨ1PLThEz[,^wKQ]+EM\l7b4DM|zfy{3"‚DVKV~4i4{㕙)X!~RM \eE Cɑ~8XS".{S/ z{zMݴ9sޝl7~"v;'P/Prg.pGh݄y^AsN2%P9vޡ^vk=B<;ڭvqzJϒ@PSis f\}%f+VY̕rS1}3ʜhJL R!5F ) 5b)[j4Qš;BvnLVw'9g!‹ zJ3# o"[@h+?dB ۰ :2y7USl}j0GO9Рm=iRDĬT4JLp;1GA$dGԣmqVz`#>:YNM[]t:)*/LRKV .F9œ`2~;-IUy|Q;cꂍ"ODDy$%"G6H)Cî 6|v]dij+kQF[и%j`N[)qKʚBf{]zKwqِIgPu]7jy+UdhXnnv-R? M{j9gYal(SDyR 6i LdI"@YՋ^tEǢQ [ǯ`G ̐# rewD4kox#>Q/X韐'_$T 5 JYcep2gt͵G (iT To0, ƯJ9tޕ׊+ d}ڏ\4x lΛ3k.L[U0(>Hki`nu6qp6G.zCw? 9ö;?bTO>y”焨g\o.䴘ŰHX'VwU!*A]b'ڏO6ur]ÏpanϺΛ#Lv0|G`iynП3V/wX7ȡׂŋ,^;ySGp6#p)b')]`S<-n!w|'!wZj z[jټ\ t&Z %t@'}ClbLlC+\dn~[w=hW$DP g/mLvc6;k]k ̓~<)eqx{03; f_C~nN /f_ Iz@C?e)D>8[As|-(/ůax@VL.(H8/_Xo`05Qu':8WY[;e6cG[:[l =.B!I1-qOj~D7,=#BBEʬ0wa ؆}t #HHKNT*F۪'.Ԅpåv+FuQt ^cw  Q] L1YG=7#2$bi9N-\Kbg0/ВF 'y@jZَjAUz$0it\ Tʎoz&K! |g jq֋93&7#+1;0L!Źߢ“+~ q CJvE|0ӻ(8V*w3Ya1cNat!PMU]E^i`PkW1l`Z_PAQu mrB*Y2Z1q.):Xxn@s|sX ƮgbOJ Ũ"T,N#ڽbP¤LۏZPXA|p ۖO"[!o#5͠1H=U>ƞ_B#g_ =g[p}hɱt4@S`e8e\lOۥ3 Qp$ 7JYU?P%K ձ#f㶏q9s{[]ʁ򴲴r_`cq4H.k篏 b~Er/g$疻z4CW84J+HMi޼Ѕyx!Af>Ko4퓐/?sv)6aQ47vmKk5sظqr1VJw>zt>Y%hzQ =hl-HfF'7ŷLlm_X) XWYG)ԃmQ.y- ԋ 4s!v%NܘH^tq ڜ_ oIv"lYi6 v6&;胟x5}KU @F* k2rN}t9#ժi-ՐX?{PDgC~Bw}}Vvs'?{6mЈgS02ɣ"yHȌHB&+.7L%e>ǢckNw T:h8*;([YdejVhTοa{[Z};ƙf3‘Ѣ3ϣ ٰ욫"Zʮwk=yСlٰu#?͋P mt"uvPUb>0eUU|,lN]U.$$̧DH0U,S.r|@#v|AK䱏br*NHHC(c4ř /َ$H˪" n;ĞDžp2\bI9~od"=/+B˜~vCU%all;EupJ?twH쭁^>c@5B<S~%#Ŕ x84!~Fv3EN7pҕ8-\[aM5Vs_ϸEpq/=B^UR}/=Wϝ;gk?NDfe8Ңbf k7ϙȱNW7w'm@H#)? !e5TjJ4ae*Ff;@I =IGJ^'! \Q{ڦƟ?#Xثy }7EJtպ9iQ\ڸP`É~{UjvMvM?mwjPՋTIkD^T- L0?9: ,B7,u[h$ Pq-Zd@zQk.l57䱘 !֫o7itJm ^D5 K y#:n+dB ͐}W^]QIr< 30h(ͬeQmo)h4rɧ]WBh܂ǖ}FGxgZnᅧ~wh]<20c;۷D/1;"KE6b J4LsH8PA-sbΞ*yr,EE=&̩=C$hWr-+BJP$ l4$hIXB^LaLQ 0:4*BLtIt)WY9 b'Sr(F@WZU)r22KЂG ZD T_ endstream endobj 41 0 obj <> stream xcd`aa`ddtv 5400f!C8WeX7ee``h- ADB ̌,z%E )Ey Ayh @k:J3~~pFB k,JϨPyhӳ_[N@[w{W[7_NsX;]y=$\{匭TgMX endstream endobj 42 0 obj <> stream x]n0 y ;MRh%UBSuPiWi(C~qz!cܖ 0pS8\@8S,@vbO+F7v|,uS \n8a_v,cU'sų@w#tSQHu{TpN.=AQd9d]Pwk_qnwclfA/> stream xڭX TSg1JicC;s/RXmj7Z[7DqRvd Ka @$'! a- ZVzjbbg6;3ciO{8rpCc]Жl~c'/$hTq2Qop?'`x?/ŏ9O!D_BeV\ڔ8qbLT(IB\J=-&1NBD"ZKR2_Z';Q-.#NZZgKTJdK'2%qbiqT wb-YOlrADOp"%O~b)4O,#V"Wukb#Ll!D&v;]DJN p8wsWrϸY:iŤMizیluG2yX|GnJk׵:F Qkۅnup#s#\0^{PSV&{Q]rv@GV(@IFS)۞)th`jSu@kYG ^<b Y`irv1Œ6V]"˓CNѢPyha2`gg"_;Ѳa4}w=KCzTdQ(+52pr\?W%@JPڎQ&zbW,f/&~k:W3Ѡu1ivW4lMeW,j AoL'e:*zBPL''Ȗ[6*FSiP5 2P+2)iq@.^a=sq܇P7s1õ.K#ފE38igXq ^lr(ToEGŸfc?yXs -j\*epy$K@1wgOwg1 n6_25)rR[Hoө `,FL@Z*herܱ zO9軻uM 0[hЂjҰ&Y}۴5HR ZEcOِjZN(`j6 9zɿl;>( f*moͤώ|";] >F3N ,wWW&tu'\.GO'z+4}dECdBGC~~9$&oolyWOo!;a\DBlHN 6'._R\$I?GrY\%@  Cwfڵ*uJ:.Z@-#P!H}d y9h zC^ЮN2r ِg(LԔ^9GB .f[>~i8x|4WVUU],m:҉^B*IR`˜u|9'\L226[-kO̰WSV!HPisDĻJH6xWF;\ٷF_eV|3m fA^Q\v$(<>`<X#^ߢY+ CJcb  DzjdYlLW-\:0UX哚.,R*j8X?v뱦= Gl%d燳-/bMP_p Mo8<{s G:[;hԚb,3%j1ò_mo?r*.<LYLAȈc_C d. haY*LXa#zSH48MO43Qz1h=RE2m3 M]˂Vcy&ιgI"tbި-/ZK%4dS9) ,Ldlc;rK ߙme {}K]+[Dl #(\G^c z[^ vhʑ~;{GXp) \2Y/n\NJӕC]K Hc-BqFFFAEvc&e|f$G/LEg9"] e*vW.:G}?tr@{ikj x7Y]:0ɵ(ei(_9rS;!2*1fRiB(0ι_׬1@SV Ķ ͕ΚNQB JbA޺ с rP2vb+z `w> "ex[)PhJ+7S61g?2#Aa:HP\Uxb[$CDS{ZjqM*'WO-tqӴ]2Fʳ ?B >E (cÍ qOw kåxKV"3 Swc3ӅO |);w**VCMTi(5ͭ}+`mE &ʫS3>D~hx@Bd|jb@M˲/28!薙Ƌ |]Q^8EVt{?@,ABk]6X >D)K r:ba [ʳk^w~OQo 5L2HO4al,IZ^?G_^ߥpll*?&O8dk$VZG)%ݐ&/0go3[PE6e ⬤Ò>tt״o;.oqqJBb-zļz꼹~Q:Ze̼zoRz}Fq쪵!@)6}[5i][3T Rknal]Pg_;? 5yyxEw}j$=2Le<6:5Lݝᶲ}:/Ws endstream endobj 45 0 obj <> stream x]QMo0 WilmU !HMJni(~`=~~(/O= tBr8kb/$7EҨf@nǼӧk];J(dSLRv#)>dW>b5|Jš'6rTP7GRAZA嶡wIrLJ!ck,񝏟>;\WOs}~X~fȹcv$_,7x5*W/a endstream endobj 47 0 obj <> stream xemLSgǟKKUtSoTgd8_a`SyjҵĵR 8HUAuNBLLl_d,n̜kVeyyNr;sTa4sK/5$~VӃM\"cIҔ ae%3:5+/ˢlM%J`X6ad/ 9zUe69"frX4WY^1c^Р7kNuMmXj-zKtŷMvZ89unK,rVZ\6Mb&U2(yw&RLJH))#)I!J$ӌKz.i\1CZ4 <൨vdŽKЈSTed ]8^*V#af0g+XZM!ϙ`:6Ӎ)K9:㊳5ǂZnGuoAnNtp8N_BCM4$mtKeZ{ ^@~ !姏J?jǬ b6 YC_%ۇG.="s=g_#b(RS7t]'4҄bdwFС糦i6}Cgi)ôPKy@2(\81U$x"s-J(/h$؉k1+ 2䏶dž@—7~:?6ppዥ} |t 9GLWq,|VktB uv*7v)BaN@ՁðmwB`. Psmhfh|neX4}.p~.hÐWvow.ƿ㸶'/4%'-38YwwׄrvZfrJ>\ȶohᬬ||O#LhW#9}#:>*ɋ~lNyYx?FV| i>6G;UtGp@FUzQ?Wk$> 9 endstream endobj 54 0 obj <> stream x]Pn ;CPe@*<$]ƃ@ @\ޚ+8%0d-(gcI@j*M.tUN;އ~Ӄ0sqs@wF|g(ؼm4M?Jz0H;#Uﺆ8?UfUn,RnYAiÍ疼YUm endstream endobj 14 0 obj <> stream xڵX[s۶~[X@[5qJ7K zi.T_ӏ?ݰ=`c.bYQ8:6iHO;b6KsSh!z&+ Ry$)"V'p" -q{o'%,|t`i% s'7n{&JY c>3D\!%K< WGot]1Hqp m~gg4YJOY--u oa^ `#{V~ =y|sw~]lǀ0g5M%"sB}B`PQ *:C(ޞ>Qny6 B(.sd{|jc8ZA|s: -"|=RɸZIfc& 9݈6mGU6ɧ0lMyi?DeEYiL_zy _v1QUrRdk8DG {8/l6WHQOˉQѸ c &"*|D<976ec33e656c76abffc6aee008dd811f>]/Size 59/W[1 2 2]/Filter/FlateDecode/Length 177>> stream x% aqfYKNs%v)rB=_Ͽϒ$IIHTI4It  xӴH L3D5S/K3૙perdif1\<5m]9sL5l&w<]E q|H.3 endstream endobj startxref 37321 %%EOF headache-1.07/doc/manual.ps.gz000066400000000000000000003512301444757364400162160ustar00rootroot00000000000000]`manual.psOga:s^/(+^?aÓvf#x;]T&W7|ϣg3Oߑ O‹tMˇϓ_/E)r=̢?<2IWyحcV%ioG*\̣sQRlYʜW?8.tA 1bWZl?FI(kw"&X@NNݹ{&UY<)bbh`3]|rdAC9 xUxޢD"5y1 g'>wL8=i`8؍(xbJĜ8kplTJci 4FBydµi+x7Βya*TM3'b5e|Z0o,.%5hY8V2`L;t W0k0Y΄S\h-n V`Y$ *;^}O:ǃs^{$µzeNp6(yKlAqo`c'YR :8`0X@c2wf<[=xߝ{bs&r$H10Abgҝ) `!b d_k)Ace3-ĢE-*];Zb@ gc@;sO}=4Y;Yg ܽx:E2/xr悚`Fnv|"ʶ}T5cBq'4|{H50%,5HAqk\q#<ɂ|p ;S\.qq<x^lŖ],S<[`!B nP`ceCA^Dh ŒN. Xbr) :Uq#IjyŠ$myeȴY[g6&jgqcs!U4B2X#{LҧD:FrT ',ӵ(S kO|Q)Cd rI拉qxF`B+UL&Ӣ) ./Suݱ~2 hXH"H(هC`l|#H뼀__0ΓGo ֔&P-wk #4v\aVU=R|(5ƨhTxT&;w8zRڽ[CTXධl)~w-rw˘Nt / WP{Z\`u(}Y̷o^_7? d?r!!{ +3Tt5sZMڠV%@i 3hVR0w!(Q+NEa)rN.v{CCGgDU**AlnЮh!՚#{)iC5DO"!;QVE*L `(1f% .}:0 ʥ+⒓]PJqwH 9'9aSMqzmXW98` `DfpK 3 7BO7?15 qq"j5: -G2ܠUDBXAI 0!QѧFj,2+N]Hg34qrS,j$RMbY%qh)JnlԄS yBQL!ڂƆ+< tcPi8vjPn.Up|`V& a GCȐ1imI-D [-dk!N0BRtS瘝I`B an,ʮda,uOx[z~nكC`!-LgY K&\CD~tcCwҤ_ SFv_ ya6`eE?$K *=>VUBlHD/i&5} c%WHѵi⎆(Wge/F6m^.t`1 1[`z@mkR Mje! q PkEOPhlsFŬb11(@qh%IĆhwKvceuަ, 4'.&'D,i;ݦ#5gdeq?\ژiB_A Uuq:BwpsSEdp;ńXJ|z7gI j>Mqϻ]kalu}w1Z hu:+G1()|P3J ,cF#D g G4d!j}BjjnsW#ܷNJ7{m b |N}ҳVjг)zdy%ZLJM`?0X|966eZVS{5WFzEd{46-tӦڛ,rX~fn4TQH=:N W ɦz,f5~eQ^\^͏evW7_Ujw ϳ+ra hO֦wFC YΤ'% dez2sJ{m.4]G˭0*$$FuWgvTuT5ɼ³;/}W7/-eڻNaɡˡ2<hM".k h?(](Jӈ׭}t~^M|;=Fdd4o/cl~OOQv-cmb`<}Չؙw!je^l`N:ud\o#v77x^ZyZvXXVcV~VcέsS>SCtiT#Kii#8Չb hk'˥jo ՠ< "*^F"ET89W˘Ctoa\@iɃ[Fq7xtܯY-4!uur"X0 D2jzQ*4Dϲm{(c{MAsRK=lr}ⷄ5i'^`NsfJRXf\x,+@FYZG&W y\Vb\U 0Ҫ }-͇|>yB'?"-<Н&em؄w0DY9ޗ 8M%Ϸى)'h iyXQG9Q(u_B4`72u<kT2 sm񕉝Yvn!2Z A)ICG‘R1~-"yoq B!7-z[0rR H&kLǨy##KZ]$2{̆bA  Rnu㪯xZ,5h)~%HU G/T^xZo=Dw3qH?v&l(m߅n`YΕ(g> /ƾeӼ,JBns?RW.[Ñ]5Aĥ{\,wrԕ{s.#A,>E<4ƅ޸7w:[~eE}UsAF"X@Bǜ+$EquV]C,! Nũ=ָ4&!Ûȟ*͑nXEԾ:4rW|!_ =1N$IHdZsZQ@KM Ss5puY0n͋ :[O7BqR6rNufC'cjbU6*JXaW1&R8/_)2Ho9:M?0pWT㻉~X.(ؑ?b׎.F@J7(1ONW%݋>S!&B$2h ,aIkK|CVCm7XCK@݂@jQW)nټ6tR:(ޝbW7 t6AeRAF Hg30iPQ! 4CIAWM՘ (Y΢㾋tJmUUe~]F%K2gw8Z_PaH& }f %hDG^鮾r RpP,-2ǖe}{'/yi?RPVrng:VG[N0s#saa Pov*YE&#JwM85 OO]YC]7\+ Y3%<ΉOY٦`ٶV,\& |B o Y -[^ƿAb7vm,._ᢋO)\v !4YqY縎J*eEsӤzcGƟqWqNzu{Μ,nOUG:MGSעI$y>?ř$ʌ{ o)/EuZU4SUI4Ҭ.ֳ}{c(ŧoI/;}\ȏƱ䳟{_ޭevdɝʎ({(|>;ikJt!|T#v:NwAǰW~k[bMq/1K'?Sq~ [lο|CDܑWyP㪘oRF^LܒKǏmj}O|ďvOw+nr_?gߛo(4Zw}q7wnx L>% U|/ 69 b_/~x_}/~/~Ϩgf"Dŷ^oͷd}ؿ=C_}l]_AK<x͖5㳿|w.G\Dk?e?_Ï>GT怼~kAop'>}+c'~[ r Jw\ Иcag'l?A.~ӭPo/`ȟ<~%d>wR/QPF?Jj?"r|>X}>鯁SM뇏 _ן7Oyy{$d7؏5߽7?_O[,=:Ͼ܏<㳞O7F{|g-rd)'Yy=?[9>LIi~[巿:Gg4?R)>hGUO_?|wK?,oW}?o? ƎY-߬/ٗ?n7zQϾˏ$V?čo0ΟX;]?}l].W?|ug_~W?W?2}}~/ˇϾїgޑnUb[*-sLu77>O ͹zx5=kϡg Ϫat< )r:q/tV㑯^wkկ}=UfkNg_3<9-S\U3FWͱo>GjΔjm~=g+O᥮-cŒ^ ?syk'qW yB8KMlO#;?3j}e!^Q͕g϶Ja+sJ`bJr~c p:V^V_g wgCKo,P}^ntݵ_'~B 1{8XUZxVX.=;#L,Bx:/rKFTW p?[5u!c}EO}pv\^]e?JsYő}5O;'rbE wyV~c#N GkJw|cey\5N̨~QpT6.HK|9{];s1mBކtv"av<?.L^$՘\ĺ1bW8y[;3TccSOqF6kT[o+=|SYnX|h'XG;ԛ#:ª#`ZZVg)l=X萟01<`xĎg Sw^H: #s,V{.|,]1S/|Ii%B?3zo5:ٸPo'' H5J.w|A4 r 81fݽs*D6Rn2oI<Uoj]i s \OVv_C-7bv:H9<=b˲VWOʅs?Z}ka4cBŋڐXf'mBFIт [ſJD#;vصaB{Fkx < |4F!)h*)_]K:IψW:/6WQޝdMl!X>|u?yْ>0VxYHx$s XP≫O)Ym#IXXxk&`X!Yp\.H#<8D'D+G& s,hI8Y7GK?{3?iͰX!xc<' h !{wP.hd+' ,p|c/sd/>n X1w'@jjc\:%Qdm X/LʸMRƊD ނOd:4JxjfXElbz]G+ - ޅ(D  VHCY a ]k?S@yTyb */.Rf@FǸ(딢VV$GY.ɗE8OncB/M u |0 Wف2.\8. <'ef7>RL.%8_Vˣ b0Cߝ-q6WQ&s~M y&,1l[M lO%^X 8O`,? {U//HblV*$/z%@YeݎȮ-2#ģV"4$ (f⡤^4=1Ɯ|r$a<͂gHb@-/,Gx֙XX v/>0< i f.y'V#N,&[=<9J J%Ήwk`f~_ J/W,A`0>q.ލrbU^ ;ІJE0lLT(1%jw9I`)D`z-dCpW waWxf{Tb oȪxty}#r٤ N /P_XyC3$`  }Szʑ. khe8 7VDl:|Ii7b]yI,d-{3@RC'M9$cZ9ɭvtɆ& # )8dQXXy⮕[76p +?T)\Lz=CpҮSM88BDŽ Ʃ1 8앏_m&skJayq S~b j\ŢtɒsU#OLC">tt[LcG85I gC(ɻI2;nuwWa ['T_Ub/7`;/IR$l,BQ# x(7/|O ҲNy%\-`@@XObh'k.x% D`눀zj;;g~-6uܞǒ&j |⏇%_ų,;FJ5+z#6|,kx9 _mSgZa\8?͎^uȐ, :}447,. ϼ M n{4CAAJ.>1 MkU gIGW=8Ls%;wd &IȤRpr B-' @ s`ڝZlByr1 1`E,J^C@#zqX1;t%PBor$u܆6R"+;H pD|pSOɭ>. B$ǐjDR{_D $ /ҹ<z 1L / 蒍E[rU|"Yf\?N$#,gc7}s 0J5;=q)`"$[JvD{HhӆW 7"ı F>Ec# cbg LA!k!\,_R J@ jxsޗ*ɻC3H}~&<A#I*6hd|6܊ 6in>qoVL3E&$ƐndW`wqnP!`9|`l6_LGH!ߚ[[;m9ˀ8~gzarcp0 JC V~}ĀIo!Na湓 ixp| |xp<'S@ԀN qw e?tzBR%`^ޣ@T0 v9=LK3 wb{e g9Sl$Z] vBp[&tݻLxpC2|TToBM`rz>W2@pYbcܽG=61Kv4/A\3"Xٚ|rlM^'/FRjv!HɛMb} wR0;9 "Okąd&98A+dqo|G9\|`ys8=yp@C(חQ*D xǫ>4`?^X.=ݰBi_@T!{X1'f<(W2߁A'm."NXl}e^xAYP 3I^vW֍¯Yف@ĚzC'USV DŽ4(k:tmdLBHRjdBHpȸ}h\+,W07{AHzA`Y`l Pn كf@RBf!wg3Uɷ/R)ގP4o\ dOhȔ1! CUr|!\HF5j&$C%a\c)zy14}#MhW~nsƱ|\η`&=_e)f!G^99"sDr#SdɜyG8$ݯDƳ_0U 5W2y '0D!1@YDs ]3Y}Qy ޕB !` D-@WH,Aу@ ;w*z?&$] $II' Fpƻ-n7>gRZ\ >Xd֪y"Ϲew …AOB"BP f VRL8SINx|bIo^K}58H|8w'̛ڮ1/%IJL8H7>: {^k&K5So$߸O$_0I{LB y!Sb@L/ەyZg˘HHԈz~1$|6u^pTdp~< ,BڼIH6X`_4ao+0<[ DBn!GONM0C82BbyGzua d tǯg_i kAr 9 ?͆dA`,]#bM!(@p )3+7F{F$+͹&Mć GsjǃYcA JH3H0|R#n7d2P8OD}.HɵO="ȗ^ܕ, Ly| |YKb%@jZRpD{_ [p[8T x ^?v3% #c!&YV/ֹ/O6,c~y j '=QGҵ`8־N :7`A< a^yAqxQ@5&.rp)V R~A!K"n!yD ׃\/>XyA,B|KQA4嵄&X-t7039+ `/#'@ f1.(?xM;P^><D":#=0qzN@$@;a|7-bk7vRDSP^eIiДwTZ[|<&vDq{q{Dnm9RZl"AjH61?0zoO:Y'Ax2e{/%ް}ijp:Q  70S~rTx+}>]y<7/ɯ{.01Z9b"u݅-QtE"&kZTZMaGk50-`:^vM>X'zO]K0W 4aYo;]/)@^AEyi|X!1DW4ā_~yhw6B4 p^ .-(LF RSp͚I.N󼣅/mB" #gĈ=ـ}Fǯ/8_{D VI̟1E,ZxC,[Yn HLV|xpDd<En]駟 9A!mB=ph̚Li0m9*tVvEUN}f+kH떔sҧqz{cI5|5ꑼ|yէډk5 ϹQ0ALjڳ_/@:Kj$\XH3ف\ n!`:Ie"R@c_E^LNl A!"Y$qylGWYl% nAΗT Svt21rȚDBى L[М&|x ߯^ 1^ذ$Aꗿ0;zwa' zqV~ueL@v?D/&SP6Hc\d)@QX=)t{.^ 倃xhSx`lvp9[ i.XW'Bu5.@F@# XC2<ʴ@y)84G{Cˉl,h2x}ҦW|T=l5F Y^[=lA~Xmc7CoTRE;` |O,Gh-T|;4-Oou*S@8|p@-:G}D~ ĨY׫ԈBê&;-, 'cn7XY [A[o" Ku{*|@ijm6o ik64z͇UbÌ+O>69\ leb,UR6m+~` el%5G5R5b|Lr O &~$WHolLoݍXurxҾ5!a&Iqņ,X3~n+ĥW>WPc㵒Lh"X<~غ&Yd4bʎ"NyY*&&cI^c' \lz Xa3'xk)'% j|>,2sAYN$hdb`{q6 h4`ސРKw``6W!'& b:#®M'@uu^?W^kS$ew(NC LGV#as H,=Kv $' D;Obw"cAq "` LC-`A[ԎNBd#DLs2C<̰F6w{۠C^Qkq46$&by@0CYKܙ?V|MazU)IăN/JH1@'d  ˊ{"$O8t;^uPoȖoeŊ}GmFi؞8]D{Dw$܃}zZZ4+l`x옥r~DܯA%K"b6٪;`vG5'\K?))R-a` ^zUo4,*uGaW/x|z@~Md"^$7l|<+e*ER ϬCe9 ;πxz~pJ#,ișuȗgGd`XqPv_8/7D/tB鵘VWb3{,zQ+=:s)MhLA`Ŭ,g$}kZ]J<+dd.qQOF6\$Z{٫R;$]mxPv%^@J6m JuYGe_}f+ƣkڱ td,()"PZZVvD-tVٻ$ B^xA$ z¯ooQ_{:`gDVM<cu?u~Zm9g@[<G_5Z>cPp0<8 Ӛ۲̃G4 p>^򐐧Jp&`H/'RIu V{)E~5t*d#Zi1 K$vҺ[2K2ؖR\vŸ]I6z(4@v"[` `{F!(xu9h+BeOĀWp-a-&!HMflx1Xn Zz۾SxB)Nӎn‡up&+&M^b=jִ@ERP`.Veq{2ˤYc)8tR2l( Z Ĥky3y1\FoO:}%l|bUj>{~^>*>O_{+~O>}?|?|٧擠 'K}?|~eI“7KK?!KjÏ_} $#a[:`;z+cm>.Na1-k23 w~XryfJ Ny hRKPlRrC];P2ܖq0XT .kiZ8mbǞc^_]]']pns#,ڜhmzX83\3~;έd_3{6EL'$*5,+#dza>ʃ[ ɞZ z4oJw=+z-)@4n,E%|W9i}$3P[=kaO(c=st,5̼ ZzM(0t{8X?amtjKQ>hff9p_o+zR\ⴷʹp-Sd1p{LFO?b۝MbR-HO IVKilh.^l ICOiGU-ܻzm7vm#PX;|x>y7a):obAKܟ@P׵2IC]E`s.}a\f+=x>]U?i՛!VmÕDX9}RzYT-eo˓CfV1*=&A<\5ͶX zFm(o<7x`nz &oyޜ][!bx Z̆%'B'0rn%fcjZ6^.*bWzcl#7{0S_F*CQ2b7+2[{mZ}WA`˂.CxZLnlv\^c,7 n , O#=!flo刂ᓐ4^G']M3PV5D`}eLjV]-Wpipjˮ' :)X:jjz9ZE O$[P)tO=XpH&QlFpܲ_ՅrY"aO>Ooei䷽TUrp[4B&^m5iyIHZyVfQ;z1E .pXA?cO|.շސt+{'zD$f[1qywɋtq}} "_}ӓ{Ƴed;}>"߅.*=9Uyzړceu)B1ve8_0R@ZKWXעk)l: .ؒRf+ZmV"]]Β@ H^'[8'FU\VAzV,wkmj%$3޻Nm TԖ u1l mX+<# "[ѓth] YP |q,&rBtm8O.PQ "uyc=tw/>?6V@R`7t2iN‚a٘ڬw;u݀FKѩeskoR?EpJ>׭ջ\;kϊ=hVcpT;}<=dbՙKż{Q_ cEV w뤲uk7aެ[u5U$σ8q啧UUŕ*K+n;!3j.b,j`P)}mBU߲m{titSKoZq+ۗ T^)3 m{I$0/sȽWLв͵/bVzjX5u Tǽ`qޭi*Tu~$vvfݽenvu{xQC$oQ =N”Y{:݆"Xz"/ّ0*75!8dίX'Ȯ+bIa= 4xQ\9lDUiP/ͻ-؎ m}нb^GLGo\޺wE`O'M&IEXX+hMZ$oesyn"lX BQ1,hyVԋg\ż !~A?o#c uCk(JR$B TŒr8+{.8kxb ړ,8cU%,+S Z@-+  q D6"#>e)l]* IYhNlH%dc@7쪧لEQ (vx50 aw wceEa='Zm DX}fNP5kR Zn]RQfEc5仿\2/oAea8J֚h d+ bj[z'-{NSպ4H]$P~@>HbĀxqikMXh V+5sfL].AT\kmZCӠ TQŽw*G@mbIrym#C=e >%)A ;V'=5K*p;[`R=m",Y(ӳg❸}C`喐*vSL2%PPBPµ[tr>.|>-OH!Z(^wDU g/s-,1(Ⅰϐ@b/qbH't lNRŦdH잡*dT?Hvy7 VIgU)g?,yl 'aOiؕ=T:%ba ]PY`o Kzq |˃,#@4si<HC\ S6r,Z[v+,@[loI>=+M@KIUǠՄ ł5ůcωM̈́6$2:"XG7n:n"# ivpX"W:L0g/WR$~$l$ 1N!"w2;[C{UK2ET͙ NvU Ap!@IwR[rxC|vJ,$ GMz )U_5_l:>9L^96zFS̙0ei/Ltx s{"q>P.!dB >*Hh WdSt* qx 3R`7ji}c f'm鱏M/qC>3XY503/@p *!).GX%xNv*J0!9~;vlf' xRCnyeK*bcyVbyyD0M=!zA*g\QQ5o:c;@&_Kfz9%1*LF_B{4Yd;Ua6$uQvXvt`' 8CINYM̖,;JJk(eqڟ^ 8]02܎1yN"\CgL[6s9FJ>) Q*gQ *@k8qy)~S=^IJb{_Hd9x}% 9OE܄y/p_EJ~.ӾD.pb(=iAl1i±Sayvzv 6O+TppT{*hTVy:2ȔVk\p,pre*<$Fr, F` = X 8g,:pC7wx+@X30̣T=w#^,$My[5 ͻ=hB :`tse\ 8:d%?_ CwY +#8ΙWdf#y/@wi#k$bRÁޱXx>xG:?N9jSqxD/XRd7?!Q $"n#tn`x~x*I; 4<A35Ê_sC>Dm @*O;3β'BV:U CUO'V)ZTQarX˙b=yYәjw΃4:W 91B'y./WXL9MoUO$b@7Ÿ= 449>FQ,9 {uȫaz6lί )`k^VY1Aiӛ.q_t\b1/,廬-}Ͳ^43׌3*t93ߨX]-rv#৖x@$8nwG`'p_OlV:\.ԛQ0tqLdW{?9i5PVϚsoR҆ :mLg8IX O`6_Cĺ+9CtU8 `6xeS.y 8q:KUރ^{FJҁ 4:KU3rѭ+Z끓v'=yE@z/UU$ &| u ]#㿼<q2u@^5+(?=rpTDZ-X T^ZC}8ѭdSX繺o,_3fsF YMBhӛJ1m) ՉKdw//m^,&sgj8]CIy~kbrgSR5+ꩺ߃X1e=1x?_8;f`|Y VF\mݾOxRvEy](/QnyolvIRLuB1yYDx4Ǽ q޻Y4uX!nq A@̴%q9Q/mќS-v!pKM8  ^9 eWby8M@Z ,8Tq`*8<'D^#CisA&/.qxe=,9Q9CұでW{'ϕgQ MXɁ #º^6vØ;=:̈́;JKH>i SCe,8aw*%Z$;^.Ǜ?A& r,eV7JDlNmsx[!ꡞjb {'!1ur $MAlݳmV5D[TxR,xB><5:\erX`}s4F$Td>l*2jʐ%s$EGzFtRoRDVNx$=3}LJ[i-UTGkvHTptSeoo -QV6^Zٗ@XN5:-v`ni::1n5H(3 ǔzЫp鸬C/zĭsZh襎ж'SiLNzL%-_xQ ^; CB#aWP1_ϰ, ]x{<2¤Mr&eъvppC&qZ0F?8Igb8JfLжCS%56d`gS⥃YL@*/){h7~X[v]bqu!yR usHCeaqġᄾBM hV2^OpoJޗ]vp: nry.OO7g78g]5Qy)V̤r"]!YcN/i> zy "Kj0*r"X$6r?0+* 7k?YLg}j{­e"Nti7ȏK.#)!l푓&9~YZjz% QV_J6zn#Җ/[Z<3) ;|tR9KE"w>u9ڸp6➏xxm {=wo㥽/Mҷ'C;z qv Oes=,=;rfcVxGŭv)gZnKR%N` d3ψwsJd =e=Ϭs8[?Nj992{PÃN9YXm=$NLRT lQ,.Tk/g#67[)ܻtl1H5v 4jPD(i&-}߀ &> MW!R4ܹ}v |ƙƫʪ^E9s }u35;T'}댾rBfUb/r%YM`?DQ 6ehwpVy&hSy@=vBK-6"-/ #'2[ZnڪKN#i/þQ;n dMO]Q|{ĦN`W3H 5]G8ֳ*Rg ه;*te%!v;IcC( 4uUuj.! Эplo/wZS=F09t 8t{D,n٤txH &0 jޗyLZASF/H['5qq=898h;)aKŞp$|e&S lYU'H,3M-)68£J 0a*Evxnxyĕ?N;nvxB*Pl*R=sǩ0N,ᯗz @%}9ؼ9ʣ|s,##Y )p"yAbP[{Ʋ 48-JUR[ OJyvG;%1oϴ"Hjv*HCOa}s6( zޓG%Ky"KSTYUrJr+gNPj^g:oGkĝ3,/59쎂w6Pp2 j;ttmJ/'ΖGJ2#K%җp>.<^{Ys j[>8黝h 7KLAyӵaLt̡sV)>[}vpڅpi[znH} 2<(}&ʑ<vɨ;R1C]I`^s[LX56%-zÁg CR*=vJaǽL}ul䄸GAn?y͖Iaa 6S}ErI&2ٜC퉃Ns¼uaJOz@#yrC]@>lŴT杛9bN˙k.dy,aBS\oGWJD ι"xd`ݎRNPKKbE@E:/ 98^ݼP|$=2W,qo\Zԩ*ϱud!szVea/'E {,ޤC]o$:µ[yutWg658oPنW҉ A`kt`9=D~R;:RX&޲d9Tu\RxV?Mo0#!t{eǸԕY^+Fx;aE; ޯ;xTHF0<kPLnFh:>vC)oc넆2׽;t^L#8㥐3lT;z̜vs0~&$)kBۜ[sz| ˇXJ{j%dJlT]IGGwy&!Żx?xg'SF^:NTK:oۡ.TԕW{eoݞy8SI䲆/6o.(c AxR;CoIs|nyJG-ܓ@x=ofge%]}(؜.k="&b돍RWȞ5wCԢgӀ)|,[Z:|vX_qjށY:1k# TD=:&pTo`|))T yq48ɜes>1N!d](qnw*qX-\@5".nsxRvYcxQ3m2`BbOrYwƪ[poȳjaKle'Ka  zl$L?:5$:#̭Z96sؐ1-lzВm7%B'T۳dt+@#D4U̓^  $9#[ lP<;XYG׃%Pa!qMݍWP7@$^_NaERSih&|j d t"wNUGXRecoZCckiʌwMgzOsY>`'GpAk8C (A:#N=]ydZdy yX ~'f]5+Cn>u (e0GFۙ`~$ϫPǩ ]k}߱ޖ;4uWCk'|0^wṎu<,(*t0<˫kBq;ɖ$S}`hm(,FtJx:|\.1UbߧKwbQgP|R[&(^ DJXH!ՉNojC*#:?7}a0rm?aOlVy03H5si['s{%%3ъx:rȪ)[\eFUzB%MGUÄV[MZf 9IKdBŅe{\羹K ض=567͎UWv_Fxg̃M(Mtg}h=IуD-靦0KVY{f# :aeiI;ߦY.08qv=;s?VyHⳖե@"_%u/k2A88Q.{ C[ybqJ`>J=>emV2|tX NdTpP3"D8na^"2p&j[#` K%΢#7 1S Te/Rn˩HVXRG߶o+*W=w-`me^nټBO]u.0nK6-()|[# `8+;z9wʈ %c6^~9NźV{_؅пQ`zܱZ~i㮰#e!`| hsPQZ;Vo9YEP9xcq6*iiABf }ʏ=N[vxtg m* 3xq 5*{mfzĥǥY }w>u;;yE#NolQ`eOg-Bɜ:mq"V[T&o侭bY]] :镭) iM?@VVXZo+x 䁖**/oUv{ 0ϖe. lĐ 5ȏJ$szVU)u^a&hEZν,b(xC\Th8O=sCˇBӫnó޺Oz'm:W,K"V2MS2Wˁ";S >HՀW=zbQ2v^.rp" ӕ?5߱$s>ƥ۵ԓ))13҉s]Krˑ2pXܬ[π$6W-m1\Ӓ{~uղulʻOp=9bcݲGSYЁ=|A隸>{')X5Eԧњb^0V]{r>Ӗ ],D ~Ӈr=yhm2K,2)w;{>y&)pG^9s1E Qq1r!Ȯ\lLRin%mz6$+WΡu:PTAatBM7i Ͻʩd&̏ApHݏJjwR1l^[iƇ_|:ڰ}j^2r4_ yI9ggx *|*@V[=Ž[56O{(ɧ6ֶ< QVV~%;JgC邆Q{_c׭SH5&miii{2fQ"PVN"|)).WZz;Uk}y}YxVҬ}ѮHaSQ6gG9mA =uuRzWh e'L uN"Qc<;u@eM9U6pcN]]`G~qkz-MZPSM'˴ XR y)`yTLEuӹ8σ.&^ y) Vʇ*( UtX"5[StBg"c  ʫ /ӯѸYIEloF Ruh0l (E,~*|XѣPبeN2)'cjoߓ-[?N,g{~D^xڮGuSY nqfMY:u٪HҍW5xO5 M>/a" @٦xv]&(˅A(vK"Qxa}K& %"#fiV7yfV٤"6~w;U\֦OqƻEh&LCpv4' ! ֻR|4՛k7XKAtOzΫCvvVHA2o{؆ɄX["xS(0/OόHi[[*lZFd*<, $aȄ^KXgW>e^eT`Ϯ*KB[mqzmVfDq3V|lɩ{'iGʴ:becǶ#y!"eA2dPuHhI\ VKY1VTFx몊uK˓GXIWb(6>ouCLm6E8?;qVԒuSɮHPؽF4G/-`dm?6J~TU}Qcu{D G&NrFtY|=1-P I:z'ܜ8mYgY] :]iˇ'Lه?by *>7?_|/Wo?w7?7wg?_~O͇ů_|_| K0_g{7?oy_~/?/G~?}?__?~ ZsMbOC{,ͮ_gsAH04A-?o_WC?WMUy:m`a dk$;CcAE@WfX6R(b2mY^;<+u9| Z> :Mhxg'e)Y<A83P U5R&ݧ 96 uHU8;s,H`|RefYY`ʫA@5Y`8-F?nRY903@TUhu+m´PWW~ɖGN[9b{:@ "ЭW;tнo={ΆZOޒڧOjxՉZ~aR {0ξ ;9[~B b8죺u֢*W } w5y9xϪ Zg%j uRu/T% 4|'aYx _#J)m'-mQ#Jmf?-I J-vpSS9M/ZJ,xɮLerP,ވ;T7/zq4gثBvC [;5$nmJ=۱tGhW)a8Nn'TMudӫL9:b+d8t`$5Ղ}O-_PC͝x6?őph RtLj6Iᨲ ѬZUx NCkLOUT1iq wzp:((vA Fs\9>γZ<G~1v1UHN|%RU*l%Ϋ)n-L2#*O )8\HV HEWN@RT XbY6 蝝a2M#=|! xs8bZlags+O+"=4":*/o W'| 6⫻Fma iׂv:j+;m2$D{/4|D~=vJuˁBაSDv5U2}.TiV[1 ;óꦞ{\ ܨsd4gikmX1KiWآc)>Љre8$QZinM_%s9 XV) am3t1wueP9~bab$Ĉ3x |)Ip'xm?a2Y`%\#]%<.]ʰIfSTb&‍(K{.m:ɶnA4D 9@sVPfgYMӉ˙o^?$߰afbPRիBP g8"YkKę :$<8R쵭vN{ώ-3fIAb>tvD?9JYD䇄C^)`֑Xs5ւ(H,հSzHF9ЩqNVq0[*+ujxE0[MHr"D 0YUW|v^AR9aZ*H)*m1*`uGPx`B|mm +;(}[kNK]]2#MLg=IlJ =ޣdemÐA؎`g!"9 wlY0 Nlޓ{d#:ɶX PKGt'XD1P$ ]rq M˻.l8êxm2A]Ia;Yu5:`Vx&ßoKo DTmDg;%gvK>_-}&([ űϸ%$%rSvz{t(R>gv۫*G1습30&;7p^U (I^8"R< f˙JtX'P2=N[mm _zV3oȋq~RW¶E|=ǝ*KcoY _Pte`aF6` ˧;,rXu͹F6&NJ[S-{؇·GԾȠ *tZv+ niYͥ*̢E\U,)=M;ZpOÎQǯ1*9jK LܝDlӎ(g3hVlfw:oQ ϢCRpJw[gϑmr(pZ/_ɣ-pTU<`X1t{`ݏ3?P" uLc4/)Ev:Lxtao\lⷃ&@ 8aB-;=NƖJs>;bOSJp(cY~tPo{-UE8hΚp@J|m8;A3L)u)JWL 2xl6fgֵ#~̉V7E`Y]TxTb=l1VuIHW-!Ŧ/vp1'nxt/|{V iOeȇa~fB+S5}xKF9ۤzI4Tɢih r ^r:Ho?ii={ + #XUYdBM|LЕjNc uQ!wפ>Gr&|Q d)+ExӉUrqa sx@6 vnP"=J%_#q̨j`,&B  YJ[og=J4YE)٩T6`ݨO!{a,uՁZjRrX4dww4oo=`y-_0s:"ӡOמcA9ډftz $WY# _`eO@1k:tAoҬC3w9ب7l!q臝sj)9Dxzzq1)3ybog%˟"@\&vPQk-'Mw Vo-j<qo!sdd'žlc?|nVAq_6mXjY@ؖ^Dq(dv嵇*4;5}ᴣ{ [x6:?bĺъ @DбGMrJKÿ//~a/.j֢Ͽ?W~wu?׿_??W*|~rqW_j?W{1w䟮?ɷrW~_||/>K~`?>|~~/7?_1|~_~o9|˯)}W_~W~f}_}?|u|޿k1|?|~Oey_돥˿s~_~F(O~U7>~CCo5d'J?ſ2? UD)sg[̸C'QEZ߭T?*y(>~`W_W }_ÿU?o&RgۇϿ?NLh7n/n[~򫯾W>v"-">/o/~_/ҭw_5n}K.wOe~/Ϧ~o؄/sM~P?_O~/_wx_gf?o?;ٷ?OW_ן^"7_}z|OZg'6 o>>}O_wO_j_U_~?~}W?O>}_j,ݟ}?}_O_J+|o?}_?_|[[ɷ{{:pgo~ן6>YXMWOJwg?їZȏ9ݏ/y/%ї<ӿї.UZR>NՉ**=z\Ԯ5x PwH,Vh~;)}_{mEw:m=p{{BNު=8l#)`SvGwzi* uo\6T(z֙ǨRSxx['@dרNO׀er6l-鯵.KU* Zsb|V=%i@{eK1>;t8^>Ioxc_/LOMn%mZSWTLJۮWt:2>3[`=r?PJ'29̢Z^ŹZSʣ l[ľ{'|;,7rSZpAvj͸KGu&;$,_fQVmwm#֝NBa1c7~sYq/d9kU{zwYsy-a'Oq[fX6\aLQxTX8uc(^U5rUj)Ih)x[=ZUgćZݍq=zt '<|!|(= mZrBq:ĀZu5eu#)VEOؼ"'/kp˪.R 請ny΃S h ^իZ̾L^c,HN=qord<{!*T̮bO?/vņ8Hc]Gmaq=kݤՅmdoU"W׮~4 1dX`!-ҝkd*ݳ,<7ȓ'-ڲt),`YM!%B/`ʙTGj"g;OM ^.,7:Rz E_NYRM VXRS{]*3!9{_NPZH;k8]Hrmo7ۈa/;!/}*G-`ˡr0w$"ͩ2abͦnE^7'hr}(܁<^[z@=QEr!IU-f` OU80#+q;)9EB=-.ACב ɾu-(PGAJ*o+4V{J8QV}.lne7o`Iґ(ҬCv:#{4Ž" 7xؤrn}.y'U4NБˆs]R_J~Tά;v٨)Cպ {xak!; P//%nP'eɨmcS|p kh ,`q+I[/Cҭ߇6!yr0Z ARmJ9 A{hijc icYYG*r֞WJwy@EFEb[! 5)Yoy[pKV2'<9{ZBA`v`仺'QC,>〰+>=?BUIi6 ++`t2c~XI,Q`&U}v{e1jAV_7:C_R1ɟUvxnk{me 5zpYKp)J(*UΉZJYYm>h}Z<w\c΃]ٝ _aM'*Y_EngrF(+m/h ib"C+ˆGG@LH/$lqW X^MbaA8Zl/X.ۘҔH$K|;X+d0/&`h:|34t^HX @GK9>sT[&ڡiF,}eo 4|긊`l)'p"8払Aɘ#9Q{fG4ّ`H|x\x#F~H>[O{$9rq 'YnN4_/=V"Ǯw=Z뵦$ڕd5D`7Oty;Е *Xn!U1˔tשlz6,e8nejNp.lMHk£RyJ!^o%j_b$mc )T.$[T08/{lr DفC6T+ 8J$o Dz?:<I{Mͮ, K.'rfx7!Z,/rLrz!fKFHB%͐n˧I~,X7'#]]ك{)MQ#`Jy-/vXFyOt}l(~xsJaC|dHSqG7 &x6ӼdIg1JA\$z/;}|$(kVƨRKHI 녗E2H;Fk@fm*- m Ir MTLxEd熂\N)PV"={as.g8+0 @BcU'RXJ3 5a֋lͫG7o 31etDb"Q{zx[5xx`C`^{<[ӻvL8]Pxx!N%Z}X@I(aг"М}UDkhBPVKt> %9B v82W91ihY>W$Wn4HKG( 9T{Χ=8rXR&2u{I+ͱ]͕nps¡=sRv6P)N:KTtzV*Nu^BIZ?HQaTfm;x:T03@uh7̥|uy-Rea1-Rp:z9oAx1 i9 e jU/aڊYioq*T XYZjo^"+, q^=ʁS93}e2W9lVNQ>ϹUsePM-۞ -A]Dlaսm"LB%:ezL92JycN\t:szYR'ӆ\w (6~K<57@-sNqXJ."̂rRT1ZHPs`$Fg'7{DYlHNbePw< @v98.{'0l~OqbЭk V&ѭ#2Gp 0Qq@ŮNKQ!NrXĵ}N^{UG"7uc.8%zOB$tiΊ/r*յwCK>Mh~ξ6(.iw9 .X;2;1)Ůb*FNѡl 0+ -:bjC@L6e[1,m^R&!рq 6ƛ@Fqk ߟ%&+$[qXn3e '(KVᄛNe%VA,J\="m SEWŀ 3h[J۲/<$=^G{b׌oSj.VlΛ":`,dQ{;fb:x;wvƩ+['4w7x4YӝĻOeBQ_R&T{3}7`|RA^,1έΡyչC-O֨z =k(V%M:+6#xOȖW$[!J#MYۢ#J 䰬KR^[٫aE_YB R$q¡U?(`Q hKp 40Lòġ o qnVH8 *o1|:RW'xt9OX<#w ۔t}:< S kYrK Vi~A +Cjb@"!4)nME TLy5 QϺxn*1٫+(Q-w„eXH.2•Qg[Nb{¡*ȟ)-#l.:; XrF;8I;'~nyԉ0a4gIb׶&|LDTeUκRgbxHu>;)n ~^VA2j3"QxJxY `ʋytDV"ꑪOY87B <yYeV)mD>Б@X 2TfzRPIy\QA0mmX`-e`=Ay1`.`y>F!mhiy/^txs){kC?*bMx[V{8>7|rl֘p>40l 'Yy: &a7:Ui@м8W}*u[٥ڏe` lQ lءW-v/IO܈lK+x IWJx!$@btCHvkXmRYBܛ΍avJl3qFrq,Jwb/NMV}gپzrgS" s&${ 2=rv@;-[$NW";w޾G㽶MٶҞ%?樝)jڀݯH)=j6PmgD&z{͹A;hZeUh6z}X®lM;mǰ{ꭔ$E#wU:4 -'EaI tʱBЗMA uWcK/!ƀα<~%{.$0 WK&g=SӦP5N_*Xרğp8Q#Z7"T(%Rr(7T6x 9Rޅ6O7DͲ "Av >i*v-*j;M BMI !)=,̞ –vY8'7ӡ58OkQ$gSrYe rsy8`)mH s)jؓ=RuCت@;U[FW 6a, Vh|DՏ mL'OL2@KCDHj:WUC$rx?N?C"-SQ3Uj MAԒNjʽ{2x8N%z!wIv:=x.\ .ק'<ŏ]SBDJ `gJ*lb!8 `ubxV?58`c^FKBٽ(8"3S[R&sԊ2uxkhqb=/Hn;DjR"UNd9ݠ4,>|z/doq/3/o:a ~j* c]<^HBkJ/xG BxWWcY,fA匿>8=F vayua}#!;aծwx# l)+,ZؑCavhkz"+ ?],!r'-(+v/^ Z> G 88:ΞZyngVlB>dy[쨲xA†웴RFq=5j:72j(D]m,|e x1VpQ'I8儹MnW{nj$*>s0aT+{ə=>´Zz# ,^9cK˖e"nptZbzNt)$kۙױۡ5|&h'ya)}O-15IPݰNusfֲcTpl HT^oT>=ՊX$`Yi *3^^g*S==}`kс9$~1-!q Fl-s94 V:v(<M۵DrEK{}VK!& `P}'gVH}_0}'Vb84QyDaX$y*:O2?(&B44&ZsN N6Ndg$0RGj8׏juViY1HeZF< 3Srm(VJ3N4n^Wʱ{,0xwzLK8XրA 35:n4Ryrct1\r:A`F?m@dB+?U(Gj S eMx ;46؆-(ilq!JdTTHـD5F$Eaw\C䗼ȋ usDct|Şi䶌pE:3;V+xOa&[ڀ8pSjW\HN Y?@vsۇpV2?< ϩvNߥJ82d)"XdHNhʔ@+v=g/928=+zZ9 'qo%_:P .[3O]NGT y\ ݞ$ktOmm@Jyó~*.;Bvo`,!\XwG18xtUbc\ٻ[+D3o ZrB$#u1Q(nSWF 9P*ނ:T1r\|, 9WP6bpЧ%Z|9a\aXl8Z}"5Ysupv*d#<k - /Ռ*oPɓ򷼑'B\"jΝTN gh^$X\眵#U0ezxHft|€vBB؂p7g`^ D::>Vgw]9n[",R< U`D.LD4zl+:=;Vn@%ˑA@[)M3ȭ ;GJ=J+={)1I&=8sO {)U Pty q3b* l]"C:(gȔe G~[IV%u6Y۳v#YBy~ nBog *Y* Au*[X=̿뻈COy#b)xaϲhU @,3yȯ QOxn1ak0>}7&T ă,]?@4P6L(^ p mhZVzcm-q?[%Iv ۯ~ T^ "f3Ht g^U1Ȍ(FFXߧB4~m-3P;0<֛5WYc;S58: #G=p"d><ٸ",8dOdL2/^'onH^s3=g6Y}J'R|CslyvsR%=; #/=r!4HWշm83$^*N#ioF1*#7.i}P p Ƽp)l\4K6C=:(J$_ʛY\\*vqۻME SK6UljQm[%ŦD؅'U건F0*#5jad3u¶\Z9[ulQM(P]'6|d?mq/PwJs QԆ.Xi+*+ )xaR?K \hɣdu Ǯ;+qYӍn\3se8z4{eAשx_'uâk׃yJ0 | |C1DN#Ib%Ox,,@%7{fϩTxv!.Cr q$E\J U_[|,Z`nk$_ut\Wzl%4tRs!ĠTIR+*t =p>t,BcaAn!4']ea1`[]+ˠ^񠄍< Pwy }]o4]n#$]κqCNr XZ 8TKv,7+1D'ќ[/K 9/\e=;ͭp7WS:}|x;pN%v{Al6֮ V'wҭ 4gJkwl.OWtNK*YS'1+8]>2woM3 إ7?ؕ.^\XMJVp;~s%ŦDעqIěxd87Yzǵ@VTŎkrƖ٭)_Md٘Fe=d!c)x`}O"<M<;,ML0F{W'B\ܐ#ZpKfK܉cpn)4Ӽ ݆$x m0&!P>N%`^:#Tʜ܀ X"/)sK"P%V P3K{H l˷}n.޶brw2uidž"a6演N٦ j8^= \4~ NJ"]1 {尾u^ʁMм. {KXs U{7 _xt6IqKhviI)H-L(Kv,aͳujBb3p 6yޗ?G~ڀNGVlqI^vȩV\7pD=9jqǣ]Ξ?2ɵ"@=0GqH+y,sj[1$$E,/;P$,h^BaZ;+X_7SOJM19E$n >$ZaR)%KwrÒ4 qhDb!Ju7D9>FҀsoq7m1nov zte jtWJpXel=ו`TܖF@8:(KS%>CɵưRL۳%4ʋ*v1%PL˱[~8Ocw_]i]!b;"^tw앓&qF#e%4 HIctqn^8yLvpP | ,YxȝRNMy 2QX1aC .X,nc%4CYƊKAH'\%:{EX:Buv[6Kܚ`fLOǣcB)w2s Ylyf72ewb@ѥ eI/o!نaKu'(5:Cs' qPk6Q7ĶObn87|z<Ņ) ߈̡^G.1Gk$3Mg,s>CaӬ81M{̻lɟ}w|֍;"+3&/Oؒ_*wPQʃ엹B8X&{ұjvKc RInоX| ]Ǿ9~p`.ƮhBr:D<ð0ҏfu&#cfr!JU ۝:>fs..,l$]oA)Gdغ+dbRGep`@mhHWASMtn)씀qZWe`w; Bbx< țӠo{Ż{)_̃ij9*e'ܶݑJ 0H;TmR(SzԱ- 9aN3{1VDi#9.ՂB,]@),Ssl}WiOmCRaXT<^)w|%wOȼ/(vT@#{Ý|F\(N"m+W~}^ 9!x0q V\Cvmm1^q/Ka$hA Yr7 ҇g|"JW~'plJsg'A7s* m\>#a Y'8XxrUGwB.o)MHM R ZAyxE5hG6Olʲڻ_{%ccc!0`k&:&2Ak^Q䰠S"6Wqk<>Jf|s{/{Z8}R`;@uCk*MvVGCkP6Ĥ-q6`f ^a7Cg/eN& W$aUf&ǂO'L؂]3,/R- 9G%(Lv^to%~{0׸p;[mNTH&wo+SP8ѣ{X77XwX]eLXٗ@$,kNm@ujusbB~= ' ބgTE}ѡsdsA^niT8gD9-f9(#,h J)ɹ!뢚 s7%gk{0/"_XB`813/6rۙhV{d`zNk{ T)J`zr]sR5ORԶ7)wlg?רVǤLq2@KX6s,Ф$Զ1G̊K\*`1,z'Ba1oGܜAK+Rwbw-{;c Vˢw,$Yj7ʹDl0aCCɊ<QHCE \;o56g Lm(t K<Q'6fJa6mrJ?sipRqU9s+p;$DXi`͛˷1xO;~.qX^+8aBsjc9whJpfMwTb5=[sq1wk8 [H7>9o0]+E6Ê!%7 ąQTc[`3'IJ,grXWYXW:&=M J,|k;!39IaV}φ/ABj'z:|\%ǞO-]cԟإ\HwNcoN!XLP% 4˸=;Cvgsqہk?$$ǔ5i_wU9ⰲW'r]W.)nw2w>רAyw,CK%glGbO&MWHo>UH*\N"R[>U s#6ywEM?ԦaJFHtKkҐNz2Rҭi[|+ȱmҩh[5fkAIiIաpKuTAHg%j(V#kS͢HL'[+HH%L. UQ%q8wU$ړke8 |bn)sJ j:[4;IHʧse7?-M,v:½R)Q1LWeS2k$|ķ (]m$aέ_SeG-!^K۪(dcJǻibc4|a6g/mvQ6s#@c_dǕA2+xS>d'KcϪHɳaqMnQm+XhD:U3h`69I(F}"yV ,kޭ6cKݐcooTWV!*U|`l46YMu* s]ds2{LU`60REiNkL@&W{jPofdO)A ox6,/jaRK6 8G*8~Dy`w;ZdL^]-79dԻSx+䶹IgʹdC!cKv:p,S+ @r8d:$WCoeӽ?NWSқ܋Ռǂ "vxTנm"K8ڷΗT*wPEݦ.E|D<¶H=/$0ӼNjSeJMAxt82NAMTBdQm29VuA\\4߻-no#5%/fXdY4=΅B8//݆E{S+G[ Ɵv-J@eJ, ـ3ZO |́zV<-mp:e3ʶ%nX4Н7,ضdFqր[.TvՖ\=JV?gNcn6) X=ܙ.c{MPύ;ur8+됱)3{SU- AoL u`i} u䪉Lf~5A<-qُ$E,qiA>lS "Q͓4d{fvx#[s_̡a4Sfʥ7aTz @Th%j#(V8JEwU8O(abZm:O}*fnJ0sXռҾƗS;Rfm:τ(}rf@AX{ا17%N`)KAΓ%ߦ:*,A2n7X5n׹f"tg] hTLp|HZ`11hhIVյ %g( blN٩iLwޔ"O*b*J9,gq%E紑ɒ2%v@z wXb5"fU9R ^.1!Un?7vIYqA.I&QK#,y9i24X0}SL0#t=n fUE㬗TOINOE<~F"_UeMV[1|WshSἲ*_SlS5#Œ*i\d`"by$Mv)X1$ UUZKNj%g~,鴳{H8o9qٰWzqxũ[Kr(D Te~,)!֓>Htvd|d\See|U5 :exy77u0"59lH8[riQ9øX5wږ{aJ $ p(L$nc2MR_4\Z'1.Lnf^L:&oea6 8bJ"jَ5)X;E-%em "pI9% F\d8m'o;+eTNsA^7=k0jluİiR*XT_)q.kR*kQJٻvBbYW6?!#J,uNt{ޖP(MӉZ ֏$ʲ.Q#1ׯ Lk)ZS2OrU{(W@[l[:%coLȦaKȰƏW}Zi5k Ǣ#0Oe^uv kw)Kc8 1`x/~}o}^?'|j~:^/p?xOB{߿~_>w~o~KL/el,w_~|'___KO|>>w_/߿~şWoo/?߾˗~7_5y}f?~۷ǟO/_~^?/W~廵y?߿wݗ_~W>_ׯ/nO>󟿼o?~_XOe;w_/?o_6o}}|/Yo??᫟%_W~H/w_ ~ %??o?V׿q}}NJO'N|믿^__3'9׷ׯ7_{oo׿{_5߸S_#6[Wˏ_y\/>}zMUyC~uz_ɇ?~;/Ců0 ~~~ww?|ꗘT[W?|^?}X_ݿS_~zo,rs͓|==>;?i^>W+Uk^%? ?x^^ λ^+xs^_{x*+~N ~ʏ^tK?zKG/yK䩾%?zS}KW?zS>G/y?zSG/y%O,w?zSG/y^ןgG__v;&4{e\akk]KSJ;lԾR?X" ȸ{TPy[1  X,Vm8UBlF2uDU]-e0UJUHvl4ڕ56xgRoȦ8xvx w]eٶPVLqv0((3 i=K`]]J!Aw&45gj.*Wf7hȷrX }+z]{IV=,yݪ"cT$sZ3r˜wfkxSZeC[t}<`O[H4>yIM7Rc M xfg$ ef bkkAyv_s*5|!q*m.Q\ELŲ(uvV,=Y-'%E˴f{dPi'σu|X)j҇-CpbMy=/ٕ5!x_yZo5+5ᾙUVQLؤJh}Y)UH*^,b(ݡfim:/_wbJl-Uc[.OAy's<\,_r*a󤡚rJJ(5wSoSY,8Θ~vNtIݹ7iѱ&vpIdC;wqpc6+`:->S/"N6{{엄 \nNF}0=Vdzu̎|dcl kODn8i^};(Ywe%wx$}ɪo7vC 081evdUѴ sen78+wd`erKsMII @:G,Ws.:>m^Yg,>X7YJne,.wCiCr5?-}9*m$5SŘxo2^|K;`w OTg/DZU)U<-HXQ~r$}a:'NߕJl{;FpPQR 6a 3}d?%tS'5{PqIJ]6$7C#]5 KagXv8^X߁}6 -`ju\;*ơѶHyW*YG!rVPGo&&[I qm Lw&:McƻqKzCXRˊ+t\%xRwv]7VK=2I}'ɱ^hQ%PETώis W}p;:Kv]<TЀZ,qv޵mţf{|C}a؏Kz(g Y;&Xy$AɴOӔ=.umY"`-Kx$ᝧwzZn.%0D8;!'EVkE뇨{"xj=*R%x&wT?|(~T)݆,S8L|dAB7|C޲uI"FӋS/{Jm_^ɲ5GN g7 ;ύk_*\9A5CcJrQUAR_ nېܱ TTY}h^'\hRH&m'Z=Qysg/I|L#KqRFSLb (|L[%#djYKX_^Òc3Ǝέ*}eR\,;7 /H2NEcB@s\٤, gv#a.n\/BNA铳w;9g<,rJ Zq)yؒ>Q5 $ab;]r;ز]3|;Cî ǣ&~&0ߴAoW ";̸ }Q'yw’%7,6&GP疕;>%E@Y^mr2.c^6o6OԽxқp9BdbL!,2èz$#)bPiOGwtySRPuK[3sj8}sdǕG3PCh'aa$=OI τ`/GrN)MqP2G^]6YIu% P"t#Q;n%XN6h" "!--X'57 /H=ҰXO'7́D@л0-w M"r34ՔN _pS}aˁM@D=Sc\WVeIl)IdCZ]w,wtO4 8,Yfz!TAm #'U؝|}A%%U7˟+ q㓔t<9x-Hl1@0*K]Jfva+ڌ U>5]ywdir'M)CyZXXꑗJUvvj2gߔrb tl r 2UbXp+{j|/0Lձ;q IvnQ&Oא?aLիQNlG9"i9^9;0w8/IrIHz۟l%Ϛ͙!cܜA7V{vM%m=9b&wvT3axn枣y*ܤٱL7):VIdzL(X5. 30=q#"'>_ J1yb?Y6֬{*.C;ږ ?XTSZ'riC؋Ӧ&\>@qœ}ץfvF0\K.FTֹov5߷"2M])NY>x.8{cx#keat57ehoVo+#3?q̛\-Qeމ VaK._-∻+t'Dڥw*\-*Ͷ;V1S $Hjy qcʹ WMUJa:XǪH6{Ԝ){s08~ªĈqfKTBƷĸo2%f5 猗x_IZjTvl@U~8]S[e8V I/thEA4^@xu/IRKKS'E"pprTO\,cAv -lO*q99QfGG$W`Ҥ ?,)減(ҏa6-ʩvZ\bV0بMv ﹻ1Jh''l9"U ?(^jD[K Dݎݴ(D  dyDu s9/5hVL'ʂ6fTGdp֨u| &__EЬmC(Ux[!#A'g\V @L'h:m-fոlz]b)Dt+T;t)<ts{rpMӆ}pA A(Z6K}v ܼǺezN~g*V TI5;KwstA;֎?:b:rSRvdupq.0ec*1qNd*3KzMP'V6](.E%ƷϽ=)k,?Kz&~,Be0 hwM]t0te1fȇU~Yh4,|[7A췅ui+wة-F@p($m[Urt$E/%R1K^F'OQacd")H%3MfsYcR:t1ِ §=I$y8̖i?7[DPɏ|ȃg;loxL߉NL[9}-.(([Ĩ`7 %,|&|Řu }9zꉩ$UڜUI"Ny'6]L|srT(K:Š/󔻜{=#lNk^\fݭ|hv>s rۊ4Uik2]~+lkC%PlM$_ut-vYjyM=ܖ&H2 + `d}Lڐm5M.,l;/y`x R -=-*J= d,A7a[4qSƎX|QIp63MmÌk"=@LvT4ph cﬞ)>@6㜸*&D,<" +eDž%n$޴8oɂr;AM"7G5|AW!5֎{(?n-E4['|4Z=RE R<L#-Q)7-"&ȐV)la=T R(-.@9nwizh''>;#a8ϱĝ  !zdD}{n&X| `<.UGMO#wCZ7Oxʭ<_h|}ո$9lƲ0e-U; >*\IХ^,gnixAۜ}901'SD6({RBe?dfHB$bU.6 =pm7Y> )^ܜB81-8٫*'Nt(8?\I %;.79qܕCXhBAI*X |DZR6f74m;S?.,q]ZqPn0) k9RMTsIN : cAl/#/l#-=(ek&[ēκtz~sln* Uk7LK*srKB%~Mo\\E5 0r5loI‚?oRꔃP'D36{&{\ūJH-%hY77E‚|:rg/ivlٳ."^p*4q0)D n"vX`Y;Yٰ^=62+/xcģ66ZJ.M3q-BIIl b> ; 1%B>Dmuۨy[||iȋtxvv<͎ip[jNܥ9S~˲4{AxE|nIgi^@lpY{cL<`dQ5)˶[0^Z&s#ar/8;َxMe%Vfl)Uuұ2VOD\1׉4M`bޥ?$@1TuKD^^BeAU -?OX7*VQWf !J%G.blu$ҷZ.9'ZT*LL]+k*y3b%"kqC2- CHHBH"D\iL^m̼=L9 m񜦢Z{;=D 7ec8vbcr"׾ d`IM.tAҫ@M`fLQY?n7_8?M䈨뤮 E#4y%[֡P{0U{Nq}r|^J<"TӾ̡܇G3?-,`!lݍ3V-'Uh겴5B3~cA@AHp{ZR9a'd*wé iTOv.-Ú.'T"jmx{JOWLcweϘ'\?7Sq|-48J lxgAX~j).MYsYJ8q$`ymwR [!,[ -^J壦N4T%Af9&%ȴš);-`K^HɊ=V',.'tklf.n_Dy(\߮Tv7KR :5Ī#!uZJD}#>e%Od F ]ľ OmZ}8ժZÖ*i!Ӟzcx*@>j '`Uſɮrp5^蹙"\xzǕÝ{H2r/ Sr>db&u~&nUDg6d @›91pL|3Ǣfv첓syU&plp@$@FHDTQ@2'oU'-+toŰ:7(X-r>X,kj"ZRg:<9ǽ͋ gaݮBXt|O64Ҏ *JHIe*ԈsVdV?va|gH뭠|< 鶴@yȸzN~1>akO}O-_:!:E]~]jkk %JֶqJ<91ϝ@02~|ڂğAvfLMbUi:6Xf@KINi;ĉ?RHC`ְ@@k66 ،|{u <3lWy:@ ?nv6ÐA {ɵ8fu=YoC]4e>`g͎c U伟KZNKb:SF|L:YRl Nl*Q}r+bHZl @EbAd]Pz7/fyiΞmcV4\GL#PFFVkr:xN>$n`[_o\f\Hc.2e; 5iR*;[HA}Ūaǥ俰ecX"}iDohZNJa`;`deFD191'ZDrM(SN&9Wgn $QU9l.:)AîRLڲvQIhּrn'K8it$J!Q4=E±u;@Ͳ@kgPUՂJaTsFZ&_t)G=xQJ%U̿t+<}nVfI$E,P(!ZuȄQb􌣲qUYfMZ6ˋv@ZRԃ'푬mp7ˠt5mSe(-#>SsĎ4d%76@''WTrVJBftJS]ΥbZ0szOf/jc9SNƪxJ+7ݮev 'tYxw_?Vʉh㥦Zbω40 kRs˼"oOepWc~ա]V-x2JeOTrrqv# %K4"MYD gU_a:JDlXFi%az+cqf++JH~T̑"~Y:&1DTE䞻B1t͸ :[;}Fg<اժ8#*vs,MmKv9*@3vy boCZ~;y5Ώvrp8nc)9[pd pLHCRL<ʬ.^/wpNU6hcV"X\2c-޸*4vyƎitB dwWwS1m⊊ <[`jճ$D7Fm WݬfH/*5r陋$ o>7Qa%ΗEU[5;pOY($nIBbm(m;;{ >rEʚe$謫r u<Uth=M#*s 4Jٮpe ~ڸ8$$SRrg8C [p,6malxgCu0J+x3䈠۩־:WO""1iDb`Ӯ0ib ݲԥ52Иᱭ׹ r[צjpMOҁ90(eqK]ç?M7F[Bk?LO*i λRzԸ$\B"*fqFvٹ)"Dz-YP2e"9 1 +o@cqJ򔇝`(CR§fiEb(SIHl3 EL)yW>&z(@Sgƺ`{٘PKeh"0F#FSse5ė#do&kADl lW/R*xb-[ԛuX!XVb4oԩk) x9t lp vtg6}e&QNWL]ztN_iҜ"J|Dw[aXMtJ u=]Ξ]i':6zZ%[N(ǿzKƢ to"Ȥ}oTiOu2/ec }nJO AqU;]qrIQOOC*iT ~MS'gT4L$.m&3qx*Rդ7L$ *)[ov7u-/k^} ceŠ՞q7 P69OIdpB ;Wp5a/QMJXW"cy\tPH#F 7$S<_K3VxWxJ,5Q+D^V=Ty16#nrl7[jlEUo,Yhk)a6[Tne4 -]vΛ-KOw|WRU>]"e'mai,P @h{-Z+ڎUܶ,އ!@R27F8cUmÎ%ν1N`8몼8]-, ,V>M-(}"% Ffi$eclٚ8;A%앉ap4w_*V:"(zI=x~㒕6:3Ng'-g Cu Ab蜶:fVH|)*JRZNvBn3GTvzE.FwW2鞒$E/ g^ j"CV1yI"ug6ER{mF.Dj.6h0tкhr f&f;vI-;rȲݙ|)p`1uQڂm$Ù` .$`d! ^P02JwVh.^med=crUbvU~s'5ϋC$Zۄ7jێll_r<rtV z2ln5nu2NB1Տs }thx%dn1i*UM)%ؾ5% lJfp,0ŊGnx~)^ KaDY?#^6OM!?ˍ,wbh5 ؕ&t.uQ3DŽ%{1~#L_m*A>;+|zHdWP|c]z↎*+ q`E7roZY c$d7p7Ǚt8D|]xFV2ZޡW `Ta賂B96} pz(֯"ZzMCE_B'3s-hIʵ WM!HL6ȋgukirAl.PAt̾I)>NpHerP \&.]eq'nP4AmݎL> O`Ieg qwU%zh C*մdry.1vr8ʄ4Rimg >r LȎ)ɤ?E,Z6)[bA}+';Vm4'K/ث+:X,PQ)oillq'P*IDu]h )" /de>IYGJDծ0נKy!h e, aۧT#Y&N؁ AAo I߭bY-|)0(%r&دJQ-[Why(dtryO ?dihټ hs3y bFc#ŷL5O, >KlTezyKOFĤ|Vt"*.^hAvІtvY'!,&N1s.Q&nj979w-4%kyds4È=DAxNK'w\KJzU @%[]dqLGo\IV_ !3@AY %ƊTY;qWGqn܆%K /3YG"M(U&%"f|c:Cpeͩ`eɍŶ0l1ŰrR`'y.q l5VxNKȀ-t'Q(q [nt6qau|Ɂ 7ybS-21Rp7t0taf\|./gcJP1+"S?>؁.q2hV>Gc0X.ӽ pv{3Nx%sl,(7`c v#$Lv5lEr-R#ao\2K;S:<wJh^sY{oZC({t׍Y)f[p͆S23{q-'PsԶӭ:_oJTDT'P gAmαS)vɀ4lP5AW+f㎎2lcdz"\gr#Y-;ZnF"ˣմ:m ͞r9*OzH5xE%/z[6dؾ4y&I}̷{NV,>-ɖ$szo6Y>>n<< NlWya lcJ\?-/\geľ3"SFVO`Q9?UXMΑ%1K|m^#,mì4w =O0cMXU0*`1Bu|{ih`_N?mꏀx<79!`D%*X6ޝ+3XPeX$Ş 0Ŷn]6jxh&LeUU($&b~x7EJK$tvuM\\T @FT$>!P1e˼A^:VH2΄u u 2*<4Ew2-|_8{S/1bTȤp w'>v/FoPIs)2śl*\9eϿsnNj`%oRkV#A4;;X k먞zb) yMR)GIѝ*eZ ޒ}ZR=&ֶ.`-)IYA.fv$ C!B/ y3ӛmܬVypMo4b7g5,Ckq9R)*C$%%t0+vofSڻ"|X 2T v1>dRd3A"_<d[6>_JoCc4i?SlWE)pCnkRJy Xn[c 7:<׷GFM@l˙LAClogAp"S‘t6Ugf5l)UOq,Q%ԍxl2*Ͳ6[nIyɹCU0#a=f"$N/XDs˪J됥cu~MlΦ{ <`OT|$R9\ΫIWṴ\aCayo;v{q$L*SV-Zgz0տli {MN,ϭW w6ٯdPU:SlTR$^m܊$\;UA"UĩUm 횤2> |EK{k7PjK9=uby,56͈МU4:ͽn/n5 Ff P̺a VqjcX|qh&WuURںǝf39񴀰*#8mQT%u_&=U''݆90')N4vjGP#N+j[}QQiuVMuA&]JQUpPƑ"hR@P=A[8S7Ȓ5y2lyRɢ$NOU) \sIϖ"Zo`%8??Tƍj/Z()GAS:w[w 4]걔.Xgu ]|S%9{۳d*`R [N҇b1d6fp׌m[fsbHReT<Ԟ%TMNG! wq3>K6GeaXZD+eYTHNh1+3q-] 8jI|}.=yY޸8Ǫ D[A޻ )I @p>Y}eUw5WvId϶h õH %(1z6,a~#y) b0 .1G+u(lkS0Q)he؞+=]7'|h`KfRndhO>.f/479Ա$,c\jsl6YM|K/epc}eT?uεXWzz5%+ׄ&3Hb{:P*oZeqt!`pb 0 ъŤiչj[xc+Ij$io=d]q͂VˋcȲ0VQ0'px?58T =*/}wL]ZQ=3k'0wNIw98J`!Y`6ʃ uDwIPZ0y8580x!$ V:qs=@W,`gQ p'"SD]FؿECM"*Lgq2g!lJwkhӬϨ 1ՀcQ>й%d0 3di K6CjrW;eߖҶpyUDNr#q"I$TހZBx& y. PPWey/V^08dLR[*1.X\5QAcdmgNI-ʋq&͛,f͵ O*< {2e5\Сn[ʁ-`Gp)&|߄-it?4]L|m^,M6 :.i,{aT8>KQs5ViioT! D0fCP?6tȭF wˌΩꘋo (>lr~ʼn;c6E>S/q"5)S%mྜ5f 2?HZ. Q9Uܺk)tʒ෋*:aY7֥V{Ƞ//騫F*lΪf]E6鈬o:NՅ_DLF.`p]jާܗ-7ۣ)TE>)7͂UP;!w#XJTDML&Eq1a`IjJKy |Daf(! i1o0&j[!ZmJ"wm6 `!ܟSUK:N\ kY@lcqʋO6ÅK]Ў s~XPN{TdkYoR4q<26J+4սY Ɲv[ g # 2JX+}uUk$)8r+)% [S^fRzjjC#<؟X*eM0`TtҢ"͕ؖ]NmPp*5j0,6פlY 䰹pS;MI8:d^%s9#NH/8ho=^!]jD8`]p8#2tQ "a>hSiHvK hIKNYiem.ȍH]f|nґӶ.&GzY87"36&} wkVXJ0tTG)l͢;T bV3)fevRc+h"v.9.[cQs`4XêeX=]JNl. Ujc5҃~zO u_'__}W'%:?}_7O>g~?_K_?~˗oӟ^z_h__?{?_r~>_~'~뗿Ͽ?/ⷿO}O>~go_?,7}lw|?ǟO/_~?^?/W~y?߿wݗ_~W>_ׯ/nO>󟿼o?~_Xe;w/?o_6o{~}|/Y㇏~__ꋿ?~m?_ ?_~1c?Ws߼|Ï_m1|/a~xw~{_/q¾k~1>Q_%CV?ͻ=@o?onƟ{ۏח?DC_s?w} O4_3׷;;>~տKp~/o߽~7?˷s}|6/߸V_#v[Wnˏ_yR_}[ !rz:/_ _^~rR{^ />#G|PgW7w߿勿o~z/~wz勯O懗w𣗼G/~G/+ |_%1~^ў}O0YVz߽~ݫR'`cڮ Rli^y8RۜMmw+C1n(ˢ%߱Rw)NgN[x$"AH[!%X~«#?Y8RNCv;%x(cs= T|;m=*/$Tnjv,SosPuLI*qXk,k(KHg5_6wYFjoJ0Q&qszć-mJڹ >oFc1B-I7ݻfΟGމ:dzIUYOPwPfٜicl·udtr #ltoHM"9k=YyC석,ݕWPm9qc}Y;of)DÓgg|j8% 7CtIؘjBt"qL=E|n2MeZIcq2m*oUG;FqΠ-V6@SDЏ[g#r>MAΫwq|>z|UXs+ɹK6RP~v:]aGvs:b9fMutE&S$,U1m'u!쟑nE1-ۭrNX)H[S]v⺄_lSv0'XSMFGU1p4RVXu}dp9mv UWl~MR8#SV#reNoϮlʶHM^) v[QQbǺnEb)Ofo?"`HWvt-6G"c/F&3ҾL4YdZ _(FN6`rIVNEM<j>.3Ӷ0|ZE: :w%5Oʉ!5BaZ9$%ZFvc>?AZU^_q vĹ6ij5iw|3M #I[y" $|nSln_e{R[='e nΥخZ'7[9S,QP*44y=PX^ vz0rr 437~.Ui׹s(5 įvb]~#I!?2l ѮSAMz=%K!x7usޱtu#Gp;u]GKKݕ4x)òE,4+EakRQNw?"ߍd2V<6,a 8ӵyr}r=6{. HqydV ;5nK0W(ĕY*.ᨋ orQ=@G[Hpp\N Lu&6r.t`ę%J;^*cַKMK%Y봮\w差vMƵ `{tER%݊5q:T͎jKwFC!M)~˪p#rc*&YQYZRibKq_\JSn3**鴪OV~ sX\NXgNFh,Gl lԽMQrfncۻp|`+~\|I&PGWV]zYɦJui$3VdTrĩ$Eg_=_g% kv>1^V9aRtݦ*>Rs݀dO,ѢXԇvgq͌AͲ;4 U9pRo̡m<_N+-vY9gG+6G'pgŕrwI⴩IŒl~^]5˽倲J-Z[jao'gH b/<`T`^[c EOqAvv?Y K;.L%,mPRSj'abtnBֽM"u'ua GU_pMn?gPZ<@$3q*mӬ$kVT3򦂯*x+!Mz̲YZ@8NCdӕUfS}֟8|+(`uꚛ5KB43 )n !t&:cÁ)BVv㧣iЀ 10QQ{UqnO Q۾PmV 5 pHa攇TrL#@v)mGlؗf {.$fٓ.r@H蓽%* Jpxoa~ %4:DXmދ5&zte6(JJ|v8e 1>?Utt]k ?<~ns A=LГ1i;e@L?(߲z]T1Ku/K%ʄ߰wٽ8r'lrbp>J+ mJ]M# rj:b`,%J}nW58gnQʋ`J ) Ro@g@`i"BN[hP\]|Y[VY>9|\Qk 7RFCob- n*r#ీSJ=᨟Gq.!{`ĖSK7.'DxJb 9F1#֟7ٶNi 4dH#1V8ԧJ1 c 'f,o)XGVUBn3%|=w, ~> ؊tGS ѣXwI_t-a}7ʳP%R5[H NPHhJm5k1|{29kF:\fN֚s%lO٤N羘Oyϸia?vW;Ap(iU-p "3g+ULD \j`*b_.Ʈxem92󲃰vZeIsM:k>l O(G!|,rih$6Vje|N!w>N>+76"˔rREpK_n=rF&)M oc|]KMA.CUHifJ #%L+ QN REJyJ4%2NGN5P~SERk]RC5dl8aO;tPFY)vȲ]~r8[!ohx/\b%|YZB\8hVsGY'w)]"  NrI-ah.pyKgHEP2rgAd-ꮁdv\cԖ7H7Yۄ)LUk_c A#L5K/l8qMljn'/nk o)KI)Xf[߯ݒ2?X7q~$?)0$+z@*Ұ'v}%n#9ANm R_%j!;LI0ֶ N_ ݷ,fQ$vf;U6$UX55/%~17XymGR w אQa?N&O=e`c9yJ 5w"콦x$'%9aDt"ci=KT[4/2^W(G$hVjZL /ՠ KieUXEӺ|l}P,~w:zqoUkƺ`%M_8id<*ڕJv+Y\2 Ҏʩ($ԉKZ5mlӸWYS[3hUR 8gq,W D2. {?&wl%$ㅔϠ1F$r 7;L{&^HbF!˛q.2U*4Y`=d+*ɛ Uaƶmr5^s-~J%Q<9EwJiIO(4[^\b|lxLW>EN̔Ȗۜ/o̕8˒Cw!8GJ}L_dgyA7oty@Ǎ)a hu>} wI8uF``MZBBь ,A.ϊ/=CAc"HhA,BǬcW{8yfcq Ԉ < AWv13_x+E>dr:FK9q* tu\v'uW;JpΡq<2mgT0<ՎArn)*)uQS*S*΢S`D~-f;t-f~B=`_UP(K7,?*~8$qyse؃Z[:eI;o 99fUq; ˅v9#}Z}t&s Ё Fu^mH(+FT dߺ0 ATMc,$dw=@Җ f[_ܻM#}pDrjb ġwe 5f}S]{qznu`%S`K:Id,'pON7Vb-T%oť a9&W9sI!=Sm@q*J*@bTʺN]!JJc/.ףeي'g倸 ʀcnAC wC)p <(LNTxpnoYn,F:e^RC0,$z}9rISu/ !+]<{j ƻl$Oצ|>4Mj)w$FYnR9$ɩQB QyMɬX M:n8gS9ȝek[f3"+β%Kdβ2W8ʕM@x o{H2"NҸ^wK0μJV$$'СauXܟgI)`_Rj]'<5'ND%.TyV'deTn-JXbq$/}-ޒzp_p&*>8nû]4iB<6}`o%c3tlAnwg.4+pg(|Sz%Ka!KJ^osIDD[\C@m:b 9lt*I]j#HU$R˩T̽fw dz,mϏ45ɇev 5,\(/'#wÍ_ҀTBQ-.ɩ|!W+d:hFk+75$oD8d->9_i%frA,CZwļ,bniIfX۹= *N(1XSBVvx*]L ]KEh-c"ʒ!<[3=ʖBļYpcT4ks`O Ϋ)"w֔ߎ(RU#hdlnJJh^B Ǧï ۬yHr63.;Sc]\E5\$E O,Eg e){NjTrǩ\x=wTY|8\pszV#c*u͂E ab͙Q+ѻh7uv҂EwX wˉ'2<bVN)*j(U tl# \#%n'h2c[-IC ⁽M`(e2#gq*1ff; ޙ& 2 :$ؒ[,Ye$Wre5l; >ۣUO$>XmR$ShɁ78y$'byl8Ùz(--f'Tud L8"v RUT5˙bs9wsUHI*>Ƴ8&(j~gleNQMvSԎgD@/"xQ ZgX5EU9ŇM)YrfӒR. CvF{3K3Cza@믘K4FncҐQg@!}s?ln} MD KwV5H'<-TDeT8No ۺrʁ\i3u_mAuMOvڞ0QvpQ۹ J)Ca0tMvioD sX$G3f Șt -_>;6ٚfYD,>ָ2E0|Tx*;ZYM68lSzG6T͟i00j[thlqFڷ;6靹lo89#R0 <Ԑ}3,hNzmm A䢂/\sĢ6l 4TpZRANajXVe;x x|B^r,c MU IuPd5+TԊ&îˇPƲqRʭz4{6ՓdUCzeei] $$NH(^%5In<{SKBdhL.)q1Q˴%yqMO}IRhejFbå <~ *co2gPNqƹD|z$z7ی ^=g{1~VloUiQT]Z$@N naךq؆erKIv=-`we*ŸswWqm7= ljq%ھo!(|8_cDd* jZ)99ػxs.y2v]FnsU3\16u"˽c4Z)3uzlx[/ە궈`O),pʾ[!v!Q6%W 輇LBp:gNuY+N!A۹ dĩ;XSK"yЗMrdu#c>~\(hu5f\2 QaٲrEcLB-O˝jSʮ).sZ\arMz|1 f_>22`NgJ7@ Wbk"Vkr`[)fqXG1DZl3 Nz}3+H..RV<圖ئ ]uK@7'߈AK:m+&cAy@ ve լV~z{\ X[Y˴8w*E!qNEB 4UTpDN5Cb,ubMN;Vfgj{7XT/) ~[W7_$w|t=ôst AN({SфxVg7l^N|1[ҎUA @ *}7U`'"2MidQVȢ\|r<ؾɃxcv[L;5k%Ru6L˟j{zrn`QG{'nU^8_s*-fhʞu@1Gf8Zx\D% oJu.QM%0R\@ O1i\8bq1ZvN78z</Ώk)U#Cì8ㄬ[#xg~^o* qʵvԺ&@< p B@), @H^SF>]x='ZrD%ϥZN:Op{K6 .Sn\pbm;+:4RHǫJ.0Nr { &sKP8D⦪%wr-͔`H#)K:JfrLP֝mrSI{FYlWK9Qn @⽸nf@ee08}zNsPAȌof7lDnێ1奒JKh*Q.Vm=nކzRzrj_4JFtH]݅+7EL wk4Ӫ`a6̎:U6N2RWuQ|Rp`o;oݛ&ss hަi]IrǙ=3!w:pE=^jy%JN6xmLgT;);#:w;O?d 2"sLqA2uѹf*h5Gxt0Khzv뾦#K'qcwBؖo ja 4;[ul J5쯘bs? ,1IcEvը vL 1(΢XF ]2T: ˻#|p1;1j `$ùVo]ߚܝMCbXijC X4atL2DqO%=Ǵ*߶aOlvI#aoȴO!Y@wuX?tcrc^ڴ ^`e ) K) :r'q0q[FX KpNfl8#S۷S~և,}uO4q :sPHu8˭"`A1s&-;qT2I%KRh(0@v:If jڣ)x8"%Y+m80  L'cN6xJdp[{RVɲʼ'WL0߹VFktu6N"f)w4<RYLJv%ΐc7*8|bP ~\ j?L^[8ӇwL}-{Q \9TNAV$*d>yVX0%wʓs3cG e?Q(boڶS#[V/mX. bTTH^xx*f)x;v(]80-(0f#g W-UԇItƉ)k>yϑ.w Km8C6'hW1ܖM5[AnVUx)wpt.y $RD]6kBt2nb iZ|R2 %:9R86'Lސ-qD].0c(9A֪՗ԝB&n5s\ŭ2I)I!FqD1{, jw} 21sߪ\r3WsJ9y7qt:(z ;Ǵ@48+I"HbĽt[&Dwc&Vef7&Q$́k)G^ZhI-*K(G;ǭ9pLR߷!"k<;md3zJK_twq9cS!,x&ˍc-+N̳Lyk\};,'_Zrsf RH=`jlWS+Qv#=hl6|8e2lc#N܊F٬t8 >F-wEIKef^e:ՙE@22^Gז&lW5.'0?9wYsot~/s\GP7@-i,-n{[ , 3eiƌxK ZvFd-4%=:P`oorEUV즼3  uuۓgpBz"|ۗSnqJL^}e>E^ U>Qm]OrF[Xl:WPn3%f== {hM" 8asR0q s4dE+0^Cl"æ$aY֗OBY/Bs)Qvz0#:vR}bYWf,Zlh"G%&[8Rgc?!0 ēholEyr-6:YED i0R֏[:eѶ"w*gB/KϚ"qÈ]f8`BJHQKѷY.$%w> Ʊ^P¯+"ise|rVEf{ &)ÄrVK\'9R/eRh.SҨ [}qar21Va-60܊dqڰx|SS>m l+݂qGQӐWYYvnL\'q VX8v6>ۡ,o=&^׭jX8z g8K2kK]bMSPg?vˮ +8mcp`䃛O,17_SFqm߃͑Zc f8Қp4N @_V)xg[ y+ӍN``~,m݌s0õT\437R6|9, 8[?7NQr-3;8` MV yTy;k$XEqЮ$f6؋3IeŹ;b-0͋o2bV򾁒u=v\^0apf3f 5A<# P܂c#syy!BJXsn݈'5>(˳({7@;$nn}RM7J5Қ`vK,9xKcGU<82 <w!9 r;-{?~:-c5ݯqkR#{='A-Orӗ|}8JK޾9ؽVL,r)A*++gɽc9 N 崹ّʾ?>8P۴ZwLYl혺ĕ@̧\C--p겲Gd.0pLD,BhTS =R6dtc!ٷck~g }7$4eۉ A;#:K}[v0mS} breD,՜fk(.)j=tGLULi$$$0]i`i=&V/h҇!]n!h4b\bMΫs/:84٣Ci#"0HŶ4SY^j - Ⱦȗ,юu&+"aΉ\"[˲>;6%ͥgFDA~l𻰙AcK|x L7֛h`{r1ﴘ'K0-T,0;2t6~=%1%X[J߶'ܧUJhXrIN( "4ZFt MehAUمrA=cLUbr d I3\}[TR8Y $; /D1NMq[r-'S~G[q$^'nHǞۈ.r0 {Oa8N@pm%-jEط"]2]Kek^_Svt1=ѹz ǔYJ*1Y9{ OI@WXj;^.>HztեI-9$Neʘf'M|8bT\SGI|^rw%+.SҘ1Ԑp'',5]L;{2g'a Gn,Q.V"qw&K QU?vX4uT<8wIis;=]  O.oU~Ԧ/vGU[3QlM0ro Ah9ap'0w}7@4T".$[sUZJGD Km)> Zc 1S.B ^&8. [rN$9vH:=YU&'"52sM(%t-5cFB$r? 2`a^僲@/^QF l=Yoei{^]έ݃:% W ؍N]pL&0~M=LJM?d2$)"W*nE46ԗ  9FxMyq0GE*Wr 5 X?|T8FnʇVK[K}cpB'O=mjo]d9I*%(si,*V)F1}яas8Wu$rY.cAC\dHe,2ˇtMi}ˋVav~.;aKl#tvۆy,4oۦ(C.{,'@U0%2{) ~\GbAH{BDoZA_>!iួ&r | 8{0{,t7nEmo`aJ4^ $%gnJbZϽpS,A" 0Mb<;Iq"=9דE* {.tGRRv9˷xGZ$6y+F` v\9N=<{S0,&8kQq_on$9)19ۈK׾u\$@`$hݱÕ?.N4HtWWee>OEڡuN~Y ^o.9ᙃ 4'SrJZ?Qtˣ4=5;!ȶf$!jBcAˇbd%0kȳ-ۂ=(ITg A[E[*z<ș5w5B++vA#)%i3dF": Rvꝸ4 iVlji!ӡNޛLPO e.5$n҃e$'tNV]jͰai9Ț+ d>VX:kN1f^O}' -!S"kR*:)[{Ij BX[XC@h5䭤DF %K,\:FإJ-:к= ƪlsJCCKCz3"$ xZ"CR3@JAZ)>tb >ԥEfIXM; mBq&pGo&ӎ^j^R$6E$#3_חUKJ۞D&RP ^A6=)u ENK1;Tb6 8R.3i4>7^BI~͞{Xx} GOS;ܾa)&ꊠo# h%xesG~ <fi.ƴJFZ? /&eJ=-qy{Y4y”$i&B$F{2tL)]INu^dF-\K:1=:a>.X"ڛZo:/I# ÙekO]ioh^C54-h"iO[t9kYL6@CHa!hC%lh~9ӥDA= ,mJrM(r(B   Iޖɴͪ.2ZB&S0JN1}ui,V~ seU%ɂYpqex#h<Q~ʙ!"RGV  х&nej5ҞµĢ'SI#|aDP"lGtO45b@-qv"= CYG7*Z2ZIK g(hQ p}YW0Sfs9/4dkDẅ́;.z”Gw&J(!*zZ)!"(`) ! sT*]ȽΩ&ŒGPK:7wl"9`竀!t!5\S]6=udI3ZGsJ )4t5υh`jRLzBY.m,mOHu9QMkD^C 8^˭& dÝfINJeJ IVLN, IaP#IE ԵQ.کm-C9d^2ص%r < Ӥ4ȳ\U 5{S=r:Kq:hqVʆKWTd Ԅ*:z'IQ< @%AQVJFDPJ)о|6eDs:Ɍ`zђ@O25&t)ϩ%A"KAnY 6ro%@4[)PC2K\rkB,8##8I@>Q-' HgJSAyV3^YB[Zb9#I)Ji:KN[Q&M2ok& $k+I夗 $@G_zHWVRiS ^%g&9P4.K$0e`e[CN4mۙ֜TwPB*QlGNtiBYD4^Lr 8ABpFN<)6ĥ>ʠ$$68=DjCIiKҕ2`/,VPJkRΈ3kwB)i54!%1 „- òQՓ2ۂD"ْ՘6E%X`\ E5ZQwQل8JbY 2wFC N1zVn? 9]oڡ !Zƭ|AWRxa)M<]^slKH7jbW@ _45Ey5V#:]azqPJű&jF790V\uHj a4-z*9zCx)KU`xx2$HҼvMe7ڤ:O o-+;8 c:,Bk!49f EmC+l*:)AN(kE3-/6k~KRvڙ6. ,r x0[ o &GZP, 95IdtEae"%otUxE@Z1&c̼eR40,3hdf$)BoY$.xRBj2hvhK-9NAX-;")4/eIr@ gPBA$9ОfIKrdj+hUCBtP/4r4c%ZZ{JAs"PC|ڶO5IS)#zj .9p/5צp(.xZlj2 }w?9u dLrL*`\!&ac |^y2r[jMɊHLa͒l yf+9;S0m6(볒sdC\2_9iu"mN%ɔzd#eKRR5ˊ:(e,#p'8EJZ~. `y =@i.%ϑo/ udԉ nZěm :rkSeסA2r`jdVh5V ʤXqtOyR5R ua+hRy {uc-jJڶ%9{u} w R0oKZg«5M L%Y%#IH!Vq<~ _I@U7 ffMUUu)xRJA8.vuTSdbL*m%IRȷ4+vmЋ!)#][JwӇb |sZ1I2‘ǒ2]Jh<#ҖgB2+1ATRβĝ44=H#J˓ RhI+h@+EO|2=yG/]z)=Ѕzh!r=+cK44t`H<[(R™q?NXS}kK2&ySve58fiM2T"gLM5m9,$ P //4CP6 Z̓ ˑ$ 2)xtu=эI$%{s1N Z 9Mti4EL#^+\Br{ɍDΡ . n3r!;d#"4g )E ^kxs4ZXᯬFx)2 `T, gB?=ˣXMh@YW լ|QD=ēUȦpFx8Ej!Yi.VLZTӠخ% AuAA+$rt\C_Ru⚣+(gdpЇ aEN=.u1؍$ϊf ^[rjȄu%Wjxڰ޲bRDZp ƛ./9`NGp4A+)HtH>fIC U%!S#KcCn[^!X^"J6w6r-j)G++& hzii!bh$>vLhSX]V$%"9ɨ7}BBV)AEq4kˌO H}jV|:*6B(|S6yUB9+B[p+&+Eq#*o^axa+!ht==J!f9Uk"uC(U|ų7W+YkΕ,uyo# Er-tSۖ\ o ٴP/HV9L\$R8afi!Dž5Lnfh,Y Qϙ0~Q tGD wu14JWzbNOt(. ecz@MŐ;S2{ߪV8 9${+QGX|vlgP$Yʮ+<,r佒kPr8="QhYl]kSS@)gR\jWA1$rR^|Ai9r7ꎵuM ]iqrR.XTMR9mD(%(5RCxʩ'uPk4{WJZYO-ϵ>Am+EmZ ;kVB1ɈAEEr>8zb7d ) z2%7NK>x=K׸kF3p⵿")SP9|]sj|@j,H fPF1ں Ju(ϊ,[v==Yj0]^\O9P6NODeAEĂU#@c]Mit֎ԓkM4\$Ѓ IKRR"zF̅/WB5/^zi%]MM@AiƑs" ~C+i=# ;ʥjLʥ"^"2-L}(0i$] .B Rk.URt{/(3xMhWOSKZgrHɓ?^  h}lKB{yNZbp#'٫ΡH#8 /i2'1)Șa15gݡ5-ztp+=wƻ2 4TtI2 Y }1iTJ2WEDT JrxmO-TI֓ĸf itHW䰚֪`rWS,͖T&LԢpMs/SEyI4hj^eK*5It2UHTE'LPl$SKK|Th*H+(M:@Ji DRz$Vj MJ/k28S4~bYbظsjTX`tsEh_%J E# y1!t ))$̤o[j%Y 1yi&ׄZ۶dcCcА6FPJT7"p0A#!$8ٳԾ+"'\甪UC <.K`]]$I\jpz) -yn.LO-St|Î:Z4p+")z,DRԵt>%[Y.EZ:! gH<ޤ<ZotH;4{GO%PKaSIwSGu젋I:#h$rBzAڍTV(UAwe7kSgܐ+2.z_Sw|2Yx#rB,wv{\ܜ_}̣?7b|.3_|k̒wi9 黤edd|>+? z' q\<ۭt ]$}|ݽelbgz!Mgi1YMO/5ܻ\QkAN/]gw뙆Z\qy?;].uGp>߹Cۥjٟw÷y \@Spwx_ \1r+.{cU_ 8 ^$'+ӊ/5d&|4|济%?Y|K +_u^)2 5]2;@D2D%Jw!n>S1]*4ڤxKdaW&>U1+ܬ" D#cE6~u 0%,$w.R>usD9Isٰq%A5AwӮ2WDMnbht- Vipf.Uչ`P:o{g.$`4zLؗvjn{[>;{U٬L͞~OE; ՟mVzo<O0::>LLr*q+v)g8rq\/ԈKdl>aswߞ=̥#/ξnsozՏl{5_%8d'..f͝>oOdy]6l1>6c{7zՏ`O=hkuwI_J췏˥~ݫ|f9]} Wǩ>1x67S)O&Px&pǍp|ôRq9ۛ1HϽ^<hu{Wיx<~K]|s̷gsX̷s{R7dwu\,>hfa$g_߅]\]qiVc:؝ê xĊ|8`LLw>!'+innL'CMvwutqtHOGa,TGS҅zP%j&̀o;x5=!~ᆵqӬB?n\觶7$NӄcVnlWY(a{cp{KdjjJΘF7pSyf,H(Emel 7IB_&,ۜ~q{23L \z͏{61M^xSA ScZKgQb-WnٞB>Mi7Xx̖ckiGw~kN.P}nH j{sFicKB%4޳!io,f>,d @* 57%%f&ǁjy>NDs3> fɈ6a?.XZģ#Scqj`'Äb^uf݆Yi0~x;8jɘwߕu1k=hv3K>km%c4wɄGlH[UYm痓W.s]l5|qsT Oqmhrhћ'faW1Bg`86тޠ=ml5n92D~2m5ݶ BOqE.o {beGNF~,K=qى+S7_`lϏkrvc3xI_ndjq}nq+"c7citFh3(Loh=A`  *U0l;nD6;_FgngǻMP/3ƚk-Q&1 nF_}e)4xʫ16պv.XWIgk}LYq 1>*A-AgldP茄($vwsn+Pn~ 6W׿ZWv{i[ KjConފr{ `yx&] Գx+d6= %fzT{n7/L*jv{l7&t2fIrOՈߏyyn^7X=)v#M|>P$%u(I'H΢'Oc 'т`+\eC^H_i8ׇ^ _A盧]= W6ISzܝ~"4ZNfs@@*&?7a m- 8Y#l"zpG [Lb4 1$.I4fg7`+(ӗg|ŒLx8I [t}| ĺߙF.1>!6J/et\뗗$:1f|v_=q$8!r7B1b?a4 R p]a&8JtС+ØSs F%k| Z7&Mpu9 !"{J?}`hZv #Ax}i~ ݏag<")_1uZCNbe5ފh_@?s}x4Ϟc|'V p8*'i>NEGiF/>0`nsa_EB|NԜû:! Mž:m 8DxJ Cxo؞% =Jߴ gRQw梄  e^?ʌm?k{MJeI?tJxyն!@c>Z!X3'#`6I~2-ٜI~͋%8EMg !\w]^J:8s_,`|`stJpo S>}sG;3 ,Pc %4Qb*dEP^vp:h"f2$seqydaaS-i9ŽDh/p$n4aXjǗQJPDB*:U0Tո+gI㈔K 22 a{{aew\#0S~vv2Ě9jLA|DZF`w<u+.U=n]87/u75]:]Ѿ Ls4?!f'[owncK7Rd?ۍBt#>8;?+ w p _-+ ݍWvy|r/0+m_w鹬㊗W+]'_ucZ.ϖug|H>i6>"d0,mYTQ7Lގt<պ:xQI;]+Tr ,>}}.qIjn^SU)EN%|f̞XvM4C( !=hhWv)oE{X4_hB(#BA'N AF U_*^F)Q&x2S`bKYB6M1uB#맳`a<A7ciyjg@(b3Xa_mXx6Ӵ'K<@W@,WӘ֟):/MN1]. ^Voc.l#)nbKdRa?xSOtަ{}y-}:;TZ \-CL~uv2Tsx&s&xa GJ_cWIUHAWY'YZPil4q9`gBc &z%˧n !Sbz%a-9 өl+xEB.]x/-!{%]Z/G:lNۃN- QBۜ. &gLiU%=>oPXj\,N[㴣$s(/Eݛ@>wu),JHLJRA$ .6w얼܅(īps.LNa*z:&#>Y,|H( hLRi-WxDgQIcĊ$/˳PM8y:Iy 6`ga1ޖ>P+4Z> Build the executable and install it into the specified directory. `headache` is available through OPAM (available at http://opam.ocaml.org/), the OCaml Package Manager. This is the preferred installation method. Be sure to install opam v1.2 or higher. Then the following sequence of commands should install the package: << opam init opam install depext opam depext headache opam install headache >> 3 Usage *=*=*=* Let us illustrate the use of this tool with a small example. Assume you have a small project mixing C and Caml code consisting in three files `foo.c`, `bar.ml` and `bar.mli`, and you want to equip them with some header. First of all, write a header file, i.e. a plain text file including the information headers must mention. An example of such a file is given in figure 1. In the following, we assume this file is named `myheader` and is in the same directory as source files. Then, in order to generate headers, just run the command: << headache -h myheader foo.c bar.ml bar.mli >> Each file is equipped with a header including the text given in the header file `myheader`, surrounded by some extra characters depending on its format making it a comment (e.g. `(*` and `*)` in `.ml` files). If you update informations in the header file `myheader`, you simply need to re-run the above command to update headers in source code files: existing ones are automatically removed. Similarly, running: << headache -r foo.c bar.ml bar.mli >> removes any existing in files `foo.c`, `bar.ml` and `bar.mli`. Files which do not have a header are kept unchanged. The current headers of files can be extracted: << headache -e foo.c bar.ml bar.mli >> prints on the standard output the current headers of the files `foo.c`, `bar.ml` and `bar.mli`. All files are kept unchanged. -------------------------------------------------------------------- << Headache Automatic generation of files headers Vincent Simonet, Projet Cristal, INRIA Rocquencourt Copyright 2002 Institut National de Recherche en Informatique et en Automatique. All rights reserved. This file is distributed under the terms of the GNU Library General Public License. Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ >> Figure 1: An example of header file -------------------------------------------------------------------- 4 Configuration file *=*=*=*=*=*=*=*=*=*= File types and format of header may be specified by a configuration file. By default, the default builtin configuration file given in figure 2 is used. You can also use your own configuration file thanks to the `-c` option: << headache -c myconfig -h myheader foo.c bar.ml bar.mli >> In order to write your own configuration, you can follow the example given in figure 2. A configuration file consists in a list of entries separated by the character `|`. Each of them is made of two parts separated by an `->`: - The first one is a regular expression. Regular expression are enclosed within double quotes and have the same syntax as in Gnu Emacs. `headache` determines file types according to file basenames; thus, each file is dealt with using the first line its name matches. - The second one describes the format of headers for files of this type. It consists of the name of a model (e.g. `frame`), possibly followed by a list of arguments. Arguments are named: `open:"(*"` means that the value of the argument `open` is `(*`. `headache` currently supports three models: - `frame`. With this model, headers are generated in a frame. This model requires three arguments: `open` and `close` (the opening and closing sequences for comments) and `line` (the character used to make the horizontal lines of the frame). Two optional arguments may be used: `margin` (a string printed between the left and right side of the frame and the border, by default two spaces) and `width` (the width of the inside of the frame, default is 68). - `lines`. Headers are typeset between two lines. Three arguments must be provided: `open` and `close` (the opening and closing sequences for comments), `line` (the character used to make the horizontal lines). Three optional arguments are allowed: `begin` (a string typeset at the beginning of each line, by default two spaces), `last` (a string typeset at the beginning of the last line) and `width` (the width of the lines, default is 70). - `no`. This model generates no header and has no argument. It is possible to change the default builtin configuration file at compile time. For this, just edit the file `config_builtin.txt` present in the source distribution before building the software. -------------------------------------------------------------------- << # Objective Caml source ".*\\.ml[il]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.fml[i]?" -> frame open:"(*" line:"*" close:"*)" | ".*\\.mly" -> frame open:"/*" line:"*" close:"*/" # C source | ".*\\.[chy]" -> frame open:"/*" line:"*" close:"*/" # Latex | ".*\\.tex" -> frame open:"%" line:"%" close:"%" # Misc | ".*Makefile.*" -> frame open:"#" line:"#" close:"#" | ".*README.*" -> frame open:"*" line:"*" close:"*" | ".*LICENSE.*" -> frame open:"*" line:"*" close:"*" >> Figure 2: The default builtin configuration file -------------------------------------------------------------------- It is also possible to add entries into your own configuration file that specify when the initial lines of the processed file have to be skipped. As previously, these entries are separated by the character `|` and each of them is made of two parts separated by an `->`: - Again, the first part is a regular expression used by `headache` to determine the file type. But here, it is according to its full filename (including the pathname). - The second part specifies when the initial lines must be skipped. It consists of the keyword `skip` followed by one of the named arguments `multiline_match:` or `match:`, then a regular expression. As long as the lines match a `multiline_match` parameter, `headache` skips them and checks the next line. If the current line matches only a `match` parameter, `headache` skips the current line and breaks the iteration there (of course, if nothing matches, `headache` puts the header before the current line). -------------------------------------------------------------------- <<# Script file | ".*\\.sh" -> frame open:"#" line:"#" close:"#" | ".*\\.sh" -> skip match:"#!.*" >> Figure 3: Example of a configuration file for skipping the shebang line of shell scripts -------------------------------------------------------------------- Figure 3 shows an example of configuration file that can used to skip the shebang line of shell scripts: when the first line of `.sh` files starts with `#!`, `headache` does not modify that line and considers that the header must start at the second line. -------------------------------------------------------------------- <<# SWI Prolog file | ".*\\.pl" -> frame open:"%" line:"%" close:"%" | ".*\\.pl" -> skip multiline_match:"#!.*" multiline_match:":-.*" >> Figure 4: Example of a configuration file for skipping the shebang line, as well as lines containing Prolog directives, such as Unicode usage. -------------------------------------------------------------------- Figure 4 shows an example of configuration file that can used for `SWI prolog` files: for a `.pl` file starting with the following three first lines, `headache` considers that the header must start just after the first two lines: << #!/usr/bin/env swipl :- encoding(utf8). % remainder of the file, that can be after the header >> ----------------------------------------------------------------------- This document was translated from LaTeX by HeVeA (4). ----------------------------------- (1) manual.txt (2) manual.ps.gz (3) manual.pdf (4) http://hevea.inria.fr/index.html headache-1.07/dune000066400000000000000000000011501444757364400140600ustar00rootroot00000000000000(library (name headache) (modules Model Config_lex Config_parse Config Info Skip) (libraries camomile str) ) (ocamllex config_lex) (ocamlyacc config_parse) (executable (name mkconfig) (modules Mkconfig) (libraries headache) ) (rule (targets config_builtin.ml) (deps mkconfig.exe config_builtin.txt) (action (run ./mkconfig.exe)) ) (executable (name headache_tool) (public_name headache) (modules Headache_tool Config_builtin) (libraries headache unix) ) (install (section doc) (files "doc/manual.pdf" "doc/manual.html" "doc/manual.txt") ) headache-1.07/dune-project000066400000000000000000000000201444757364400155170ustar00rootroot00000000000000(lang dune 3.4) headache-1.07/example000066400000000000000000000005471444757364400145710ustar00rootroot00000000000000 Headache Vincent Simonet, Projet Cristal, INRIA Rocquencourt Copyright 2002 Institut National de Recherche en Informatique et en Automatique. All rights reserved. This file is distributed under the terms of the GNU Library General Public License. Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ headache-1.07/headache.opam000066400000000000000000000014121444757364400156030ustar00rootroot00000000000000opam-version: "2.0" name: "headache" version: "1.07" license: "LGPL-2.0-only" synopsis: "Automatic generation of files headers" description: """ Lightweight tool for managing headers in source code files. It can update in any source code files (OCaml, C, XML et al). """ authors: [ "Vincent Simonet" # contributors "Patrick Baudin" "Mehdi Dogguy" "André Maroneze" "François Pottier" "Virgile Prevosto" "Ralf Treinen" ] maintainer: "frama-ci-bot@frama-c.com" homepage: "https://github.com/Frama-C/headache/" bug-reports: "https://github.com/Frama-C/headache/issues" dev-repo: "git+https://github.com/Frama-C/headache.git" depends: [ "ocaml" {>= "4.02"} "camomile" {>= "2.0.0"} "dune" {>= "3.4"} ] build: [ [ "dune" "build" "-p" name "-j" jobs ] ] headache-1.07/headache_tool.ml000066400000000000000000000161521444757364400163230ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) open Printf open Config_builtin open Headache (***************************************************************************) (** {2 Command-line options} *) let verbose = ref false (***************************************************************************) (** {2 Configuration files} *) let generators : (Str.regexp * Model.generator) list ref = ref [] let skips : (Str.regexp * Skip.param_skip) list ref = ref [] let read_configfile filename = let ic = open_in filename in let lexbuf = Lexing.from_channel ic in try let (config_generators, config_skips) = (Config_parse.configfile Config_lex.token lexbuf) in skips := config_skips @ !skips; generators := config_generators @ !generators; close_in ic with Config.Error (msg, loc1, loc2) -> eprintf "%s: Configuration file %s, error at characters %d-%d:\n%s\n" Sys.argv.(0) filename loc1 loc2 msg; exit 2 | Parsing.Parse_error -> eprintf "%s: Configuration file %s, syntax error at characters %d-%d:\n" Sys.argv.(0) filename (Lexing.lexeme_start lexbuf) (Lexing.lexeme_end lexbuf) let find_generator filename = let basename = Filename.basename filename in try let _, generator = List.find (function regexp, _ -> Str.string_match regexp basename 0 ) (! generators) in generator with Not_found -> eprintf "%s: No generator found for file %s\n" Sys.argv.(0) filename; exit 2 let find_skips filename = List.filter (fun (rg_filename, _) -> Str.string_match rg_filename filename 0) !skips (***************************************************************************) (** {2 Builtin config} *) let _ = try generators := List.map (function regexp, model, parameters -> (Str.regexp (sprintf "^%s$" regexp), (Model.find model) parameters) ) builtin_config with Not_found -> eprintf "%s: Error in builtin configuration\n" Sys.argv.(0); exit 2 (***************************************************************************) (** {2 Header files} *) let read_headerfile filename = let ic = open_in filename in let rec loop () = try let line = input_line ic in line :: loop () with End_of_file -> close_in ic; [] in let header = loop () in let header_width = List.fold_left (fun w line -> max (Model.string_length line) w) 0 header in header, header_width (***************************************************************************) (** {2 Processing files} *) let prng = Random.State.make_self_init ();; let temp_file_name directory prefix suffix = let rnd = (Random.State.bits prng) land 0xFFFFFF in Filename.concat directory (Printf.sprintf "%s%06x%s" prefix rnd suffix) ;; let open_temp_file ?(mode = [Open_text]) directory prefix suffix = let rec try_name counter = if counter >= 1000 then invalid_arg "Filename.open_temp_file: temp dir nonexistent or full"; let name = temp_file_name directory prefix suffix in try (name, open_out_gen (Open_wronly::Open_creat::Open_excl::mode) 0o600 name) with Sys_error _ -> try_name (counter + 1) in try_name 0 let pipe_file f filename = let directory = Filename.dirname filename in let ic = open_in filename in let tempname, oc = open_temp_file directory "header" "tmp" in f ic oc; close_in ic; close_out oc; Unix.chmod tempname (Unix.stat filename).Unix.st_perm; Sys.remove filename; Sys.rename tempname filename let rd_pipe_file f filename = let ic = open_in filename in f ic; close_in ic let copy ic oc = let len = 256 in let buf = Bytes.create len in let rec loop () = let i = input ic buf 0 len in if i > 0 then begin output oc buf 0 i; loop () end in loop () let create_header header header_width filename = let generator = find_generator filename in let skip_lst = find_skips filename in pipe_file (fun ic oc -> let () = Skip.skip ~verbose:!verbose skip_lst ic (Some oc) in let line = generator.Model.remove ic in let () = Skip.skip ~verbose:!verbose skip_lst ic (Some oc) in generator.Model.create oc header header_width; output_string oc line; copy ic oc ) filename let remove_header filename = let generator = find_generator filename in let skip_lst = find_skips filename in pipe_file (fun ic oc -> let () = Skip.skip ~verbose:!verbose skip_lst ic (Some oc) in let line = generator.Model.remove ic in let () = Skip.skip ~verbose:!verbose skip_lst ic (Some oc) in output_string oc line; copy ic oc ) filename let extract_header filename = let generator = find_generator filename in let skip_lst = find_skips filename in rd_pipe_file (fun ic -> let () = Skip.skip ~verbose:!verbose skip_lst ic None in generator.Model.extract ic ) filename (***************************************************************************) (** {2 Main loop} *) type action = Create of string list * int | Remove | Extract let main () = let action = ref (Create ([], 0)) in let anonymous filename = match !action with Create (header, header_width) -> create_header header header_width filename | Remove -> remove_header filename | Extract -> extract_header filename in Arg.parse [ "-h", Arg.String (fun s -> let (header, header_width) = (read_headerfile s) in action := Create (header, header_width)), " Create headers with text from the header file"; "-c", Arg.String read_configfile, " Read the given configuration file"; "-r", Arg.Unit (fun () -> action := Remove), " Remove headers in files"; "-e", Arg.Unit (fun () -> action := Extract), " Extract headers from files"; "-v", Arg.Set verbose, " Enable verbose output"; ] anonymous (sprintf "%s, version %s\n\ Usage: %s \n \ Process headers of given files\n\ Optional arguments are:" Info.name Info.version Info.name); () let () = try main () with Sys_error msg -> eprintf "%s: %s\n" Sys.argv.(0) msg headache-1.07/info.ml000066400000000000000000000021421444757364400144710ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) let name = "headache" let version = "1.07" headache-1.07/mkconfig.ml000066400000000000000000000041121444757364400153320ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) open Printf open Headache let file_in = "config_builtin.txt" let file_out = "config_builtin.ml" let main () = let ic = open_in file_in in let lexbuf = Lexing.from_channel ic in let oc = open_out file_out in try fprintf oc "let builtin_config = [\n"; List.iter (function regexp, model, parameters -> fprintf oc "\"%s\", \"%s\", [" (String.escaped regexp) (String.escaped model); List.iter (function name, v -> fprintf oc "\"%s\", \"%s\"; " (String.escaped name) (String.escaped v) ) parameters; fprintf oc "];\n" ) (Config_parse.boot Config_lex.token lexbuf); fprintf oc "]\n"; close_in ic; close_out oc with Config.Error (msg, loc1, loc2) -> eprintf "%s: Configuration file %s, error at characters %d-%d:\n%s\n" Sys.argv.(0) file_in loc1 loc2 msg; exit 2 | Parsing.Parse_error -> eprintf "%s: Configuration file %s, syntax error at characters %d-%d:\n" Sys.argv.(0) file_in (Lexing.lexeme_start lexbuf) (Lexing.lexeme_end lexbuf) let () = main () headache-1.07/model.ml000066400000000000000000000163751444757364400146530ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) open Camomile open Printf exception Error of string let string_length s = try UTF8.validate s; UTF8.length s with UTF8.Malformed_code -> String.length s (***************************************************************************) (** {2 Headers generators} *) type generator = { extract: in_channel -> unit; remove: in_channel -> string; create: out_channel -> string list -> int -> unit; } (***************************************************************************) (** {2 Models} *) type model = (string * string) list -> generator let models : (string, model) Hashtbl.t = Hashtbl.create 3 let add name m = Hashtbl.add models name m let find name = Hashtbl.find models name (***************************************************************************) let arg_string args ?default name = try List.assoc name args with Not_found -> match default with None -> raise (Error (sprintf "parameter %s is missing" name)) | Some s -> s let arg_int args ?default name = try int_of_string (arg_string args ?default name) with Failure _ -> raise (Error (sprintf "parameter %s expects an integer" name)) let arg_char args ?default name = let s = arg_string args ?default name in if string_length s = 1 then s.[0] else raise (Error (sprintf "parameter %s expects a character" name)) let make_frame ~open_comment ~close_comment ~line_char ~margin ~width = let regexp_header = Str.regexp_string (sprintf "%s%s" open_comment (String.make 10 line_char)) in let regexp_blank = Str.regexp "^[ ]*[\r]?$" in let regexp_extra = Str.regexp "[ \r]+$" in let regexp_margin = Str.regexp ("^" ^ margin) in let regexp_open = Str.regexp ("^" ^ (Str.quote open_comment)) in let len_open = String.length open_comment in let len_close = String.length close_comment in let extract ic = try let line = input_line ic in if Str.string_match regexp_header line 0 then begin while let line = input_line ic in let b = not (Str.string_match regexp_blank line 0) in if b && not (Str.string_match regexp_header line 0) then begin let len = String.length line in let s = if (len >= len_open+len_close) && (Str.string_match regexp_open line 0) then String.sub line len_open (len-(len_open+len_close)) else line in let s = Str.replace_first regexp_margin "" s in let s = Str.global_replace regexp_extra "" s in Format.printf "%s@." s end; b do () done; end with End_of_file -> () in let remove ic = try let line = input_line ic in if Str.string_match regexp_header line 0 then begin while not (Str.string_match regexp_blank (input_line ic) 0) do () done; "" end else if Str.string_match regexp_blank line 0 then "" else (line ^ "\n") with End_of_file -> "" in let create oc header header_width = let real_width = max width header_width in let width' = real_width + 2 * String.length margin in let white = String.make width' ' ' in let line = String.make width' line_char in Printf.fprintf oc "%s%s%s\n" open_comment line close_comment; List.iter (function string -> output_string oc open_comment; output_string oc margin; output_string oc string; output_substring oc white 0 (max 0 (real_width - string_length string)); output_string oc margin; output_string oc close_comment; output_char oc '\n' ) header; Printf.fprintf oc "%s%s%s\n\n" open_comment line close_comment in { extract = extract; remove = remove; create = create } let _ = add "frame" begin function args -> make_frame ~open_comment:(arg_string args "open") ~close_comment:(arg_string args "close") ~line_char:(arg_char args "line") ~margin:(arg_string args ~default:" " "margin") ~width:(arg_int args ~default:"68" "width") end let make_lines ~open_comment ~close_comment ~line_char ~begin_line ~begin_last ~width = let regexp_begin = Str.regexp_string (sprintf "%s%s" open_comment (String.make 10 line_char)) in let regexp_end = Str.regexp_string (sprintf "%s%s" (String.make 10 line_char) close_comment) in let end_length = 10 + String.length close_comment in let regexp_blank = Str.regexp "^[ ]*$" in let extract ic = try let line = input_line ic in if Str.string_match regexp_begin line 0 then begin while let s = input_line ic in let b = not (Str.string_match regexp_end s (max 0 (string_length s - end_length))) in if b then Format.printf "%s@." s; b do () done; () end with End_of_file -> () in let remove ic = try let line = input_line ic in if Str.string_match regexp_begin line 0 then begin while let s = input_line ic in not (Str.string_match regexp_end s (max 0 (string_length s - end_length))) do () done; "" end else if Str.string_match regexp_blank line 0 then "" else (line ^ "\n") with End_of_file -> "" in let create oc header header_width = let real_width = max width header_width in Printf.fprintf oc "%s%s\n" open_comment (String.make (max 0 (real_width - String.length open_comment)) line_char); List.iter (function string -> output_string oc begin_line; output_string oc string; output_char oc '\n' ) header; Printf.fprintf oc "%s%s%s\n\n" begin_last (String.make (max 0 (real_width - String.length begin_last - String.length close_comment)) line_char) close_comment; in { extract = extract; remove = remove; create = create } let _ = add "lines" begin function args -> make_lines ~open_comment:(arg_string args "open") ~close_comment:(arg_string args "close") ~line_char:(arg_char args "line") ~begin_line:(arg_string args ~default:" " "begin") ~begin_last:(arg_string args ~default:"" "last") ~width:(arg_int args ~default:"70" "width") end let make_no () = { extract = (fun _ -> ()); remove = (fun _ -> ""); create = (fun _ _ _ -> ()) } let _ = add "no" (function _ -> make_no ()) headache-1.07/skip.ml000066400000000000000000000042651444757364400145140ustar00rootroot00000000000000(**************************************************************************) (* *) (* Headache *) (* *) (* Vincent Simonet, Projet Cristal, INRIA Rocquencourt *) (* *) (* Copyright 2002 *) (* Institut National de Recherche en Informatique et en Automatique. *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Library General Public License. *) (* *) (* Vincent.Simonet@inria.fr http://cristal.inria.fr/~simonet/ *) (* *) (**************************************************************************) type regexp_filename = Str.regexp ;; type regexp_skip = Str.regexp ;; type param_skip = bool * regexp_skip ;; let skip ~verbose skip_lst ic oc = let multiple_skip_lst,simple_skip_lst = List.partition (fun (_,(multiple,_)) -> multiple) skip_lst in let rec skip_aux () = let initial_pos = LargeFile.pos_in ic in try let line = input_line ic in let match_line skip_lst = let (_,(multiple,_)) = List.find (fun (_, (_,rg_skip)) -> Str.string_match rg_skip line 0) skip_lst in multiple in try let multiple = try match_line multiple_skip_lst; with Not_found -> match_line simple_skip_lst; in if verbose then prerr_endline ("Line : "^line^" skipped"); (match oc with | None -> () | Some oc -> output_string oc line; output_string oc "\n"); if multiple then skip_aux () with Not_found -> LargeFile.seek_in ic initial_pos with End_of_file -> () in skip_aux () ;;