units-2.12/0000777000175000017500000000000012607610576012074 5ustar adrianadrianunits-2.12/Makefile.in0000664000175000017500000002217112321651015014124 0ustar adrianadrian# Makefile for units, a program for units conversion # # Copyright (C) 1996, 1997, 1999, 2005, 2006, 2012, 2014 # Free Software Foundation, Inc # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # # This program was written by Adrian Mariano (adrianm@gnu.org) # @MKSFIX@ SHELL = /bin/sh prefix = @prefix@ exec_prefix = @exec_prefix@ srcdir = @srcdir@ CC = @CC@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ MAKEINFO = makeinfo TEXI2DVI = texi2dvi TEXI2PDF = texi2pdf MKDIR_P = @MKDIR_P@ LDFLAGS = @LDFLAGS@ LIBS= @LIBS@ VPATH = @srcdir@ HAVE_PYTHON = @HAVE_PYTHON@ PYTHON = @PYTHON@ datarootdir = @datarootdir@ datadir = @datadir@ bindir = @bindir@ infodir = @infodir@ mandir = @mandir@ transform=@program_transform_name@ DEFS=-DUNITSFILE=\"@UDAT@definitions.units\" -DLOCALEMAP=\"@UDAT@locale_map.txt\" \ @DEFIS@ @DEFS@ CFLAGS = @CFLAGS@ OBJECTS = units.@OBJEXT@ parse.tab.@OBJEXT@ getopt.@OBJEXT@ getopt1.@OBJEXT@ @STRFUNC@ .SUFFIXES: .SUFFIXES: .c .@OBJEXT@ .c.@OBJEXT@: $(CC) $(DEFS) $(CPPFLAGS) $(CFLAGS) -I$(srcdir) -c $< # %.@OBJEXT@: %.c # $(CC) $(DEFS) $(CFLAGS) -I$(srcdir) -c %.c DISTFILES = README ChangeLog units.info units.txt getopt1.c units.dvi \ Makefile.in units.c getopt.c getopt.h definitions.units units.texinfo \ configure.ac configure strfunc.c COPYING Makefile.Win install-sh \ units.man NEWS texi2man INSTALL units.pdf units_cur2 units_cur3 \ parse.tab.c parse.y units.h Makefile.OS2 makeobjs.cmd README.OS2 \ README.MKS locale_map.txt fdl-1.3.texi currency.units README.Win \ unitsfile.ico unitsprog.ico icon_ms.png winmkdirs.bat all: units@EXEEXT@ units.1 units.info units_cur_inst units.@OBJEXT@: units.c units.h parse.tab.c: parse.y bison parse.y parse.tab.@OBJEXT@: parse.tab.c units@EXEEXT@: $(OBJECTS) $(CC) $(CFLAGS) $(LDFLAGS) -o units@EXEEXT@ $(OBJECTS) $(LIBS) units_cur: units_cur2 units_cur3 @if test $(HAVE_PYTHON) = no; then \ $(MAKE) units_cur_dummy; \ else \ version=`$(PYTHON) --version 2>&1`; \ if echo $$version | grep 'Python 2' >/dev/null; then \ cp $(srcdir)/units_cur2 units_cur; \ echo Creating units_cur for Python 2; \ elif echo $$version | grep 'Python 3'>/dev/null; then \ cp $(srcdir)/units_cur3 units_cur; \ echo Creating units_cur for Python 3; \ else \ echo Unrecognized Python version: $$version; \ echo Unable to create correct units_cur; \ exit 1; \ fi; \ fi units_cur_dummy: echo '\#!/bin/sh' > units_cur echo 'echo Units_cur requires python, which was not found when units was configured' >> units_cur chmod +x units_cur units_cur3: units_cur2 -mkdir python3_tempdir 2to3 --no-diffs -n -o python3_tempdir -w units_cur2 mv python3_tempdir/units_cur2 units_cur3 rm -rf python3_tempdir units_cur_inst: units_cur sed -e "s@outfile = 'currency.units'@outfile='@UDAT@currency.units'@"\ -e "s@/usr/bin/python@$(PYTHON)@" \ units_cur > units_cur_inst install-support: definitions.units currency.units units_cur_inst $(MKDIR_P) $(DESTDIR)@UDAT@ $(DESTDIR)$(bindir) $(INSTALL_DATA) $(srcdir)/definitions.units $(DESTDIR)@UDAT@definitions.units $(INSTALL_DATA) $(srcdir)/currency.units $(DESTDIR)@UDAT@currency.units $(INSTALL_DATA) $(srcdir)/locale_map.txt $(DESTDIR)@UDAT@locale_map.txt if test $(HAVE_PYTHON) = yes; then \ $(INSTALL_PROGRAM) units_cur_inst $(DESTDIR)$(bindir)/`echo units_cur|sed '$(transform)'`;fi install: units@EXEEXT@ install-doc install-support $(MKDIR_P) $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) units@EXEEXT@ $(DESTDIR)$(bindir)/`echo units@EXEEXT@|sed '$(transform)'` install-strip: units@EXEEXT@ install-doc install-support $(MKDIR_P) $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) -s units@EXEEXT@ $(DESTDIR)$(bindir)/`echo units@EXEEXT@|sed '$(transform)'` install-doc: install-man install-info install-man: units.1 $(MKDIR_P) $(DESTDIR)$(mandir)/man1 $(INSTALL_DATA) units.1 $(DESTDIR)$(mandir)/man1/`echo units|sed '$(transform)'`.1 units.man: units.texinfo texi2man ./texi2man units.texinfo > units.man units.1: units.man sed s!@DATAFILE@!@UDAT@definitions.units! $(srcdir)/units.man > units.1 install-info: $(DESTDIR)$(infodir)/units.info $(DESTDIR)$(infodir)/units.info: units.info $(POST_INSTALL) $(MKDIR_P) $(DESTDIR)$(infodir) # There may be a newer info file in . than in srcdir. -if test -f units.info; then d=.; \ else d=$(srcdir); fi; \ $(INSTALL_DATA) $$d/units.info $@; \ # Run install-info only if it exists. # Use `if' instead of just prepending `-' to the # line so we notice real errors from install-info. # We use `$(SHELL) -c' because some shells do not # fail gracefully when there is an unknown command. if test -f $(DESTDIR)$(infodir)/dir; then \ if $(SHELL) -c 'install-info --version' \ >/dev/null 2>&1; then \ install-info --dir-file=$(DESTDIR)$(infodir)/dir \ $(DESTDIR)$(infodir)/units.info; \ else true; fi \ else true; fi Makefile: Makefile.in config.status ./config.status uninstall: -rm -f $(DESTDIR)$(bindir)/`echo units@EXEEXT@|sed '$(transform)'` \ $(DESTDIR)$(mandir)/man1/`echo units|sed '$(transform)'`.1 \ $(DESTDIR)$(infodir)/units.info \ $(DESTDIR)@UDAT@definitions.units \ $(DESTDIR)@UDAT@currency.units \ $(DESTDIR)@UDAT@locale_map.txt \ $(DESTDIR)$(bindir)/`echo units_cur|sed '$(transform)'` -rmdir $(DESTDIR)@UDAT@ @if test -f $(DESTDIR)$(infodir)/dir; then \ echo You may need to remove units.info from $(DESTDIR)$(infodir)/dir; \ else true; fi clean mostlyclean: -rm -f *.@OBJEXT@ units@EXEEXT@ units.fn units.ky units.pg units.tp \ units.vr units.log units.dvi units.1 units.cp distname .chk \ units.toc units.aux units.cps units.op units_cur_inst units_cur distclean: clean -rm -f config.* Makefile TAGS maintainer-clean: clean -rm -f units.txt units.info units.pdf units.dvi \ units-*.tar.gz parse.tab.c currency.units currency.units: units_cur @echo "Trying to update currency.units (will use existing file if this fails)" -./units_cur sig: echo units-`sed -n -e '/\#.*VERSION/s/.*"\(.*\)"/\1/gp' \ $(srcdir)/units.c`.tar.gz > distname echo 'version: 1.2' > `cat distname`.directive echo 'directory: units' >> `cat distname`.directive echo 'filename: '`cat distname` >> `cat distname`.directive gpg --clearsign `cat distname`.directive gpg -b `cat distname` -rm -f `cat distname`.directive distname dist: $(DISTFILES) units_cur @./units_cur @echo Updated currencies, running check: ./units -f definitions.units -c @echo '' @chmod g+rw,o+r * @echo units-`sed -n -e '/\#.*VERSION/s/.*"\(.*\)"/\1/gp' \ $(srcdir)/units.c` > distname -@if [ -d `cat distname` ]; then rm -r `cat distname`; fi -@if [ -e `cat distname`.tar.gz ]; then rm `cat distname`.tar.gz; fi @mkdir `cat distname` @dst=`cat distname`; for f in $(DISTFILES); do \ ln $(srcdir)/$$f $$dst/$$f || { echo copying $$f; \ cp -p $(srcdir)/$$f $$dst/$$f ; } \ done @chmod 777 `cat distname` @tar czf `cat distname`.tar.gz `cat distname` @echo `cat distname`.tar.gz created -@rm -rf `cat distname` distname dvi: units.dvi pdf: units.pdf units.dvi: units.texinfo $(TEXI2DVI) $(srcdir)/units.texinfo units.pdf: units.texinfo $(TEXI2PDF) $(srcdir)/units.texinfo info: units.info units.info: units.texinfo $(MAKEINFO) $(srcdir)/units.texinfo units.txt: units.1 nroff -Tascii -man $(srcdir)/units.1 | col -b > units.txt doc: units.dvi units.info units.txt units.pdf check: all @echo Checking units @./units -f $(srcdir)/definitions.units \ '(((square(kiloinch)+2.84m2) /0.5) meters^2)^(1|4)' m \ | sed -n -e 's/ \* //p' > .chk @if [ "`cat .chk`" = 6 ]; then echo Units seems to work; \ else echo Something is wrong: units failed the check: ;cat .chk; fi @rm -f .chk configure: configure.ac autoconf TAGS: units.c etags $(srcdir)/units.c $(srcdir)/parse.y tags: units.c ctags $(srcdir)/units.c smalldist: units.c units.h parse.y parse.tab.c echo units-`sed -n -e '/\#.*VERSION/s/.*"\(.*\)"/\1/gp' \ $(srcdir)/units.c` > distname -rm -r `cat distname` `cat distname`.tar `cat distname`.tar.gz tar cf `cat distname`.tar units.c units.h parse.y parse.tab.c\ getopt1.c getopt.c getopt.h gzip `cat distname`.tar # # Not very portable code to compile into library (written for Linux) # libunits.a: $(OBJECTS) ar -r libunits.a $^ libunits.so: $(OBJECTS) $(CC) $(LDFLAGS) -shared -o $@ $^ # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: units-2.12/COPYING0000664000175000017500000010451310642156735013130 0ustar adrianadrian GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state 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 program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . units-2.12/strfunc.c0000664000175000017500000000423110641165333013712 0ustar adrianadrian/* * Copyright (C) 1996 Free Software Foundation, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ #define NULL 0 #define size_t int #ifdef NO_STRTOK /* Find the first ocurrence in S of any character in ACCEPT. */ char * strpbrk(char *s, char *accept) { while (*s != '\0') if (strchr(accept, *s) == NULL) ++s; else return (char *) s; return NULL; } static char *olds = NULL; char * strtok(char *s, char *delim) { char *token; if (s == NULL) { if (olds == NULL) { /*errno = EINVAL; Wonder where errno is defined....*/ return NULL; } else s = olds; } /* Scan leading delimiters. */ s += strspn(s, delim); if (*s == '\0') { olds = NULL; return NULL; } /* Find the end of the token. */ token = s; s = strpbrk(token, delim); if (s == NULL) /* This token finishes the string. */ olds = NULL; else { /* Terminate the token and make OLDS point past it. */ *s = '\0'; olds = s + 1; } return token; } #endif /* NO_STRTOK */ #ifdef NO_STRSPN /* Return the length of the maximum initial segment of S which contains only characters in ACCEPT. */ size_t strspn(char *s, char *accept) { register char *p; register char *a; register size_t count = 0; for (p = s; *p != '\0'; ++p) { for (a = accept; *a != '\0'; ++a) if (*p == *a) break; if (*a == '\0') return count; else ++count; } return count; } #endif NO_STRSPN units-2.12/README.MKS0000664000175000017500000000454012316637516013406 0ustar adrianadrianThis comments in this file are based on MKS Toolkit for developers, version 9.6, running on Windows XP Professional, SP3. The configure script was generated by GNU Autoconf 2.68. The most recent build of units with the Toolkit (using Microsoft Visual C/C++ 6.0, and Visual C/C++ Express 9.0 and 10.0) was for version 2.11 on 24 March 2014. The system on which the build was done had /bin as a symbolic link to C:/Program Files/MKS Toolkit/mksnt. -- Jeff Conrad (jeff_conrad@msn.com) 1 April 2014 Configure --------- Configure will fail unless invoked as ./configure PATH_SEPARATOR=';' Compilation ----------- The MKS version of make ignores suffix rules in Makefile unless the line .POSIX: appears in Makefile before any suffix rules. This target is also required for the currency updater units_cur to run properly from Makefile. The configure script attempts to detect the Toolkit by running mksinfo, and if this succeeds, the .POSIX target is added. If you have the MKS Toolkit and it somehow is not detected, you should add this line manually. Behavior of PAGER ----------------- The MKS versions of more and less do not recognize '+n' as an option to display a file beginning at line n, so help from within units will fail. If configure is able to detect the Toolkit by running mksinfo, -DHAVE_MKS_TOOLKIT is added to the DEFS in Makefile. If you have the MKS Toolkit and it somehow is not detected, you should add this manually. Install Program --------------- If the PATH at shell invocation uses the backslash as the path separator, and you have a BSD-compatible install program, the Makefile may have the incorrect entry INSTALL = c:usrlocalbin/install.exe -c Add the slashes to get INSTALL = c:/usr/local/bin/install.exe -c Giving a PATH with forward slashes in a file given by ENV will have no effect because configure unsets that variable, and the file will not be read. Python and units_cur -------------------- If python is installed, a copy of python.exe must be placed in /usr/bin so the shell can find it. Alternatively, you can change the first line of units_cur to specify the location of the python executable. The complete pathname in Makefile may contain backslashes; for example, PYTHON = C:\usr\bin/python.exe The build will fail unless the backslashes are changed to forward slashes: PYTHON = C:/usr/bin/python.exe units-2.12/icon_ms.png0000664000175000017500000000051612312651560014220 0ustar adrianadrian‰PNG  IHDRѓџasRGBЎЮщbKGDџџџ НЇ“ pHYs  šœtIMEмC%+ЮIDAT8Ы­гНjBA†с'•Rк™:XŸJHSЄГА’$з`ЁМŒx‚—›жFmь‚X& XXiГВŽ?,ьЬ№~3ЬВ\A;tБФ/шр?x,b№‰ киФ_GИ’д ’ЅHМР}ЌГN”їCwчє"ѕТI .Њ‹рtŠф\xƒїpЏ‡g§У<“?ЊUиzЊ)šИCƒ will complete unit names. *Note Readline Support::, for more information about 'readline'. To quit the program under Unix, press or . Under Windows, press or ; with the latter, you may also need to press . The result will be displayed in two ways. The first line of output, which is marked with a '*' to indicate multiplication, gives the result of the conversion you have asked for. The second line of output, which is marked with a '/' to indicate division, gives the inverse of the conversion factor. If you convert 10 meters to feet, 'units' will print * 32.808399 / 0.03048 which tells you that 10 meters equals about 32.8 feet. The second number gives the conversion in the opposite direction. In this case, it tells you that 1 foot is equal to about 0.03 dekameters since the dekameter is 10 meters. It also tells you that 1/32.8 is about 0.03. The 'units' program prints the inverse because sometimes it is a more convenient number. In the example above, for example, the inverse value is an exact conversion: a foot is exactly 0.03048 dekameters. But the number given the other direction is inexact. If you convert grains to pounds, you will see the following: You have: grains You want: pounds * 0.00014285714 / 7000 From the second line of the output you can immediately see that a grain is equal to a seven thousandth of a pound. This is not so obvious from the first line of the output. If you find the output format confusing, try using the '--verbose' option: You have: grain You want: aeginamina grain = 0.00010416667 aeginamina grain = (1 / 9600) aeginamina If you request a conversion between units that measure reciprocal dimensions, then 'units' will display the conversion results with an extra note indicating that reciprocal conversion has been done: You have: 6 ohms You want: siemens reciprocal conversion * 0.16666667 / 6 Reciprocal conversion can be suppressed by using the '--strict' option. As usual, use the '--verbose' option to get more comprehensible output: You have: tex You want: typp reciprocal conversion 1 / tex = 496.05465 typp 1 / tex = (1 / 0.0020159069) typp You have: 20 mph You want: sec/mile reciprocal conversion 1 / 20 mph = 180 sec/mile 1 / 20 mph = (1 / 0.0055555556) sec/mile If you enter incompatible unit types, the 'units' program will print a message indicating that the units are not conformable and it will display the reduced form for each unit: You have: ergs/hour You want: fathoms kg^2 / day conformability error 2.7777778e-11 kg m^2 / sec^3 2.1166667e-05 kg^2 m / sec If you only want to find the reduced form or definition of a unit, simply press at the 'You want:' prompt. Here is an example: You have: jansky You want: Definition: fluxunit = 1e-26 W/m^2 Hz = 1e-26 kg / s^2 The output from 'units' indicates that the jansky is defined to be equal to a fluxunit which in turn is defined to be a certain combination of watts, meters, and hertz. The fully reduced (and in this case somewhat more cryptic) form appears on the far right. Some named units are treated as dimensionless in some situations. These units include the radian and steradian. These units will be treated as equal to 1 in units conversions. Power is equal to torque times angular velocity. This conversion can only be performed if the radian is dimensionless. You have: (14 ft lbf) (12 radians/sec) You want: watts * 227.77742 / 0.0043902509 It is also possible to compute roots and other non-integer powers of dimensionless units; this allows computations such as the altitude of geosynchronous orbit: You have: cuberoot(G earthmass / (circle/siderealday)^2) - earthradius You want: miles * 22243.267 / 4.4957425e-05 Named dimensionless units are not treated as dimensionless in other contexts. They cannot be used as exponents so for example, 'meter^radian' is forbidden. If you want a list of options you can type '?' at the 'You want:' prompt. The program will display a list of named units that are conformable with the unit that you entered at the 'You have:' prompt above. Conformable unit _combinations_ will not appear on this list. Typing 'help' at either prompt displays a short help message. You can also type 'help' followed by a unit name. This will invoke a pager on the units data base at the point where that unit is defined. You can read the definition and comments that may give more details or historical information about the unit. (You can generally quit out of the page by pressing 'q'.) Typing 'search' TEXT will display a list of all of the units whose names contain TEXT as a substring along with their definitions. This may help in the case where you aren't sure of the right unit name.  File: units.info, Node: Command Line Use, Next: Unit Definitions, Prev: Interactive Use, Up: Top 3 Using 'units' Non-Interactively ********************************* The 'units' program can perform units conversions non-interactively from the command line. To do this, type the command, type the original unit expression, and type the new units you want. If a units expression contains non-alphanumeric characters, you may need to protect it from interpretation by the shell using single or double quote characters. If you type units "2 liters" quarts then 'units' will print * 2.1133764 / 0.47317647 and then exit. The output tells you that 2 liters is about 2.1 quarts, or alternatively that a quart is about 0.47 times 2 liters. If the conversion is successful, then 'units' will return success (zero) to the calling environment. If you enter non-conformable units then 'units' will print a message giving the reduced form of each unit and it will return failure (nonzero) to the calling environment. When you invoke 'units' with only one argument, it will print out the definition of the specified unit. It will return failure if the unit is not defined and success if the unit is defined.  File: units.info, Node: Unit Definitions, Next: Unit Expressions, Prev: Command Line Use, Up: Top 4 Unit Definitions ****************** The conversion information is read from a units data file that is called 'definitions.units' and is usually located in the '/usr/share/units' directory. If you invoke 'units' with the '-V' option, it will print the location of this file. The default file includes definitions for all familiar units, abbreviations and metric prefixes. It also includes many obscure or archaic units. Many constants of nature are defined, including these: pi ratio of circumference to diameter c speed of light e charge on an electron force acceleration of gravity mole Avogadro's number water pressure per unit height of water Hg pressure per unit height of mercury au astronomical unit k Boltzman's constant mu0 permeability of vacuum epsilon0 permittivity of vacuum G Gravitational constant mach speed of sound The standard data file includes atomic masses for all of the elements and numerous other constants. Also included are the densities of various ingredients used in baking so that '2 cups flour_sifted' can be converted to 'grams'. This is not an exhaustive list. Consult the units data file to see the complete list, or to see the definitions that are used. The 'pound' is a unit of mass. To get force, multiply by the force conversion unit 'force' or use the shorthand 'lbf'. (Note that 'g' is already taken as the standard abbreviation for the gram.) The unit 'ounce' is also a unit of mass. The fluid ounce is 'fluidounce' or 'floz'. When British capacity units differ from their US counterparts, such as the British Imperial gallon, the unit is defined both ways with 'br' and 'us' prefixes. Your locale settings will determine the value of the unprefixed unit. Currency is prefixed with its country name: 'belgiumfranc', 'britainpound'. When searching for a unit, if the specified string does not appear exactly as a unit name, then the 'units' program will try to remove a trailing 's', 'es'. Next units will replace a trailing 'ies' with 'y'. If that fails, 'units' will check for a prefix. The database includes all of the standard metric prefixes. Only one prefix is permitted per unit, so 'micromicrofarad' will fail. However, prefixes can appear alone with no unit following them, so 'micro*microfarad' will work, as will 'micro microfarad'. To find out which units and prefixes are available, read the standard units data file, which is extensively annotated. 4.1 English Customary Units =========================== English customary units differ in various ways in different regions. In Britain a complex system of volume measurements featured different gallons for different materials such as a wine gallon and ale gallon that different by twenty percent. This complexity was swept away in 1824 by a reform that created an entirely new gallon, the British Imperial gallon defined as the volume occupied by ten pounds of water. Meanwhile in the USA the gallon is derived from the 1707 Winchester wine gallon, which is 231 cubic inches. These gallons differ by about twenty percent. By default if 'units' runs in the 'en_GB' locale you will get the British volume measures. If it runs in the 'en_US' locale you will get the US volume measures. In other locales the default values are the US definitions. If you wish to force different definitions then set the environment variable 'UNITS_ENGLISH' to either 'US' or 'GB' to set the desired definitions independent of the locale. Before 1959, the value of a yard (and other units of measure defined in terms of it) differed slightly among English-speaking countries. In 1959, Australia, Canada, New Zealand, the United Kingdom, the United States, and South Africa adopted the Canadian value of 1 yard = 0.9144 m (exactly), which was approximately halfway between the values used by the UK and the US; it had the additional advantage of making 1 inch = 2.54 cm (exactly). This new standard was termed the "International Yard". Australia, Canada, and the UK then defined all customary lengths in terms of the International Yard (Australia did not define the furlong or rod); because many US land surveys were in terms of the pre-1959 units, the US continued to define customary surveyors' units (furlong, chain, rod, and link) in terms of the previous value for the foot, which was termed the "US survey foot". The US defined a "US survey mile" as 5280 US survey feet, and defined a "statute mile" as a US survey mile. The US values for these units differ from the international values by about 2 ppm. The 'units' program uses the international values for these units; the US values can be obtained by using either the 'US' or the 'survey' prefix. In either case, the simple familiar relationships among the units are maintained, e.g., 1 'furlong' = 660 'ft', and 1 'USfurlong' = 660 'USft', though the metric equivalents differ slightly between the two cases. The 'US' prefix or the 'survey' prefix can also be used to obtain the US survey mile and the value of the US yard prior to 1959, e.g., 'USmile' or 'surveymile' (but _not_ 'USsurveymile'). To get the US value of the statute mile, use either 'USstatutemile' or 'USmile'. Except for distances that extend over hundreds of miles (such as in the US State Plane Coordinate System), the differences in the miles are usually insignificant: You have: 100 surveymile - 100 mile You want: inch * 12.672025 / 0.078913984 The pre-1959 UK values for these units can be obtained with the prefix 'UK'. In the US, the acre is officially defined in terms of the US survey foot, but 'units' uses a definition based on the international foot. If you want the official US acre use 'USacre' and similarly use 'USacrefoot' for the official US version of that unit. The difference between these units is about 4 parts per million.  File: units.info, Node: Unit Expressions, Next: Nonlinear Conversions, Prev: Unit Definitions, Up: Top 5 Unit Expressions ****************** * Menu: * Operators:: The usual arithmetic operators, with a few extras * Sums and Differences of Units:: Adding and subtracting units * Numbers as Units:: A number is a dimensionless unit * Built-in Functions:: Trigonometric functions, logarithms, roots * Previous Result:: Inserting the result of the previous conversion * Complicated Unit Expressions:: A complicated example * Backwards Compatibility:: Alternate behavior for '*' and '-'  File: units.info, Node: Operators, Next: Sums and Differences of Units, Up: Unit Expressions 5.1 Operators ============= You can enter more complicated units by combining units with operations such as multiplication, division, powers, addition, subtraction, and parentheses for grouping. You can use the customary symbols for these operators when 'units' is invoked with its default options. Additionally, 'units' supports some extensions, including high priority multiplication using a space, and a high priority numerical division operator ('|') that can simplify some expressions. You multiply units using a space or an asterisk ('*'). The next example shows both forms: You have: arabicfoot * arabictradepound * force You want: ft lbf * 0.7296 / 1.370614 You can divide units using the slash ('/') or with 'per': You have: furlongs per fortnight You want: m/s * 0.00016630986 / 6012.8727 You can use parentheses for grouping: You have: (1/2) kg / (kg/meter) You want: league * 0.00010356166 / 9656.0833 Multiplication using a space has a higher precedence than division using a slash and is evaluated left to right; in effect, the first '/' character marks the beginning of the denominator of a unit expression. This makes it simple to enter a quotient with several terms in the denominator: 'J / mol K'. The '*' and '/' operators have the same precedence, and are evaluated left to right; if you multiply with '*', you must group the terms in the denominator with parentheses: 'J / (mol * K)'. The higher precedence of the space operator may not always be advantageous. For example, 'm/s s/day' is equivalent to 'm / s s day' and has dimensions of length per time cubed. Similarly, '1/2 meter' refers to a unit of reciprocal length equivalent to 0.5/meter, perhaps not what you would intend if you entered that expression. The get a half meter you would need to use parentheses: '(1/2) meter'. The '*' operator is convenient for multiplying a sequence of quotients. For example, 'm/s * s/day' is equivalent to 'm/day'. Similarly, you could write '1/2 * meter' to get half a meter. The 'units' program supports another option for numerical fractions: you can indicate division of _numbers_ with the vertical bar ('|'), so if you wanted half a meter you could write '1|2 meter'. You cannot use the vertical bar to indicate division of non-numerical units (e.g., 'm|s' results in an error message). Powers of units can be specified using the '^' character, as shown in the following example, or by simple concatenation of a unit and its exponent: 'cm3' is equivalent to 'cm^3'; if the exponent is more than one digit, the '^' is required. You can also use '**' as an exponent operator. You have: cm^3 You want: gallons * 0.00026417205 / 3785.4118 Concatenation only works with a single unit name: if you write '(m/s)2', 'units' will treat it as multiplication by 2. When a unit includes a prefix, exponent operators apply to the combination, so 'centimeter3' gives cubic centimeters. If you separate the prefix from the unit with any multiplication operator (e.g., 'centi meter^3'), the prefix is treated as a separate unit, so the exponent applies only to the unit without the prefix. The second example is equivalent to 'centi * (meter^3)', and gives a hundredth of a cubic meter, not a cubic centimeter. The 'units' program is limited internally to products of 99 units; accordingly, expressions like 'meter^100' or 'joule^34' (represented internally as 'kg^34 m^68 / s^68') will fail. The '|' operator has the highest precedence, so you can write the square root of two thirds as '2|3^1|2'. The '^' operator has the second highest precedence, and is evaluated right to left, as usual: You have: 5 * 2^3^2 You want: Definition: 2560 With a dimensionless base unit, any dimensionless exponent is meaningful (e.g., 'pi^exp(2.371)'). Even though angle is sometimes treated as dimensionless, exponents cannot have dimensions of angle: You have: 2^radian ^ Exponent not dimensionless If the base unit is not dimensionless, the exponent must be a rational number P/Q, and the dimension of the unit must be a power of Q, so 'gallon^2|3' works but 'acre^2|3' fails. An exponent using the slash ('/') operator (e.g., 'gallon^(2/3)') is also acceptable; the parentheses are needed because the precedence of '^' is higher than that of '/'. Since 'units' cannot represent dimensions with exponents greater than 99, a fully reduced exponent must have Q < 100. When raising a non-dimensionless unit to a power, 'units' attempts to convert a decimal exponent to a rational number with Q < 100. If this is not possible 'units' displays an error message: You have: ft^1.234 Base unit not dimensionless; rational exponent required A decimal exponent must match its rational representation to machine precision, so 'acre^1.5' works but 'gallon^0.666' does not.  File: units.info, Node: Sums and Differences of Units, Next: Numbers as Units, Prev: Operators, Up: Unit Expressions 5.2 Sums and Differences of Units ================================= You may sometimes want to add values of different units that are outside the SI. You may also wish to use 'units' as a calculator that keeps track of units. Sums of conformable units are written with the '+' character, and differences with the '-' character. You have: 2 hours + 23 minutes + 32 seconds You want: seconds * 8612 / 0.00011611705 You have: 12 ft + 3 in You want: cm * 373.38 / 0.0026782366 You have: 2 btu + 450 ft lbf You want: btu * 2.5782804 / 0.38785542 The expressions that are added or subtracted must reduce to identical expressions in primitive units, or an error message will be displayed: You have: 12 printerspoint - 4 heredium ^ Illegal sum of non-conformable units As usual, the precedence for '+' and '-' is lower than that of the other operators. A fractional quantity such as 2 1/2 cups can be given as '(2+1|2) cups'; the parentheses are necessary because multiplication has higher precedence than addition. If you omit the parentheses, 'units' attempts to add '2' and '1|2 cups', and you get an error message: You have: 2+1|2 cups ^ Illegal sum or difference of non-conformable units The expression could also be correctly written as '(2+1/2) cups'. If you write '2 1|2 cups' the space is interpreted as _multiplication_ so the result is the same as '1 cup'. The '+' and '-' characters sometimes appears in exponents like '3.43e+8'. This leads to an ambiguity in an expression like '3e+2 yC'. The unit 'e' is a small unit of charge, so this can be regarded as equivalent to '(3e+2) yC' or '(3 e)+(2 yC)'. This ambiguity is resolved by always interpreting '+' and '-' as part of an exponent if possible.  File: units.info, Node: Numbers as Units, Next: Built-in Functions, Prev: Sums and Differences of Units, Up: Unit Expressions 5.3 Numbers as Units ==================== For 'units', numbers are just another kind of unit. They can appear as many times as you like and in any order in a unit expression. For example, to find the volume of a box that is 2 ft by 3 ft by 12 ft in steres, you could do the following: You have: 2 ft 3 ft 12 ft You want: stere * 2.038813 / 0.49048148 You have: $ 5 / yard You want: cents / inch * 13.888889 / 0.072 And the second example shows how the dollar sign in the units conversion can precede the five. Be careful: 'units' will interpret '$5' with no space as equivalent to 'dollar^5'.  File: units.info, Node: Built-in Functions, Next: Previous Result, Prev: Numbers as Units, Up: Unit Expressions 5.4 Built-in Functions ====================== Several built-in functions are provided: 'sin', 'cos', 'tan', 'ln', 'log', 'log2', 'exp', 'acos', 'atan' and 'asin'. The 'sin', 'cos', and 'tan' functions require either a dimensionless argument or an argument with dimensions of angle. You have: sin(30 degrees) You want: Definition: 0.5 You have: sin(pi/2) You want: Definition: 1 You have: sin(3 kg) ^ Unit not dimensionless The other functions on the list require dimensionless arguments. The inverse trigonometric functions return arguments with dimensions of angle. If you wish to take roots of units, you may use the 'sqrt' or 'cuberoot' functions. These functions require that the argument have the appropriate root. You can obtain higher roots by using fractional exponents: You have: sqrt(acre) You want: feet * 208.71074 / 0.0047913202 You have: (400 W/m^2 / stefanboltzmann)^(1/4) You have: Definition: 289.80882 K You have: cuberoot(hectare) ^ Unit not a root  File: units.info, Node: Previous Result, Next: Complicated Unit Expressions, Prev: Built-in Functions, Up: Unit Expressions 5.5 Previous Result =================== You can insert the result of the previous conversion using the underscore ('_'). It is useful when you want to convert the same input to several different units, for example You have: 2.3 tonrefrigeration You want: btu/hr * 27600 / 3.6231884e-005 You have: _ You want: kW * 8.0887615 / 0.12362832 Suppose you want to do some deep frying that requires an oil depth of 2 inches. You have 1/2 gallon of oil, and want to know the largest-diameter pan that will maintain the required depth. The nonlinear unit 'circlearea' gives the _radius_ of the circle (*note Other Nonlinear Units::, for a more detailed description) in SI units; you want the _diameter_ in _inches_: You have: 1|2 gallon / 2 in You want: circlearea 0.10890173 m You have: 2 _ You want: in * 8.5749393 / 0.1166189 In most cases, surrounding white space is optional, so the previous example could have used '2_'. If '_' follows a non-numerical unit symbol, however, the space is required: You have: m_ ^ Parse error When '_' is followed by a digit, the operation is multiplication rather than exponentiation, so that '_2', is equivalent to '_ * 2' rather than '_^2'. You can use the '_' symbol any number of times; for example, You have: m You want: Definition: 1 m You have: _ _ You want: Definition: 1 m^2 Using '_' before a conversion has been performed (e.g., immediately after invocation) generates an error: You have: _ ^ No previous result; '_' not set Accordingly, '_' serves no purpose when 'units' is invoked non-interactively. If 'units' is invoked with the '--verbose' option (*note Invoking Units::), the value of '_' is not expanded: You have: mile You want: ft mile = 5280 ft mile = (1 / 0.00018939394) ft You have: _ You want: m _ = 1609.344 m _ = (1 / 0.00062137119) m You can give '_' at the 'You want:' prompt, but it usually is not very useful.  File: units.info, Node: Complicated Unit Expressions, Next: Backwards Compatibility, Prev: Previous Result, Up: Unit Expressions 5.6 Complicated Unit Expressions ================================ The 'units' program is especially helpful in ensuring accuracy and dimensional consistency when converting lengthy unit expressions. For example, one form of the Darcy-Weisbach fluid-flow equation is Delta P = (8/pi^2) rho f L (Q^2 / d^5) where \Delta P is the pressure drop, \rho is the mass density, f is the (dimensionless) friction factor, L is the length of the pipe, Q is the volumetric flow rate, and d is the pipe diameter. It might be desired to have the equation in the form Delta P = A1 rho f L (Q^2 / d^5) that accepted the user's normal units; for typical units used in the US, the required conversion could be something like You have: (8/pi^2)(lbm/ft^3)ft(ft^3/s)^2(1/in^5) You want: psi * 43.533969 / 0.022970568 The parentheses allow individual terms in the expression to be entered naturally, as they might be read from the formula. Alternatively, the multiplication could be done with the '*' rather than a space; then parentheses are needed only around 'ft^3/s' because of its exponent: You have: 8/pi^2 * lbm/ft^3 * ft * (ft^3/s)^2 /in^5 You want: psi * 43.533969 / 0.022970568 Without parentheses, and using spaces for multiplication, the previous conversion would need to be entered as You have: 8 lb ft ft^3 ft^3 / pi^2 ft^3 s^2 in^5 You want: psi * 43.533969 / 0.022970568  File: units.info, Node: Backwards Compatibility, Prev: Complicated Unit Expressions, Up: Unit Expressions 5.7 Backwards Compatibility: '*' and '-' ======================================== The original 'units' assigned multiplication a higher precedence than division using the slash. This differs from the usual precedence rules, which give multiplication and division equal precedence, and can be confusing for people who think of units as a calculator. The star operator ('*') included in this 'units' program has, by default, the same precedence as division, and hence follows the usual precedence rules. For backwards compatibility you can invoke 'units' with the '--oldstar' option. Then '*' has a higher precedence than division, and the same precedence as multiplication using the space. Historically, the hyphen ('-') has been used in technical publications to indicate products of units, and the original 'units' program treated it as a multiplication operator. Because 'units' provides several other ways to obtain unit products, and because '-' is a subtraction operator in general algebraic expressions, 'units' treats the binary '-' as a subtraction operator by default. For backwards compatibility use the '--product' option, which causes 'units' to treat the binary '-' operator as a product operator. When '-' is a multiplication operator it has the same precedence as multiplication with a space, giving it a higher precedence than division. When '-' is used as a unary operator it negates its operand. Regardless of the 'units' options, if '-' appears after '(' or after '+' then it will act as a negation operator. So you can always compute 20 degrees minus 12 minutes by entering '20 degrees + -12 arcmin'. You must use this construction when you define new units because you cannot know what options will be in force when your definition is processed.  File: units.info, Node: Nonlinear Conversions, Next: Unit Lists, Prev: Unit Expressions, Up: Top 6 Nonlinear Unit Conversions **************************** Nonlinear units are represented using functional notation. They make possible nonlinear unit conversions such as temperature. * Menu: * Temperature Conversions:: Conversion between temperature scales * Other Nonlinear Units:: Ring size, wire gauge, abrasive grit size  File: units.info, Node: Temperature Conversions, Next: Other Nonlinear Units, Up: Nonlinear Conversions 6.1 Temperature Conversions =========================== Conversions between temperatures are different from linear conversions between temperature _increments_--see the example below. The absolute temperature conversions are handled by units starting with 'temp', and you must use functional notation. The temperature-increment conversions are done using units starting with 'deg' and they do not require functional notation. You have: tempF(45) You want: tempC 7.2222222 You have: 45 degF You want: degC * 25 / 0.04 Think of 'tempF(X)' not as a function but as a notation that indicates that X should have units of 'tempF' attached to it. *Note Defining Nonlinear Units::. The first conversion shows that if it's 45 degrees Fahrenheit outside, it's 7.2 degrees Celsius. The second conversion indicates that a change of 45 degrees Fahrenheit corresponds to a change of 25 degrees Celsius. The conversion from 'tempF(X)' is to absolute temperature, so that You have: tempF(45) You want: degR * 504.67 / 0.0019814929 gives the same result as You have: tempF(45) You want: tempR * 504.67 / 0.0019814929 But if you convert 'tempF(X)' to 'degC', the output is probably not what you expect: You have: tempF(45) You want: degC * 280.37222 / 0.0035666871 The result is the temperature in K, because 'degC' is defined as 'K', the Kelvin. For consistent results, use the 'tempX' units when converting to a temperature rather than converting a temperature increment. The 'tempC()' and 'tempF()' definitions are limited to positive absolute temperatures, and giving a value that would result in a negative absolute temperature generates an error message: You have: tempC(-275) ^ Argument of function outside domain ^  File: units.info, Node: Other Nonlinear Units, Prev: Temperature Conversions, Up: Nonlinear Conversions 6.2 Other Nonlinear Units ========================= Some other examples of nonlinear units are numerous different ring sizes and wire gauges, the grit sizes used for abrasives, the decibel scale, shoe size, scales for the density of sugar (e.g., baume). The standard data file also supplies units for computing the area of a circle and the volume of a sphere. See the standard units data file for more details. Wire gauges with multiple zeroes are signified using negative numbers where two zeroes is '-1'. Alternatively, you can use the synonyms 'g00', 'g000', and so on that are defined in the standard units data file. You have: wiregauge(11) You want: inches * 0.090742002 / 11.020255 You have: brwiregauge(g00) You want: inches * 0.348 / 2.8735632 You have: 1 mm You want: wiregauge 18.201919 You have: grit_P(600) You want: grit_ansicoated 342.76923 The last example shows the conversion from P graded sand paper, which is the European standard and may be marked "P600" on the back, to the USA standard. You can compute the area of a circle using the nonlinear unit, 'circlearea'. You can also do this using the circularinch or circleinch. The next example shows two ways to compute the area of a circle with a five inch radius and one way to compute the volume of a sphere with a radius of one meter. You have: circlearea(5 in) You want: in2 * 78.539816 / 0.012732395 You have: 10^2 circleinch You want: in2 * 78.539816 / 0.012732395 You have: spherevol(meter) You want: ft3 * 147.92573 / 0.0067601492 The inverse of a nonlinear conversion is indicated by prefixing a tilde ('~') to the nonlinear unit name: You have: ~wiregauge(0.090742002 inches) You want: Definition: 11 You can give a nonlinear unit definition without an argument or parentheses, and press at the 'You want:' prompt to get the definition of a nonlinear unit; if the definition is not valid for all real numbers, the range of validity is also given. If the definition requires specific units this information is also displayed: You have: tempC Definition: tempC(x) = x K + stdtemp defined for x >= -273.15 You have: ~tempC Definition: ~tempC(tempC) = (tempC +(-stdtemp))/K defined for tempC >= 0 K You have: circlearea Definition: circlearea(r) = pi r^2 r has units m To see the definition of the inverse use the '~' notation. In this case the parameter in the functional definition will usually be the name of the unit. Note that the inverse for 'tempC' shows that it requires units of 'K' in the specification of the allowed range of values. Nonlinear unit conversions are described in more detail in *note Defining Nonlinear Units::.  File: units.info, Node: Unit Lists, Next: Logging Calculations, Prev: Nonlinear Conversions, Up: Top 7 Unit Lists: Conversion to Sums of Units ***************************************** Outside of the SI, it is sometimes desirable to convert a single unit to a sum of units--for example, feet to feet plus inches. The conversion _from_ sums of units was described in *note Sums and Differences of Units::, and is a simple matter of adding the units with the '+' sign: You have: 12 ft + 3 in + 3|8 in You want: ft * 12.28125 / 0.081424936 Although you can similarly write a sum of units to convert _to_, the result will not be the conversion to the units in the sum, but rather the conversion to the particular sum that you have entered: You have: 12.28125 ft You want: ft + in + 1|8 in * 11.228571 / 0.089058524 The unit expression given at the 'You want:' prompt is equivalent to asking for conversion to multiples of '1 ft + 1 in + 1|8 in', which is 1.09375 ft, so the conversion in the previous example is equivalent to You have: 12.28125 ft You want: 1.09375 ft * 11.228571 / 0.089058524 In converting to a sum of units like miles, feet and inches, you typically want the largest integral value for the first unit, followed by the largest integral value for the next, and the remainder converted to the last unit. You can do this conversion easily with 'units' using a special syntax for lists of units. You must list the desired units in order from largest to smallest, separated by the semicolon (';') character: You have: 12.28125 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in The conversion always gives integer coefficients on the units in the list, except possibly the last unit when the conversion is not exact: You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3.00096 * 1|8 in The order in which you list the units is important: You have: 3 kg You want: oz;lb 105 oz + 0.051367866 lb You have: 3 kg You want: lb;oz 6 lb + 9.8218858 oz Listing ounces before pounds produces a technically correct result, but not a very useful one. You must list the units in descending order of size in order to get the most useful result. Ending a unit list with the separator ';' has the same effect as repeating the last unit on the list, so 'ft;in;1|8 in;' is equivalent to 'ft;in;1|8 in;1|8 in'. With the example above, this gives You have: 12.28126 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in + 0.00096 * 1|8 in in effect separating the integer and fractional parts of the coefficient for the last unit. If you instead prefer to round the last coefficient to an integer you can do this with the '--round' ('-r') option. With the previous example, the result is You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in (rounded down to nearest 1|8 in) When you use the '-r' option, repeating the last unit on the list has no effect (e.g., 'ft;in;1|8 in;1|8 in' is equivalent to 'ft;in;1|8 in'), and hence neither does ending a list with a ';'. With a single unit and the '-r' option, a terminal ';' _does_ have an effect: it causes 'units' to treat the single unit as a list and produce a rounded value for the single unit. Without the extra ';', the '-r' option has no effect on single unit conversions. This example shows the output using the '-r' option: You have: 12.28126 ft You want: in * 147.37512 / 0.0067854058 You have: 12.28126 ft You want: in; 147 in (rounded down to nearest in) Each unit that appears in the list must be conformable with the first unit on the list, and of course the listed units must also be conformable with the unit that you enter at the 'You have:' prompt. You have: meter You want: ft;kg ^ conformability error ft = 0.3048 m kg = 1 kg You have: meter You want: lb;oz conformability error 1 m 0.45359237 kg In the first case, 'units' reports the disagreement between units appearing on the list. In the second case, 'units' reports disagreement between the unit you entered and the desired conversion. This conformability error is based on the first unit on the unit list. Other common candidates for conversion to sums of units are angles and time: You have: 23.437754 deg You want; deg;arcmin;arcsec 23 deg + 26 arcmin + 15.9144 arcsec You have: 7.2319 hr You want: hr;min;sec 7 hr + 13 min + 54.84 sec In North America, recipes for cooking typically measure ingredients by volume, and use units that are not always convenient multiples of each other. Suppose that you have a recipe for 6 and you wish to make a portion for 1. If the recipe calls for 2 1/2 cups of an ingredient, you might wish to know the measurements in terms of measuring devices you have available, you could use 'units' and enter You have: (2+1|2) cup / 6 You want: cup;1|2 cup;1|3 cup;1|4 cup;tbsp;tsp;1|2 tsp;1|4 tsp 1|3 cup + 1 tbsp + 1 tsp By default, if a unit in a list begins with fraction of the form 1|X and its multiplier is an integer, the fraction is given as the product of the multiplier and the numerator; for example, You have: 12.28125 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in In many cases, such as the example above, this is what is wanted, but sometimes it is not. For example, a cooking recipe for 6 might call for 5 1/4 cup of an ingredient, but you want a portion for 2, and your 1-cup measure is not available; you might try You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3|2 cup + 1|4 cup This result might be fine for a baker who has a 1 1/2-cup measure (and recognizes the equivalence), but it may not be as useful to someone with more limited set of measures, who does want to do additional calculations, and only wants to know "How many 1/2-cup measures to I need to add?" After all, that's what was actually asked. With the '--show-factor' option, the factor will not be combined with a unity numerator, so that you get You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3 * 1|2 cup + 1|4 cup A user-specified fractional unit with a numerator other than 1 is never overridden, however--if a unit list specifies '3|4 cup;1|2 cup', a result equivalent to 1 1/2 cups will always be shown as '2 * 3|4 cup' whether or not the '--show-factor' option is given. Some applications for unit lists may be less obvious. Suppose that you have a postal scale and wish to ensure that it's accurate at 1 oz, but have only metric calibration weights. You might try You have: 1 oz You want: 100 g;50 g; 20 g;10 g;5 g;2 g;1 g; 20 g + 5 g + 2 g + 1 g + 0.34952312 * 1 g You might then place one each of the 20 g, 5 g, 2 g, and 1 g weights on the scale and hope that it indicates close to You have: 20 g + 5 g + 2 g + 1 g You want: oz; 0.98767093 oz Appending ';' to 'oz' forces a one-line display that includes the unit; here the integer part of the result is zero, so it is not displayed. A unit list such as cup;1|2 cup;1|3 cup;1|4 cup;tbsp;tsp;1|2 tsp;1|4 tsp can be tedious to enter. The 'units' program provides shorthand names for some common combinations: hms hours, minutes, seconds dms angle: degrees, minutes, seconds time years, days, hours, minutes and seconds usvol US cooking volume: cups and smaller Using these shorthands, or "unit list aliases", you can do the following conversions: You have: anomalisticyear You want: time 1 year + 25 min + 3.4653216 sec You have: 1|6 cup You want: usvol 2 tbsp + 2 tsp You cannot combine a unit list alias with other units: it must appear alone at the 'You want:' prompt. You can display the definition of a unit list alias by entering it at the 'You have:' prompt: You have: dms Definition: unit list, deg;arcmin;arcsec When you specify compact output with '--compact', '--terse' or '-t' and perform conversion to a unit list, 'units' lists the conversion factors for each unit in the list, separated by semicolons. You have: year You want: day;min;sec 365;348;45.974678 Unlike the case of regular output, zeros _are_ included in this output list: You have: liter You want: cup;1|2 cup;1|4 cup;tbsp 4;0;0;3.6280454  File: units.info, Node: Logging Calculations, Next: Invoking Units, Prev: Unit Lists, Up: Top 8 Logging Calculations ********************** The '--log' option allows you to save the results of calculations in a file; this can be useful if you need a permanent record of your work. For example, the fluid-flow conversion in *note Complicated Unit Expressions::, is lengthy, and if you were to use it in designing a piping system, you might want a record of it for the project file. If the interactive session # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 You have: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units You want: psi * 43.533969 / 0.022970568 were logged, the log file would contain ### Log started Fri Oct 02 15:55:35 2015 # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 From: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units To: psi * 43.533969 / 0.022970568 The time is written to the log file when the file is opened. The use of comments can help clarify the meaning of calculations for the log. The log includes conformability errors between the units at the 'You have:' and 'You want:' prompts, but not other errors, including lack of conformability of items in sums or differences or among items in a unit list. For example, a conversion between zenith angle and elevation angle could involve You have: 90 deg - (5 deg + 22 min + 9 sec) ^ Illegal sum or difference of non-conformable units You have: 90 deg - (5 deg + 22 arcmin + 9 arcsec) You want: dms 84 deg + 37 arcmin + 51 arcsec You have: _ You want: deg * 84.630833 / 0.011816024 You have: The log file would contain From: 90 deg - (5 deg + 22 arcmin + 9 arcsec) To: deg;arcmin;arcsec 84 deg + 37 arcmin + 51 arcsec From: _ To: deg * 84.630833 / 0.011816024 The initial entry error (forgetting that minutes have dimension of time, and that arcminutes must be used for dimensions of angle) does not appear in the output. When converting to a unit list alias, 'units' expands the alias in the log file. The 'From:' and 'To:' tags are written to the log file even if the '--quiet' option is given. If the log file exists when 'units' is invoked, the new results are appended to the log file. The time is written to the log file each time the file is opened. The '--log' option is ignored when 'units' is used non-interactively.  File: units.info, Node: Invoking Units, Next: Defining Your Own Units, Prev: Logging Calculations, Up: Top 9 Invoking 'units' ****************** You invoke 'units' like this: units [OPTIONS] [FROM-UNIT [TO-UNIT]] If the FROM-UNIT and TO-UNIT are omitted, the program will use interactive prompts to determine which conversions to perform. *Note Interactive Use::. If both FROM-UNIT and TO-UNIT are given, 'units' will print the result of that single conversion and then exit. If only FROM-UNIT appears on the command line, 'units' will display the definition of that unit and exit. Units specified on the command line may need to be quoted to protect them from shell interpretation and to group them into two arguments. *Note Command Line Use::. The default behavior of 'units' can be changed by various options given on the command line. In most cases, the options may be given in either short form (a single '-' followed by a single character) or long form ('--' followed by a word or hyphen-separated words). Short-form options are cryptic but require less typing; long-form options require more typing but are more explanatory and may be more mnemonic. With long-form options you need only enter sufficient characters to uniquely identify the option to the program. For example, '--out %f' works, but '--o %f' fails because 'units' has other long options beginning with 'o'. However, '--q' works because '--quiet' is the only long option beginning with 'q'. Some options require arguments to specify a value (e.g., '-d 12' or '--digits 12'). Short-form options that do not take arguments may be concatenated (e.g., '-erS' is equivalent to '-e -r -S'); the last option in such a list may be one that takes an argument (e.g., '-ed 12'). With short-form options, the space between an option and its argument is optional (e.g., '-d12' is equivalent to '-d 12'). Long-form options may not be concatenated, and the space between a long-form option and its argument is required. Short-form and long-form options may be intermixed on the command line. Options may be given in any order, but when incompatible options (e.g., '--output-format' and '--exponential') are given in combination, behavior is controlled by the last option given. For example, '-o%.12f -e' gives exponential format with the default eight significant digits). The following options are available: '-c' '--check' Check that all units and prefixes defined in the units data file reduce to primitive units. Print a list of all units that cannot be reduced. Also display some other diagnostics about suspicious definitions in the units data file. Only definitions active in the current locale are checked. You should always run 'units' with this option after modifying a units data file. '--check-verbose' '--verbose-check' Like the '--check' option, this option prints a list of units that cannot be reduced. But to help find unit definitions that cause endless loops, it lists the units as they are checked. If 'units' hangs, then the last unit to be printed has a bad definition. Only definitions active in the current locale are checked. '-d NDIGITS' '--digits NDIGITS' Set the number of significant digits in the output to the value specified (which must be greater than zero). For example, '-d 12' sets the number of significant digits to 12. With exponential output 'units' displays one digit to the left of the decimal point(1) and eleven digits to the right of the decimal point. On most systems, the maximum number of internally meaningful digits is 15; if you specify a greater number than your system's maximum, 'units' will print a warning and set the number to the largest meaningful value. To directly set the maximum value, give an argument of 'max' (e.g., '-d max'). Be aware, of course, that "significant" here refers only to the _display_ of numbers; if results depend on physical constants not known to this precision, the physically meaningful precision may be less than that shown. The '--digits' option conflicts with the '--output-format' option. '-e' '--exponential' Set the numeric output format to exponential (i.e., scientific notation), like that used in the Unix 'units' program. The default precision is eight significant digits (seven digits to the right of the decimal point); this can be changed with the '--digits' option. The '--exponential' option conflicts with the '--output-format' option. '-o FORMAT' '--output-format FORMAT' This option affords complete control over the numeric output format using the specified FORMAT. The format is a single floating point numeric format for the 'printf()' function in the C programming language. All compilers support the format types 'g' and 'G' to specify significant digits, 'e' and 'E' for scientific notation, and 'f' for fixed-point decimal. The ISO C99 standard introduced the 'F' type for fixed-point decimal and the 'a' and 'A' types for hexadecimal floating point; these types are allowed with compilers that support them. The default format is '%.8g'; for greater precision, you could specify '-o %.15g'. *Note Numeric Output Format::, and the documentation for 'printf()' for more detailed descriptions of the format specification. The '--output-format' option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the 'printf()' format syntax. If you don't want to bother with the 'printf()' syntax, you can specify greater precision more simply with the '--digits' option or select exponential format with '--exponential'. The '--output-format' option is incompatible with the '--exponential' and '--digits' options. '-f FILENAME' '--file FILENAME' Instruct 'units' to load the units file FILENAME. You can specify up to 25 units files on the command line. When you use this option, 'units' will load _only_ the files you list on the command line; it will not load the standard file or your personal units file unless you explicitly list them. If FILENAME is the empty string ('-f ""'), the default units file (or that specified by 'UNITSFILE') will be loaded in addition to any others specified with '-f'. '-L LOGFILE' '--log LOGFILE' Save the results of calculations in the file LOGFILE; this can be useful if it is important to have a record of unit conversions or other calculations that are to be used extensively or in a critical activity such as a program or design project. If LOGFILE exits, the new results are appended to the file. This option is ignored when 'units' is used non-interactively. *Note Logging Calculations::, for a more detailed description and some examples. '-H FILENAME' '--history FILENAME' Instruct 'units' to save history to FILENAME, so that a record of your commands is available for retrieval across different 'units' invocations. To prevent the history from being saved set FILENAME to the emptry string ('-f ""'). This option has no effect if readline is not available. '-h' '--help' Print out a summary of the options for 'units'. '-m' '--minus' Causes '-' to be interpreted as a subtraction operator. This is the default behavior. '-p' '--product' Causes '-' to be interpreted as a multiplication operator when it has two operands. It will act as a negation operator when it has only one operand: '(-3)'. By default '-' is treated as a subtraction operator. '--oldstar' Causes '*' to have the old-style precedence, higher than the precedence of division so that '1/2*3' will equal '1/6'. '--newstar' Forces '*' to have the new (default) precedence that follows the usual rules of algebra: the precedence of '*' is the same as the precedence of '/', so that '1/2*3' will equal '3/2'. '--compact' Give compact output featuring only the conversion factor. This turns off the '--verbose' option. '-q' '--quiet' '--silent' Suppress prompting of the user for units and the display of statistics about the number of units loaded. '-n' '--nolists' Disable conversion to unit lists. '-r' '--round' When converting to a combination of units given by a unit list, round the value of the last unit in the list to the nearest integer. '-S' '--show-factor' When converting to a combination of units specified in a list, always show a non-unity factor before a unit that begins with a fraction with a unity denominator. By default, if the unit in a list begins with fraction of the form 1|X and its multiplier is an integer other than 1, the fraction is given as the product of the multiplier and the numerator (e.g., '3|8 in' rather than '3 * 1|8 in'). In some cases, this is not what is wanted; for example, the results for a cooking recipe might show '3 * 1|2 cup' as '3|2 cup'. With the '--show-factor' option, a result equivalent to 1.5 cups will display as '3 * 1|2 cup' rather than '3|2 cup'. A user-specified fractional unit with a numerator other than 1 is never overridden, however--if a unit list specifies '3|4 cup;1|2 cup', a result equivalent to 1 1/2 cups will always be shown as '2 * 3|4 cup' whether or not the '--show-factor' option is given. '-s' '--strict' Suppress conversion of units to their reciprocal units. For example, 'units' will normally convert hertz to seconds because these units are reciprocals of each other. The strict option requires that units be strictly conformable to perform a conversion, and will give an error if you attempt to convert hertz to seconds. '-1' '--one-line' Give only one line of output (the forward conversion). Do not print the reverse conversion. If a reciprocal conversion is performed then 'units' will still print the "reciprocal conversion" line. '-t' '--terse' Give terse output when converting units. This option can be used when calling 'units' from another program so that the output is easy to parse. This option has the combined effect of these options: '--strict' '--quiet' '--one-line' '--compact'. When combined with '--version' it produces a display showing only the program name and version number. '-v' '--verbose' Give slightly more verbose output when converting units. When combined with the '-c' option this gives the same effect as '--check-verbose'. When combined with '--version' produces a more detailed output, equivalent to the '--info' option. '-V' '--version' Print the program version number, tell whether the 'readline' library has been included, tell whether UTF-8 support has been included; give the locale, the location of the default units data file, and the location of the personal units data file; indicate if the personal units data file does not exist. When given in combination with the '--terse' option, the program prints only the version number and exits. When given in combination with the '--verbose' option, the program, the '--version' option has the same effect as the '--info' option below. '-I' '--info' Print the information given with the '--version' option, show the pathname of the units program, show the status of the 'UNITSFILE' and 'MYUNITSFILE' environment variables, and additional information about how 'units' locates the related files. On systems running Microsoft Windows, the status of the 'UNITSLOCALE' environment variable and information about the related locale map are also given. This option is usually of interest only to developers and administrators, but it can sometimes be useful for troubleshooting. Combining the '--version' and '--verbose' options has the same effect as giving '--info'. '-U' '--unitsfile' Print the location of the default units data file and exit; if the file cannot be found, print "Units data file not found". '-l LOCALE' '--locale LOCALE' Print the information given with the '--version' option, show the Force a specified locale such as 'en_GB' to get British definitions by default. This overrides the locale determined from system settings or environment variables. *Note Locale::, for a description of locale format. ---------- Footnotes ---------- (1) This document refers to "decimal point," but strictly, the "radix" separates the integer and fractional parts of a floating-point number; in English-speaking countries, the radix is a point ('.'), but in most other countries it is a comma (',').  File: units.info, Node: Defining Your Own Units, Next: Numeric Output Format, Prev: Invoking Units, Up: Top 10 Adding Your Own Definitions ****************************** * Menu: * Units Data Files:: Where are units defined? * Defining New Units:: Writing your own unit and prefix definitions * Defining Nonlinear Units:: Writing your own nonlinear unit definitions * Piecewise Linear Units:: Writing your own piecewise linear definitions * Defining Unit List Aliases:: Writing your own unit list aliases  File: units.info, Node: Units Data Files, Next: Defining New Units, Up: Defining Your Own Units 10.1 Units Data Files ===================== The units and prefixes that 'units' can convert are defined in the units data file, typically '/usr/share/units/definitions.units'. If you can't find this file, run 'units --version' to get information on the file locations for your installation. Although you can extend or modify this data file if you have appropriate user privileges, it's usually better to put extensions in separate files so that the definitions will be preserved if you update 'units'. You can include additional data files in the units database using the '!include' command in the standard units data file. For example !include /usr/local/share/units/local.units might be appropriate for a site-wide supplemental data file. The location of the '!include' statement in the standard units data file is important; later definitions replace earlier ones, so any definitions in an included file will override definitions before the '!include' statement in the standard units data file. With normal invocation, no warning is given about redefinitions; to ensure that you don't have an unintended redefinition, run 'units -c' after making changes to any units data file. If you want to add your own units in addition to or in place of standard or site-wide supplemental units data files, you can include them in the '.units' file in your home directory. If this file exists it is read after the standard units data file, so that any definitions in this file will replace definitions of the same units in the standard data file or in files included from the standard data file. This file will not be read if any units files are specified on the command line. (Under Windows the personal units file is named 'unitdef.units'.) Running 'units -V' will display the location and name of your personal units file. The 'units' program first tries to determine your home directory from the 'HOME' environment variable. On systems running Microsoft Windows, if 'HOME' does not exist, 'units' attempts to find your home directory from 'HOMEDRIVE', 'HOMEPATH' and 'USERPROFILE'. You can specify an arbitrary file as your personal units data file with the 'MYUNITSFILE' environment variable; if this variable exists, its value is used without searching your home directory. The default units data files are described in more detail in *note Data Files::.  File: units.info, Node: Defining New Units, Next: Defining Nonlinear Units, Prev: Units Data Files, Up: Defining Your Own Units 10.2 Defining New Units and Prefixes ==================================== A unit is specified on a single line by giving its name and an equivalence. Comments start with a '#' character, which can appear anywhere in a line. The backslash character ('\') acts as a continuation character if it appears as the last character on a line, making it possible to spread definitions out over several lines if desired. A file can be included by giving the command '!include' followed by the file's name. The '!' must be the first character on the line. The file will be sought in the same directory as the parent file unless you give a full path. The name of the file to be included cannot contain the comment character '#'. Unit names must not contain any of the operator characters '+', '-', '*', '/', '|', '^', ';', '~', the comment character '#', or parentheses. They cannot begin or end with an underscore ('_'), a comma (',') or a decimal point ('.'). The figure dash (U+2012), typographical minus ('-'; U+2212), and en dash ('-'; U+2013) are converted to the operator '-', so none of these characters can appear in unit names. Names cannot begin with a digit, and if a name ends in a digit other than zero, the digit must be preceded by a string beginning with an underscore, and afterwards consisting only of digits, decimal points, or commas. For example, 'foo_2', 'foo_2,1', or 'foo_3.14' are valid names but 'foo2' or 'foo_a2' are invalid. You could define nitrous oxide as N2O nitrogen 2 + oxygen but would need to define nitrogen dioxide as NO_2 nitrogen + oxygen 2 Be careful to define new units in terms of old ones so that a reduction leads to the primitive units, which are marked with '!' characters. Dimensionless units are indicated by using the string '!dimensionless' for the unit definition. When adding new units, be sure to use the '-c' option to check that the new units reduce properly. If you create a loop in the units definitions, then 'units' will hang when invoked with the '-c' option. You will need to use the '--check-verbose' option, which prints out each unit as it is checked. The program will still hang, but the last unit printed will be the unit that caused the infinite loop. If you define any units that contain '+' characters, carefully check them because the '-c' option will not catch non-conformable sums. Be careful with the '-' operator as well. When used as a binary operator, the '-' character can perform addition or multiplication depending on the options used to invoke 'units'. To ensure consistent behavior use '-' only as a unary negation operator when writing units definitions. To multiply two units leave a space or use the '*' operator with care, recalling that it has two possible precedence values and may require parentheses to ensure consistent behavior. To compute the difference of 'foo' and 'bar' write 'foo+(-bar)' or even 'foo+-bar'. Here is an example of a short data file that defines some basic units: m ! # The meter is a primitive unit sec ! # The second is a primitive unit rad !dimensionless # A dimensionless primitive unit micro- 1e-6 # Define a prefix minute 60 sec # A minute is 60 seconds hour 60 min # An hour is 60 minutes inch 0.0254 m # Inch defined in terms of meters ft 12 inches # The foot defined in terms of inches mile 5280 ft # And the mile A unit that ends with a '-' character is a prefix. If a prefix definition contains any '/' characters, be sure they are protected by parentheses. If you define 'half- 1/2' then 'halfmeter' would be equivalent to '1 / (2 meter)'.  File: units.info, Node: Defining Nonlinear Units, Next: Piecewise Linear Units, Prev: Defining New Units, Up: Defining Your Own Units 10.3 Defining Nonlinear Units ============================= Some unit conversions of interest are nonlinear; for example, temperature conversions between the Fahrenheit and Celsius scales cannot be done by simply multiplying by conversion factors. When you give a linear unit definition such as 'inch 2.54 cm' you are providing information that 'units' uses to convert values in inches into primitive units of meters. For nonlinear units, you give a functional definition that provides the same information. Nonlinear units are represented using a functional notation. It is best to regard this notation not as a function call but as a way of adding units to a number, much the same way that writing a linear unit name after a number adds units to that number. Internally, nonlinear units are defined by a pair of functions that convert to and from linear units in the database, so that an eventual conversion to primitive units is possible. Here is an example nonlinear unit definition: tempF(x) units=[1;K] domain=[-459.67,) range=[0,) \ (x+(-32)) degF + stdtemp ; (tempF+(-stdtemp))/degF + 32 A nonlinear unit definition comprises a unit name, a formal parameter name, two functions, and optional specifications for units, the domain, and the range (the domain of the inverse function). The functions tell 'units' how to convert to and from the new unit. To produce valid results, the arguments of these functions need to have the correct dimensions and be within the domains for which the functions are defined. The definition begins with the unit name followed immediately (with no spaces) by a '(' character. In the parentheses is the name of the formal parameter. Next is an optional specification of the units required by the functions in the definition. In the example above, the 'units=[1;K]' specification indicates that the 'tempF' function requires an input argument conformable with '1' (i.e., the argument is dimensionless), and that the inverse function requires an input argument conformable with 'K'. For normal nonlinear units definition, the forward function will always take a dimensionless argument; in general, the inverse function will need units that match the quantity measured by your nonlinear unit. Specifying the units enables 'units' to perform error checking on function arguments, and also to assign units to domain and range specifications, which are described later. Next the function definitions appear. In the example above, the 'tempF' function is defined by tempF(x) = (x+(-32)) degF + stdtemp This gives a rule for converting 'x' in the units 'tempF' to linear units of absolute temperature, which makes it possible to convert from tempF to other units. To enable conversions to Fahrenheit, you must give a rule for the inverse conversions. The inverse will be 'x(tempF)' and its definition appears after a ';' character. In our example, the inverse is x(tempF) = (tempF+(-stdtemp))/degF + 32 This inverse definition takes an absolute temperature as its argument and converts it to the Fahrenheit temperature. The inverse can be omitted by leaving out the ';' character and the inverse definition, but then conversions _to_ the unit will not be possible. If the inverse definition is omitted, the '--check' option will display a warning. It is up to you to calculate and enter the correct inverse function to obtain proper conversions; the '--check' option tests the inverse at one point and prints an error if it is not valid there, but this is not a guarantee that your inverse is correct. With some definitions, the units may vary. For example, the definition square(x) x^2 can have any arbitrary units, and can also take dimensionless arguments. In such a case, you should _not_ specify units. If a definition takes a root of its arguments, the definition is valid only for units that yield such a root. For example, squirt(x) sqrt(x) is valid for a dimensionless argument, and for arguments with even powers of units. Some definitions may not be valid for all real numbers. In such cases, 'units' can handle errors better if you specify an appropriate domain and range. You specify the domain and range as shown below: baume(d) units=[1;g/cm^3] domain=[0,130.5] range=[1,10] \ (145/(145-d)) g/cm^3 ; (baume+-g/cm^3) 145 / baume In this example the domain is specified after 'domain=' with the endpoints given in brackets. In accord with mathematical convention, square brackets indicate a closed interval (one that includes its endpoints), and parentheses indicate an open interval (one that does not include its endpoints). An interval can be open or closed on one or both ends; an interval that is unbounded on either end is indicated by omitting the limit on that end. For example, a quantity to which decibel (dB) is applied may have any value greater than zero, so the range is indicated by '(0,)': decibel(x) units=[1;1] range=(0,) 10^(x/10); 10 log(decibel) If the domain or range is given, the second endpoint must be greater than the first. The domain and range specifications can appear independently and in any order along with the units specification. The values for the domain and range endpoints are attached to the units given in the units specification, and if necessary, the parameter value is adjusted for comparison with the endpoints. For example, if a definition includes 'units=[1;ft]' and 'range=[3,)', the range will be taken as 3 ft to infinity. If the function is passed a parameter of '900 mm', that value will be adjusted to 2.9527559 ft, which is outside the specified range. If you omit the units specification from the previous example, 'units' can not tell whether you intend the lower endpoint to be 3 ft or 3 microfurlongs, and can not adjust the parameter value of 900 mm for comparison. Without units, numerical values other than zero or plus or minus infinity for domain or range endpoints are meaningless, and accordingly they are not allowed. If you give other values without units then the definition will be ignored and you will get an error message. Although the units, domain, and range specifications are optional, it's best to give them when they are applicable; doing so allows 'units' to perform better error checking and give more helpful error messages. Giving the domain and range also enables the '--check' option to find a point in the domain to use for its point check of your inverse definition. You can make synonyms for nonlinear units by providing both the forward and inverse functions; inverse functions can be obtained using the '~' operator. So to create a synonym for 'tempF' you could write fahrenheit(x) units=[1;K] tempF(x); ~tempF(fahrenheit) This is useful for creating a nonlinear unit definition that differs slightly from an existing definition without having to repeat the original functions. For example, dBW(x) units=[1;W] range=[0,) dB(x) W ; ~dB(dBW/W) If you wish a synonym to refer to an existing nonlinear unit without modification, you can do so more simply by adding the synonym with appended parentheses as a new unit, with the existing nonlinear unit--without parentheses--as the definition. So to create a synonym for 'tempF' you could write fahrenheit() tempF The definition must be a nonlinear unit; for example, the synonym fahrenheit() meter will result in an error message when 'units' starts. You may occasionally wish to define a function that operates on units. This can be done using a nonlinear unit definition. For example, the definition below provides conversion between radius and the area of a circle. This definition requires a length as input and produces an area as output, as indicated by the 'units=' specification. Specifying the range as the nonnegative numbers can prevent cryptic error messages. circlearea(r) units=[m;m^2] range=[0,) pi r^2 ; sqrt(circlearea/pi)  File: units.info, Node: Piecewise Linear Units, Next: Defining Unit List Aliases, Prev: Defining Nonlinear Units, Up: Defining Your Own Units 10.4 Defining Piecewise Linear Units ==================================== Sometimes you may be interested in a piecewise linear unit such as many wire gauges. Piecewise linear units can be defined by specifying conversions to linear units on a list of points. Conversion at other points will be done by linear interpolation. A partial definition of zinc gauge is zincgauge[in] 1 0.002, 10 0.02, 15 0.04, 19 0.06, 23 0.1 In this example, 'zincgauge' is the name of the piecewise linear unit. The definition of such a unit is indicated by the embedded '[' character. After the bracket, you should indicate the units to be attached to the numbers in the table. No spaces can appear before the ']' character, so a definition like 'foo[kg meters]' is invalid; instead write 'foo[kg*meters]'. The definition of the unit consists of a list of pairs optionally separated by commas. This list defines a function for converting from the piecewise linear unit to linear units. The first item in each pair is the function argument; the second item is the value of the function at that argument (in the units specified in brackets). In this example, we define 'zincgauge' at five points. For example, we set 'zincgauge(1)' equal to '0.002 in'. Definitions like this may be more readable if written using continuation characters as zincgauge[in] \ 1 0.002 \ 10 0.02 \ 15 0.04 \ 19 0.06 \ 23 0.1 With the preceding definition, the following conversion can be performed: You have: zincgauge(10) You want: in * 0.02 / 50 You have: .01 inch You want: zincgauge 5 If you define a piecewise linear unit that is not strictly monotonic, then the inverse will not be well defined. If the inverse is requested for such a unit, 'units' will return the smallest inverse. After adding nonlinear units definitions, you should normally run 'units --check' to check for errors. If the 'units' keyword is not given, the '--check' option checks a nonlinear unit definition using a dimensionless argument, and then checks using an arbitrary combination of units, as well as the square and cube of that combination; a warning is given if any of these tests fail. For example, Warning: function 'squirt(x)' defined as 'sqrt(x)' failed for some test inputs: squirt(7(kg K)^1): Unit not a root squirt(7(kg K)^3): Unit not a root Running 'units --check' will print a warning if a non-monotonic piecewise linear unit is encountered. For example, the relationship between ANSI coated abrasive designation and mean particle size is non-monotonic in the vicinity of 800 grit: ansicoated[micron] \ . . . 600 10.55 \ 800 11.5 \ 1000 9.5 \ Running 'units --check' would give the error message Table 'ansicoated' lacks unique inverse around entry 800 Although the inverse is not well defined in this region, it's not really an error. Viewing such error messages can be tedious, and if there are enough of them, they can distract from true errors. Error checking for nonlinear unit definitions can be suppressed by giving the 'noerror' keyword; for the examples above, this could be done as squirt(x) noerror domain=[0,) range=[0,) sqrt(x); squirt^2 ansicoated[micron] noerror \ . . . Use the 'noerror' keyword with caution. The safest approach after adding a nonlinear unit definition is to run 'units --check' and confirm that there are no actual errors before adding the 'noerror' keyword.  File: units.info, Node: Defining Unit List Aliases, Prev: Piecewise Linear Units, Up: Defining Your Own Units 10.5 Defining Unit List Aliases =============================== Unit list aliases are treated differently from unit definitions, because they are a data entry shorthand rather than a true definition for a new unit. A unit list alias definition begins with '!unitlist' and includes the alias and the definition; for example, the aliases included in the standard units data file are !unitlist hms hr;min;sec !unitlist time year;day;hr;min;sec !unitlist dms deg;arcmin;arcsec !unitlist ftin ft;in;1|8 in !unitlist usvol cup;3|4 cup;2|3 cup;1|2 cup;1|3 cup;1|4 cup;\ tbsp;tsp;1|2 tsp;1|4 tsp;1|8 tsp Unit list aliases are only for unit lists, so the definition must include a ';'. Unit list aliases can never be combined with units or other unit list aliases, so the definition of 'time' shown above could _not_ have been shortened to 'year;day;hms'. As usual, be sure to run 'units --check' to ensure that the units listed in unit list aliases are conformable.  File: units.info, Node: Numeric Output Format, Next: Localization, Prev: Defining Your Own Units, Up: Top 11 Numeric Output Format ************************ * Menu: * Format Specification:: The output format specification * Flags:: Optional format flags * Field Width:: Specifying output field width * Precision:: Specifying output precision By default, 'units' shows results to eight significant digits. You can change this with the '--exponential', '--digits', and '--output-format' options. The first sets an exponential format (i.e., scientific notation) like that used in the original Unix 'units' program, the second allows you to specify a different number of significant digits, and the last allows you to control the output appearance using the format for the 'printf()' function in the C programming language. If you only want to change the number of significant digits or specify exponential format type, use the '--digits' and '--exponential' options. The '--output-format' option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the 'printf()' format syntax. *Note Invoking Units::, for descriptions of these options.  File: units.info, Node: Format Specification, Next: Flags, Up: Numeric Output Format 11.1 Format Specification ========================= The format specification recognized with the '--output-format' option is a subset of that for 'printf()'. The format specification has the form '%'[flags][width]['.'precision]type; it must begin with '%', and must end with a floating-point type specifier: 'g' or 'G' to specify the number of significant digits, 'e' or 'E' for scientific notation, and 'f' for fixed-point decimal. The ISO C99 standard added the 'F' type for fixed-point decimal and the 'a' and 'A' types for hexadecimal floating point; these types are allowed with compilers that support them. Type length modifiers (e.g., 'L' to indicate a long double) are inapplicable and are not allowed. The default format for 'units' is '%.8g'; for greater precision, you could specify '-o %.15g'. The 'g' and 'G' format types use exponential format whenever the exponent would be less than -4, so the value 0.000013 displays as '1.3e-005'. These types also use exponential notation when the exponent is greater than or equal to the precision, so with the default format, the value 5e7 displays as '50000000' and the value 5e8 displays as '5e+008'. If you prefer fixed-point display, you might specify '-o %.8f'; however, small numbers will display very few significant digits, and values less than 0.5e-8 will show nothing but zeros. The format specification may include one or more optional flags: '+', ' ' (space), '#', '-', or '0' (the digit zero). The digit-grouping flag ''' (apostrophe) is allowed with compilers that support it. Flags are followed by an optional value for the minimum field width, and an optional precision specification that begins with a period (e.g., '.6'). The field width includes the digits, decimal point, the exponent, thousands separators (with the digit-grouping flag), and the sign if any of these are shown.  File: units.info, Node: Flags, Next: Field Width, Prev: Format Specification, Up: Numeric Output Format 11.2 Flags ========== The '+' flag causes the output to have a sign ('+' or '-'). The space flag ' ' is similar to the '+' flag, except that when the value is positive, it is prefixed with a space rather than a plus sign; this flag is ignored if the '+' flag is also given. The '+' or ' ' flag could be useful if conversions might include positive and negative results, and you wanted to align the decimal points in exponential notation. The '#' flag causes the output value to contain a decimal point in all cases; by default, the output contains a decimal point only if there are digits (which can be trailing zeros) to the right of the point. With the 'g' or 'G' types, the '#' flag also prevents the suppression of trailing zeros. The digit-grouping flag ''' shows a thousands separator in digits to the left of the decimal point. This can be useful when displaying large numbers in fixed-point decimal; for example, with the format '%f', You have: mile You want: microfurlong * 8000000.000000 / 0.000000 the magnitude of the first result may not be immediately obvious without counting the digits to the left of the decimal point. If the thousands separator is the comma (','), the output with the format '%'f' might be You have: mile You want: microfurlong * 8,000,000.000000 / 0.000000 making the magnitude readily apparent. Unfortunately, few compilers support the digit-grouping flag. With the '-' flag, the output value is left aligned within the specified field width. If a field width greater than needed to show the output value is specified, the '0' (zero) flag causes the output value to be left padded with zeros until the specified field width is reached; for example, with the format '%011.6f', You have: troypound You want: grain * 5760.000000 / 0000.000174 The '0' flag has no effect if the '-' (left align) flag is given.  File: units.info, Node: Field Width, Next: Precision, Prev: Flags, Up: Numeric Output Format 11.3 Field Width ================ By default, the output value is left aligned and shown with the minimum width necessary for the specified (or default) precision. If a field width greater than this is specified, the value shown is right aligned, and padded on the left with enough spaces to provide the specified field width. A width specification is typically used with fixed-point decimal to have columns of numbers align at the decimal point; this arguably is less useful with 'units' than with long columnar output, but it may nonetheless assist in quickly assessing the relative magnitudes of results. For example, with the format '%12.6f', You have: km You want: in * 39370.078740 / 0.000025 You have: km You want: rod * 198.838782 / 0.005029 You have: km You want: furlong * 4.970970 / 0.201168  File: units.info, Node: Precision, Prev: Field Width, Up: Numeric Output Format 11.4 Precision ============== The meaning of "precision" depends on the format type. With 'g' or 'G', it specifies the number of significant digits (like the '--digits' option); with 'e', 'E', 'f', or 'F', it specifies the maximum number of digits to be shown after the decimal point. With the 'g' and 'G' format types, trailing zeros are suppressed, so the results may sometimes have fewer digits than the specified precision (as indicated above, the '#' flag causes trailing zeros to be displayed). The default precision is 6, so '%g' is equivalent to '%.6g', and would show the output to six significant digits. Similarly, '%e' or '%f' would show the output with six digits after the decimal point. The C 'printf()' function allows a precision of arbitrary size, whether or not all of the digits are meaningful. With most compilers, the maximum internal precision with 'units' is 15 decimal digits (or 13 hexadecimal digits). With the '--digits' option, you are limited to the maximum internal precision; with the '--output-format' option, you may specify a precision greater than this, but it may not be meaningful. In some cases, specifying excess precision can result in rounding artifacts. For example, a pound is exactly 7000 grains, but with the format '%.18g', the output might be You have: pound You want: grain * 6999.9999999999991 / 0.00014285714285714287 With the format '%.25g' you might get the following: You have: 1/3 You want: Definition: 0.333333333333333314829616256247 In this case the displayed value includes a series of digits that represent the underlying binary floating-point approximation to 1/3 but are not meaningful for the desired computation. In general, the result with excess precision is system dependent. The precision affects only the _display_ of numbers; if a result relies on physical constants that are not known to the specified precision, the number of physically meaningful digits may be less than the number of digits shown. See the documentation for 'printf()' for more detailed descriptions of the format specification. The '--output-format' option is incompatible with the '--exponential' or '--digits' options; if the former is given in combination with either of the latter, the format is controlled by the last option given.  File: units.info, Node: Localization, Next: Environment Vars, Prev: Numeric Output Format, Up: Top 12 Localization *************** * Menu: * Locale:: What is a locale? * Additional Localization:: When the locale isn't enough Some units have different values in different locations. The localization feature accommodates this by allowing a units data file to specify definitions that depend on the user's locale.  File: units.info, Node: Locale, Next: Additional Localization, Up: Localization 12.1 Locale =========== A locale is a subset of a user's environment that indicates the user's language and country, and some attendant preferences, such as the formatting of dates. The 'units' program attempts to determine the locale from the POSIX setlocale function; if this cannot be done, 'units' examines the environment variables 'LC_CTYPE' and 'LANG'. On POSIX systems, a locale is of the form LANGUAGE'_'COUNTRY, where LANGUAGE is the two-character code from ISO 639-1 and COUNTRY is the two-character code from ISO 3166-1; LANGUAGE is lower case and COUNTRY is upper case. For example, the POSIX locale for the United Kingdom is 'en_GB'. On systems running Microsoft Windows, the value returned by setlocale() is different from that on POSIX systems; 'units' attempts to map the Windows value to a POSIX value by means of a table in the file 'locale_map.txt' in the same directory as the other data files. The file includes entries for many combinations of language and country, and can be extended to include other combinations. The 'locale_map.txt' file comprises two tab-separated columns; each entry is of the form WINDOWS-LOCALE POSIX-LOCALE where POSIX-LOCALE is as described above, and WINDOWS-LOCALE typically spells out both the language and country. For example, the entry for the United States is English_United States en_US You can force 'units' to run in a desired locale by using the '-l' option. In order to create unit definitions for a particular locale you begin a block of definitions in a unit datafile with '!locale' followed by a locale name. The '!' must be the first character on the line. The 'units' program reads the following definitions only if the current locale matches. You end the block of localized units with '!endlocale'. Here is an example, which defines the British gallon. !locale en_GB gallon 4.54609 liter !endlocale  File: units.info, Node: Additional Localization, Prev: Locale, Up: Localization 12.2 Additional Localization ============================ Sometimes the locale isn't sufficient to determine unit preferences. There could be regional preferences, or a company could have specific preferences. Though probably uncommon, such differences could arise with the choice of English customary units outside of English-speaking countries. To address this, 'units' allows specifying definitions that depend on environment variable settings. The environment variables can be controled based on the current locale, or the user can set them to force a particular group of definitions. A conditional block of definitions in a units data file begins with either '!var' or '!varnot' following by an environment variable name and then a space separated list of values. The leading '!' must appear in the first column of a units data file, and the conditional block is terminated by '!endvar'. Definitions in blocks beginning with '!var' are executed only if the environment variable is exactly equal to one of the listed values. Definitions in blocks beginning with '!varnot' are executed only if the environment variable does _not_ equal any of the list values. The inch has long been a customary measure of length in many places. The word comes from the latin _uncia_ meaning "one twelfth," referring to its relationship with the foot. By the 20th century, the inch was officially defined in English-speaking countries relative to the yard, but until 1959, the yard differed slightly among those countries. In France the customary inch, which was displaced in 1799 by the meter, had a different length based on a french foot. These customary definitions could be accommodated as follows: !var INCH_UNIT usa yard 3600|3937 m !endvar !var INCH_UNIT canada yard 0.9144 meter !endvar !var INCH_UNIT uk yard 0.91439841 meter !endvar !var INCH_UNIT canada uk usa foot 1|3 yard inch 1|12 foot !endvar !var INCH_UNIT france foot 144|443.296 m inch 1|12 foot line 1|12 inch !endvar !varnot INCH_UNIT usa uk france canada !message Unknown value for INCH_UNIT !endvar When 'units' reads the above definitions it will check the environment variable 'INCH_UNIT' and load only the definitions for the appropriate section. If 'INCH_UNIT' is unset or is not set to one of the four values listed then 'units' will run the last block. In this case that block uses the '!message' command to display a warning message. Alternatively that block could set default values. In order to create default values that are overridden by user settings the data file can use the '!set' command, which sets an environment variable _only if it is not already set_; these settings are only for the current 'units' invocation and do not persist. So if the example above were preceded by '!set INCH_UNIT france' then this would make 'france' the default value for 'INCH_UNIT'. If the user had set the variable in the environment before invoking 'units', then 'units' would use the user's value. To link these settings to the user's locale you combine the '!set' command with the '!locale' command. If you wanted to combine the above example with suitable locales you could do by _preceding_ the above definition with the following: !locale en_US !set INCH_UNIT usa !endlocale !locale en_GB !set INCH_UNIT uk !endlocale !locale en_CA !set INCH_UNIT canada !endlocale !locale fr_FR !set INCH_UNIT france !endlocale !set INCH_UNIT france These definitions set the overall default for 'INCH_UNIT' to 'france' and set default values for four locales appropriately. The overall default setting comes last so that it only applies when 'INCH_UNIT' was not set by one of the other commands or by the user. If the variable given after '!var' or '!varnot' is undefined then 'units' prints an error message and ignores the definitions that follow. Use '!set' to create defaults to prevent this situation from arising. The '-c' option only checks the definitions that are active for the current environment and locale, so when adding new definitions take care to check that all cases give rise to a well defined set of definitions.  File: units.info, Node: Environment Vars, Next: Data Files, Prev: Localization, Up: Top 13 Environment Variables ************************ The 'units' program uses the following environment variables: 'HOME' Specifies the location of your home directory; it is used by 'units' to find a personal units data file '.units'. On systems running Microsoft Windows, the file is 'unitdef.units', and if 'HOME' does not exist, 'units' tries to determine your home directory from the 'HOMEDRIVE' and 'HOMEPATH' environment variables; if these variables do not exist, units finally tries 'USERPROFILE'--typically 'C:\Users\USERNAME' (Windows Vista and Windows 7) or 'C:\Documents and Settings\USERNAME' (Windows XP). 'LC_CTYPE, LANG' Checked to determine the locale if 'units' cannot obtain it from the operating system. Sections of the standard units data file are specific to certain locales. 'MYUNITSFILE' Specifies your personal units data file. If this variable exists, 'units' uses its value rather than searching your home directory for '.units'. The personal units file will not be loaded if any data files are given using the '-f' option. 'PAGER' Specifies the pager to use for help and for displaying the conformable units. The help function browses the units database and calls the pager using the '+n'N syntax for specifying a line number. The default pager is 'more'; 'PAGER' can be used to specify alternatives such as 'less', 'pg', 'emacs', or 'vi'. 'UNITS_ENGLISH' Set to either 'US' or 'GB' to choose United States or British volume definitions, overriding the default from your locale. 'UNITSFILE' Specifies the units data file to use (instead of the default). You can only specify a single units data file using this environment variable. If units data files are given using the '-f' option, the file specified by 'UNITSFILE' will be not be loaded unless the '-f' option is given with the empty string ('units -f ""'). 'UNITSLOCALEMAP' Windows only; this variable has no effect on Unix-like systems. Specifies the units locale map file to use (instead of the default). This variable seldom needs to be set, but you can use it to ensure that the locale map file will be found if you specify a location for the units data file using either the '-f' option or the 'UNITSFILE' environment variable, and that location does not also contain the locale map file.  File: units.info, Node: Data Files, Next: Unicode Support, Prev: Environment Vars, Up: Top 14 Data Files ************* The 'units' program uses two default data files: 'definitions.units' and 'currency.units'. The program can also use an optional personal units data file '.units' ('unitdef.units' under Windows) located in the user's home directory. The personal units data file is described in more detail in *note Units Data Files::. On Unix-like systems, the data files are typically located in '/usr/share/units' if 'units' is provided with the operating system, or in '/usr/local/share/units' if 'units' is compiled from the source distribution. On systems running Microsoft Windows, the files may be in the same locations if Unix-like commands are available, a Unix-like file structure is present (e.g., 'C:/usr/local'), and 'units' is compiled from the source distribution. If Unix-like commands are not available, a more common location is 'C:\Program Files (x86)\GNU\units' (for 64-bit Windows installations) or 'C:\Program Files\GNU\units' (for 32-bit installations). If 'units' is obtained from the GNU Win32 Project (), the files are commonly in 'C:\Program Files\GnuWin32\share\units'. If the default units data file is not an absolute pathname, 'units' will look for the file in the directory that contains the 'units' program; if the file is not found there, 'units' will look in a directory '../share/units' relative to the directory with the 'units' program. You can determine the location of the files by running 'units --version'. Running 'units --info' will give you additional information about the files, how 'units' will attempt to find them, and the status of the related environment variables.  File: units.info, Node: Unicode Support, Next: Readline Support, Prev: Data Files, Up: Top 15 Unicode Support ****************** The standard units data file is in Unicode, using UTF-8 encoding. Most definitions use only ASCII characters (i.e., code points U+0000 through U+007F); definitions using non-ASCII characters appear in blocks beginning with '!utf8' and ending with '!endutf8'. When 'units' starts, it checks the locale to determine the character set. If 'units' is compiled with Unicode support and definitions; otherwise these definitions are ignored. When Unicode support is active, 'units' will check every line of all of the units data files for invalid or non-printing UTF-8 sequences; if such sequences occur, 'units' ignores the entire line. In addition to checking validity, 'units' determines the display width of non-ASCII characters to ensure proper positioning of the pointer in some error messages and to align columns for the 'search' and '?' commands. At present, 'units' does not support Unicode under Microsoft Windows. The UTF-16 and UTF-32 encodings are not supported on any systems. If definitions that contain non-ASCII characters are added to a units data file, those definitions should be enclosed within '!utf8' ... '!endutf8' to ensure that they are only loaded when Unicode support is available. As usual, the '!' must appear as the first character on the line. As discussed in *note Units Data Files::, it's usually best to put such definitions in supplemental data files linked by an '!include' command or in a personal units data file. When Unicode support is not active, 'units' makes no assumptions about character encoding, except that characters in the range 00-7F hexadecimal correspond to ASCII encoding. Non-ASCII characters are simply sequences of bytes, and have no special meanings; for definitions in supplementary units data files, you can use any encoding consistent with this assumption. For example, if you wish to use non-ASCII characters in definitions when running 'units' under Windows, you can use a character set such as Windows "ANSI" (code page 1252 in the US and Western Europe). You can even use UTF-8, though some messages may be improperly aligned, and 'units' will not detect invalid UTF-8 sequences. If you use UTF-8 encoding when Unicode support is not active, you should place any definitions with non-ASCII characters _outside_ '!utf8' ... '!endutf8' blocks--otherwise, they will be ignored. Typeset material other than code examples usually uses the Unicode minus (U+2212) rather than the ASCII hyphen-minus operator (U+002D) used in 'units'; the figure dash (U+2012) and en dash (U+2013) are also occasionally used. To allow such material to be copied and pasted for interactive use or in units data files, 'units' converts these characters to U+002D before further processing. Because of this, none of these characters can appear in unit names.  File: units.info, Node: Readline Support, Next: Currency, Prev: Unicode Support, Up: Top 16 Readline Support ******************* If the 'readline' package has been compiled in, then when 'units' is used interactively, numerous command line editing features are available. To check if your version of 'units' includes 'readline', invoke the program with the '--version' option. For complete information about 'readline', consult the documentation for the 'readline' package. Without any configuration, 'units' will allow editing in the style of emacs. Of particular use with 'units' are the completion commands. If you type a few characters and then hit followed by '?' then 'units' will display a list of all the units that start with the characters typed. For example, if you type 'metr' and then request completion, you will see something like this: You have: metr metre metriccup metrichorsepower metrictenth metretes metricfifth metricounce metricton metriccarat metricgrain metricquart metricyarncount You have: metr If there is a unique way to complete a unitname, you can hit the key and 'units' will provide the rest of the unit name. If 'units' beeps, it means that there is no unique completion. Pressing the key a second time will print the list of all completions. The readline library also keeps a history of the values you enter. You can move through this history using the up and down arrows. The history is saved to the file '.units_history' in your home directory so that it will persist across multiple 'units' invocations. If you wish to keep work for a certain project separate you can change the history filename using the '--history' option. You could, for example, make an alias for 'units' to 'units --history .units_history' so that 'units' would save separate history in the current directory. The length of each history file is limited to 5000 lines. Note also that if you run several concurrent copies of 'units' each one will save its new history to the history file upon exit.  File: units.info, Node: Currency, Next: Database Syntax, Prev: Readline Support, Up: Top 17 Updating Currency Exchange Rates *********************************** The units program includes currency exchange rates and prices for some precious metals in the database. Of course, these values change over time, sometimes very rapidly, and 'units' cannot provide real time values. To update the exchange rates run the 'units_cur', which rewrites the files containing the currency rates, typically '/usr/share/units/currency.units'. This program requires 'python' and the 'unidecode' package, and must be run with suitable permissions to write the file. To keep the rates updated automatically, run it using a cron job on a Unix-like system, or a similar scheduling program on a different system. Currency exchange rates are taken from Time Genie () and precious metals pricing from Packetizer (). These sites update once per day, so there is no benefit in running the update script more often than daily. You can run 'units_cur' with a filename specified on the command line and it will write the data to that file. If you give '-' for the file it will write to standard output.  File: units.info, Node: Database Syntax, Next: GNU Free Documentation License, Prev: Currency, Up: Top 18 Database Command Syntax ************************** UNIT DEFINITION Define a regular unit. PREFIX- DEFINITION Define a prefix. FUNCNAME(VAR) noerror units=[IN-UNITS,OUT-UNITS] domain=[X1,X2] range=[Y1,Y2] DEFINITION(VAR) ; INVERSE(FUNCNAME) Define a nonlinear unit or unit function. The four optional keywords 'noerror', 'units=', 'range=' and 'domain=' can appear in any order. The definition of the inverse is optional. TABNAME[OUT-UNITS] noerror PAIR-LIST Define a piecewise linear unit. The pair list gives the points on the table listed in ascending order. The 'noerror' keyword is optional. !endlocale End a block of definitions beginning with '!locale' !endutf8 End a block of definitions begun with '!utf8' !endvar End a block of definitions begun with '!var' or '!varnot' !include FILE Include the specified file. !locale VALUE Load the following definitions only of the locale is set to VALUE. !message TEXT Display TEXT when the database is read unless the quiet option ('-q') is enabled. !set VARIABLE VALUE Sets the environment variable, VARIABLE, to the specified value _only if_ it is not already set. !unitlist ALIAS DEFINITION Define a unit list alias. !utf8 Load the following definitions only if 'units' is running with UTF-8 enabled. !var ENVAR VALUE-LIST Load the block of definitions that follows only if the environment variable ENVAR is set to one of the values listed in the space-separated value list. If ENVAR is not set, 'units' prints an error message and ignores the block of definitions. !varnot ENVAR VALUE-LIST Load the block of definitions that follows only if the environment variable ENVAR is set to value that is _not_ listed in the space-separated value list. If ENVAR is not set, 'units' prints an error message and ignores the block of definitions.  File: units.info, Node: GNU Free Documentation License, Next: Index, Prev: Database Syntax, Up: Top 19 GNU Free Documentation License ********************************* Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.  File: units.info, Node: Index, Prev: GNU Free Documentation License, Up: Top Index ***** [index] * Menu: * '!' to indicate primitive units: Defining New Units. (line 6) * '!endlocale': Localization. (line 6) * '!endutf8': Unicode Support. (line 6) * '!include': Units Data Files. (line 6) * '!locale': Localization. (line 6) * '!unitlist': Defining Unit List Aliases. (line 6) * '!utf8': Unicode Support. (line 6) * '*' operator: Operators. (line 14) * '**' operator: Operators. (line 65) * '+' operator: Sums and Differences of Units. (line 6) * '-' as multiplication operator: Backwards Compatibility. (line 17) * '-' as subtraction operator: Sums and Differences of Units. (line 6) * --check (option for 'units'): Invoking Units. (line 50) * --check-verbose (option for 'units'): Invoking Units. (line 59) * --compact (option for 'units'): Invoking Units. (line 170) * --digits (option for 'units'): Invoking Units. (line 67) * --exponential (option for 'units'): Invoking Units. (line 84) * --file (option for 'units'): Invoking Units. (line 115) * --file (option for 'units') <1>: Invoking Units. (line 137) * --help (option for 'units'): Invoking Units. (line 146) * --info (option for 'units'): Invoking Units. (line 256) * --locale (option for 'units'): Invoking Units. (line 275) * --log (option for 'units'): Invoking Units. (line 127) * --minus (option for 'units'): Invoking Units. (line 150) * --newstar (option for 'units'): Invoking Units. (line 165) * --oldstar (option for 'units'): Invoking Units. (line 161) * --one-line (option for 'units'): Invoking Units. (line 218) * --output-format (option for 'units'): Invoking Units. (line 93) * --product (option for 'units'): Invoking Units. (line 155) * --quiet (option for 'units'): Invoking Units. (line 176) * --silent (option for 'units'): Invoking Units. (line 176) * --strict (option for 'units'): Invoking Units. (line 209) * --terse (option for 'units'): Invoking Units. (line 225) * --unitsfile (option for 'units'): Invoking Units. (line 270) * --verbose (option for 'units'): Invoking Units. (line 234) * --verbose-check (option for 'units'): Invoking Units. (line 59) * --version (option for 'units'): Invoking Units. (line 241) * -1 (option for 'units'): Invoking Units. (line 218) * -c (option for 'units'): Invoking Units. (line 50) * -d (option for 'units'): Invoking Units. (line 67) * -e (option for 'units'): Invoking Units. (line 84) * -f (option for 'units'): Invoking Units. (line 115) * -f (option for 'units') <1>: Invoking Units. (line 137) * -h (option for 'units'): Invoking Units. (line 146) * -I (option for 'units'): Invoking Units. (line 256) * -L (option for 'units'): Invoking Units. (line 127) * -l (option for 'units'): Invoking Units. (line 275) * -m (option for 'units'): Invoking Units. (line 150) * -o (option for 'units'): Invoking Units. (line 93) * -p (option for 'units'): Invoking Units. (line 155) * -q (option for 'units'): Invoking Units. (line 176) * -s (option for 'units'): Invoking Units. (line 209) * -t (option for 'units'): Invoking Units. (line 225) * -U (option for 'units'): Invoking Units. (line 270) * -v (option for 'units'): Invoking Units. (line 234) * -V (option for 'units'): Invoking Units. (line 241) * '?' for unit completion with 'readline': Readline Support. (line 16) * '?' to show conformable units: Interactive Use. (line 131) * '_' to use result of previous conversion: Previous Result. (line 6) * '|' operator: Operators. (line 46) * abrasive grit size: Other Nonlinear Units. (line 36) * addition of units: Sums and Differences of Units. (line 9) * additional units data files: Units Data Files. (line 6) * backwards compatibility: Backwards Compatibility. (line 6) * British Imperial measure: Unit Definitions. (line 36) * circle, area of: Other Nonlinear Units. (line 42) * command, '!' to indicate primitive units: Defining New Units. (line 6) * command, '!endlocale': Localization. (line 6) * command, '!endutf8': Unicode Support. (line 6) * command, '!endvar': Localization. (line 6) * command, '!include': Units Data Files. (line 6) * command, '!locale': Localization. (line 6) * command, '!message': Localization. (line 6) * command, '!set': Localization. (line 6) * command, '!unitlist': Defining Unit List Aliases. (line 6) * command, '!utf8': Unicode Support. (line 6) * command, '!var': Localization. (line 6) * command, '!varnot': Localization. (line 6) * command-line options: Invoking Units. (line 6) * command-line unit conversion: Command Line Use. (line 6) * commands in units database: Database Syntax. (line 6) * compatibility: Backwards Compatibility. (line 6) * compatibility with earlier versions: Backwards Compatibility. (line 6) * completion, unit, using '?' ('readline' only): Readline Support. (line 16) * conformable units, '?' to show: Interactive Use. (line 131) * currency, updating: Currency. (line 6) * Darcy-Weisbach equation: Complicated Unit Expressions. (line 7) * data files: Data Files. (line 6) * data files, additional: Units Data Files. (line 6) * database syntax summary: Database Syntax. (line 6) * defining nonlinear units: Defining Nonlinear Units. (line 6) * defining piecewise linear units: Piecewise Linear Units. (line 6) * defining prefixes: Defining New Units. (line 6) * defining unit list aliases: Defining Unit List Aliases. (line 6) * defining units: Defining New Units. (line 6) * defining units with '-': Backwards Compatibility. (line 33) * differences of units: Sums and Differences of Units. (line 9) * dimensionless units: Interactive Use. (line 129) * dimensionless units, defining: Defining New Units. (line 38) * division of numbers: Operators. (line 46) * division of units: Operators. (line 14) * domain, nonlinear unit definitions: Defining Nonlinear Units. (line 90) * environment dependent definitions: Localization. (line 6) * environment variable, HOME: Environment Vars. (line 9) * environment variable, LANG: Environment Vars. (line 20) * environment variable, LC_CTYPE: Environment Vars. (line 20) * environment variable, MYUNITSFILE: Units Data Files. (line 43) * environment variable, MYUNITSFILE <1>: Environment Vars. (line 25) * environment variable, PAGER: Environment Vars. (line 31) * environment variable, UNITSFILE: Environment Vars. (line 42) * environment variable, UNITSLOCALEMAP: Environment Vars. (line 49) * environment variable, UNITS_ENGLISH: Environment Vars. (line 38) * environment variables: Environment Vars. (line 6) * exchange rates, updating: Currency. (line 6) * exponent operator: Operators. (line 65) * files, data: Data Files. (line 6) * flags, output format: Flags. (line 6) * format specification, output: Format Specification. (line 6) * fractions, numerical: Operators. (line 46) * functions of units: Defining Nonlinear Units. (line 162) * functions, built in: Built-in Functions. (line 6) * help: Interactive Use. (line 137) * help <1>: Environment Vars. (line 31) * HOME environment variable: Environment Vars. (line 9) * hyphen as multiplication operator: Backwards Compatibility. (line 17) * Imperial measure: Unit Definitions. (line 36) * include files: Defining New Units. (line 15) * including additional units data files: Units Data Files. (line 6) * incompatible units: Interactive Use. (line 87) * interactive use: Interactive Use. (line 6) * international mile: Unit Definitions. (line 76) * international yard: Unit Definitions. (line 76) * invoking units: Invoking Units. (line 6) * LANG environment variable: Environment Vars. (line 20) * LC_CTYPE environment variable: Environment Vars. (line 20) * length measure, English customary: Unit Definitions. (line 76) * length measure, UK: Unit Definitions. (line 76) * linear interpolation: Piecewise Linear Units. (line 6) * locale: Locale. (line 6) * 'locale_map.txt': Locale. (line 17) * localization: Localization. (line 6) * log file: Logging Calculations. (line 6) * logging calculations: Logging Calculations. (line 6) * measure, Imperial: Unit Definitions. (line 36) * mile, international: Unit Definitions. (line 76) * minus ('-') operator, subtraction: Sums and Differences of Units. (line 6) * multiplication of units: Operators. (line 14) * multiplication, hyphen: Backwards Compatibility. (line 17) * MYUNITSFILE environment variable: Units Data Files. (line 43) * MYUNITSFILE environment variable <1>: Environment Vars. (line 25) * non-conformable units: Interactive Use. (line 87) * non-interactive unit conversion: Command Line Use. (line 6) * nonlinear unit conversions: Nonlinear Conversions. (line 6) * nonlinear unit conversions <1>: Defining Nonlinear Units. (line 6) * nonlinear units, defining: Defining Nonlinear Units. (line 6) * nonlinear units, other: Other Nonlinear Units. (line 6) * numbers as units: Numbers as Units. (line 6) * numeric output format: Numeric Output Format. (line 6) * numerical fractions: Operators. (line 46) * operator precedence: Operators. (line 36) * operator, ('**'): Operators. (line 65) * operator, caret ('^'): Operators. (line 65) * operator, hyphen ('-') as multiplication: Backwards Compatibility. (line 17) * operator, hyphen ('-') as subtraction: Sums and Differences of Units. (line 6) * operator, minus ('-'): Sums and Differences of Units. (line 6) * operator, 'per': Operators. (line 14) * operator, plus ('+'): Sums and Differences of Units. (line 6) * operator, slash ('/'): Operators. (line 14) * operator, solidus ('/'): Operators. (line 14) * operator, space: Operators. (line 14) * operator, star ('*'): Operators. (line 14) * operator, vertical bar ('|'): Operators. (line 46) * operators: Operators. (line 6) * output field width: Field Width. (line 6) * output format: Numeric Output Format. (line 6) * output format flags: Flags. (line 6) * output format specification: Format Specification. (line 6) * output precision: Precision. (line 6) * PAGER environment variable: Environment Vars. (line 31) * parentheses: Operators. (line 29) * parentheses <1>: Operators. (line 36) * parentheses <2>: Operators. (line 65) * parentheses <3>: Sums and Differences of Units. (line 33) * parentheses <4>: Complicated Unit Expressions. (line 27) * parentheses <5>: Defining New Units. (line 47) * parentheses <6>: Defining New Units. (line 71) * parentheses <7>: Defining Nonlinear Units. (line 36) * 'per' operator: Operators. (line 14) * personal units data file: Units Data Files. (line 28) * piecewise linear units: Piecewise Linear Units. (line 6) * plus ('+') operator: Sums and Differences of Units. (line 6) * powers: Operators. (line 65) * precision, output: Precision. (line 6) * prefixes: Unit Definitions. (line 55) * prefixes and exponents: Operators. (line 77) * prefixes, definition of: Defining New Units. (line 6) * previous result: Previous Result. (line 6) * primitive units: Defining New Units. (line 6) * products of units: Operators. (line 14) * quotients of units: Operators. (line 14) * range, nonlinear unit definitions: Defining Nonlinear Units. (line 90) * 'readline', use with 'units': Readline Support. (line 6) * reciprocal conversion: Interactive Use. (line 62) * roots: Built-in Functions. (line 27) * setlocale function: Locale. (line 17) * slash ('/') operator: Operators. (line 14) * solidus ('/') operator: Operators. (line 14) * sphere, volume of: Other Nonlinear Units. (line 42) * square roots: Built-in Functions. (line 27) * star ('*') operator: Operators. (line 14) * State Plane Coordinate System, US: Unit Definitions. (line 76) * strict conversion: Interactive Use. (line 71) * subtraction of units: Sums and Differences of Units. (line 9) * sums and differences of units: Sums and Differences of Units. (line 6) * sums of units: Sums and Differences of Units. (line 9) * sums of units <1>: Unit Lists. (line 6) * survey foot, US: Unit Definitions. (line 76) * survey measure, US: Unit Definitions. (line 76) * survey mile, US: Unit Definitions. (line 76) * syntax of units database: Database Syntax. (line 6) * temperature conversions: Temperature Conversions. (line 6) * Unicode support: Unicode Support. (line 6) * unit completion using '?' ('readline' only): Readline Support. (line 16) * unit definitions: Unit Definitions. (line 6) * unit expressions: Unit Expressions. (line 6) * unit expressions, complicated: Complicated Unit Expressions. (line 6) * unit list aliases, defining: Defining Unit List Aliases. (line 6) * unit lists: Unit Lists. (line 6) * unit name completion: Readline Support. (line 19) * units data file, personal: Units Data Files. (line 28) * units data files, additional: Units Data Files. (line 6) * units definitions, adding: Defining New Units. (line 6) * units definitions, changing: Defining New Units. (line 6) * units functions: Defining Nonlinear Units. (line 162) * units quotients: Operators. (line 14) * units, definition of: Defining New Units. (line 6) * units, lookup method: Unit Definitions. (line 46) * units, piecewise linear: Piecewise Linear Units. (line 6) * units, primitive: Defining New Units. (line 6) * units, sums and differences: Sums and Differences of Units. (line 6) * units, sums of: Unit Lists. (line 6) * UNITSFILE environment variable: Environment Vars. (line 42) * UNITSLOCALEMAP environment variable: Environment Vars. (line 49) * UNITS_ENGLISH environment variable: Environment Vars. (line 38) * US State Plane Coordinate System: Unit Definitions. (line 76) * US survey foot: Unit Definitions. (line 76) * US survey measure: Unit Definitions. (line 76) * US survey mile: Unit Definitions. (line 76) * UTF-8: Unicode Support. (line 6) * verbose output: Interactive Use. (line 53) * verbose output <1>: Interactive Use. (line 71) * vertical bar ('|') operator: Operators. (line 46) * volume measure, English customary: Unit Definitions. (line 61) * wire gauge: Other Nonlinear Units. (line 14) * yard, international: Unit Definitions. (line 76)  Tag Table: Node: Top842 Node: Overview2324 Ref: Overview-Footnote-14088 Node: Interactive Use4282 Node: Command Line Use10178 Node: Unit Definitions11424 Node: Unit Expressions17565 Node: Operators18178 Node: Sums and Differences of Units23297 Node: Numbers as Units25339 Node: Built-in Functions26144 Node: Previous Result27427 Node: Complicated Unit Expressions29754 Node: Backwards Compatibility31389 Node: Nonlinear Conversions33290 Node: Temperature Conversions33729 Node: Other Nonlinear Units35794 Node: Unit Lists38931 Node: Logging Calculations47703 Node: Invoking Units50363 Ref: Invoking Units-Footnote-163090 Node: Defining Your Own Units63344 Node: Units Data Files63882 Node: Defining New Units66370 Node: Defining Nonlinear Units70273 Node: Piecewise Linear Units78450 Node: Defining Unit List Aliases82207 Node: Numeric Output Format83367 Node: Format Specification84640 Node: Flags86602 Node: Field Width88685 Node: Precision89720 Node: Localization92177 Node: Locale92620 Node: Additional Localization94633 Node: Environment Vars99086 Node: Data Files101645 Node: Unicode Support103432 Node: Readline Support106392 Node: Currency108536 Node: Database Syntax109773 Node: GNU Free Documentation License111836 Node: Index136968  End Tag Table units-2.12/parse.y0000664000175000017500000003132412303457637013401 0ustar adrianadrian/* * parse.y: the parser for GNU units, a program for units conversion * Copyright (C) 1999, 2000, 2001, 2002, 2007, 2009, 2014 Free Software * Foundation, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * This program was written by Adrian Mariano (adrianm@gnu.org) */ %{ #include "units.h" struct commtype { int location; char *data; struct unittype *result; int errorcode; char *paramname; struct unittype *paramvalue; }; static int err; /* value used by parser to store return values */ #define CHECK if (err) { comm->errorcode=err; YYABORT; } int yylex(); void yyerror(struct commtype *comm, char *); #define MEMSIZE 100 struct unittype *memtable[MEMSIZE]; int nextunit=0; int maxunit=0; struct function { char *name; double (*func)(double); int type; }; #define DIMENSIONLESS 0 #define ANGLEIN 1 #define ANGLEOUT 2 struct unittype * getnewunit() { if (nextunit>=MEMSIZE) return 0; memtable[nextunit] = (struct unittype *) mymalloc(sizeof(struct unittype),"(getnewunit)"); if (!memtable[nextunit]) return 0; initializeunit(memtable[nextunit]); return memtable[nextunit++]; } struct unittype * makenumunit(double num,int *myerr) { struct unittype *ret; ret=getnewunit(); if (!ret){ *myerr = E_PARSEMEM; return 0; } ret->factor = num; *myerr = 0; return ret; } double logb2(double x) { return log(x)/log(2.0); } int funcunit(struct unittype *theunit, struct function *fun) { struct unittype angleunit; if (fun->type==ANGLEIN){ err=unit2num(theunit); if (err==E_NOTANUMBER){ initializeunit(&angleunit); angleunit.denominator[0] = dupstr("radian"); angleunit.denominator[1] = 0; err = multunit(theunit, &angleunit); freeunit(&angleunit); if (!err) err = unit2num(theunit); } if (err) return err; } else if (fun->type==ANGLEOUT || fun->type == DIMENSIONLESS) { if ((err=unit2num(theunit))) return err; } else return E_BADFUNCTYPE; errno = 0; theunit->factor = (*(fun->func))(theunit->factor); if (errno) return E_FUNC; if (fun->type==ANGLEOUT) { theunit->numerator[0] = dupstr("radian"); theunit->numerator[1] = 0; } return 0; } %} %parse-param {struct commtype *comm} %lex-param {struct commtype *comm} %pure_parser %name-prefix="units" %union { double number; int integer; struct unittype *utype; struct function *dfunc; struct func *ufunc; } %token REAL %token UNIT %token RFUNC %token UFUNC %token EXPONENT %token MULTIPLY %token MULTSTAR %token DIVIDE %token NUMDIV %token SQRT %token CUBEROOT %token MULTMINUS %token EOL %token FUNCINV %token MEMERROR %token BADNUMBER %token UNITEND %token LASTUNSET %type numexpr %type expr %type list %type pexpr %type unitexpr %left ADD MINUS %left UNARY %left DIVIDE MULTSTAR %left MULTIPLY MULTMINUS %nonassoc '(' SQRT CUBEROOT RFUNC UNIT REAL UFUNC FUNCINV MEMERROR BADNUMBER UNITEND LASTUNSET %right EXPONENT %left NUMDIV %% input: EOL { comm->result = makenumunit(1,&err); CHECK; YYACCEPT; } | unitexpr EOL { comm->result = $1; YYACCEPT; } | error { YYABORT; } ; unitexpr: expr {$$ = $1;} | DIVIDE list { invertunit($2); $$=$2;} ; expr: list { $$ = $1; } | MULTMINUS list %prec UNARY { $$ = $2; $$->factor *= -1; } | MINUS list %prec UNARY { $$ = $2; $$->factor *= -1; } | expr ADD expr { err = addunit($1,$3); CHECK; $$=$1;} | expr MINUS expr { $3->factor *= -1; err = addunit($1,$3); CHECK; $$=$1;} | expr DIVIDE expr { err = divunit($1, $3); CHECK; $$=$1;} | expr MULTIPLY expr { err = multunit($1,$3); CHECK; $$=$1;} | expr MULTSTAR expr { err = multunit($1,$3); CHECK; $$=$1;} ; numexpr: REAL { $$ = $1; } | numexpr NUMDIV numexpr { $$ = $1 / $3; } ; pexpr: '(' expr ')' { $$ = $2; } ; /* list is a list of units, possibly raised to powers, to be multiplied together. */ list: numexpr { $$ = makenumunit($1,&err); CHECK;} | UNIT { $$ = $1; } | list EXPONENT list { err = unitpower($1,$3); CHECK; $$=$1;} | list MULTMINUS list { err = multunit($1,$3); CHECK; $$=$1;} | list list %prec MULTIPLY { err = multunit($1,$2); CHECK; $$=$1;} | pexpr { $$=$1; } | SQRT pexpr { err = rootunit($2,2); CHECK; $$=$2;} | CUBEROOT pexpr { err = rootunit($2,3); CHECK; $$=$2;} | RFUNC pexpr { err = funcunit($2,$1); CHECK; $$=$2;} | UFUNC pexpr { err = evalfunc($2,$1,0,0); CHECK; $$=$2;} | FUNCINV UFUNC pexpr { err = evalfunc($3,$2,1,0); CHECK; $$=$3;} | list EXPONENT MULTMINUS list %prec EXPONENT { $4->factor *= -1; err = unitpower($1,$4); CHECK; $$=$1;} | list EXPONENT MINUS list %prec EXPONENT { $4->factor *= -1; err = unitpower($1,$4); CHECK; $$=$1;} | BADNUMBER { err = E_BADNUM; CHECK; } | MEMERROR { err = E_PARSEMEM; CHECK; } | UNITEND { err = E_UNITEND; CHECK; } | LASTUNSET { err = E_LASTUNSET; CHECK; } | FUNCINV UNIT { err = E_NOTAFUNC; CHECK; } ; %% #ifndef strchr # ifdef NO_STRCHR # define strchr(a,b) index((a),(b)) # else char *strchr(); # endif #endif /* !strchr */ double strtod(); struct function realfunctions[] = { {"sin", sin, ANGLEIN}, {"cos", cos, ANGLEIN}, {"tan", tan, ANGLEIN}, {"ln", log, DIMENSIONLESS}, {"log", log10, DIMENSIONLESS}, {"log2", logb2, DIMENSIONLESS}, {"exp", exp, DIMENSIONLESS}, {"acos", acos, ANGLEOUT}, {"atan", atan, ANGLEOUT}, {"asin", asin, ANGLEOUT}, {0, 0, 0}}; struct { char op; int value; } optable[] = { {'*', MULTIPLY}, {'/', DIVIDE}, {'|', NUMDIV}, {'+', ADD}, {'(', '('}, {')', ')'}, {'^', EXPONENT}, {'~', FUNCINV}, {0, 0}}; struct { char *name; int value; } strtable[] = { {"sqrt", SQRT}, {"cuberoot", CUBEROOT}, {"per" , DIVIDE}, {0, 0}}; #define LASTUNIT '_' /* Last unit symbol */ int yylex(YYSTYPE *lvalp, struct commtype *comm) { int length, count; struct unittype *output; char *inptr; char *nonunitchars = "~;+-*/|\t\n^ ()"; /* Chars not allowed in unit name */ char *nonunitends = ".,_"; /* Can't start or end a unit */ char *number_start = ".,0123456789"; /* Can be first char of a number */ if (comm->location==-1) return 0; inptr = comm->data + comm->location; /* Point to start of data */ /* Skip white space */ while( *inptr && strchr(WHITE,*inptr)) inptr++, comm->location++; if (*inptr==0) { comm->location = -1; return EOL; /* Return failure if string has ended */ } /* Check for **, an exponent operator. */ if (0==strncmp("**",inptr,2)){ comm->location += 2; return EXPONENT; } /* Check for '-' and '*' which get special handling */ if (*inptr=='-'){ comm->location++; if (parserflags.minusminus) return MINUS; return MULTMINUS; } if (*inptr=='*'){ comm->location++; if (parserflags.oldstar) return MULTIPLY; return MULTSTAR; } /* Check for the "last unit" symbol */ if (*inptr == LASTUNIT) { comm->location++; if (!lastunitset) return LASTUNSET; output = getnewunit(); if (!output) return MEMERROR; unitcopy(output, &lastunit); lvalp->utype = output; return UNIT; } /* Look for single character ops */ for(count=0; optable[count].op; count++){ if (*inptr==optable[count].op) { comm->location++; return optable[count].value; } } /* Look for numbers */ if (strchr(number_start,*inptr)){ /* prevent "nan" from being recognized */ char *endloc; lvalp->number = strtod(inptr, &endloc); if (inptr != endloc) { comm->location += (endloc-inptr); if (*endloc && strchr(number_start,*endloc)) return BADNUMBER; else return REAL; } } /* Look for a word (function name or unit name) */ length = strcspn(inptr,nonunitchars); if (!length){ /* Next char is not a valid unit char */ comm->location++; return 0; } /* Check that unit name doesn't start or end with forbidden chars */ if (strchr(nonunitends,*inptr)){ comm->location++; return 0; } if (strchr(nonunitends, inptr[length-1])){ comm->location+=length; return 0; } /* Look for string operators */ for(count=0;strtable[count].name;count++){ if (length==strlen(strtable[count].name) && 0==strncmp(strtable[count].name,inptr,length)){ comm->location += length; return strtable[count].value; } } /* Look for real function names */ for(count=0;realfunctions[count].name;count++){ if (length==strlen(realfunctions[count].name) && 0==strncmp(realfunctions[count].name,inptr,length)){ lvalp->dfunc = realfunctions+count; comm->location += length; return RFUNC; } } /* Look for function parameter */ if (function_parameter && length==strlen(function_parameter) && 0==strncmp(function_parameter, inptr, length)){ output = getnewunit(); if (!output) return MEMERROR; unitcopy(output, parameter_value); lvalp->utype = output; comm->location += length; return UNIT; } /* Look for user defined function */ lvalp->ufunc = fnlookup(inptr,length); if (lvalp->ufunc){ comm->location += length; return UFUNC; } /* Didn't find a special string, so treat it as unit name */ comm->location+=length; if (strchr("23456789",inptr[length-1]) && !hassubscript(inptr,length)) { /* do exponent handling like m3 */ count = inptr[length-1] - '0'; length--; if (strchr(number_start, inptr[length-1])){ return UNITEND; } } else count=1; output = getnewunit(); if (!output) return MEMERROR; output->numerator[count]=0; for(;count;count--){ output->numerator[count-1] = mymalloc(length+1,"(yylex)"); strncpy(output->numerator[count-1], inptr, length); output->numerator[count-1][length]=0; } lvalp->utype=output; return UNIT; } void yyerror(struct commtype *comm, char *s){} void freelist(int startunit) { if (nextunit>maxunit) maxunit = nextunit; while(nextunit>startunit){ freeunit(memtable[--nextunit]); free(memtable[nextunit]); } } int parseunit(struct unittype *output, char *input,char **errstr,int *errloc) { struct commtype comm; int startunit; startunit = nextunit; initializeunit(output); comm.location = 0; comm.data = input; comm.errorcode = E_PARSE; /* Assume parse error */ errno=0; if (yyparse(&comm) || errno){ if (comm.location==-1) comm.location = strlen(input); if (errstr){ if (comm.errorcode==E_FUNC || errno) *errstr = strerror(errno); else *errstr=errormsg[comm.errorcode]; } if (errloc) *errloc = comm.location; freelist(startunit); return comm.errorcode; } else { if (errstr) *errstr = 0; multunit(output,comm.result); freeunit(comm.result); freelist(startunit); return 0; } } units-2.12/fdl-1.3.texi0000664000175000017500000005560712007313547014036 0ustar adrianadrian@c The GNU Free Documentation License. @center Version 1.3, 3 November 2008 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. @uref{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @enumerate 0 @item PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document @dfn{free} in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of ``copyleft'', which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. @item APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The ``Document'', below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as ``you''. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A ``Modified Version'' of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A ``Secondary Section'' is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The ``Invariant Sections'' are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The ``Cover Texts'' are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A ``Transparent'' copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not ``Transparent'' is called ``Opaque''. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, La@TeX{} input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The ``Title Page'' means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, ``Title Page'' means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The ``publisher'' means any person or entity that distributes copies of the Document to the public. A section ``Entitled XYZ'' means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as ``Acknowledgements'', ``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' of such a section when you modify the Document means that it remains a section ``Entitled XYZ'' according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. @item VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. @item COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. @item MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: @enumerate A @item Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. @item List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. @item State on the Title page the name of the publisher of the Modified Version, as the publisher. @item Preserve all the copyright notices of the Document. @item Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. @item Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. @item Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. @item Include an unaltered copy of this License. @item Preserve the section Entitled ``History'', Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled ``History'' in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. @item Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the ``History'' section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. @item For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. @item Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. @item Delete any section Entitled ``Endorsements''. Such a section may not be included in the Modified Version. @item Do not retitle any existing section to be Entitled ``Endorsements'' or to conflict in title with any Invariant Section. @item Preserve any Warranty Disclaimers. @end enumerate If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled ``Endorsements'', provided it contains nothing but endorsements of your Modified Version by various parties---for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. @item COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled ``History'' in the various original documents, forming one section Entitled ``History''; likewise combine any sections Entitled ``Acknowledgements'', and any sections Entitled ``Dedications''. You must delete all sections Entitled ``Endorsements.'' @item COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. @item AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. @item TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled ``Acknowledgements'', ``Dedications'', or ``History'', the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. @item TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. @item FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation 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. See @uref{http://www.gnu.org/copyleft/}. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. @item RELICENSING ``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A ``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the site means any set of copyrightable works thus published on the MMC site. ``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. ``Incorporate'' means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is ``eligible for relicensing'' if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. @end enumerate @page @heading ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: @smallexample @group Copyright (C) @var{year} @var{your name}. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end group @end smallexample If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the ``with@dots{}Texts.''@: line with this: @smallexample @group with the Invariant Sections being @var{list their titles}, with the Front-Cover Texts being @var{list}, and with the Back-Cover Texts being @var{list}. @end group @end smallexample If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. @c Local Variables: @c ispell-local-pdict: "ispell-dict" @c End: units-2.12/locale_map.txt0000664000175000017500000001270611747125613014732 0ustar adrianadrianAfrikaans_South Africa af_ZA Albanian_Albania sq_AL Alsatian_France gsw_FR Amharic_Ethiopia am_ET Arabic_Algeria ar_DZ Arabic_Bahrain ar_BH Arabic_Egypt ar_EG Arabic_Iraq ar_IQ Arabic_Jordan ar_JO Arabic_Kuwait ar_KW Arabic_Lebanon ar_LB Arabic_Libya ar_LY Arabic_Morocco ar_MA Arabic_Oman ar_OM Arabic_Qatar ar_QA Arabic_Saudi Arabia ar_SA Arabic_Syria ar_SY Arabic_Tunisia ar_TN Arabic_U.A.E. ar_AE Arabic_Yemen ar_YE Armenian_Armenia hy_AM Assamese_India as_IN Azeri_Azerbaijan, Cyrillic az_AZ Azeri_Azerbaijan, Latin az_AZ Bashkir_Russia ba_RU Basque_Basque eu_ES Belarusian_Belarus be_BY Bengali_Bangladesh bn_?? Bengali_India bn_IN Bosnian_Neutral bs_?? Bosnian_Bosnia and Herzegovina, Cyrillic bs_BA Bosnian_Bosnia and Herzegovina, Latin bs_BA Breton_France br_FR Bulgarian_Bulgaria bg_BG Central Kurdish_Iraq ku_IQ Cherokee_Cherokee chr_Cher Catalan_Spain ca_ES Chinese_Hong Kong SAR, PRC zh_HK Chinese_Macao SAR zh_MO Chinese_Singapore zh_SG Chinese_Simplified zh_Hans Chinese_Traditional zh_Hant Corsican_France co_FR Croatian_Neutral hr_?? Croatian_Bosnia and Herzegovina, Latin hr_BA Croatian_Croatia hr_HR Czech_Czech Republic cs_CZ Danish_Denmark da_DK Dari_Afghanistan prs_AF Divehi_Maldives dv_MV Dutch_Belgium nl_BE Dutch_Netherlands nl_NL English_Australia en_AU English_Belize en_BZ English_Canada en_CA English_Caribbean en_029 English_India en_IN English_Ireland en_IE English_Ireland en_IE English_Jamaica en_JM English_Malaysia en_MY English_New Zealand en_NZ English_Philippines en_PH English_Singapore en_SG English_South Africa en_ZA English_Trinidad and Tobago en_TT English_United Kingdom en_GB English_United States en_US English_Zimbabwe en_ZW Estonian_Estonia et_EE Faroese_Faroe Islands fo_FO Filipino_Philippines fil_PH Finnish_Finland fi_FI French_Belgium fr_BE French_Canada fr_CA French_France fr_FR French_Luxembourg fr_LU French_Monaco fr_MC French_Switzerland fr_CH Frisian_Netherlands fy_NL Galician_Spain gl_ES Georgian_Georgia ka_GE German_Austria de_AT German_Germany de_DE German_Liechtenstein de_LI German_Luxembourg de_LU German_Switzerland de_CH Greek_Greece el_GR Greenlandic_Greenland kl_GL Gujarati_India gu_IN Hausa_Nigeria ha_NG Hawiian_United States haw_US Hebrew_Israel he_IL Hindi_India hi_IN Hungarian_Hungary hu_HU Icelandic_Iceland is_IS Igbo_Nigeria ig_NG Indonesian_Indonesia id_ID Inuktitut_Canada iu_CA, Latin Inuktitut_Canada iu_CA, Canadian Syllabics Irish_Ireland ga_IE isiXhosa_South Africa xh_ZA isiZulu_South Africa zu_ZA Italian_Italy it_IT Italian_Switzerland it_CH Japanese_Japan ja_JP Kannada_India kn_IN Kazakh_Kazakhstan kk_KZ Khmer_Cambodia kh_KH K'iche_Guatemala qut_GT Kinyarwanda_Rwanda rw_RW Konkani_India kok_IN Korean_Korea ko_KR Kyrgyz_Kyrgyzstan ky_KG Lao_Lao PDR lo_LA Latvian_Latvia lv_LV Lithuanian_Lithuanian lt_LT Lower Sorbian_Germany dsb_DE Luxembourgish_Luxembourg lb_LU Macedonian_Macedonia, FYROM mk_MK Malay_Brunei Darassalam ms_BN Malay_Malaysia ms_MY Malayalam_India ml_IN Maltese_Malta mt_MT Maori_New Zealand mi_NZ Mapudungun_Chile arn_CL Marathi_India mr_IN Mohawk_Canada moh_CA Mongolian_Mongolia, Cyrillic mn_MN Mongolian_Mongolia, Mong mn_MN Nepali_Nepal ne_NP Nepali_India ne_IN Norwegian_BokmУЅl, Norway no_NO Norwegian_Nynorsk, Norway no_NO Occitan_France oc_FR Oriya_India or_IN Pashto_Afghanistan ps_AF Persian_Iran fa_IR Polish_Poland pl_PL Portuguese_Brazil pt_BR Portuguese_Portugal pt_PT Pular_Senegal ff_SN Punjabi_India, Gurmukhi script pa_IN Punjabi_Pakistan, Arabic script pa_PK Quechua_Bolivia quz_BO Quechua_Ecuador quz_EC Quechua_Peru quz_PE Romanian_Romania ro_RO Romansh_Switzerland rm_CH Russian_Russia ru_RU Sakha_Russia sah_RU Sami_Inari, Finland smn_FI Sami_Lule, Norway smj_NO Sami_Lule, Sweden smj_SE Sami_Northern, Finland se_FI Sami_Northern, Norway se_NO Sami_Northern, Sweden se_SE Sami_Skolt, Finland sms_FI Sami_Southern, Norway sma_NO Sami_Southern, Sweden sma_SE Sanskrit_India sa_IN Serbian_Neutral sr_?? Serbian_Bosnia and Herzegovina, Cyrillic sr_BA Serbian_Bosnia and Herzegovina, Latin sr_BA Serbian_Croatia sr_HR Serbian_Serbia and Montenegro, Former, Cyrillic sr_CS Serbian_Serbia and Montenegro, Former, Latin sr_CS Sesotho sa Leboa_South Africa nso_ZA Setswana / Tswana_Botswana tn_BW Setswana / Tswana_South Africa tn_ZA Sindhi_Pakistan sd_PK Sinhala_Sri Lanka si_LK Slovak_Slovakia sk_SK Slovenian_Slovenia sl_SI Spanish_Argentina es_AR Spanish_Bolivia es_BO Spanish_Chile es_CL Spanish_Colombia es_CO Spanish_Costa Rica es_CR Spanish_Dominican Republic es_DO Spanish_Ecuador es_EC Spanish_El Salvador es_SV Spanish_Guatemala es_GT Spanish_Honduras es_HN Spanish_Mexico es_MX Spanish_Nicaragua es_NI Spanish_Panama es_PA Spanish_Paraguay es_PY Spanish_Peru es_PE Spanish_Puerto Rico es_PR Spanish_Spain, Modern Sort es_ES Spanish_Spain, Traditional Sort es_ES Spanish_United States es_US Spanish_Uruguay es_UY Spanish_Venezuela es_VE Swahili_Kenya sw_KE Swedish_Finland sv_FI Swedish_Sweden sv_SE Swedish_Sweden sv_SE Syriac_Syria syr_SY Tajik_Tajikistan, Cyrillic tg_TJ Tamazight_Algeria, Latin tzm_DZ Tamil_India ta_IN Tamil_Sri Lanka ta_LK Tatar_Russia tt_RU Telugu_India te_IN Thai_Thailand th_TH Tibetan_PRC bo_CN Tigrinya_Eritrea ti_ER Tigrinya_Ethiopia ti_ET Turkish_Turkey tr_TR Turkmen_Turkmenistan tk_TM Ukrainian_Ukraine uk_UA Upper Sorbian_Germany hsb_DE Urdu_(reserved) ur_?? Urdu_Pakistan ur_PK Uyghur_PRC ug_CN Uzbek_Uzbekistan, Cyrillic uz_UZ Uzbek_Uzbekistan, Latin uz_UZ Valencian_Valencia ca_ES-Valencia Vietnamese_Vietnam vi_VN Welsh_United Kingdom cy_GB Wolof_Senegal wo_SN Yi_PRC ii_CN Yoruba_Nigeria yo_NG units-2.12/parse.tab.c0000664000175000017500000017612612303461132014113 0ustar adrianadrian/* A Bison parser, made by GNU Bison 2.5. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output. */ #define YYBISON 1 /* Bison version. */ #define YYBISON_VERSION "2.5" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* Using locations. */ #define YYLSP_NEEDED 0 /* Substitute the variable and function names. */ #define yyparse unitsparse #define yylex unitslex #define yyerror unitserror #define yylval unitslval #define yychar unitschar #define yydebug unitsdebug #define yynerrs unitsnerrs /* Copy the first part of user declarations. */ /* Line 268 of yacc.c */ #line 24 "parse.y" #include "units.h" struct commtype { int location; char *data; struct unittype *result; int errorcode; char *paramname; struct unittype *paramvalue; }; static int err; /* value used by parser to store return values */ #define CHECK if (err) { comm->errorcode=err; YYABORT; } int yylex(); void yyerror(struct commtype *comm, char *); #define MEMSIZE 100 struct unittype *memtable[MEMSIZE]; int nextunit=0; int maxunit=0; struct function { char *name; double (*func)(double); int type; }; #define DIMENSIONLESS 0 #define ANGLEIN 1 #define ANGLEOUT 2 struct unittype * getnewunit() { if (nextunit>=MEMSIZE) return 0; memtable[nextunit] = (struct unittype *) mymalloc(sizeof(struct unittype),"(getnewunit)"); if (!memtable[nextunit]) return 0; initializeunit(memtable[nextunit]); return memtable[nextunit++]; } struct unittype * makenumunit(double num,int *myerr) { struct unittype *ret; ret=getnewunit(); if (!ret){ *myerr = E_PARSEMEM; return 0; } ret->factor = num; *myerr = 0; return ret; } double logb2(double x) { return log(x)/log(2.0); } int funcunit(struct unittype *theunit, struct function *fun) { struct unittype angleunit; if (fun->type==ANGLEIN){ err=unit2num(theunit); if (err==E_NOTANUMBER){ initializeunit(&angleunit); angleunit.denominator[0] = dupstr("radian"); angleunit.denominator[1] = 0; err = multunit(theunit, &angleunit); freeunit(&angleunit); if (!err) err = unit2num(theunit); } if (err) return err; } else if (fun->type==ANGLEOUT || fun->type == DIMENSIONLESS) { if ((err=unit2num(theunit))) return err; } else return E_BADFUNCTYPE; errno = 0; theunit->factor = (*(fun->func))(theunit->factor); if (errno) return E_FUNC; if (fun->type==ANGLEOUT) { theunit->numerator[0] = dupstr("radian"); theunit->numerator[1] = 0; } return 0; } /* Line 268 of yacc.c */ #line 189 "parse.tab.c" /* Enabling traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif /* Enabling verbose error messages. */ #ifdef YYERROR_VERBOSE # undef YYERROR_VERBOSE # define YYERROR_VERBOSE 1 #else # define YYERROR_VERBOSE 0 #endif /* Enabling the token table. */ #ifndef YYTOKEN_TABLE # define YYTOKEN_TABLE 0 #endif /* Tokens. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers know about them. */ enum yytokentype { REAL = 258, UNIT = 259, RFUNC = 260, UFUNC = 261, EXPONENT = 262, MULTIPLY = 263, MULTSTAR = 264, DIVIDE = 265, NUMDIV = 266, SQRT = 267, CUBEROOT = 268, MULTMINUS = 269, EOL = 270, FUNCINV = 271, MEMERROR = 272, BADNUMBER = 273, UNITEND = 274, LASTUNSET = 275, MINUS = 276, ADD = 277, UNARY = 278 }; #endif #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE { /* Line 293 of yacc.c */ #line 139 "parse.y" double number; int integer; struct unittype *utype; struct function *dfunc; struct func *ufunc; /* Line 293 of yacc.c */ #line 258 "parse.tab.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif /* Copy the second part of user declarations. */ /* Line 343 of yacc.c */ #line 270 "parse.tab.c" #ifdef short # undef short #endif #ifdef YYTYPE_UINT8 typedef YYTYPE_UINT8 yytype_uint8; #else typedef unsigned char yytype_uint8; #endif #ifdef YYTYPE_INT8 typedef YYTYPE_INT8 yytype_int8; #elif (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) typedef signed char yytype_int8; #else typedef short int yytype_int8; #endif #ifdef YYTYPE_UINT16 typedef YYTYPE_UINT16 yytype_uint16; #else typedef unsigned short int yytype_uint16; #endif #ifdef YYTYPE_INT16 typedef YYTYPE_INT16 yytype_int16; #else typedef short int yytype_int16; #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int # endif #endif #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif # ifndef YY_ # define YY_(msgid) msgid # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else # define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ #ifndef lint # define YYID(n) (n) #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static int YYID (int yyi) #else static int YYID (yyi) int yyi; #endif { return yyi; } #endif #if ! defined yyoverflow || YYERROR_VERBOSE /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's `empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yytype_int16 yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYSIZE_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / sizeof (*yyptr); \ } \ while (YYID (0)) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from FROM to TO. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(To, From, Count) \ __builtin_memcpy (To, From, (Count) * sizeof (*(From))) # else # define YYCOPY(To, From, Count) \ do \ { \ YYSIZE_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (To)[yyi] = (From)[yyi]; \ } \ while (YYID (0)) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 34 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 179 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 26 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 7 /* YYNRULES -- Number of rules. */ #define YYNRULES 35 /* YYNRULES -- Number of states. */ #define YYNSTATES 59 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 #define YYMAXUTOK 278 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ static const yytype_uint8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 24, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 5, 8, 10, 12, 15, 17, 20, 23, 27, 31, 35, 39, 43, 45, 49, 53, 55, 57, 61, 65, 68, 70, 73, 76, 79, 82, 86, 91, 96, 98, 100, 102, 104 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int8 yyrhs[] = { 27, 0, -1, 15, -1, 28, 15, -1, 1, -1, 29, -1, 10, 32, -1, 32, -1, 14, 32, -1, 21, 32, -1, 29, 22, 29, -1, 29, 21, 29, -1, 29, 10, 29, -1, 29, 8, 29, -1, 29, 9, 29, -1, 3, -1, 30, 11, 30, -1, 24, 29, 25, -1, 30, -1, 4, -1, 32, 7, 32, -1, 32, 14, 32, -1, 32, 32, -1, 31, -1, 12, 31, -1, 13, 31, -1, 5, 31, -1, 6, 31, -1, 16, 6, 31, -1, 32, 7, 14, 32, -1, 32, 7, 21, 32, -1, 18, -1, 17, -1, 19, -1, 20, -1, 16, 4, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 185, 185, 186, 187, 190, 191, 194, 195, 196, 197, 198, 200, 201, 202, 205, 206, 209, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 229, 232, 233, 234, 235, 236 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "$end", "error", "$undefined", "REAL", "UNIT", "RFUNC", "UFUNC", "EXPONENT", "MULTIPLY", "MULTSTAR", "DIVIDE", "NUMDIV", "SQRT", "CUBEROOT", "MULTMINUS", "EOL", "FUNCINV", "MEMERROR", "BADNUMBER", "UNITEND", "LASTUNSET", "MINUS", "ADD", "UNARY", "'('", "')'", "$accept", "input", "unitexpr", "expr", "numexpr", "pexpr", "list", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ static const yytype_uint16 yytoknum[] = { 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 40, 41 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint8 yyr1[] = { 0, 26, 27, 27, 27, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ static const yytype_uint8 yyr2[] = { 0, 2, 1, 2, 1, 1, 2, 1, 2, 2, 3, 3, 3, 3, 3, 1, 3, 3, 1, 1, 3, 3, 2, 1, 2, 2, 2, 2, 3, 4, 4, 1, 1, 1, 1, 2 }; /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. Performed when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ static const yytype_uint8 yydefact[] = { 0, 4, 15, 19, 0, 0, 0, 0, 0, 0, 2, 0, 32, 31, 33, 34, 0, 0, 0, 0, 5, 18, 23, 7, 26, 27, 6, 24, 25, 8, 35, 0, 9, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 22, 28, 17, 13, 14, 12, 11, 10, 16, 0, 0, 20, 21, 29, 30 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { -1, 18, 19, 20, 21, 22, 44 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -18 static const yytype_int16 yypact[] = { 45, -18, -18, -18, -17, -17, 155, -17, -17, 155, -18, 9, -18, -18, -18, -18, 155, 67, 8, -1, 68, 16, -18, 89, -18, -18, 89, -18, -18, 89, -18, -17, 89, 10, -18, -18, 67, 67, 67, 67, 67, 18, 111, 155, 133, -18, -18, -18, 21, 21, 2, 2, -18, 155, 155, 23, 133, 23, 23 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -18, -18, -18, -14, -8, -3, 0 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -1 static const yytype_uint8 yytable[] = { 23, 24, 25, 33, 27, 28, 26, 17, 34, 29, 36, 37, 38, 30, 35, 31, 32, 23, 36, 37, 38, 2, 47, 48, 49, 50, 51, 41, 45, 36, 42, 39, 40, 52, 0, 46, 23, 23, 23, 23, 23, 0, 55, 56, 0, 0, 1, 0, 2, 3, 4, 5, 0, 57, 58, 6, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 17, 2, 3, 4, 5, 0, 0, 36, 37, 38, 7, 8, 9, 0, 11, 12, 13, 14, 15, 16, 39, 40, 17, 2, 3, 4, 5, 42, 0, 0, 0, 0, 7, 8, 43, 0, 11, 12, 13, 14, 15, 0, 0, 0, 17, 2, 3, 4, 5, 0, 0, 0, 0, 0, 7, 8, 53, 0, 11, 12, 13, 14, 15, 54, 0, 0, 17, 2, 3, 4, 5, 42, 0, 0, 0, 0, 7, 8, 0, 0, 11, 12, 13, 14, 15, 0, 0, 0, 17, 2, 3, 4, 5, 0, 0, 0, 0, 0, 7, 8, 0, 0, 11, 12, 13, 14, 15, 0, 0, 0, 17 }; #define yypact_value_is_default(yystate) \ ((yystate) == (-18)) #define yytable_value_is_error(yytable_value) \ YYID (0) static const yytype_int8 yycheck[] = { 0, 4, 5, 17, 7, 8, 6, 24, 0, 9, 8, 9, 10, 4, 15, 6, 16, 17, 8, 9, 10, 3, 36, 37, 38, 39, 40, 11, 31, 8, 7, 21, 22, 41, -1, 25, 36, 37, 38, 39, 40, -1, 42, 43, -1, -1, 1, -1, 3, 4, 5, 6, -1, 53, 54, 10, -1, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, 24, 3, 4, 5, 6, -1, -1, 8, 9, 10, 12, 13, 14, -1, 16, 17, 18, 19, 20, 21, 21, 22, 24, 3, 4, 5, 6, 7, -1, -1, -1, -1, 12, 13, 14, -1, 16, 17, 18, 19, 20, -1, -1, -1, 24, 3, 4, 5, 6, -1, -1, -1, -1, -1, 12, 13, 14, -1, 16, 17, 18, 19, 20, 21, -1, -1, 24, 3, 4, 5, 6, 7, -1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, 20, -1, -1, -1, 24, 3, 4, 5, 6, -1, -1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 18, 19, 20, -1, -1, -1, 24 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 1, 3, 4, 5, 6, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 27, 28, 29, 30, 31, 32, 31, 31, 32, 31, 31, 32, 4, 6, 32, 29, 0, 15, 8, 9, 10, 21, 22, 11, 7, 14, 32, 31, 25, 29, 29, 29, 29, 29, 30, 14, 21, 32, 32, 32, 32 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYEMPTY (-2) #define YYEOF 0 #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. However, YYFAIL appears to be in use. Nevertheless, it is formally deprecated in Bison 2.4.2's NEWS entry, where a plan to phase it out is discussed. */ #define YYFAIL goto yyerrlab #if defined YYFAIL /* This is here to suppress warnings from the GCC cpp's -Wunused-macros. Normally we don't worry about that warning, but some users do, and we want to make it easy for users to remove YYFAIL uses, which will produce warnings from Bison 2.5. */ #endif #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (1); \ goto yybackup; \ } \ else \ { \ yyerror (comm, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (YYID (0)) #define YYTERROR 1 #define YYERRCODE 256 /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ #define YYRHSLOC(Rhs, K) ((Rhs)[K]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ do \ if (YYID (N)) \ { \ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ } \ else \ { \ (Current).first_line = (Current).last_line = \ YYRHSLOC (Rhs, 0).last_line; \ (Current).first_column = (Current).last_column = \ YYRHSLOC (Rhs, 0).last_column; \ } \ while (YYID (0)) #endif /* This macro is provided for backward compatibility. */ #ifndef YY_LOCATION_PRINT # define YY_LOCATION_PRINT(File, Loc) ((void) 0) #endif /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM # define YYLEX yylex (&yylval, YYLEX_PARAM) #else # define YYLEX yylex (&yylval, comm) #endif /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (YYID (0)) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Type, Value, comm); \ YYFPRINTF (stderr, "\n"); \ } \ } while (YYID (0)) /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct commtype *comm) #else static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, comm) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; struct commtype *comm; #endif { if (!yyvaluep) return; YYUSE (comm); # ifdef YYPRINT if (yytype < YYNTOKENS) YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else YYUSE (yyoutput); # endif switch (yytype) { default: break; } } /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, struct commtype *comm) #else static void yy_symbol_print (yyoutput, yytype, yyvaluep, comm) FILE *yyoutput; int yytype; YYSTYPE const * const yyvaluep; struct commtype *comm; #endif { if (yytype < YYNTOKENS) YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); else YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); yy_symbol_value_print (yyoutput, yytype, yyvaluep, comm); YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) #else static void yy_stack_print (yybottom, yytop) yytype_int16 *yybottom; yytype_int16 *yytop; #endif { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yy_reduce_print (YYSTYPE *yyvsp, int yyrule, struct commtype *comm) #else static void yy_reduce_print (yyvsp, yyrule, comm) YYSTYPE *yyvsp; int yyrule; struct commtype *comm; #endif { int yynrhs = yyr2[yyrule]; int yyi; unsigned long int yylno = yyrline[yyrule]; YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], &(yyvsp[(yyi + 1) - (yynrhs)]) , comm); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyvsp, Rule, comm); \ } while (YYID (0)) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif #if YYERROR_VERBOSE # ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen strlen # else /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static YYSIZE_T yystrlen (const char *yystr) #else static YYSIZE_T yystrlen (yystr) const char *yystr; #endif { YYSIZE_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif # endif # ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static char * yystpcpy (char *yydest, const char *yysrc) #else static char * yystpcpy (yydest, yysrc) char *yydest; const char *yysrc; #endif { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif # endif # ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYSIZE_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; /* Fall through. */ default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (! yyres) return yystrlen (yystr); return yystpcpy (yyres, yystr) - yyres; } # endif /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return 2 if the required number of bytes is too large to store. */ static int yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, yytype_int16 *yyssp, int yytoken) { YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); YYSIZE_T yysize = yysize0; YYSIZE_T yysize1; enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; /* Internationalized format string. */ const char *yyformat = 0; /* Arguments of yyformat. */ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; /* Number of reported tokens (one for the "unexpected", one per "expected"). */ int yycount = 0; /* There are many possibilities here to consider: - Assume YYFAIL is not used. It's too flawed to consider. See for details. YYERROR is fine as it does not invoke this function. - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yytoken != YYEMPTY) { int yyn = yypact[*yyssp]; yyarg[yycount++] = yytname[yytoken]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR && !yytable_value_is_error (yytable[yyx + yyn])) { if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) { yycount = 1; yysize = yysize0; break; } yyarg[yycount++] = yytname[yyx]; yysize1 = yysize + yytnamerr (0, yytname[yyx]); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; } } } switch (yycount) { # define YYCASE_(N, S) \ case N: \ yyformat = S; \ break YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); # undef YYCASE_ } yysize1 = yysize + yystrlen (yyformat); if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) return 2; yysize = yysize1; if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return 1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yyarg[yyi++]); yyformat += 2; } else { yyp++; yyformat++; } } return 0; } #endif /* YYERROR_VERBOSE */ /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, struct commtype *comm) #else static void yydestruct (yymsg, yytype, yyvaluep, comm) const char *yymsg; int yytype; YYSTYPE *yyvaluep; struct commtype *comm; #endif { YYUSE (yyvaluep); YYUSE (comm); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); switch (yytype) { default: break; } } /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus int yyparse (void *YYPARSE_PARAM); #else int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus int yyparse (struct commtype *comm); #else int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ /*----------. | yyparse. | `----------*/ #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (void *YYPARSE_PARAM) #else int yyparse (YYPARSE_PARAM) void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) int yyparse (struct commtype *comm) #else int yyparse (comm) struct commtype *comm; #endif #endif { /* The lookahead symbol. */ int yychar; /* The semantic value of the lookahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ int yynerrs; int yystate; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus; /* The stacks and their tools: `yyss': related to states. `yyvs': related to semantic values. Refer to the stacks thru separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* The state stack. */ yytype_int16 yyssa[YYINITDEPTH]; yytype_int16 *yyss; yytype_int16 *yyssp; /* The semantic value stack. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs; YYSTYPE *yyvsp; YYSIZE_T yystacksize; int yyn; int yyresult; /* Lookahead token as an internal (translated) token number. */ int yytoken; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; #if YYERROR_VERBOSE /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; yytoken = 0; yyss = yyssa; yyvs = yyvsa; yystacksize = YYINITDEPTH; YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; yynerrs = 0; yychar = YYEMPTY; /* Cause a token to be read. */ /* Initialize stack pointers. Waste one element of value and location stack so that they stay on the same level as the state stack. The wasted elements are never initialized. */ yyssp = yyss; yyvsp = yyvs; goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; yysetstate: *yyssp = yystate; if (yyss + yystacksize - 1 <= yyssp) { /* Get the current used size of the three stacks, in elements. */ YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ YYSTYPE *yyvs1 = yyvs; yytype_int16 *yyss1 = yyss; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * sizeof (*yyssp), &yyvs1, yysize * sizeof (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE goto yyexhaustedlab; # else /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) goto yyexhaustedlab; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yytype_int16 *yyss1 = yyss; union yyalloc *yyptr = (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); if (! yyptr) goto yyexhaustedlab; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif #endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YYDPRINTF ((stderr, "Stack size increased to %lu\n", (unsigned long int) yystacksize)); if (yyss + yystacksize - 1 <= yyssp) YYABORT; } YYDPRINTF ((stderr, "Entering state %d\n", yystate)); if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } if (yychar <= YYEOF) { yychar = yytoken = YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); /* Discard the shifted token. */ yychar = YYEMPTY; yystate = yyn; *++yyvsp = yylval; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: `$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* Line 1806 of yacc.c */ #line 185 "parse.y" { comm->result = makenumunit(1,&err); CHECK; YYACCEPT; } break; case 3: /* Line 1806 of yacc.c */ #line 186 "parse.y" { comm->result = (yyvsp[(1) - (2)].utype); YYACCEPT; } break; case 4: /* Line 1806 of yacc.c */ #line 187 "parse.y" { YYABORT; } break; case 5: /* Line 1806 of yacc.c */ #line 190 "parse.y" {(yyval.utype) = (yyvsp[(1) - (1)].utype);} break; case 6: /* Line 1806 of yacc.c */ #line 191 "parse.y" { invertunit((yyvsp[(2) - (2)].utype)); (yyval.utype)=(yyvsp[(2) - (2)].utype);} break; case 7: /* Line 1806 of yacc.c */ #line 194 "parse.y" { (yyval.utype) = (yyvsp[(1) - (1)].utype); } break; case 8: /* Line 1806 of yacc.c */ #line 195 "parse.y" { (yyval.utype) = (yyvsp[(2) - (2)].utype); (yyval.utype)->factor *= -1; } break; case 9: /* Line 1806 of yacc.c */ #line 196 "parse.y" { (yyval.utype) = (yyvsp[(2) - (2)].utype); (yyval.utype)->factor *= -1; } break; case 10: /* Line 1806 of yacc.c */ #line 197 "parse.y" { err = addunit((yyvsp[(1) - (3)].utype),(yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 11: /* Line 1806 of yacc.c */ #line 198 "parse.y" { (yyvsp[(3) - (3)].utype)->factor *= -1; err = addunit((yyvsp[(1) - (3)].utype),(yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 12: /* Line 1806 of yacc.c */ #line 200 "parse.y" { err = divunit((yyvsp[(1) - (3)].utype), (yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 13: /* Line 1806 of yacc.c */ #line 201 "parse.y" { err = multunit((yyvsp[(1) - (3)].utype),(yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 14: /* Line 1806 of yacc.c */ #line 202 "parse.y" { err = multunit((yyvsp[(1) - (3)].utype),(yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 15: /* Line 1806 of yacc.c */ #line 205 "parse.y" { (yyval.number) = (yyvsp[(1) - (1)].number); } break; case 16: /* Line 1806 of yacc.c */ #line 206 "parse.y" { (yyval.number) = (yyvsp[(1) - (3)].number) / (yyvsp[(3) - (3)].number); } break; case 17: /* Line 1806 of yacc.c */ #line 209 "parse.y" { (yyval.utype) = (yyvsp[(2) - (3)].utype); } break; case 18: /* Line 1806 of yacc.c */ #line 215 "parse.y" { (yyval.utype) = makenumunit((yyvsp[(1) - (1)].number),&err); CHECK;} break; case 19: /* Line 1806 of yacc.c */ #line 216 "parse.y" { (yyval.utype) = (yyvsp[(1) - (1)].utype); } break; case 20: /* Line 1806 of yacc.c */ #line 217 "parse.y" { err = unitpower((yyvsp[(1) - (3)].utype),(yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 21: /* Line 1806 of yacc.c */ #line 218 "parse.y" { err = multunit((yyvsp[(1) - (3)].utype),(yyvsp[(3) - (3)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (3)].utype);} break; case 22: /* Line 1806 of yacc.c */ #line 219 "parse.y" { err = multunit((yyvsp[(1) - (2)].utype),(yyvsp[(2) - (2)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (2)].utype);} break; case 23: /* Line 1806 of yacc.c */ #line 220 "parse.y" { (yyval.utype)=(yyvsp[(1) - (1)].utype); } break; case 24: /* Line 1806 of yacc.c */ #line 221 "parse.y" { err = rootunit((yyvsp[(2) - (2)].utype),2); CHECK; (yyval.utype)=(yyvsp[(2) - (2)].utype);} break; case 25: /* Line 1806 of yacc.c */ #line 222 "parse.y" { err = rootunit((yyvsp[(2) - (2)].utype),3); CHECK; (yyval.utype)=(yyvsp[(2) - (2)].utype);} break; case 26: /* Line 1806 of yacc.c */ #line 223 "parse.y" { err = funcunit((yyvsp[(2) - (2)].utype),(yyvsp[(1) - (2)].dfunc)); CHECK; (yyval.utype)=(yyvsp[(2) - (2)].utype);} break; case 27: /* Line 1806 of yacc.c */ #line 224 "parse.y" { err = evalfunc((yyvsp[(2) - (2)].utype),(yyvsp[(1) - (2)].ufunc),0,0); CHECK; (yyval.utype)=(yyvsp[(2) - (2)].utype);} break; case 28: /* Line 1806 of yacc.c */ #line 225 "parse.y" { err = evalfunc((yyvsp[(3) - (3)].utype),(yyvsp[(2) - (3)].ufunc),1,0); CHECK; (yyval.utype)=(yyvsp[(3) - (3)].utype);} break; case 29: /* Line 1806 of yacc.c */ #line 227 "parse.y" { (yyvsp[(4) - (4)].utype)->factor *= -1; err = unitpower((yyvsp[(1) - (4)].utype),(yyvsp[(4) - (4)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (4)].utype);} break; case 30: /* Line 1806 of yacc.c */ #line 230 "parse.y" { (yyvsp[(4) - (4)].utype)->factor *= -1; err = unitpower((yyvsp[(1) - (4)].utype),(yyvsp[(4) - (4)].utype)); CHECK; (yyval.utype)=(yyvsp[(1) - (4)].utype);} break; case 31: /* Line 1806 of yacc.c */ #line 232 "parse.y" { err = E_BADNUM; CHECK; } break; case 32: /* Line 1806 of yacc.c */ #line 233 "parse.y" { err = E_PARSEMEM; CHECK; } break; case 33: /* Line 1806 of yacc.c */ #line 234 "parse.y" { err = E_UNITEND; CHECK; } break; case 34: /* Line 1806 of yacc.c */ #line 235 "parse.y" { err = E_LASTUNSET; CHECK; } break; case 35: /* Line 1806 of yacc.c */ #line 236 "parse.y" { err = E_NOTAFUNC; CHECK; } break; /* Line 1806 of yacc.c */ #line 1803 "parse.tab.c" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; #if ! YYERROR_VERBOSE yyerror (comm, YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) { char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = YYSYNTAX_ERROR; if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == 1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); if (!yymsg) { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = 2; } else { yysyntax_error_status = YYSYNTAX_ERROR; yymsgp = yymsg; } } yyerror (comm, yymsgp); if (yysyntax_error_status == 2) goto yyexhaustedlab; } # undef YYSYNTAX_ERROR #endif } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, comm); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers like GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (/*CONSTCOND*/ 0) goto yyerrorlab; /* Do not reclaim the symbols of the rule which action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[yystate], yyvsp, comm); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } *++yyvsp = yylval; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturn; #if !defined(yyoverflow) || YYERROR_VERBOSE /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: yyerror (comm, YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif yyreturn: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, comm); } /* Do not reclaim the symbols of the rule which action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, comm); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); #endif /* Make sure YYID is used. */ return YYID (yyresult); } /* Line 2067 of yacc.c */ #line 242 "parse.y" #ifndef strchr # ifdef NO_STRCHR # define strchr(a,b) index((a),(b)) # else char *strchr(); # endif #endif /* !strchr */ double strtod(); struct function realfunctions[] = { {"sin", sin, ANGLEIN}, {"cos", cos, ANGLEIN}, {"tan", tan, ANGLEIN}, {"ln", log, DIMENSIONLESS}, {"log", log10, DIMENSIONLESS}, {"log2", logb2, DIMENSIONLESS}, {"exp", exp, DIMENSIONLESS}, {"acos", acos, ANGLEOUT}, {"atan", atan, ANGLEOUT}, {"asin", asin, ANGLEOUT}, {0, 0, 0}}; struct { char op; int value; } optable[] = { {'*', MULTIPLY}, {'/', DIVIDE}, {'|', NUMDIV}, {'+', ADD}, {'(', '('}, {')', ')'}, {'^', EXPONENT}, {'~', FUNCINV}, {0, 0}}; struct { char *name; int value; } strtable[] = { {"sqrt", SQRT}, {"cuberoot", CUBEROOT}, {"per" , DIVIDE}, {0, 0}}; #define LASTUNIT '_' /* Last unit symbol */ int yylex(YYSTYPE *lvalp, struct commtype *comm) { int length, count; struct unittype *output; char *inptr; char *nonunitchars = "~;+-*/|\t\n^ ()"; /* Chars not allowed in unit name */ char *nonunitends = ".,_"; /* Can't start or end a unit */ char *number_start = ".,0123456789"; /* Can be first char of a number */ if (comm->location==-1) return 0; inptr = comm->data + comm->location; /* Point to start of data */ /* Skip white space */ while( *inptr && strchr(WHITE,*inptr)) inptr++, comm->location++; if (*inptr==0) { comm->location = -1; return EOL; /* Return failure if string has ended */ } /* Check for **, an exponent operator. */ if (0==strncmp("**",inptr,2)){ comm->location += 2; return EXPONENT; } /* Check for '-' and '*' which get special handling */ if (*inptr=='-'){ comm->location++; if (parserflags.minusminus) return MINUS; return MULTMINUS; } if (*inptr=='*'){ comm->location++; if (parserflags.oldstar) return MULTIPLY; return MULTSTAR; } /* Check for the "last unit" symbol */ if (*inptr == LASTUNIT) { comm->location++; if (!lastunitset) return LASTUNSET; output = getnewunit(); if (!output) return MEMERROR; unitcopy(output, &lastunit); lvalp->utype = output; return UNIT; } /* Look for single character ops */ for(count=0; optable[count].op; count++){ if (*inptr==optable[count].op) { comm->location++; return optable[count].value; } } /* Look for numbers */ if (strchr(number_start,*inptr)){ /* prevent "nan" from being recognized */ char *endloc; lvalp->number = strtod(inptr, &endloc); if (inptr != endloc) { comm->location += (endloc-inptr); if (*endloc && strchr(number_start,*endloc)) return BADNUMBER; else return REAL; } } /* Look for a word (function name or unit name) */ length = strcspn(inptr,nonunitchars); if (!length){ /* Next char is not a valid unit char */ comm->location++; return 0; } /* Check that unit name doesn't start or end with forbidden chars */ if (strchr(nonunitends,*inptr)){ comm->location++; return 0; } if (strchr(nonunitends, inptr[length-1])){ comm->location+=length; return 0; } /* Look for string operators */ for(count=0;strtable[count].name;count++){ if (length==strlen(strtable[count].name) && 0==strncmp(strtable[count].name,inptr,length)){ comm->location += length; return strtable[count].value; } } /* Look for real function names */ for(count=0;realfunctions[count].name;count++){ if (length==strlen(realfunctions[count].name) && 0==strncmp(realfunctions[count].name,inptr,length)){ lvalp->dfunc = realfunctions+count; comm->location += length; return RFUNC; } } /* Look for function parameter */ if (function_parameter && length==strlen(function_parameter) && 0==strncmp(function_parameter, inptr, length)){ output = getnewunit(); if (!output) return MEMERROR; unitcopy(output, parameter_value); lvalp->utype = output; comm->location += length; return UNIT; } /* Look for user defined function */ lvalp->ufunc = fnlookup(inptr,length); if (lvalp->ufunc){ comm->location += length; return UFUNC; } /* Didn't find a special string, so treat it as unit name */ comm->location+=length; if (strchr("23456789",inptr[length-1]) && !hassubscript(inptr,length)) { /* do exponent handling like m3 */ count = inptr[length-1] - '0'; length--; if (strchr(number_start, inptr[length-1])){ return UNITEND; } } else count=1; output = getnewunit(); if (!output) return MEMERROR; output->numerator[count]=0; for(;count;count--){ output->numerator[count-1] = mymalloc(length+1,"(yylex)"); strncpy(output->numerator[count-1], inptr, length); output->numerator[count-1][length]=0; } lvalp->utype=output; return UNIT; } void yyerror(struct commtype *comm, char *s){} void freelist(int startunit) { if (nextunit>maxunit) maxunit = nextunit; while(nextunit>startunit){ freeunit(memtable[--nextunit]); free(memtable[nextunit]); } } int parseunit(struct unittype *output, char *input,char **errstr,int *errloc) { struct commtype comm; int startunit; startunit = nextunit; initializeunit(output); comm.location = 0; comm.data = input; comm.errorcode = E_PARSE; /* Assume parse error */ errno=0; if (yyparse(&comm) || errno){ if (comm.location==-1) comm.location = strlen(input); if (errstr){ if (comm.errorcode==E_FUNC || errno) *errstr = strerror(errno); else *errstr=errormsg[comm.errorcode]; } if (errloc) *errloc = comm.location; freelist(startunit); return comm.errorcode; } else { if (errstr) *errstr = 0; multunit(output,comm.result); freeunit(comm.result); freelist(startunit); return 0; } } units-2.12/configure0000775000175000017500000044232012603104457013776 0ustar adrianadrian#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for GNU units 2.12. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and adrianm@gnu.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='GNU units' PACKAGE_TARNAME='units' PACKAGE_VERSION='2.12' PACKAGE_STRING='GNU units 2.12' PACKAGE_BUGREPORT='adrianm@gnu.org' PACKAGE_URL='http://www.gnu.org/software/units/' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS PYTHON mkstoolkit EGREP GREP CPP MKDIR_P INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MKSFIX PYTHON_VERSION HAVE_PYTHON UDAT STRFUNC DEFIS target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_relocation ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures GNU units 2.12 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/units] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of GNU units 2.12:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-relocation look in program directory for units data files (default is NO) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . GNU units home page: . General help using GNU software: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF GNU units configure 2.12 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES # --------------------------------------------- # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. ac_fn_c_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------ ## ## Report this to adrianm@gnu.org ## ## ------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by GNU units $as_me 2.12, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` saveCFLAGS=$CFLAGS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gcc cc egcs cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in gcc cc egcs cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5 $as_echo_n "checking for $CC option to accept ISO C99... " >&6; } if ${ac_cv_prog_cc_c99+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include #include // Check varargs macros. These examples are taken from C99 6.10.3.5. #define debug(...) fprintf (stderr, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK your preprocessor is broken; #endif #if BIG_OK #else your preprocessor is broken; #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy. static void test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg (args_copy, const char *); break; case 'd': // int number = va_arg (args_copy, int); break; case 'f': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); } int main () { // Check bool. _Bool success = false; // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs ("s, d' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' || dynamic_array[ni.number - 1] != 543); ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 $as_echo "$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then : fi if test "$CC" = cl.exe -a -z "$saveCFLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: setting special CFLAGS value for cl" >&5 $as_echo "$as_me: setting special CFLAGS value for cl" >&6;} CFLAGS="-O2 -W3 -nologo" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sin" >&5 $as_echo_n "checking for library containing sin... " >&6; } if ${ac_cv_search_sin+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sin (); int main () { return sin (); ; return 0; } _ACEOF for ac_lib in '' m; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_sin=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_sin+:} false; then : break fi done if ${ac_cv_search_sin+:} false; then : else ac_cv_search_sin=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_sin" >&5 $as_echo "$ac_cv_search_sin" >&6; } ac_res=$ac_cv_search_sin if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi { ac_cv_lib_readline_readline=; unset ac_cv_lib_readline_readline;} for termlib in "" -ltermcap -lncurses -lcurses; do if test "$ac_cv_lib_readline_readline" != yes ; then { ac_cv_lib_readline_readline=; unset ac_cv_lib_readline_readline;} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline in -lreadline" >&5 $as_echo_n "checking for readline in -lreadline... " >&6; } if ${ac_cv_lib_readline_readline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lreadline $termlib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char readline (); int main () { return readline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_readline_readline=yes else ac_cv_lib_readline_readline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_readline" >&5 $as_echo "$ac_cv_lib_readline_readline" >&6; } if test "x$ac_cv_lib_readline_readline" = xyes; then : LIBS="-lreadline $termlib $LIBS";DEFIS="$DEFIS -DREADLINE" fi fi done if test "$ac_cv_lib_readline_readline" = yes; then ac_fn_c_check_decl "$LINENO" "rl_completion_suppress_append" "ac_cv_have_decl_rl_completion_suppress_append" "#include " if test "x$ac_cv_have_decl_rl_completion_suppress_append" = xyes; then : else DEFIS="$DEFIS -DNO_SUPPRESS_APPEND" fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = xyes; then : else DEFIS="$DEFIS -DSTRINGS_H" fi ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : else DEFIS="$DEFIS -DNO_STDLIB_H" fi ac_fn_c_check_func "$LINENO" "strchr" "ac_cv_func_strchr" if test "x$ac_cv_func_strchr" = xyes; then : else DEFIS="$DEFIS -DNO_STRCHR" fi ac_fn_c_check_func "$LINENO" "strspn" "ac_cv_func_strspn" if test "x$ac_cv_func_strspn" = xyes; then : else DEFIS="$DEFIS -DNO_STRSPN";STRFUNC="strfunc.$OBJEXT" fi ac_fn_c_check_func "$LINENO" "strtok" "ac_cv_func_strtok" if test "x$ac_cv_func_strtok" = xyes; then : else DEFIS="$DEFIS -DNO_STRTOK";STRFUNC="strfunc.$OBJEXT" fi ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" if test "x$ac_cv_func_setenv" = xyes; then : else DEFIS="$DEFIS -DNO_SETENV" fi ac_fn_c_check_func "$LINENO" "setlocale" "ac_cv_func_setlocale" if test "x$ac_cv_func_setlocale" = xyes; then : else DEFIS="$DEFIS -DNO_SETLOCALE" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for locale and UTF-8 support" >&5 $as_echo_n "checking for locale and UTF-8 support... " >&6; } if ${am_cv_utf8+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 600 #include #include #include int main () { wchar_t *out;char *in;char *res; res=setlocale(LC_CTYPE,"");res=in; mbsrtowcs(out, &res, 2, NULL); wcswidth(out,2); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_utf8=yes else am_cv_utf8=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_utf8" >&5 $as_echo "$am_cv_utf8" >&6; } if test $am_cv_utf8 = yes; then DEFIS="$DEFIS -DSUPPORT_UTF8" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5 $as_echo_n "checking for isfinite... " >&6; } if ${am_cv_isfinite+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _XOPEN_SOURCE 600 #include int main () { float a;a=1;isfinite(a); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_isfinite=yes else am_cv_isfinite=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_isfinite" >&5 $as_echo "$am_cv_isfinite" >&6; } if test $am_cv_isfinite = no; then DEFIS="$DEFIS -DNO_ISFINITE" fi # Extract the first word of "mksinfo", so it can be a program name with args. set dummy mksinfo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_mkstoolkit+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$mkstoolkit"; then ac_cv_prog_mkstoolkit="$mkstoolkit" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_mkstoolkit="found" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_mkstoolkit" && ac_cv_prog_mkstoolkit="no" fi fi mkstoolkit=$ac_cv_prog_mkstoolkit if test -n "$mkstoolkit"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $mkstoolkit" >&5 $as_echo "$mkstoolkit" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test $mkstoolkit = found; then if mksinfo > /dev/null; then DEFIS="$DEFIS -DHAVE_MKS_TOOLKIT" echo 'using MKS Toolkit' MKSFIX=".POSIX:" else echo 'mksinfo failed... not using MKS Toolkit' fi fi # Extract the first word of "python", so it can be a program name with args. set dummy python; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON="no" ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test $PYTHON = no; then HAVE_PYTHON=no echo ' Units will work without python but the currency update' echo ' script, units_cur, will not be installed' PYTHON='' else HAVE_PYTHON=yes fi # Check whether --enable-relocation was given. if test "${enable_relocation+set}" = set; then : enableval=$enable_relocation; if test $enable_relocation = yes ;then UDAT="" echo relocation enabled else UDAT="$datadir/units/" echo relocation disabled fi else UDAT="$datadir/units/" fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by GNU units $as_me 2.12, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to . GNU units home page: . General help using GNU software: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ GNU units config.status 2.12 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi units-2.12/units.h0000664000175000017500000001074612472715341013411 0ustar adrianadrian/* * units, a program for units conversion * Copyright (C) 1996, 1997, 1999, 2000, 2001, 2014 Free Software Foundation, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * This program was written by Adrian Mariano (adrianm@gnu.org) */ #include #include /* Apparently popen and pclose require leading _ under windows */ #if defined(_MSC_VER) || defined(__MINGW32__) # define popen _popen # define pclose _pclose #endif #ifdef NO_ISFINITE # if defined _WIN32 && defined _MSC_VER # define isfinite(x) (!_isnan(x) && _finite(x)) # else # define isfinite(x) ( -DBL_MAX <= (x) && (x) <= DBL_MAX ) # endif #endif #ifdef STRINGS_H # include #else # include #endif #ifndef NO_STDLIB_H # include #else char *malloc(), *realloc(), *getenv(); #endif #ifndef strchr # ifdef NO_STRCHR # define strchr(a,b) index((a),(b)) # else char *strchr(); # endif #endif /* !strchr */ #define E_NORMAL 0 #define E_PARSE 1 #define E_PRODOVERFLOW 2 #define E_REDUCE 3 #define E_BADSUM 4 #define E_NOTANUMBER 5 #define E_NOTROOT 6 #define E_UNKNOWNUNIT 7 #define E_FUNC 8 /* If errno is set after calling a function */ #define E_BADFUNCTYPE 9 #define E_BADFUNCARG 10 #define E_NOTINDOMAIN 11 #define E_BADFUNCDIMEN 12 #define E_NOINVERSE 13 #define E_PARSEMEM 14 #define E_FUNARGDEF 15 #define E_FILE 16 #define E_BADFILE 17 #define E_MEMORY 18 #define E_BADNUM 19 #define E_UNITEND 20 #define E_LASTUNSET 21 #define E_IRRATIONAL_EXPONENT 22 #define E_BASE_NOTROOT 23 #define E_DIMEXPONENT 24 #define E_NOTAFUNC 25 #define WHITE " \t\n" extern char *errormsg[]; /* Data type used to store a single unit being operated on. The numerator and denominator arrays contain lists of units (strings) which are terminated by a null pointer. The special string NULLUNIT is used to mark blank units that occur in the middle of the list. */ extern char *NULLUNIT; #define MAXSUBUNITS 100 /* Size of internal unit reduction buffer */ struct unittype { char *numerator[MAXSUBUNITS]; char *denominator[MAXSUBUNITS]; double factor; }; struct functype { char *param; char *def; char *dimen; double *domain_min, *domain_max; int domain_min_open, domain_max_open; }; struct pair { double location, value; }; struct func { char *name; struct functype forward; struct functype inverse; struct pair *table; int tablelen; char *tableunit; struct func *next; int skip_error_check; /* do not check for errors when running units -c */ int linenumber; char *file; /* file where defined */ }; struct parseflag { int oldstar; /* Does '*' have higher precedence than '/' */ int minusminus; /* Does '-' character give subtraction */ }; extern struct parseflag parserflags; extern struct unittype *parameter_value; extern char *function_parameter; extern int lastunitset; extern struct unittype lastunit; void *mymalloc(int bytes,char *mesg); int hassubscript(const char *str, int length); void initializeunit(struct unittype *theunit); void freeunit(struct unittype *theunit); void unitcopy(struct unittype *dest,struct unittype *src); int divunit(struct unittype *left, struct unittype *right); void invertunit(struct unittype *theunit); int multunit(struct unittype *left, struct unittype *right); int expunit(struct unittype *theunit, int power); int addunit(struct unittype *unita, struct unittype *unitb); int rootunit(struct unittype *inunit,int n); int unitpower(struct unittype *base, struct unittype *exponent); char *dupstr(const char *str); int unit2num(struct unittype *input); struct func *fnlookup(const char *str, int length); int evalfunc(struct unittype *theunit, struct func *infunc, int inverse, int allerror); int parseunit(struct unittype *output, char *input,char **errstr,int *errloc); units-2.12/units.texinfo0000664000175000017500000037461312606610543014641 0ustar adrianadrian\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename units.info @settitle Units: A Unit Conversion Program and Scientific Calculator @finalout @setchapternewpage off @firstparagraphindent none @set EDITION 2.11 @set VERSION 2.12 @c %**end of header @c ifman .\" @copying This manual is for GNU Units (version @value{VERSION}), which performs units conversions and units calculations. Copyright @copyright{} 1996, 1997, 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2011--2015 Free Software Foundation, Inc. @quotation Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. @c end ifman @c noman A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end quotation @end copying @c end noman @defcodeindex op @syncodeindex op cp @c noman @dircategory Science @direntry * Units: (units). Units conversion and scientific calculation. @end direntry @c end noman @c man .TH UNITS 1 "19 March 2014" @c man .SH NAME @c man units \(em unit conversion and calculation program @titlepage @title Units Conversion @subtitle Edition @value{EDITION} for @command{units} Version @value{VERSION} @author Adrian Mariano @page @vskip 0pt plus 1filll @insertcopying @end titlepage @contents @iftex @headings off @everyheading Units Conversion @| @| @thispage @end iftex @ifnottex @node Top @top Units Conversion @c noman This manual describes the @command{units} command for units conversion and how you can use it as a powerful scientific calculator that keeps track of units. This is Edition @value{EDITION} of @cite{The Units Conversion Manual} for @command{units} Version @value{VERSION}. @c end noman @end ifnottex @menu * Overview:: What does @command{units} do? * Interactive Use:: How to use @command{units}. * Command Line Use:: How to use @command{units} non-interactively. * Unit Definitions:: What units are defined? * Unit Expressions:: Forming compound units. * Nonlinear Conversions:: Nonlinear unit conversions (e.g., temperature). * Unit Lists:: Conversion to sums of units (e.g., feet and inches). * Logging Calculations:: Logging conversions and calculations in a file. * Invoking Units:: Command line options. * Defining Your Own Units:: Adding your own unit definitions * Numeric Output Format:: How to change the output format * Localization:: How to define and use regional unit names. * Environment Vars:: Environment variables used by @command{units}. * Data Files:: Descriptions and locations of units data files. * Unicode Support:: Support for Unicode (UTF-8). * Readline Support:: Unit name completion and editing. * Currency:: Updating currency exchange rates. * Database Syntax:: Summary of database command syntax. * GNU Free Documentation License:: License. * Index:: General index. @end menu @c noman @node Overview @chapter Overview of @command{units} @c end noman @c ifman @ignore @c '.PP' for consistency with spacing before other sections. .PP .SH SYNOPSIS .PP .CW units .RI [ options ] .RI [ from-unit .RI [ to-unit ]] .PP .SH DESCRIPTION @end ignore @c end ifman The @command{units} program converts quantities expressed in various systems of measurement to their equivalents in other systems of measurement. Like many similar programs, it can handle multiplicative scale changes. It can also handle nonlinear conversions such as Fahrenheit to @c man Celsius; @c noman Celsius;@footnote{But Fahrenheit to Celsius is linear, you insist. Not so. A transformation @math{T} is linear if @math{T(x+y)=T(x)+T(y)} and this fails for @math{T(x)=ax+b}. This transformation is affine, but not linear. } @pxref{Temperature Conversions}. @c end noman @c man see \fITemperature Conversions\fP. The program can also perform conversions from and to sums of units, such as converting between meters and feet plus inches. Basic operation is simple: you enter the units that you want to convert @emph{from} and the units that you want to convert @emph{to}. You can use the program interactively with prompts, or you can use it from the command line. Beyond simple unit conversions, @command{units} can be used as a general-purpose scientific calculator that keeps track of units in its calculations. You can form arbitrary complex mathematical expressions of dimensions including sums, products, quotients, powers, and even roots of dimensions. Thus you can ensure accuracy and dimensional consistency when working with long expressions that involve many different units that may combine in complex ways; for an illustration, @c man see \fIComplicated Unit Expressions\fP. @c noman @pxref{Complicated Unit Expressions}. @c end noman The units are defined in an external data file. You can use the extensive data file that comes with this program, or you can provide your own data file to suit your needs. You can also use your own data file to supplement the standard data file. You can change the default behavior of @command{units} with various options given on the command line. @xref{Invoking Units}, for a description of the available options. @node Interactive Use @chapter Interacting with @command{units} @cindex interactive use To invoke units for interactive use, type @kbd{units} at your shell prompt. The program will print something like this: @example @group Currency exchange rates from www.timegenie.com on 2014-03-05 2860 units, 109 prefixes, 85 nonlinear units You have: @end group @end example @noindent At the @w{@samp{You have:}} prompt, type the quantity and units that you are converting @emph{from}. For example, if you want to convert ten meters to feet, type @kbd{10 meters}. Next, @command{units} will print @w{@samp{You want:}}. You should type the units you want to convert @emph{to}. To convert to feet, you would type @kbd{feet}. If the @command{readline} library was compiled in then @key{tab} will complete unit names. @xref{Readline Support}, for more information about @command{readline}. To quit the program under Unix, press @key{Ctrl-C} or @key{Ctrl-D}. Under Windows, press @key{Ctrl-C} or @key{Ctrl-Z}; with the latter, you may also need to press @key{Enter}. The result will be displayed in two ways. The first line of output, which is marked with a @samp{*} to indicate multiplication, gives the result of the conversion you have asked for. The second line of output, which is marked with a @samp{/} to indicate division, gives the inverse of the conversion factor. If you convert 10 meters to feet, @command{units} will print @example @group * 32.808399 / 0.03048 @end group @end example @noindent which tells you that 10 meters equals about 32.8 feet. The second number gives the conversion in the opposite direction. In this case, it tells you that 1 foot is equal to about 0.03 dekameters since the dekameter is 10 meters. It also tells you that 1/32.8 is about 0.03. The @command{units} program prints the inverse because sometimes it is a more convenient number. In the example above, for example, the inverse value is an exact conversion: a foot is exactly 0.03048 dekameters. But the number given the other direction is inexact. If you convert grains to pounds, you will see the following: @example @group You have: grains You want: pounds * 0.00014285714 / 7000 @end group @end example @noindent From the second line of the output you can immediately see that a grain is equal to a seven thousandth of a pound. This is not so obvious from the first line of the output. If you find the output format confusing, try using the @option{--verbose} option: @cindex verbose output @example @group You have: grain You want: aeginamina grain = 0.00010416667 aeginamina grain = (1 / 9600) aeginamina @end group @end example @noindent If you request a conversion between units that measure reciprocal dimensions, then @command{units} will display the conversion results with an extra note indicating that reciprocal conversion has been done: @cindex reciprocal conversion @example @group You have: 6 ohms You want: siemens reciprocal conversion * 0.16666667 / 6 @end group @end example @noindent Reciprocal conversion can be suppressed by using the @option{--strict} option. As usual, use the @option{--verbose} option to get more comprehensible output: @cindex verbose output @cindex strict conversion @example @group You have: tex You want: typp reciprocal conversion 1 / tex = 496.05465 typp 1 / tex = (1 / 0.0020159069) typp You have: 20 mph You want: sec/mile reciprocal conversion 1 / 20 mph = 180 sec/mile 1 / 20 mph = (1 / 0.0055555556) sec/mile @end group @end example @noindent If you enter incompatible unit types, the @command{units} program will print a message indicating that the units are not conformable and it will display the reduced form for each unit: @cindex incompatible units @cindex non-conformable units @example @group You have: ergs/hour You want: fathoms kg^2 / day conformability error 2.7777778e-11 kg m^2 / sec^3 2.1166667e-05 kg^2 m / sec @end group @end example @noindent If you only want to find the reduced form or definition of a unit, simply press @key{Enter} at the @w{@samp{You want:}} prompt. Here is an example: @example @group You have: jansky You want: Definition: fluxunit = 1e-26 W/m^2 Hz = 1e-26 kg / s^2 @end group @end example @noindent The output from @command{units} indicates that the jansky is defined to be equal to a fluxunit which in turn is defined to be a certain combination of watts, meters, and hertz. The fully reduced (and in this case somewhat more cryptic) form appears on the far right. Some named units are treated as dimensionless in some situations. These units include the radian and steradian. These units will be treated as equal to 1 in units conversions. Power is equal to torque times angular velocity. This conversion can only be performed if the radian is dimensionless. @example @group You have: (14 ft lbf) (12 radians/sec) You want: watts * 227.77742 / 0.0043902509 @end group @end example @noindent It is also possible to compute roots and other non-integer powers of dimensionless units; this allows computations such as the altitude of geosynchronous orbit: @example @group You have: cuberoot(G earthmass / (circle/siderealday)^2) - earthradius You want: miles * 22243.267 / 4.4957425e-05 @end group @end example @noindent Named dimensionless units are not treated as dimensionless in other contexts. They cannot be used as exponents so for example, @samp{meter^radian} is forbidden. @cindex dimensionless units @cindex @samp{?} to show conformable units @cindex conformable units, @samp{?} to show If you want a list of options you can type @kbd{?} at the @w{@samp{You want:}} prompt. The program will display a list of named units that are conformable with the unit that you entered at the @w{@samp{You have:}} prompt above. Conformable unit @emph{combinations} will not appear on this list. @cindex help Typing @kbd{help} at either prompt displays a short help message. You can also type @kbd{help} followed by a unit name. This will invoke a pager on the units data base at the point where that unit is defined. You can read the definition and comments that may give more details or historical information about the unit. (You can generally quit out of the page by pressing @samp{q}.) Typing @kbd{search} @var{text} will display a list of all of the units whose names contain @var{text} as a substring along with their definitions. This may help in the case where you aren't sure of the right unit name. @node Command Line Use @chapter Using @command{units} Non-Interactively @cindex command-line unit conversion @cindex non-interactive unit conversion The @command{units} program can perform units conversions non-interactively from the command line. To do this, type the command, type the original unit expression, and type the new units you want. If a units expression contains non-alphanumeric characters, you may need to protect it from interpretation by the shell using single or double quote characters. If you type @example units "2 liters" quarts @end example @noindent then @command{units} will print @example @group * 2.1133764 / 0.47317647 @end group @end example @noindent and then exit. The output tells you that 2 liters is about 2.1 quarts, or alternatively that a quart is about 0.47 times 2 liters. If the conversion is successful, then @command{units} will return success (zero) to the calling environment. If you enter non-conformable units then @command{units} will print a message giving the reduced form of each unit and it will return failure (nonzero) to the calling environment. When you invoke @command{units} with only one argument, it will print out the definition of the specified unit. It will return failure if the unit is not defined and success if the unit is defined. @node Unit Definitions @chapter Unit Definitions @cindex unit definitions The conversion information is read from a units data file that is called @file{definitions.units} and is usually located in the @file{/usr/share/units} directory. If you invoke @command{units} with the @option{-V} option, it will print the location of this file. The default file includes definitions for all familiar units, abbreviations and metric prefixes. It also includes many obscure or archaic units. Many constants of nature are defined, including these: @example pi @r{ratio of circumference to diameter} c @r{speed of light} e @r{charge on an electron} force @r{acceleration of gravity} mole @r{Avogadro's number} water @r{pressure per unit height of water} Hg @r{pressure per unit height of mercury} au @r{astronomical unit} k @r{Boltzman's constant} mu0 @r{permeability of vacuum} epsilon0 @r{permittivity of vacuum} G @r{Gravitational constant} mach @r{speed of sound} @end example @noindent The standard data file includes atomic masses for all of the elements and numerous other constants. Also included are the densities of various ingredients used in baking so that @samp{2@tie{}cups flour_sifted} can be converted to @samp{grams}. This is not an exhaustive list. Consult the units data file to see the complete list, or to see the definitions that are used. @cindex measure, Imperial @cindex Imperial measure @cindex British Imperial measure The @samp{pound} is a unit of mass. To get force, multiply by the force conversion unit @samp{force} or use the shorthand @samp{lbf}. (Note that @samp{g} is already taken as the standard abbreviation for the gram.) The unit @samp{ounce} is also a unit of mass. The fluid ounce is @samp{fluidounce} or @samp{floz}. When British capacity units differ from their US counterparts, such as the British Imperial gallon, the unit is defined both ways with @samp{br} and @samp{us} prefixes. Your locale settings will determine the value of the unprefixed unit. Currency is prefixed with its country name: @samp{belgiumfranc}, @samp{britainpound}. @cindex units, lookup method When searching for a unit, if the specified string does not appear exactly as a unit name, then the @command{units} program will try to remove a trailing @samp{s}, @samp{es}. Next units will replace a trailing @samp{ies} with @samp{y}. If that fails, @command{units} will check for a prefix. The database includes all of the standard metric prefixes. Only one prefix is permitted per unit, so @samp{micromicrofarad} will fail. However, prefixes can appear alone with no unit following them, so @samp{micro*microfarad} will work, as will @samp{micro microfarad}. @cindex prefixes To find out which units and prefixes are available, read the standard units data file, which is extensively annotated. @section English Customary Units @cindex volume measure, English customary English customary units differ in various ways in different regions. In Britain a complex system of volume measurements featured different gallons for different materials such as a wine gallon and ale gallon that different by twenty percent. This complexity was swept away in 1824 by a reform that created an entirely new gallon, the British Imperial gallon defined as the volume occupied by ten pounds of water. Meanwhile in the USA the gallon is derived from the 1707 Winchester wine gallon, which is 231 cubic inches. These gallons differ by about twenty percent. By default if @command{units} runs in the @samp{en_GB} locale you will get the British volume measures. If it runs in the @samp{en_US} locale you will get the US volume measures. In other locales the default values are the US definitions. If you wish to force different definitions then set the environment variable @env{UNITS_ENGLISH} to either @samp{US} or @samp{GB} to set the desired definitions independent of the locale. @cindex length measure, English customary @cindex length measure, UK @cindex survey measure, US @cindex US survey measure @cindex survey mile, US @cindex US survey foot @cindex State Plane Coordinate System, US @cindex US State Plane Coordinate System @cindex survey foot, US @cindex US survey mile @cindex mile, international @cindex international mile @cindex yard, international @cindex international yard Before 1959, the value of a yard (and other units of measure defined in terms of it) differed slightly among English-speaking countries. In 1959, Australia, Canada, New Zealand, the United Kingdom, the United States, and South Africa adopted the Canadian value of 1@tie{}yard = 0.9144@tie{}m (exactly), which was approximately halfway between the values used by the UK and the US; it had the additional advantage of making 1@tie{}inch = 2.54@tie{}cm (exactly). This new standard was termed the @dfn{International Yard}. Australia, Canada, and the UK then defined all customary lengths in terms of the International Yard (Australia did not define the furlong or rod); because many US land surveys were in terms of the pre-1959 units, the US continued to define customary surveyors' units (furlong, chain, rod, and link) in terms of the previous value for the foot, which was termed the @dfn{US survey foot}. The US defined a @dfn{US survey mile} as 5280 US survey feet, and defined a @dfn{statute mile} as a US survey mile. The US values for these units differ from the international values by about 2@tie{}ppm. The @command{units} program uses the international values for these units; the US values can be obtained by using either the @samp{US} or the @samp{survey} prefix. In either case, the simple familiar relationships among the units are maintained, e.g., 1 @samp{furlong} = 660 @samp{ft}, and 1 @samp{USfurlong} = 660 @samp{USft}, though the metric equivalents differ slightly between the two cases. The @samp{US} prefix or the @samp{survey} prefix can also be used to obtain the US survey mile and the value of the US yard prior to 1959, e.g., @samp{USmile} or @samp{surveymile} (but @emph{not} @samp{USsurveymile}). To get the US value of the statute mile, use either @samp{USstatutemile} or @samp{USmile}. Except for distances that extend over hundreds of miles (such as in the US State Plane Coordinate System), the differences in the miles are usually insignificant: @example @group You have: 100 surveymile - 100 mile You want: inch * 12.672025 / 0.078913984 @end group @end example @noindent The pre-1959 UK values for these units can be obtained with the prefix @samp{UK}. In the US, the acre is officially defined in terms of the US survey foot, but @command{units} uses a definition based on the international foot. If you want the official US acre use @samp{USacre} and similarly use @samp{USacrefoot} for the official US version of that unit. The difference between these units is about 4 parts per million. @node Unit Expressions @chapter Unit Expressions @cindex unit expressions @menu * Operators:: The usual arithmetic operators, with a few extras * Sums and Differences of Units:: Adding and subtracting units * Numbers as Units:: A number is a dimensionless unit * Built-in Functions:: Trigonometric functions, logarithms, roots * Previous Result:: Inserting the result of the previous conversion * Complicated Unit Expressions:: A complicated example * Backwards Compatibility:: Alternate behavior for @samp{*} and @samp{-} @end menu @node Operators @section Operators @cindex operators You can enter more complicated units by combining units with operations such as multiplication, division, powers, addition, subtraction, and parentheses for grouping. You can use the customary symbols for these operators when @command{units} is invoked with its default options. Additionally, @command{units} supports some extensions, including high priority multiplication using a space, and a high priority numerical division operator (@samp{|}) that can simplify some expressions. @cindex products of units @cindex quotients of units @cindex units quotients @cindex multiplication of units @cindex division of units @cindex operator, @samp{per} @cindex @samp{per} operator @cindex operator, space @cindex operator, star (@samp{*}) @cindex star (@samp{*}) operator @cindex @samp{*} operator @cindex operator, slash (@samp{/}) @cindex slash (@samp{/}) operator @cindex operator, solidus (@samp{/}) @cindex solidus (@samp{/}) operator You multiply units using a space or an asterisk (@samp{*}). The next example shows both forms: @example @group You have: arabicfoot * arabictradepound * force You want: ft lbf * 0.7296 / 1.370614 @end group @end example @noindent You can divide units using the slash (@samp{/}) or with @samp{per}: @example @group You have: furlongs per fortnight You want: m/s * 0.00016630986 / 6012.8727 @end group @end example @cindex parentheses @noindent You can use parentheses for grouping: @example @group You have: (1/2) kg / (kg/meter) You want: league * 0.00010356166 / 9656.0833 @end group @end example @cindex operator precedence @cindex parentheses @noindent Multiplication using a space has a higher precedence than division using a slash and is evaluated left to right; in effect, the first @samp{/} character marks the beginning of the denominator of a unit expression. This makes it simple to enter a quotient with several terms in the denominator: @w{@samp{J / mol K}}. The @samp{*} and @samp{/} operators have the same precedence, and are evaluated left to right; if you multiply with @samp{*}, you must group the terms in the denominator with parentheses: @w{@samp{J / (mol * K)}}. @cindex fractions, numerical @cindex numerical fractions @cindex division of numbers @cindex operator, vertical bar (@samp{|}) @cindex vertical bar (@samp{|}) operator @cindex @samp{|} operator The higher precedence of the space operator may not always be advantageous. For example, @w{@samp{m/s s/day}} is equivalent to @w{@samp{m / s s day}} and has dimensions of length per time cubed. Similarly, @w{@samp{1/2 meter}} refers to a unit of reciprocal length equivalent to 0.5/meter, perhaps not what you would intend if you entered that expression. The get a half meter you would need to use parentheses: @w{@samp{(1/2) meter}}. The @samp{*} operator is convenient for multiplying a sequence of quotients. For example, @w{@samp{m/s * s/day}} is equivalent to @samp{m/day}. Similarly, you could write @w{@samp{1/2 * meter}} to get half a meter. The @command{units} program supports another option for numerical fractions: you can indicate division of @emph{numbers} with the vertical bar (@samp{|}), so if you wanted half a meter you could write @w{@samp{1|2 meter}}. You cannot use the vertical bar to indicate division of non-numerical units (e.g., @samp{m|s} results in an error message). @cindex powers @cindex exponent operator @cindex operator, caret (@samp{^}) @cindex operator, (@samp{**}) @cindex @samp{**} operator @cindex parentheses Powers of units can be specified using the @samp{^} character, as shown in the following example, or by simple concatenation of a unit and its exponent: @samp{cm3} is equivalent to @samp{cm^3}; if the exponent is more than one digit, the @samp{^} is required. You can also use @samp{**} as an exponent operator. @example @group You have: cm^3 You want: gallons * 0.00026417205 / 3785.4118 @end group @end example @noindent Concatenation only works with a single unit name: if you write @samp{(m/s)2}, @command{units} will treat it as multiplication by 2. @cindex prefixes and exponents When a unit includes a prefix, exponent operators apply to the combination, so @samp{centimeter3} gives cubic centimeters. If you separate the prefix from the unit with any multiplication operator (e.g., @samp{centi meter^3}), the prefix is treated as a separate unit, so the exponent applies only to the unit without the prefix. The second example is equivalent to @samp{centi * (meter^3)}, and gives a hundredth of a cubic meter, not a cubic centimeter. The @command{units} program is limited internally to products of 99 units; accordingly, expressions like @samp{meter^100} or @samp{joule^34} (represented internally as @w{@samp{kg^34 m^68 / s^68}}) will fail. The @samp{|} operator has the highest precedence, so you can write the square root of two thirds as @samp{2|3^1|2}. The @samp{^} operator has the second highest precedence, and is evaluated right to left, as usual: @example @group You have: 5 * 2^3^2 You want: Definition: 2560 @end group @end example @noindent With a dimensionless base unit, any dimensionless exponent is meaningful (e.g., @samp{pi^exp(2.371)}). Even though angle is sometimes treated as dimensionless, exponents cannot have dimensions of angle: @example @group You have: 2^radian ^ Exponent not dimensionless @end group @end example @noindent If the base unit is not dimensionless, the exponent must be a rational number @w{@var{p}/@var{q}}, and the dimension of the unit must be a power of @var{q}, so @samp{gallon^2|3} works but @samp{acre^2|3} fails. An exponent using the slash (@samp{/}) operator (e.g., @samp{gallon^(2/3)}) is also acceptable; the parentheses are needed because the precedence of @samp{^} is higher than that of @samp{/}. Since @command{units} cannot represent dimensions with exponents greater than 99, a fully reduced exponent must have @w{@var{q} < 100}. When raising a non-dimensionless unit to a power, @command{units} attempts to convert a decimal exponent to a rational number with @w{@var{q} < 100}. If this is not possible @command{units} displays an error message: @example @group You have: ft^1.234 Base unit not dimensionless; rational exponent required @end group @end example @noindent A decimal exponent must match its rational representation to machine precision, so @samp{acre^1.5} works but @samp{gallon^0.666} does not. @node Sums and Differences of Units @section Sums and Differences of Units @cindex sums and differences of units @cindex units, sums and differences @cindex operator, plus (@samp{+}) @cindex plus (@samp{+}) operator @cindex @samp{+} operator @cindex operator, minus (@samp{-}) @cindex minus (@samp{-}) operator, subtraction @cindex operator, hyphen (@samp{-}) as subtraction @cindex @samp{-} as subtraction operator @noindent You may sometimes want to add values of different units that are outside the SI. You may also wish to use @command{units} as a calculator that keeps track of units. Sums of conformable units are written with the @samp{+} character, and differences with the @samp{-} character. @cindex sums of units @cindex addition of units @cindex subtraction of units @cindex differences of units @example @group You have: 2 hours + 23 minutes + 32 seconds You want: seconds * 8612 / 0.00011611705 @end group @group You have: 12 ft + 3 in You want: cm * 373.38 / 0.0026782366 @end group @group You have: 2 btu + 450 ft lbf You want: btu * 2.5782804 / 0.38785542 @end group @end example @noindent The expressions that are added or subtracted must reduce to identical expressions in primitive units, or an error message will be displayed: @example @group You have: 12 printerspoint - 4 heredium ^ Illegal sum of non-conformable units @end group @end example @cindex parentheses @noindent As usual, the precedence for @samp{+} and @samp{-} is lower than that of the other operators. A fractional quantity such as 2@tie{}1/2 cups can be given as @samp{(2+1|2) cups}; the parentheses are necessary because multiplication has higher precedence than addition. If you omit the parentheses, @command{units} attempts to add @samp{2} and @samp{1|2 cups}, and you get an error message: @example @group You have: 2+1|2 cups ^ Illegal sum or difference of non-conformable units @end group @end example @noindent The expression could also be correctly written as @samp{(2+1/2) cups}. If you write @samp{2@tie{}1|2 cups} the space is interpreted as @emph{multiplication} so the result is the same as @samp{1 cup}. The @samp{+} and @samp{-} characters sometimes appears in exponents like @samp{3.43e+8}. This leads to an ambiguity in an expression like @samp{3e+2 yC}. The unit @samp{e} is a small unit of charge, so this can be regarded as equivalent to @samp{(3e+2) yC} or @samp{(3 e)+(2 yC)}. This ambiguity is resolved by always interpreting @samp{+} and @samp{-} as part of an exponent if possible. @node Numbers as Units @section Numbers as Units @cindex numbers as units For @command{units}, numbers are just another kind of unit. They can appear as many times as you like and in any order in a unit expression. For example, to find the volume of a box that is 2 ft by 3 ft by 12 ft in steres, you could do the following: @example @group You have: 2 ft 3 ft 12 ft You want: stere * 2.038813 / 0.49048148 You have: $ 5 / yard You want: cents / inch * 13.888889 / 0.072 @end group @end example @noindent And the second example shows how the dollar sign in the units conversion can precede the five. Be careful: @command{units} will interpret @samp{$5} with no space as equivalent to @samp{dollar^5}. @node Built-in Functions @section Built-in Functions @cindex functions, built in Several built-in functions are provided: @samp{sin}, @samp{cos}, @samp{tan}, @samp{ln}, @samp{log}, @samp{log2}, @samp{exp}, @samp{acos}, @samp{atan} and @samp{asin}. The @samp{sin}, @samp{cos}, and @samp{tan} functions require either a dimensionless argument or an argument with dimensions of angle. @example @group You have: sin(30 degrees) You want: Definition: 0.5 You have: sin(pi/2) You want: Definition: 1 You have: sin(3 kg) ^ Unit not dimensionless @end group @end example @noindent The other functions on the list require dimensionless arguments. The inverse trigonometric functions return arguments with dimensions of angle. @cindex roots @cindex square roots If you wish to take roots of units, you may use the @samp{sqrt} or @samp{cuberoot} functions. These functions require that the argument have the appropriate root. You can obtain higher roots by using fractional exponents: @example @group You have: sqrt(acre) You want: feet * 208.71074 / 0.0047913202 You have: (400 W/m^2 / stefanboltzmann)^(1/4) You have: Definition: 289.80882 K You have: cuberoot(hectare) ^ Unit not a root @end group @end example @node Previous Result @section Previous Result @cindex previous result @cindex @samp{_} to use result of previous conversion @noindent You can insert the result of the previous conversion using the underscore (@samp{_}). It is useful when you want to convert the same input to several different units, for example @example @group You have: 2.3 tonrefrigeration You want: btu/hr * 27600 / 3.6231884e-005 You have: _ You want: kW * 8.0887615 / 0.12362832 @end group @end example @noindent Suppose you want to do some deep frying that requires an oil depth of 2@tie{}inches. You have 1/2 gallon of oil, and want to know the largest-diameter pan that will maintain the required depth. The nonlinear unit @samp{circlearea} gives the @emph{radius} of the circle (@pxref{Other Nonlinear Units}, for a more detailed description) in SI units; you want the @emph{diameter} in @emph{inches}: @example @group You have: 1|2 gallon / 2 in You want: circlearea 0.10890173 m @end group @group You have: 2 _ You want: in * 8.5749393 / 0.1166189 @end group @end example @noindent In most cases, surrounding white space is optional, so the previous example could have used @samp{2_}. If @samp{_} follows a non-numerical unit symbol, however, the space is required: @example @group You have: m_ ^ Parse error @end group @end example @noindent When @samp{_} is followed by a digit, the operation is multiplication rather than exponentiation, so that @samp{_2}, is equivalent to @w{@samp{_ * 2}} rather than @samp{_^2}. You can use the @samp{_} symbol any number of times; for example, @example @group You have: m You want: Definition: 1 m You have: _ _ You want: Definition: 1 m^2 @end group @end example @noindent Using @samp{_} before a conversion has been performed (e.g., immediately after invocation) generates an error: @set codequoteundirected @c man .if \n(.g .tr '\(aq @example @group You have: _ ^ No previous result; '_' not set @end group @end example @c man .if \n(.g .tr '' @clear codequoteundirected @noindent Accordingly, @samp{_} serves no purpose when @command{units} is invoked non-interactively. If @command{units} is invoked with the @option{--verbose} option (@pxref{Invoking Units}), the value of @samp{_} is not expanded: @example @group You have: mile You want: ft mile = 5280 ft mile = (1 / 0.00018939394) ft You have: _ You want: m _ = 1609.344 m _ = (1 / 0.00062137119) m @end group @end example @noindent You can give @samp{_} at the @w{@samp{You want:}} prompt, but it usually is not very useful. @node Complicated Unit Expressions @section Complicated Unit Expressions @cindex unit expressions, complicated @noindent The @command{units} program is especially helpful in ensuring accuracy and dimensional consistency when converting lengthy unit expressions. @c noman @cindex Darcy--Weisbach equation For example, one form of the Darcy--Weisbach fluid-flow equation is @tex $$ \Delta P = {8 \over \pi^2} \rho fL { Q^2 \over d^5} $$ @end tex @ifnottex @example Delta P = (8/pi^2) rho f L (Q^2 / d^5) @end example @end ifnottex @noindent where @math{ \Delta P} is the pressure drop, @math{\rho} is the mass density, @math{f} is the (dimensionless) friction factor, @math{L} is the length of the pipe, @math{Q} is the volumetric flow rate, and @math{d} is the pipe diameter. It might be desired to have the equation in the form @tex $$ \Delta P = A_1 \rho fL {Q^2 \over d^5} $$ @end tex @ifnottex @example Delta P = A1 rho f L (Q^2 / d^5) @end example @end ifnottex @c end noman @c ----------------------------------- @c nroff--assume neqn is not available @c ----------------------------------- @c man .if t .ig ++ @c man For example, one form of the Darcy-Weisbach fluid-flow equation is @c man .RS 5n @c man .PP @c man Delta \fIP\fP = (8 / pi)^2 (rho \fIfLQ\fP^2) / \fId\fP^5, @c man .RE @c man .PP @c man where Delta \fIP\fP is the pressure drop, rho is the mass density, @c man \fIf\fP is the (dimensionless) friction factor, \fIL\fP is the length @c man of the pipe, \fIQ\fP is the volumetric flow rate, and \fId\fP @c man is the pipe diameter. @c man It might be desired to have the equation in the form @c man .RS 5n @c man .PP @c man Delta \fIP\fP = A1 rho \fIfLQ\fP^2 / \fId\fP^5 @c man .RE @c man .PP @c man .++ @c ----- @c troff @c ----- @c man .if n .ig ++ @c man .EQ @c man delim $$ @c man .EN @c don't assume en dash is available @c man For example, one form of the Darcy\-Weisbach fluid-flow equation is @c man .RS 5n @c man .PP @c man .EQ @c man DELTA P = 8 over pi sup 2 rho fL Q sup 2 over d sup 5 , @c man .EN @c man .RE @c man .PP @c man where $DELTA P$ is the pressure drop, $rho$ is the mass density, @c man $f$ is the (dimensionless) friction factor, $L$ is the length @c man of the pipe, $Q$ is the volumetric flow rate, and $d$ @c man is the pipe diameter. @c man It might be desired to have the equation in the form @c man .RS 5n @c man .PP @c man .EQ @c man DELTA P = A sub 1 rho fL Q sup 2 over d sup 5 @c man .EN @c man .RE @c man .PP @c man .EQ @c man delim off @c man .EN @c man .++ @c @noindent that accepted the user's normal units; for typical units used in the US, the required conversion could be something like @example @group You have: (8/pi^2)(lbm/ft^3)ft(ft^3/s)^2(1/in^5) You want: psi * 43.533969 / 0.022970568 @end group @end example @cindex parentheses @noindent The parentheses allow individual terms in the expression to be entered naturally, as they might be read from the formula. Alternatively, the multiplication could be done with the @samp{*} rather than a space; then parentheses are needed only around @samp{ft^3/s} because of its exponent: @example @group You have: 8/pi^2 * lbm/ft^3 * ft * (ft^3/s)^2 /in^5 You want: psi * 43.533969 / 0.022970568 @end group @end example @noindent Without parentheses, and using spaces for multiplication, the previous conversion would need to be entered as @example @group You have: 8 lb ft ft^3 ft^3 / pi^2 ft^3 s^2 in^5 You want: psi * 43.533969 / 0.022970568 @end group @end example @node Backwards Compatibility @section Backwards Compatibility: @samp{*} and @samp{-} @cindex backwards compatibility @cindex compatibility @cindex compatibility with earlier versions The original @command{units} assigned multiplication a higher precedence than division using the slash. This differs from the usual precedence rules, which give multiplication and division equal precedence, and can be confusing for people who think of units as a calculator. The star operator (@samp{*}) included in this @command{units} program has, by default, the same precedence as division, and hence follows the usual precedence rules. For backwards compatibility you can invoke @command{units} with the @option{--oldstar} option. Then @samp{*} has a higher precedence than division, and the same precedence as multiplication using the space. @cindex @samp{-} as multiplication operator @cindex operator, hyphen (@samp{-}) as multiplication @cindex multiplication, hyphen @cindex hyphen as multiplication operator Historically, the hyphen (@samp{-}) has been used in technical publications to indicate products of units, and the original @command{units} program treated it as a multiplication operator. Because @command{units} provides several other ways to obtain unit products, and because @samp{-} is a subtraction operator in general algebraic expressions, @command{units} treats the binary @samp{-} as a subtraction operator by default. For backwards compatibility use the @option{--product} option, which causes @command{units} to treat the binary @samp{-} operator as a product operator. When @samp{-} is a multiplication operator it has the same precedence as multiplication with a space, giving it a higher precedence than division. When @samp{-} is used as a unary operator it negates its operand. Regardless of the @command{units} options, if @samp{-} appears after @samp{(} or after @samp{+} then it will act as a negation operator. So you can always compute 20 degrees minus 12 minutes by entering @samp{20@tie{}degrees + -12@tie{}arcmin}. You must use this construction when you define new units because you cannot know what options will be in force when your definition is processed. @cindex defining units with `-' @node Nonlinear Conversions @chapter Nonlinear Unit Conversions @cindex nonlinear unit conversions Nonlinear units are represented using functional notation. They make possible nonlinear unit conversions such as temperature. @menu * Temperature Conversions:: Conversion between temperature scales * Other Nonlinear Units:: Ring size, wire gauge, abrasive grit size @end menu @node Temperature Conversions @section Temperature Conversions @cindex temperature conversions Conversions between temperatures are different from linear conversions between temperature @emph{increments}---see the example below. The absolute temperature conversions are handled by units starting with @samp{temp}, and you must use functional notation. The temperature-increment conversions are done using units starting with @samp{deg} and they do not require functional notation. @example @group You have: tempF(45) You want: tempC 7.2222222 You have: 45 degF You want: degC * 25 / 0.04 @end group @end example @noindent Think of @samp{tempF(@var{x})} not as a function but as a notation that indicates that @var{x} should have units of @samp{tempF} attached to it. @xref{Defining Nonlinear Units}. The first conversion shows that if it's 45 degrees Fahrenheit outside, it's 7.2 degrees Celsius. The second conversion indicates that a change of 45 degrees Fahrenheit corresponds to a change of 25 degrees Celsius. The conversion from @samp{tempF(@var{x})} is to absolute temperature, so that @example @group You have: tempF(45) You want: degR * 504.67 / 0.0019814929 @end group @end example @noindent gives the same result as @example @group You have: tempF(45) You want: tempR * 504.67 / 0.0019814929 @end group @end example @noindent But if you convert @samp{tempF(@var{x})} to @samp{degC}, the output is probably not what you expect: @example @group You have: tempF(45) You want: degC * 280.37222 / 0.0035666871 @end group @end example @noindent The result is the temperature in K, because @samp{degC} is defined as @samp{K}, the Kelvin. For consistent results, use the @samp{temp@var{X}} units when converting to a temperature rather than converting a temperature increment. The @samp{tempC()} and @samp{tempF()} definitions are limited to positive absolute temperatures, and giving a value that would result in a negative absolute temperature generates an error message: @example @group You have: tempC(-275) ^ Argument of function outside domain ^ @end group @end example @node Other Nonlinear Units @section Other Nonlinear Units @cindex nonlinear units, other Some other examples of nonlinear units are numerous different ring sizes and wire gauges, the grit sizes used for abrasives, the decibel scale, shoe size, scales for the density of sugar (e.g., baume). The standard data file also supplies units for computing the area of a circle and the volume of a sphere. See the standard units data file for more details. Wire gauges with multiple zeroes are signified using negative numbers where two zeroes is @samp{-1}. Alternatively, you can use the synonyms @samp{g00}, @samp{g000}, and so on that are defined in the standard units data file. @cindex wire gauge @example @group You have: wiregauge(11) You want: inches * 0.090742002 / 11.020255 You have: brwiregauge(g00) You want: inches * 0.348 / 2.8735632 You have: 1 mm You want: wiregauge 18.201919 You have: grit_P(600) You want: grit_ansicoated 342.76923 @end group @end example @noindent The last example shows the conversion from P graded sand paper, which is the European standard and may be marked ``P600'' on the back, to the USA standard. @cindex abrasive grit size You can compute the area of a circle using the nonlinear unit, @samp{circlearea}. You can also do this using the circularinch or circleinch. The next example shows two ways to compute the area of a circle with a five inch radius and one way to compute the volume of a sphere with a radius of one meter. @cindex circle, area of @cindex sphere, volume of @example @group You have: circlearea(5 in) You want: in2 * 78.539816 / 0.012732395 You have: 10^2 circleinch You want: in2 * 78.539816 / 0.012732395 You have: spherevol(meter) You want: ft3 * 147.92573 / 0.0067601492 @end group @end example @noindent The inverse of a nonlinear conversion is indicated by prefixing a tilde (@samp{~}) to the nonlinear unit name: @example @group You have: ~wiregauge(0.090742002 inches) You want: Definition: 11 @end group @end example @noindent You can give a nonlinear unit definition without an argument or parentheses, and press @key{Enter} at the @w{@samp{You want:}} prompt to get the definition of a nonlinear unit; if the definition is not valid for all real numbers, the range of validity is also given. If the definition requires specific units this information is also displayed: @example @group You have: tempC Definition: tempC(x) = x K + stdtemp defined for x >= -273.15 You have: ~tempC Definition: ~tempC(tempC) = (tempC +(-stdtemp))/K defined for tempC >= 0 K You have: circlearea Definition: circlearea(r) = pi r^2 r has units m @end group @end example @noindent To see the definition of the inverse use the @samp{~} notation. In this case the parameter in the functional definition will usually be the name of the unit. Note that the inverse for @samp{tempC} shows that it requires units of @samp{K} in the specification of the allowed range of values. Nonlinear unit conversions are described in more detail in @ref{Defining Nonlinear Units}. @node Unit Lists @chapter Unit Lists: Conversion to Sums of Units @cindex sums of units @cindex unit lists @cindex units, sums of Outside of the SI, it is sometimes desirable to convert a single unit to a sum of units---for example, feet to feet plus inches. The conversion @emph{from} sums of units was described in @ref{Sums and Differences of Units}, and is a simple matter of adding the units with the @samp{+} sign: @example @group You have: 12 ft + 3 in + 3|8 in You want: ft * 12.28125 / 0.081424936 @end group @end example @noindent Although you can similarly write a sum of units to convert @emph{to}, the result will not be the conversion to the units in the sum, but rather the conversion to the particular sum that you have entered: @example @group You have: 12.28125 ft You want: ft + in + 1|8 in * 11.228571 / 0.089058524 @end group @end example @noindent The unit expression given at the @w{@samp{You want:}} prompt is equivalent to asking for conversion to multiples of @samp{1@tie{}ft + 1@tie{}in + 1|8@tie{}in}, which is 1.09375 ft, so the conversion in the previous example is equivalent to @example @group You have: 12.28125 ft You want: 1.09375 ft * 11.228571 / 0.089058524 @end group @end example @noindent In converting to a sum of units like miles, feet and inches, you typically want the largest integral value for the first unit, followed by the largest integral value for the next, and the remainder converted to the last unit. You can do this conversion easily with @command{units} using a special syntax for lists of units. You must list the desired units in order from largest to smallest, separated by the semicolon (@samp{;}) character: @example @group You have: 12.28125 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in @end group @end example @noindent The conversion always gives integer coefficients on the units in the list, except possibly the last unit when the conversion is not exact: @example @group You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3.00096 * 1|8 in @end group @end example @noindent The order in which you list the units is important: @example @group You have: 3 kg You want: oz;lb 105 oz + 0.051367866 lb You have: 3 kg You want: lb;oz 6 lb + 9.8218858 oz @end group @end example @noindent Listing ounces before pounds produces a technically correct result, but not a very useful one. You must list the units in descending order of size in order to get the most useful result. Ending a unit list with the separator @samp{;} has the same effect as repeating the last unit on the list, so @samp{ft;in;1|8 in;} is equivalent to @samp{ft;in;1|8 in;1|8 in}. With the example above, this gives @example @group You have: 12.28126 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in + 0.00096 * 1|8 in @end group @end example @noindent in effect separating the integer and fractional parts of the coefficient for the last unit. If you instead prefer to round the last coefficient to an integer you can do this with the @option{--round} (@option{-r}) option. With the previous example, the result is @example @group You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in (rounded down to nearest 1|8 in) @end group @end example @noindent When you use the @option{-r} option, repeating the last unit on the list has no effect (e.g., @samp{ft;in;1|8 in;1|8 in} is equivalent to @samp{ft;in;1|8 in}), and hence neither does ending a list with a @samp{;}. With a single unit and the @option{-r} option, a terminal @samp{;} @emph{does} have an effect: it causes @command{units} to treat the single unit as a list and produce a rounded value for the single unit. Without the extra @samp{;}, the @option{-r} option has no effect on single unit conversions. This example shows the output using the @option{-r} option: @example @group You have: 12.28126 ft You want: in * 147.37512 / 0.0067854058 You have: 12.28126 ft You want: in; 147 in (rounded down to nearest in) @end group @end example @noindent Each unit that appears in the list must be conformable with the first unit on the list, and of course the listed units must also be conformable with the unit that you enter at the @w{@samp{You have:}} prompt. @example @group You have: meter You want: ft;kg ^ conformability error ft = 0.3048 m kg = 1 kg @end group @group You have: meter You want: lb;oz conformability error 1 m 0.45359237 kg @end group @end example @noindent In the first case, @command{units} reports the disagreement between units appearing on the list. In the second case, @command{units} reports disagreement between the unit you entered and the desired conversion. This conformability error is based on the first unit on the unit list. Other common candidates for conversion to sums of units are angles and time: @example @group You have: 23.437754 deg You want; deg;arcmin;arcsec 23 deg + 26 arcmin + 15.9144 arcsec @end group @group You have: 7.2319 hr You want: hr;min;sec 7 hr + 13 min + 54.84 sec @end group @end example @noindent In North America, recipes for cooking typically measure ingredients by volume, and use units that are not always convenient multiples of each other. Suppose that you have a recipe for 6 and you wish to make a portion for 1. If the recipe calls for 2@tie{}1/2 cups of an ingredient, you might wish to know the measurements in terms of measuring devices you have available, you could use @command{units} and enter @example @group You have: (2+1|2) cup / 6 You want: cup;1|2 cup;1|3 cup;1|4 cup;tbsp;tsp;1|2 tsp;1|4 tsp 1|3 cup + 1 tbsp + 1 tsp @end group @end example @noindent By default, if a unit in a list begins with fraction of the form 1|@var{x} and its multiplier is an integer, the fraction is given as the product of the multiplier and the numerator; for example, @example @group You have: 12.28125 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in @end group @end example @noindent In many cases, such as the example above, this is what is wanted, but sometimes it is not. For example, a cooking recipe for 6 might call for 5@tie{}1/4 cup of an ingredient, but you want a portion for 2, and your 1-cup measure is not available; you might try @example @group You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3|2 cup + 1|4 cup @end group @end example @noindent This result might be fine for a baker who has a 1@tie{}1/2-cup measure (and recognizes the equivalence), but it may not be as useful to someone with more limited set of measures, who does want to do additional calculations, and only wants to know ``How many 1/2-cup measures to I need to add?'' After all, that's what was actually asked. With the @option{--show-factor} option, the factor will not be combined with a unity numerator, so that you get @example @group You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3 * 1|2 cup + 1|4 cup @end group @end example @noindent A user-specified fractional unit with a numerator other than 1 is never overridden, however---if a unit list specifies @samp{3|4 cup;1|2 cup}, a result equivalent to 1@tie{}1/2 cups will always be shown as @samp{2 * 3|4@tie{}cup} whether or not the @option{--show-factor} option is given. Some applications for unit lists may be less obvious. Suppose that you have a postal scale and wish to ensure that it's accurate at 1@tie{}oz, but have only metric calibration weights. You might try @example @group You have: 1 oz You want: 100 g;50 g; 20 g;10 g;5 g;2 g;1 g; 20 g + 5 g + 2 g + 1 g + 0.34952312 * 1 g @end group @end example @noindent You might then place one each of the 20@tie{}g, 5@tie{}g, 2@tie{}g, and 1@tie{}g weights on the scale and hope that it indicates close to @example @group You have: 20 g + 5 g + 2 g + 1 g You want: oz; 0.98767093 oz @end group @end example @noindent Appending @samp{;} to @samp{oz} forces a one-line display that includes the unit; here the integer part of the result is zero, so it is not displayed. A unit list such as @example cup;1|2@tie{}cup;1|3@tie{}cup;1|4@tie{}cup;tbsp;tsp;1|2@tie{}tsp;1|4@tie{}tsp @end example @noindent can be tedious to enter. The @command{units} program provides shorthand names for some common combinations: @example hms @r{hours, minutes, seconds} dms @r{angle: degrees, minutes, seconds} time @r{years, days, hours, minutes and seconds} usvol @r{US cooking volume: cups and smaller} @end example @noindent Using these shorthands, or @dfn{unit list aliases}, you can do the following conversions: @example @group You have: anomalisticyear You want: time 1 year + 25 min + 3.4653216 sec You have: 1|6 cup You want: usvol 2 tbsp + 2 tsp @end group @end example @noindent You cannot combine a unit list alias with other units: it must appear alone at the @w{@samp{You want:}} prompt. You can display the definition of a unit list alias by entering it at the @w{@samp{You have:}} prompt: @example @group You have: dms Definition: unit list, deg;arcmin;arcsec @end group @end example @noindent When you specify compact output with @option{--compact}, @option{--terse} or @option{-t} and perform conversion to a unit list, @command{units} lists the conversion factors for each unit in the list, separated by semicolons. @example @group You have: year You want: day;min;sec 365;348;45.974678 @end group @end example @noindent Unlike the case of regular output, zeros @emph{are} included in this output list: @example @group You have: liter You want: cup;1|2 cup;1|4 cup;tbsp 4;0;0;3.6280454 @end group @end example @node Logging Calculations @chapter Logging Calculations @cindex logging calculations @cindex log file The @option{--log} option allows you to save the results of calculations in a file; this can be useful if you need a permanent record of your work. For example, the fluid-flow conversion in @ref{Complicated Unit Expressions}, is lengthy, and if you were to use it in designing a piping system, you might want a record of it for the project file. If the interactive session @example @group # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 You have: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units You want: psi * 43.533969 / 0.022970568 @end group @end example @noindent were logged, the log file would contain @example @group ### Log started Fri Oct 02 15:55:35 2015 # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 From: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units To: psi * 43.533969 / 0.022970568 @end group @end example @noindent The time is written to the log file when the file is opened. The use of comments can help clarify the meaning of calculations for the log. The log includes conformability errors between the units at the @w{@samp{You have:}} and @w{@samp{You want:}} prompts, but not other errors, including lack of conformability of items in sums or differences or among items in a unit list. For example, a conversion between zenith angle and elevation angle could involve @example @group You have: 90 deg - (5 deg + 22 min + 9 sec) ^ Illegal sum or difference of non-conformable units You have: 90 deg - (5 deg + 22 arcmin + 9 arcsec) You want: dms 84 deg + 37 arcmin + 51 arcsec You have: _ You want: deg * 84.630833 / 0.011816024 You have: @end group @end example @noindent The log file would contain @example @group From: 90 deg - (5 deg + 22 arcmin + 9 arcsec) To: deg;arcmin;arcsec 84 deg + 37 arcmin + 51 arcsec From: _ To: deg * 84.630833 / 0.011816024 @end group @end example @noindent The initial entry error (forgetting that minutes have dimension of time, and that arcminutes must be used for dimensions of angle) does not appear in the output. When converting to a unit list alias, @command{units} expands the alias in the log file. The @samp{From:} and @samp{To:} tags are written to the log file even if the @option{--quiet} option is given. If the log file exists when @command{units} is invoked, the new results are appended to the log file. The time is written to the log file each time the file is opened. The @option{--log} option is ignored when @command{units} is used non-interactively. @node Invoking Units @chapter Invoking @command{units} @cindex invoking units @cindex command-line options You invoke @command{units} like this: @example units [@var{options}] [@var{from-unit} [@var{to-unit}]] @end example @noindent If the @var{from-unit} and @var{to-unit} are omitted, the program will use interactive prompts to determine which conversions to perform. @xref{Interactive Use}. If both @var{from-unit} and @var{to-unit} are given, @command{units} will print the result of that single conversion and then exit. If only @var{from-unit} appears on the command line, @command{units} will display the definition of that unit and exit. Units specified on the command line may need to be quoted to protect them from shell interpretation and to group them into two arguments. @xref{Command Line Use}. The default behavior of @command{units} can be changed by various options given on the command line. In most cases, the options may be given in either short form (a single @samp{-} followed by a single character) or long form (@samp{--} followed by a word or hyphen-separated words). Short-form options are cryptic but require less typing; long-form options require more typing but are more explanatory and may be more mnemonic. With long-form options you need only enter sufficient characters to uniquely identify the option to the program. For example, @samp{--out@tie{}%f} works, but @samp{--o@tie{}%f} fails because @command{units} has other long options beginning with @samp{o}. However, @samp{--q} works because @samp{--quiet} is the only long option beginning with @samp{q}. Some options require arguments to specify a value (e.g., @samp{-d@tie{}12} or @samp{--digits@tie{}12}). Short-form options that do not take arguments may be concatenated (e.g., @samp{-erS} is equivalent to @samp{-e@tie{}-r@tie{}-S}); the last option in such a list may be one that takes an argument (e.g., @samp{-ed@tie{}12}). With short-form options, the space between an option and its argument is optional (e.g., @samp{-d12} is equivalent to @samp{-d@tie{}12}). Long-form options may not be concatenated, and the space between a long-form option and its argument is required. Short-form and long-form options may be intermixed on the command line. Options may be given in any order, but when incompatible options (e.g., @option{--output-format} and @option{--exponential}) are given in combination, behavior is controlled by the last option given. For example, @samp{-o%.12f@tie{}-e} gives exponential format with the default eight significant digits). The following options are available: @table @env @item -c @itemx --check @opindex -c @r{(option for} @command{units}@r{)} @opindex --check @r{(option for} @command{units}@r{)} Check that all units and prefixes defined in the units data file reduce to primitive units. Print a list of all units that cannot be reduced. Also display some other diagnostics about suspicious definitions in the units data file. Only definitions active in the current locale are checked. You should always run @command{units} with this option after modifying a units data file. @item --check-verbose @itemx --verbose-check @opindex --check-verbose @r{(option for} @command{units}@r{)} @opindex --verbose-check @r{(option for} @command{units}@r{)} Like the @option{--check} option, this option prints a list of units that cannot be reduced. But to help find unit definitions that cause endless loops, it lists the units as they are checked. If @command{units} hangs, then the last unit to be printed has a bad definition. Only definitions active in the current locale are checked. @item -d @var{ndigits} @itemx --digits @var{ndigits} @opindex -d @r{(option for} @command{units}@r{)} @opindex --digits @r{(option for} @command{units}@r{)} Set the number of significant digits in the output to the value specified (which must be greater than zero). For example, @samp{-d@tie{}12} sets the number of significant digits to 12. With exponential output @command{units} displays one digit to the left of the decimal @c man point @c noman point@footnote{This document refers to ``decimal point,'' but strictly, the @dfn{radix} separates the integer and fractional parts of a floating-point number; in English-speaking countries, the radix is a point (@samp{.}), but in most other countries it is a comma (@samp{,}).} @c end noman and eleven digits to the right of the decimal point. On most systems, the maximum number of internally meaningful digits is 15; if you specify a greater number than your system's maximum, @command{units} will print a warning and set the number to the largest meaningful value. To directly set the maximum value, give an argument of @code{max} (e.g., @samp{-d@tie{}max}). Be aware, of course, that ``significant'' here refers only to the @emph{display} of numbers; if results depend on physical constants not known to this precision, the physically meaningful precision may be less than that shown. The @option{--digits} option conflicts with the @option{--output-format} option. @item -e @itemx --exponential @opindex -e @r{(option for} @command{units}@r{)} @opindex --exponential @r{(option for} @command{units}@r{)} Set the numeric output format to exponential (i.e., scientific notation), like that used in the Unix @command{units} program. The default precision is eight significant digits (seven digits to the right of the decimal point); this can be changed with the @option{--digits} option. The @option{--exponential} option conflicts with the @option{--output-format} option. @item -o @var{format} @itemx --output-format @var{format} @opindex -o @r{(option for} @command{units}@r{)} @opindex --output-format @r{(option for} @command{units}@r{)} This option affords complete control over the numeric output format using the specified @var{format}. The format is a single floating point numeric format for the @code{printf()} function in the C programming language. All compilers support the format types @samp{g} and @samp{G} to specify significant digits, @samp{e} and @samp{E} for scientific notation, and @samp{f} for fixed-point decimal. The ISO C99 standard introduced the @samp{F} type for fixed-point decimal and the @samp{a} and @samp{A} types for hexadecimal floating point; these types are allowed with compilers that support them. The default format is @samp{%.8g}; for greater precision, you could specify @samp{-o@tie{}%.15g}. @xref{Numeric Output Format}, and the documentation for @code{printf()} for more detailed descriptions of the format specification. The @option{--output-format} option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the @code{printf()} format syntax. If you don't want to bother with the @code{printf()} syntax, you can specify greater precision more simply with the @option{--digits} option or select exponential format with @option{--exponential}. The @option{--output-format} option is incompatible with the @option{--exponential} and @option{--digits} options. @item -f @var{filename} @itemx --file @var{filename} @opindex -f @r{(option for} @command{units}@r{)} @opindex --file @r{(option for} @command{units}@r{)} Instruct @command{units} to load the units file @var{filename}. You can specify up to 25 units files on the command line. When you use this option, @command{units} will load @emph{only} the files you list on the command line; it will not load the standard file or your personal units file unless you explicitly list them. If @var{filename} is the empty string (@w{@samp{-f ""}}), the default units file (or that specified by @env{UNITSFILE}) will be loaded in addition to any others specified with @samp{-f}. @item -L @var{logfile} @itemx --log @var{logfile} @opindex -L @r{(option for} @command{units}@r{)} @opindex --log @r{(option for} @command{units}@r{)} Save the results of calculations in the file @var{logfile}; this can be useful if it is important to have a record of unit conversions or other calculations that are to be used extensively or in a critical activity such as a program or design project. If @var{logfile} exits, the new results are appended to the file. This option is ignored when @command{units} is used non-interactively. @xref{Logging Calculations}, for a more detailed description and some examples. @item -H @var{filename} @itemx --history @var{filename} @opindex -f @r{(option for} @command{units}@r{)} @opindex --file @r{(option for} @command{units}@r{)} Instruct @command{units} to save history to @var{filename}, so that a record of your commands is available for retrieval across different @command{units} invocations. To prevent the history from being saved set @var{filename} to the emptry string (@w{@samp{-f ""}}). This option has no effect if readline is not available. @item -h @itemx --help @opindex -h @r{(option for} @command{units}@r{)} @opindex --help @r{(option for} @command{units}@r{)} Print out a summary of the options for @command{units}. @item -m @itemx --minus @opindex -m @r{(option for} @command{units}@r{)} @opindex --minus @r{(option for} @command{units}@r{)} Causes @samp{-} to be interpreted as a subtraction operator. This is the default behavior. @item -p @itemx --product @opindex -p @r{(option for} @command{units}@r{)} @opindex --product @r{(option for} @command{units}@r{)} Causes @samp{-} to be interpreted as a multiplication operator when it has two operands. It will act as a negation operator when it has only one operand: @samp{(-3)}. By default @samp{-} is treated as a subtraction operator. @item --oldstar @opindex --oldstar @r{(option for} @command{units}@r{)} Causes @samp{*} to have the old-style precedence, higher than the precedence of division so that @samp{1/2*3} will equal @samp{1/6}. @item --newstar @opindex --newstar @r{(option for} @command{units}@r{)} Forces @samp{*} to have the new (default) precedence that follows the usual rules of algebra: the precedence of @samp{*} is the same as the precedence of @samp{/}, so that @samp{1/2*3} will equal @samp{3/2}. @item --compact @opindex --compact @r{(option for} @command{units}@r{)} Give compact output featuring only the conversion factor. This turns off the @option{--verbose} option. @item -q @itemx --quiet @itemx --silent @opindex -q @r{(option for} @command{units}@r{)} @opindex --quiet @r{(option for} @command{units}@r{)} @opindex --silent @r{(option for} @command{units}@r{)} Suppress prompting of the user for units and the display of statistics about the number of units loaded. @item -n @itemx --nolists Disable conversion to unit lists. @item -r @itemx --round When converting to a combination of units given by a unit list, round the value of the last unit in the list to the nearest integer. @item -S @itemx --show-factor When converting to a combination of units specified in a list, always show a non-unity factor before a unit that begins with a fraction with a unity denominator. By default, if the unit in a list begins with fraction of the form 1|@var{x} and its multiplier is an integer other than 1, the fraction is given as the product of the multiplier and the numerator (e.g., @samp{3|8@tie{}in} rather than @samp{3 * 1|8@tie{}in}). In some cases, this is not what is wanted; for example, the results for a cooking recipe might show @samp{3 * 1|2@tie{}cup} as @samp{3|2@tie{}cup}. With the @option{--show-factor} option, a result equivalent to 1.5 cups will display as @samp{3 * 1|2@tie{}cup} rather than @samp{3|2@tie{}cup}. A user-specified fractional unit with a numerator other than 1 is never overridden, however---if a unit list specifies @samp{3|4 cup;1|2 cup}, a result equivalent to 1@tie{}1/2 cups will always be shown as @samp{2 * 3|4@tie{}cup} whether or not the @option{--show-factor} option is given. @item -s @itemx --strict @opindex -s @r{(option for} @command{units}@r{)} @opindex --strict @r{(option for} @command{units}@r{)} Suppress conversion of units to their reciprocal units. For example, @command{units} will normally convert hertz to seconds because these units are reciprocals of each other. The strict option requires that units be strictly conformable to perform a conversion, and will give an error if you attempt to convert hertz to seconds. @item -1 @itemx --one-line @opindex -1 @r{(option for} @command{units}@r{)} @opindex --one-line @r{(option for} @command{units}@r{)} Give only one line of output (the forward conversion). Do not print the reverse conversion. If a reciprocal conversion is performed then @command{units} will still print the ``reciprocal conversion'' line. @item -t @itemx --terse @opindex -t @r{(option for} @command{units}@r{)} @opindex --terse @r{(option for} @command{units}@r{)} Give terse output when converting units. This option can be used when calling @command{units} from another program so that the output is easy to parse. This option has the combined effect of these options: @option{--strict} @option{--quiet} @option{--one-line} @option{--compact}. When combined with @option{--version} it produces a display showing only the program name and version number. @item -v @itemx --verbose @opindex -v @r{(option for} @command{units}@r{)} @opindex --verbose @r{(option for} @command{units}@r{)} Give slightly more verbose output when converting units. When combined with the @option{-c} option this gives the same effect as @option{--check-verbose}. When combined with @option{--version} produces a more detailed output, equivalent to the @option{--info} option. @item -V @itemx --version @opindex -V @r{(option for} @command{units}@r{)} @opindex --version @r{(option for} @command{units}@r{)} Print the program version number, tell whether the @command{readline} library has been included, tell whether UTF-8 support has been included; give the locale, the location of the default units data file, and the location of the personal units data file; indicate if the personal units data file does not exist. When given in combination with the @option{--terse} option, the program prints only the version number and exits. When given in combination with the @option{--verbose} option, the program, the @option{--version} option has the same effect as the @option{--info} option below. @item -I @itemx --info @opindex -I @r{(option for} @command{units}@r{)} @opindex --info @r{(option for} @command{units}@r{)} Print the information given with the @option{--version} option, show the pathname of the units program, show the status of the @env{UNITSFILE} and @env{MYUNITSFILE} environment variables, and additional information about how @command{units} locates the related files. On systems running Microsoft Windows, the status of the @env{UNITSLOCALE} environment variable and information about the related locale map are also given. This option is usually of interest only to developers and administrators, but it can sometimes be useful for troubleshooting. Combining the @option{--version} and @option{--verbose} options has the same effect as giving @option{--info}. @item -U @itemx --unitsfile @opindex -U @r{(option for} @command{units}@r{)} @opindex --unitsfile @r{(option for} @command{units}@r{)} Print the location of the default units data file and exit; if the file cannot be found, print ``Units data file not found''. @item -l @var{locale} @itemx --locale @var{locale} Print the information given with the @option{--version} option, show the @opindex --locale @r{(option for} @command{units}@r{)} @opindex -l @r{(option for} @command{units}@r{)} Force a specified locale such as @samp{en_GB} to get British definitions by default. This overrides the locale determined from system settings or environment variables. @xref{Locale}, for a description of locale format. @end table @node Defining Your Own Units @chapter Adding Your Own Definitions @menu * Units Data Files:: Where are units defined? * Defining New Units:: Writing your own unit and prefix definitions * Defining Nonlinear Units:: Writing your own nonlinear unit definitions * Piecewise Linear Units:: Writing your own piecewise linear definitions * Defining Unit List Aliases:: Writing your own unit list aliases @end menu @node Units Data Files @section Units Data Files @cindex additional units data files @cindex data files, additional @cindex units data files, additional @cindex @samp{!include} @cindex command, @samp{!include} @cindex including additional units data files The units and prefixes that @command{units} can convert are defined in the units data file, typically @file{/usr/share/units/definitions.units}. If you can't find this file, run @command{units@tie{}--version} to get information on the file locations for your installation. Although you can extend or modify this data file if you have appropriate user privileges, it's usually better to put extensions in separate files so that the definitions will be preserved if you update @command{units}. You can include additional data files in the units database using the @samp{!include} command in the standard units data file. For example @example !include /usr/local/share/units/local.units @end example @noindent might be appropriate for a site-wide supplemental data file. The location of the @samp{!include} statement in the standard units data file is important; later definitions replace earlier ones, so any definitions in an included file will override definitions before the @samp{!include} statement in the standard units data file. With normal invocation, no warning is given about redefinitions; to ensure that you don't have an unintended redefinition, run @command{units@tie{}-c} after making changes to any units data file. @cindex personal units data file @cindex units data file, personal If you want to add your own units in addition to or in place of standard or site-wide supplemental units data files, you can include them in the @file{.units} file in your home directory. If this file exists it is read after the standard units data file, so that any definitions in this file will replace definitions of the same units in the standard data file or in files included from the standard data file. This file will not be read if any units files are specified on the command line. (Under Windows the personal units file is named @file{unitdef.units}.) Running @w{@command{units -V}} will display the location and name of your personal units file. The @command{units} program first tries to determine your home directory from the @env{HOME} environment variable. On systems running Microsoft Windows, if @env{HOME} does not exist, @command{units} attempts to find your home directory from @env{HOMEDRIVE}, @env{HOMEPATH} and @env{USERPROFILE}. @cindex MYUNITSFILE environment variable @cindex environment variable, MYUNITSFILE You can specify an arbitrary file as your personal units data file with the @env{MYUNITSFILE} environment variable; if this variable exists, its value is used without searching your home directory. The default units data files are described in more detail in @ref{Data Files}. @node Defining New Units @section Defining New Units and Prefixes @cindex defining units @cindex units, definition of @cindex units definitions, adding @cindex units definitions, changing @cindex prefixes, definition of @cindex defining prefixes @cindex primitive units @cindex units, primitive @cindex @samp{!} to indicate primitive units @cindex command, @samp{!} to indicate primitive units A unit is specified on a single line by giving its name and an equivalence. Comments start with a @samp{#} character, which can appear anywhere in a line. The backslash character (@samp{\}) acts as a continuation character if it appears as the last character on a line, making it possible to spread definitions out over several lines if desired. A file can be included by giving the command @samp{!include} followed by the file's name. The @samp{!} must be the first character on the line. The file will be sought in the same directory as the parent file unless you give a full path. The name of the file to be included cannot contain the comment character @samp{#}. @cindex include files Unit names must not contain any of the operator characters @samp{+}, @samp{-}, @samp{*}, @samp{/}, @samp{|}, @samp{^}, @samp{;}, @samp{~}, the comment character @samp{#}, or parentheses. They cannot begin or end with an underscore (@samp{_}), a comma (@samp{,}) or a decimal point (@samp{.}). The figure dash (U+2012), typographical minus (`@minus{}'; U+2212), and en dash (`--'; U+2013) are converted to the operator @samp{-}, so none of these characters can appear in unit names. Names cannot begin with a digit, and if a name ends in a digit other than zero, the digit must be preceded by a string beginning with an underscore, and afterwards consisting only of digits, decimal points, or commas. For example, @samp{foo_2}, @samp{foo_2,1}, or @samp{foo_3.14} are valid names but @samp{foo2} or @samp{foo_a2} are invalid. You could define nitrous oxide as @example N2O nitrogen 2 + oxygen @end example @noindent but would need to define nitrogen dioxide as @example NO_2 nitrogen + oxygen 2 @end example @noindent Be careful to define new units in terms of old ones so that a reduction leads to the primitive units, which are marked with @samp{!} characters. Dimensionless units are indicated by using the string @samp{!dimensionless} for the unit definition. @cindex dimensionless units, defining When adding new units, be sure to use the @option{-c} option to check that the new units reduce properly. If you create a loop in the units definitions, then @command{units} will hang when invoked with the @option{-c} option. You will need to use the @option{--check-verbose} option, which prints out each unit as it is checked. The program will still hang, but the last unit printed will be the unit that caused the infinite loop. @cindex parentheses If you define any units that contain @samp{+} characters, carefully check them because the @option{-c} option will not catch non-conformable sums. Be careful with the @samp{-} operator as well. When used as a binary operator, the @samp{-} character can perform addition or multiplication depending on the options used to invoke @command{units}. To ensure consistent behavior use @samp{-} only as a unary negation operator when writing units definitions. To multiply two units leave a space or use the @samp{*} operator with care, recalling that it has two possible precedence values and may require parentheses to ensure consistent behavior. To compute the difference of @samp{foo} and @samp{bar} write @samp{foo+(-bar)} or even @samp{foo+-bar}. Here is an example of a short data file that defines some basic units: @example @group m ! # The meter is a primitive unit sec ! # The second is a primitive unit rad !dimensionless # A dimensionless primitive unit micro- 1e-6 # Define a prefix minute 60 sec # A minute is 60 seconds hour 60 min # An hour is 60 minutes inch 0.0254 m # Inch defined in terms of meters ft 12 inches # The foot defined in terms of inches mile 5280 ft # And the mile @end group @end example @cindex parentheses @noindent A unit that ends with a @samp{-} character is a prefix. If a prefix definition contains any @samp{/} characters, be sure they are protected by parentheses. If you define @samp{half- 1/2} then @samp{halfmeter} would be equivalent to @samp{1 / (2@tie{}meter)}. @node Defining Nonlinear Units @section Defining Nonlinear Units @cindex defining nonlinear units @cindex nonlinear units, defining @cindex nonlinear unit conversions Some unit conversions of interest are nonlinear; for example, temperature conversions between the Fahrenheit and Celsius scales cannot be done by simply multiplying by conversion factors. When you give a linear unit definition such as @samp{inch 2.54@tie{}cm} you are providing information that @command{units} uses to convert values in inches into primitive units of meters. For nonlinear units, you give a functional definition that provides the same information. Nonlinear units are represented using a functional notation. It is best to regard this notation not as a function call but as a way of adding units to a number, much the same way that writing a linear unit name after a number adds units to that number. Internally, nonlinear units are defined by a pair of functions that convert to and from linear units in the database, so that an eventual conversion to primitive units is possible. Here is an example nonlinear unit definition: @example @group tempF(x) units=[1;K] domain=[-459.67,) range=[0,) \ (x+(-32)) degF + stdtemp ; (tempF+(-stdtemp))/degF + 32 @end group @end example @noindent A nonlinear unit definition comprises a unit name, a formal parameter name, two functions, and optional specifications for units, the domain, and the range (the domain of the inverse function). The functions tell @command{units} how to convert to and from the new unit. To produce valid results, the arguments of these functions need to have the correct dimensions and be within the domains for which the functions are defined. @cindex parentheses The definition begins with the unit name followed immediately (with no spaces) by a @samp{(} character. In the parentheses is the name of the formal parameter. Next is an optional specification of the units required by the functions in the definition. In the example above, the @samp{units=[1;K]} specification indicates that the @samp{tempF} function requires an input argument conformable with @samp{1} (i.e., the argument is dimensionless), and that the inverse function requires an input argument conformable with @samp{K}. For normal nonlinear units definition, the forward function will always take a dimensionless argument; in general, the inverse function will need units that match the quantity measured by your nonlinear unit. Specifying the units enables @command{units} to perform error checking on function arguments, and also to assign units to domain and range specifications, which are described later. Next the function definitions appear. In the example above, the @samp{tempF} function is defined by @example @group tempF(x) = (x+(-32)) degF + stdtemp @end group @end example @noindent This gives a rule for converting @samp{x} in the units @samp{tempF} to linear units of absolute temperature, which makes it possible to convert from tempF to other units. To enable conversions to Fahrenheit, you must give a rule for the inverse conversions. The inverse will be @samp{x(tempF)} and its definition appears after a @samp{;} character. In our example, the inverse is @example @group x(tempF) = (tempF+(-stdtemp))/degF + 32 @end group @end example @noindent This inverse definition takes an absolute temperature as its argument and converts it to the Fahrenheit temperature. The inverse can be omitted by leaving out the @samp{;} character and the inverse definition, but then conversions @emph{to} the unit will not be possible. If the inverse definition is omitted, the @option{--check} option will display a warning. It is up to you to calculate and enter the correct inverse function to obtain proper conversions; the @option{--check} option tests the inverse at one point and prints an error if it is not valid there, but this is not a guarantee that your inverse is correct. With some definitions, the units may vary. For example, the definition @example @group square(x) x^2 @end group @end example @noindent can have any arbitrary units, and can also take dimensionless arguments. In such a case, you should @emph{not} specify units. If a definition takes a root of its arguments, the definition is valid only for units that yield such a root. For example, @example @group squirt(x) sqrt(x) @end group @end example @noindent is valid for a dimensionless argument, and for arguments with even powers of units. @cindex domain, nonlinear unit definitions @cindex range, nonlinear unit definitions Some definitions may not be valid for all real numbers. In such cases, @command{units} can handle errors better if you specify an appropriate domain and range. You specify the domain and range as shown below: @example @group baume(d) units=[1;g/cm^3] domain=[0,130.5] range=[1,10] \ (145/(145-d)) g/cm^3 ; (baume+-g/cm^3) 145 / baume @end group @end example @noindent In this example the domain is specified after @samp{domain=} with the endpoints given in brackets. In accord with mathematical convention, square brackets indicate a closed interval (one that includes its endpoints), and parentheses indicate an open interval (one that does not include its endpoints). An interval can be open or closed on one or both ends; an interval that is unbounded on either end is indicated by omitting the limit on that end. For example, a quantity to which decibel (dB) is applied may have any value greater than zero, so the range is indicated by @samp{(0,)}: @example @group decibel(x) units=[1;1] range=(0,) 10^(x/10); 10 log(decibel) @end group @end example @noindent If the domain or range is given, the second endpoint must be greater than the first. The domain and range specifications can appear independently and in any order along with the units specification. The values for the domain and range endpoints are attached to the units given in the units specification, and if necessary, the parameter value is adjusted for comparison with the endpoints. For example, if a definition includes @samp{units=[1;ft]} and @samp{range=[3,)}, the range will be taken as 3@tie{}ft to infinity. If the function is passed a parameter of @w{@samp{900 mm}}, that value will be adjusted to 2.9527559@tie{}ft, which is outside the specified range. If you omit the units specification from the previous example, @command{units} can not tell whether you intend the lower endpoint to be 3@tie{}ft or 3@tie{}microfurlongs, and can not adjust the parameter value of 900@tie{}mm for comparison. Without units, numerical values other than zero or plus or minus infinity for domain or range endpoints are meaningless, and accordingly they are not allowed. If you give other values without units then the definition will be ignored and you will get an error message. Although the units, domain, and range specifications are optional, it's best to give them when they are applicable; doing so allows @command{units} to perform better error checking and give more helpful error messages. Giving the domain and range also enables the @option{--check} option to find a point in the domain to use for its point check of your inverse definition. You can make synonyms for nonlinear units by providing both the forward and inverse functions; inverse functions can be obtained using the @samp{~} operator. So to create a synonym for @samp{tempF} you could write @example @group fahrenheit(x) units=[1;K] tempF(x); ~tempF(fahrenheit) @end group @end example @noindent This is useful for creating a nonlinear unit definition that differs slightly from an existing definition without having to repeat the original functions. For example, @example dBW(x) units=[1;W] range=[0,) dB(x) W ; ~dB(dBW/W) @end example @noindent If you wish a synonym to refer to an existing nonlinear unit without modification, you can do so more simply by adding the synonym with appended parentheses as a new unit, with the existing nonlinear unit---without parentheses---as the definition. So to create a synonym for @samp{tempF} you could write @example fahrenheit() tempF @end example @noindent The definition must be a nonlinear unit; for example, the synonym @example fahrenheit() meter @end example @noindent will result in an error message when @command{units} starts. @cindex units functions @cindex functions of units You may occasionally wish to define a function that operates on units. This can be done using a nonlinear unit definition. For example, the definition below provides conversion between radius and the area of a circle. This definition requires a length as input and produces an area as output, as indicated by the @samp{units=} specification. Specifying the range as the nonnegative numbers can prevent cryptic error messages. @example @group circlearea(r) units=[m;m^2] range=[0,) pi r^2 ; sqrt(circlearea/pi) @end group @end example @node Piecewise Linear Units @section Defining Piecewise Linear Units @cindex defining piecewise linear units @cindex linear interpolation @cindex units, piecewise linear @cindex piecewise linear units Sometimes you may be interested in a piecewise linear unit such as many wire gauges. Piecewise linear units can be defined by specifying conversions to linear units on a list of points. Conversion at other points will be done by linear interpolation. A partial definition of zinc gauge is @example @group zincgauge[in] 1 0.002, 10 0.02, 15 0.04, 19 0.06, 23 0.1 @end group @end example @noindent In this example, @samp{zincgauge} is the name of the piecewise linear unit. The definition of such a unit is indicated by the embedded @samp{[} character. After the bracket, you should indicate the units to be attached to the numbers in the table. No spaces can appear before the @samp{]} character, so a definition like @samp{foo[kg meters]} is invalid; instead write @samp{foo[kg*meters]}. The definition of the unit consists of a list of pairs optionally separated by commas. This list defines a function for converting from the piecewise linear unit to linear units. The first item in each pair is the function argument; the second item is the value of the function at that argument (in the units specified in brackets). In this example, we define @samp{zincgauge} at five points. For example, we set @samp{zincgauge(1)} equal to @w{@samp{0.002 in}}. Definitions like this may be more readable if written using continuation characters as @example @group zincgauge[in] \ 1 0.002 \ 10 0.02 \ 15 0.04 \ 19 0.06 \ 23 0.1 @end group @end example @noindent With the preceding definition, the following conversion can be performed: @example @group You have: zincgauge(10) You want: in * 0.02 / 50 You have: .01 inch You want: zincgauge 5 @end group @end example @noindent If you define a piecewise linear unit that is not strictly monotonic, then the inverse will not be well defined. If the inverse is requested for such a unit, @command{units} will return the smallest inverse. After adding nonlinear units definitions, you should normally run @w{@command{units --check}} to check for errors. If the @samp{units} keyword is not given, the @option{--check} option checks a nonlinear unit definition using a dimensionless argument, and then checks using an arbitrary combination of units, as well as the square and cube of that combination; a warning is given if any of these tests fail. For example, @set codequoteundirected @example @group Warning: function 'squirt(x)' defined as 'sqrt(x)' failed for some test inputs: squirt(7(kg K)^1): Unit not a root squirt(7(kg K)^3): Unit not a root @end group @end example @clear codequoteundirected @noindent Running @w{@command{units --check}} will print a warning if a non-monotonic piecewise linear unit is encountered. For example, the relationship between ANSI coated abrasive designation and mean particle size is non-monotonic in the vicinity of 800 grit: @example @group ansicoated[micron] \ . . . 600 10.55 \ 800 11.5 \ 1000 9.5 \ @end group @end example @noindent Running @w{@command{units --check}} would give the error message @set codequoteundirected @example @group Table 'ansicoated' lacks unique inverse around entry 800 @end group @end example @clear codequoteundirected @noindent Although the inverse is not well defined in this region, it's not really an error. Viewing such error messages can be tedious, and if there are enough of them, they can distract from true errors. Error checking for nonlinear unit definitions can be suppressed by giving the @samp{noerror} keyword; for the examples above, this could be done as @example @group squirt(x) noerror domain=[0,) range=[0,) sqrt(x); squirt^2 ansicoated[micron] noerror \ . . . @end group @end example @noindent Use the @samp{noerror} keyword with caution. The safest approach after adding a nonlinear unit definition is to run @w{@command{units --check}} and confirm that there are no actual errors before adding the @samp{noerror} keyword. @node Defining Unit List Aliases @section Defining Unit List Aliases @cindex defining unit list aliases @cindex unit list aliases, defining @cindex @samp{!unitlist} @cindex command, @samp{!unitlist} Unit list aliases are treated differently from unit definitions, because they are a data entry shorthand rather than a true definition for a new unit. A unit list alias definition begins with @samp{!unitlist} and includes the alias and the definition; for example, the aliases included in the standard units data file are @example @group !unitlist hms hr;min;sec !unitlist time year;day;hr;min;sec !unitlist dms deg;arcmin;arcsec !unitlist ftin ft;in;1|8 in !unitlist usvol cup;3|4 cup;2|3 cup;1|2 cup;1|3 cup;1|4 cup;\ tbsp;tsp;1|2 tsp;1|4 tsp;1|8 tsp @end group @end example @noindent Unit list aliases are only for unit lists, so the definition must include a @samp{;}. Unit list aliases can never be combined with units or other unit list aliases, so the definition of @samp{time} shown above could @emph{not} have been shortened to @samp{year;day;hms}. As usual, be sure to run @w{@command{units --check}} to ensure that the units listed in unit list aliases are conformable. @node Numeric Output Format @chapter Numeric Output Format @cindex numeric output format @cindex output format @menu * Format Specification:: The output format specification * Flags:: Optional format flags * Field Width:: Specifying output field width * Precision:: Specifying output precision @end menu By default, @code{units} shows results to eight significant digits. You can change this with the @option{--exponential}, @option{--digits}, and @option{--output-format} options. The first sets an exponential format (i.e., scientific notation) like that used in the original Unix @command{units} program, the second allows you to specify a different number of significant digits, and the last allows you to control the output appearance using the format for the @code{printf()} function in the C programming language. If you only want to change the number of significant digits or specify exponential format type, use the @option{--digits} and @option{--exponential} options. The @option{--output-format} option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the @code{printf()} format syntax. @xref{Invoking Units}, for descriptions of these options. @node Format Specification @section Format Specification @cindex output format specification @cindex format specification, output The format specification recognized with the @option{--output-format} option is a subset of that for @code{printf()}. The format specification has the form @c noman @code{%}[@i{flags}][@i{width}][@code{.}@i{precision}]@i{type}; @c end noman @c ifman @ignore .\".CW "%\fR[\fP\fIflags\fP\fR][\fP\fIwidth\fP\fR][\fP.\fIprecision\fP\fR]\fP\fItype\fP" ; @code{%}[@i{flags}][@i{width}][\c @code{.}@i{precision}]@i{type}; @end ignore @c end ifman it must begin with @samp{%}, and must end with a floating-point type specifier: @samp{g} or @samp{G} to specify the number of significant digits, @samp{e} or @samp{E} for scientific notation, and @samp{f} for fixed-point decimal. The ISO C99 standard added the @samp{F} type for fixed-point decimal and the @samp{a} and @samp{A} types for hexadecimal floating point; these types are allowed with compilers that support them. Type length modifiers (e.g., @samp{L} to indicate a long double) are inapplicable and are not allowed. The default format for @command{units} is @samp{%.8g}; for greater precision, you could specify @samp{-o@tie{}%.15g}. The @samp{g} and @samp{G} format types use exponential format whenever the exponent would be less than @minus{}4, so the value 0.000013 displays as @samp{1.3e-005}. These types also use exponential notation when the exponent is greater than or equal to the precision, so with the default format, the value @c @tex $5\times 10^7$ @end tex @ifnottex @c noman 5e7 @c end noman @c man .if t .ig ++ @c man 5e7 @c man .++ @c man .if n .ig ++ @c man .EQ @c man 5 times 10 sup 7 @c man .EN @c man .++ @end ifnottex displays as @samp{50000000} and the value @tex $5\times 10^8$ @end tex @ifnottex @c noman 5e8 @c end noman @c man .if t .ig ++ @c man 5e8 @c man .++ @c man .if n .ig ++ @c man .EQ @c man 5 times 10 sup 8 @c man .EN @c man .++ @end ifnottex displays as @samp{5e+008}. If you prefer fixed-point display, you might specify @samp{-o@tie{}%.8f}; however, small numbers will display very few significant digits, and values less than @tex $0.5\times10^{-8}$ @end tex @ifnottex @c noman 0.5e@minus{}8 @c end noman @c man .if t .ig ++ @c man 0.5e\-8 @c man .++ @c man .if n .ig ++ @c man .EQ @c man 0.5 times 10 sup -8 @c man .EN @c man .++ @end ifnottex will show nothing but zeros. The format specification may include one or more optional flags: @samp{+}, @samp{@tie{}} (space), @samp{#}, @samp{-}, or @samp{0} (the digit zero). The digit-grouping flag @c noman @set codequoteundirected @samp{'} (apostrophe) @clear codequoteundirected @c end noman @c if the troff formatter is groff, ensure an ASCII single quote @c man .ie \n(.g .CQ "\(aq" @c man .el .CQ "'" is allowed with compilers that support it. Flags are followed by an optional value for the minimum field width, and an optional precision specification that begins with a period (e.g., @samp{.6}). The field width includes the digits, decimal point, the exponent, thousands separators (with the digit-grouping flag), and the sign if any of these are shown. @node Flags @section Flags @cindex output format flags @cindex flags, output format The @samp{+} flag causes the output to have a sign (@samp{+} or @samp{-}). The space flag @samp{@tie{}} is similar to the @samp{+} flag, except that when the value is positive, it is prefixed with a space rather than a plus sign; this flag is ignored if the @samp{+} flag is also given. The @samp{+} or @samp{@tie{}} flag could be useful if conversions might include positive and negative results, and you wanted to align the decimal points in exponential notation. @c The @samp{#} flag causes the output value to contain a decimal point in all cases; by default, the output contains a decimal point only if there are digits (which can be trailing zeros) to the right of the point. With the @samp{g} or @samp{G} types, the @samp{#} flag also prevents the suppression of trailing zeros. @c The digit-grouping flag @c noman @set codequoteundirected @samp{'} @clear codequoteundirected @c end noman @c if the troff formatter is groff, ensure an ASCII single quote @c man .ie \n(.g .CQ "\(aq" @c man .el .CQ "'" shows a thousands separator in digits to the left of the decimal point. @c (e.g., @samp{1,234.56}). This can be useful when displaying large numbers in fixed-point decimal; for example, with the format @samp{%f}, @example You have: mile You want: microfurlong * 8000000.000000 / 0.000000 @end example @noindent the magnitude of the first result may not be immediately obvious without counting the digits to the left of the decimal point. If the thousands separator is the comma (@samp{,}), the output with the format @c noman @set codequoteundirected @samp{%'f} @clear codequoteundirected @c end noman @c if the troff formatter is groff, ensure an ASCII single quote @c man .ie \n(.g .CQ "%\(aqf" @c man .el .CQ "%'f" might be @example You have: mile You want: microfurlong * 8,000,000.000000 / 0.000000 @end example @noindent making the magnitude readily apparent. Unfortunately, few compilers support the digit-grouping flag. @c With the @samp{-} flag, the output value is left aligned within the specified field width. If a field width greater than needed to show the output value is specified, the @samp{0} (zero) flag causes the output value to be left padded with zeros until the specified field width is reached; for example, with the format @samp{%011.6f}, @example You have: troypound You want: grain * 5760.000000 / 0000.000174 @end example @noindent The @samp{0} flag has no effect if the @samp{-} (left align) flag is given. @node Field Width @section Field Width @cindex output field width By default, the output value is left aligned and shown with the minimum width necessary for the specified (or default) precision. If a field width greater than this is specified, the value shown is right aligned, and padded on the left with enough spaces to provide the specified field width. A width specification is typically used with fixed-point decimal to have columns of numbers align at the decimal point; this arguably is less useful with @command{units} than with long columnar output, but it may nonetheless assist in quickly assessing the relative magnitudes of results. For example, with the format @samp{%12.6f}, @example @group You have: km You want: in * 39370.078740 / 0.000025 @end group @group You have: km You want: rod * 198.838782 / 0.005029 @end group @group You have: km You want: furlong * 4.970970 / 0.201168 @end group @end example @node Precision @section Precision @cindex output precision @cindex precision, output The meaning of ``precision'' depends on the format type. With @samp{g} or @samp{G}, it specifies the number of significant digits (like the @option{--digits} option); with @samp{e}, @samp{E}, @samp{f}, or @samp{F}, it specifies the maximum number of digits to be shown after the decimal point. @c With the @samp{g} and @samp{G} format types, trailing zeros are suppressed, so the results may sometimes have fewer digits than the specified precision (as indicated above, the @samp{#} flag causes trailing zeros to be displayed). The default precision is 6, so @samp{%g} is equivalent to @samp{%.6g}, and would show the output to six significant digits. Similarly, @samp{%e} or @samp{%f} would show the output with six digits after the decimal point. The C @code{printf()} function allows a precision of arbitrary size, whether or not all of the digits are meaningful. With most compilers, the maximum internal precision with @command{units} is 15 decimal digits (or 13 hexadecimal digits). With the @option{--digits} option, you are limited to the maximum internal precision; with the @option{--output-format} option, you may specify a precision greater than this, but it may not be meaningful. In some cases, specifying excess precision can result in rounding artifacts. For example, a pound is exactly 7000 grains, but with the format @samp{%.18g}, the output might be @example You have: pound You want: grain * 6999.9999999999991 / 0.00014285714285714287 @end example @noindent With the format @samp{%.25g} you might get the following: @example You have: 1/3 You want: Definition: 0.333333333333333314829616256247 @end example @noindent In this case the displayed value includes a series of digits that represent the underlying binary floating-point approximation to 1/3 but are not meaningful for the desired computation. In general, the result with excess precision is system dependent. @c The precision affects only the @emph{display} of numbers; if a result relies on physical constants that are not known to the specified precision, the number of physically meaningful digits may be less than the number of digits shown. See the documentation for @code{printf()} for more detailed descriptions of the format specification. The @option{--output-format} option is incompatible with the @option{--exponential} or @option{--digits} options; if the former is given in combination with either of the latter, the format is controlled by the last option given. @node Localization @chapter Localization @cindex environment dependent definitions @cindex localization @cindex @samp{!locale} @cindex command, @samp{!locale} @cindex @samp{!endlocale} @cindex command, @samp{!endlocale} @cindex command, @samp{!endvar} @cindex command, @samp{!var} @cindex command, @samp{!varnot} @cindex command, @samp{!set} @cindex command, @samp{!message} @menu * Locale:: What is a locale? * Additional Localization:: When the locale isn't enough @end menu Some units have different values in different locations. The localization feature accommodates this by allowing a units data file to specify definitions that depend on the user's locale. @node Locale @section Locale @cindex locale A locale is a subset of a user's environment that indicates the user's language and country, and some attendant preferences, such as the formatting of dates. The @command{units} program attempts to determine the locale from the POSIX setlocale function; if this cannot be done, @command{units} examines the environment variables @env{LC_CTYPE} and @env{LANG}. On POSIX systems, a locale is of the form @var{language}@code{_}@var{country}, where @var{language} is the two-character code from ISO 639-1 and @var{country} is the two-character code from ISO 3166-1; @var{language} is lower case and @var{country} is upper case. For example, the POSIX locale for the United Kingdom is @code{en_GB}. @cindex @file{locale_map.txt} @cindex setlocale function On systems running Microsoft Windows, the value returned by setlocale() is different from that on POSIX systems; @command{units} attempts to map the Windows value to a POSIX value by means of a table in the file @file{locale_map.txt} in the same directory as the other data files. The file includes entries for many combinations of language and country, and can be extended to include other combinations. The @file{locale_map.txt} file comprises two tab-separated columns; each entry is of the form @display @var{Windows-locale}@ @ @ @var{POSIX-locale} @end display @noindent where @var{POSIX-locale} is as described above, and @var{Windows-locale} typically spells out both the language and country. For example, the entry for the United States is @example English_United States en_US @end example @noindent You can force @command{units} to run in a desired locale by using the @option{-l} option. In order to create unit definitions for a particular locale you begin a block of definitions in a unit datafile with @samp{!locale} followed by a locale name. The @samp{!} must be the first character on the line. The @command{units} program reads the following definitions only if the current locale matches. You end the block of localized units with @samp{!endlocale}. Here is an example, which defines the British gallon. @example @group !locale en_GB gallon 4.54609 liter !endlocale @end group @end example @node Additional Localization @section Additional Localization Sometimes the locale isn't sufficient to determine unit preferences. There could be regional preferences, or a company could have specific preferences. Though probably uncommon, such differences could arise with the choice of English customary units outside of English-speaking countries. To address this, @command{units} allows specifying definitions that depend on environment variable settings. The environment variables can be controled based on the current locale, or the user can set them to force a particular group of definitions. A conditional block of definitions in a units data file begins with either @samp{!var} or @samp{!varnot} following by an environment variable name and then a space separated list of values. The leading @samp{!} must appear in the first column of a units data file, and the conditional block is terminated by @samp{!endvar}. Definitions in blocks beginning with @samp{!var} are executed only if the environment variable is exactly equal to one of the listed values. Definitions in blocks beginning with @samp{!varnot} are executed only if the environment variable does @emph{not} equal any of the list values. The inch has long been a customary measure of length in many places. The word comes from the latin @emph{uncia} meaning ``one twelfth,'' referring to its relationship with the foot. By the 20th century, the inch was officially defined in English-speaking countries relative to the yard, but until 1959, the yard differed slightly among those countries. In France the customary inch, which was displaced in 1799 by the meter, had a different length based on a french foot. These customary definitions could be accommodated as follows: @example @group !var INCH_UNIT usa yard 3600|3937 m !endvar @end group @group !var INCH_UNIT canada yard 0.9144 meter !endvar @end group @group !var INCH_UNIT uk yard 0.91439841 meter !endvar @end group @group !var INCH_UNIT canada uk usa foot 1|3 yard inch 1|12 foot !endvar @end group @group !var INCH_UNIT france foot 144|443.296 m inch 1|12 foot line 1|12 inch !endvar @end group @group !varnot INCH_UNIT usa uk france canada !message Unknown value for INCH_UNIT !endvar @end group @end example @noindent When @command{units} reads the above definitions it will check the environment variable @env{INCH_UNIT} and load only the definitions for the appropriate section. If @env{INCH_UNIT} is unset or is not set to one of the four values listed then @command{units} will run the last block. In this case that block uses the @samp{!message} command to display a warning message. Alternatively that block could set default values. In order to create default values that are overridden by user settings the data file can use the @samp{!set} command, which sets an environment variable @emph{only if it is not already set}; these settings are only for the current @command{units} invocation and do not persist. So if the example above were preceded by @samp{!set INCH_UNIT france} then this would make @samp{france} the default value for @env{INCH_UNIT}. If the user had set the variable in the environment before invoking @command{units}, then @command{units} would use the user's value. To link these settings to the user's locale you combine the @samp{!set} command with the @samp{!locale} command. If you wanted to combine the above example with suitable locales you could do by @emph{preceding} the above definition with the following: @example @group !locale en_US !set INCH_UNIT usa !endlocale !locale en_GB !set INCH_UNIT uk !endlocale !locale en_CA !set INCH_UNIT canada !endlocale !locale fr_FR !set INCH_UNIT france !endlocale !set INCH_UNIT france @end group @end example @noindent These definitions set the overall default for @env{INCH_UNIT} to @samp{france} and set default values for four locales appropriately. The overall default setting comes last so that it only applies when @env{INCH_UNIT} was not set by one of the other commands or by the user. If the variable given after @samp{!var} or @samp{!varnot} is undefined then @command{units} prints an error message and ignores the definitions that follow. Use @samp{!set} to create defaults to prevent this situation from arising. The @option{-c} option only checks the definitions that are active for the current environment and locale, so when adding new definitions take care to check that all cases give rise to a well defined set of definitions. @node Environment Vars @chapter Environment Variables @cindex environment variables The @command{units} program uses the following environment variables: @table @env @item HOME @cindex HOME environment variable @cindex environment variable, HOME Specifies the location of your home directory; it is used by @command{units} to find a personal units data file @samp{.units}. On systems running Microsoft Windows, the file is @samp{unitdef.units}, and if @env{HOME} does not exist, @command{units} tries to determine your home directory from the @env{HOMEDRIVE} and @env{HOMEPATH} environment variables; if these variables do not exist, units finally tries @env{USERPROFILE}---typically @file{C:\Users\@var{username}} (Windows Vista and Windows@tie{}7) or @w{@file{C:\Documents and Settings\@var{username}}} (Windows@tie{}XP). @item LC_CTYPE, LANG @cindex LANG environment variable @cindex LC_CTYPE environment variable @cindex environment variable, LANG @cindex environment variable, LC_CTYPE Checked to determine the locale if @command{units} cannot obtain it from the operating system. Sections of the standard units data file are specific to certain locales. @item MYUNITSFILE @cindex MYUNITSFILE environment variable @cindex environment variable, MYUNITSFILE Specifies your personal units data file. If this variable exists, @command{units} uses its value rather than searching your home directory for @samp{.units}. The personal units file will not be loaded if any data files are given using the @option{-f} option. @item PAGER @cindex PAGER environment variable @cindex environment variable, PAGER @cindex help Specifies the pager to use for help and for displaying the conformable units. The help function browses the units database and calls the pager using the @samp{+n}@var{n} syntax for specifying a line number. The default pager is @command{more}; @env{PAGER} can be used to specify alternatives such as @command{less}, @command{pg}, @command{emacs}, or @command{vi}. @item UNITS_ENGLISH @cindex UNITS_ENGLISH environment variable @cindex environment variable, UNITS_ENGLISH Set to either @samp{US} or @samp{GB} to choose United States or British volume definitions, overriding the default from your locale. @item UNITSFILE @cindex UNITSFILE environment variable @cindex environment variable, UNITSFILE Specifies the units data file to use (instead of the default). You can only specify a single units data file using this environment variable. If units data files are given using the @option{-f} option, the file specified by @env{UNITSFILE} will be not be loaded unless the @option{-f} option is given with the empty string (@w{@samp{units -f ""}}). @item UNITSLOCALEMAP @cindex UNITSLOCALEMAP environment variable @cindex environment variable, UNITSLOCALEMAP Windows only; this variable has no effect on Unix-like systems. Specifies the units locale map file to use (instead of the default). This variable seldom needs to be set, but you can use it to ensure that the locale map file will be found if you specify a location for the units data file using either the @option{-f} option or the @env{UNITSFILE} environment variable, and that location does not also contain the locale map file. @end table @node Data Files @chapter Data Files @cindex files, data @cindex data files The @command{units} program uses two default data files: @file{definitions.units} and @file{currency.units}. The program can also use an optional personal units data file @file{.units} (@file{unitdef.units} under Windows) located in the user's home directory. The personal units data file is described in more detail in @ref{Units Data Files}. On Unix-like systems, the data files are typically located in @file{/usr/share/units} if @command{units} is provided with the operating system, or in @file{/usr/local/share/units} if @command{units} is compiled from the source distribution. On systems running Microsoft Windows, the files may be in the same locations if Unix-like commands are available, a Unix-like file structure is present (e.g., @file{C:/usr/local}), and @command{units} is compiled from the source distribution. If Unix-like commands are not available, a more common location is @w{@file{C:\Program Files (x86)\GNU\units}} (for 64-bit Windows installations) or @w{@file{C:\Program Files\GNU\units}} (for 32-bit installations). If @command{units} is obtained from the GNU Win32 Project (@uref{http://gnuwin32.sourceforge.net/}), the files are commonly in @w{@file{C:\Program Files\GnuWin32\share\units}}. If the default units data file is not an absolute pathname, @command{units} will look for the file in the directory that contains the @command{units} program; if the file is not found there, @command{units} will look in a directory @code{../share/units} relative to the directory with the @command{units} program. You can determine the location of the files by running @w{@command{units --version}}. Running @w{@command{units --info}} will give you additional information about the files, how @command{units} will attempt to find them, and the status of the related environment variables. @node Unicode Support @chapter Unicode Support @cindex Unicode support @cindex UTF-8 @cindex @samp{!utf8} @cindex command, @samp{!utf8} @cindex @samp{!endutf8} @cindex command, @samp{!endutf8} The standard units data file is in Unicode, using UTF-8 encoding. Most definitions use only ASCII characters (i.e., code points U+0000 through U+007F); definitions using non-ASCII characters appear in blocks beginning with @samp{!utf8} and ending with @samp{!endutf8}. When @command{units} starts, it checks the locale to determine the character set. If @command{units} is compiled with Unicode support and definitions; otherwise these definitions are ignored. When Unicode support is active, @command{units} will check every line of all of the units data files for invalid or non-printing UTF-8 sequences; if such sequences occur, @command{units} ignores the entire line. In addition to checking validity, @command{units} determines the display width of non-ASCII characters to ensure proper positioning of the pointer in some error messages and to align columns for the @samp{search} and @samp{?} commands. At present, @command{units} does not support Unicode under Microsoft Windows. The UTF-16 and UTF-32 encodings are not supported on any systems. If definitions that contain non-ASCII characters are added to a units data file, those definitions should be enclosed within @samp{!utf8} @dots{} @samp{!endutf8} to ensure that they are only loaded when Unicode support is available. As usual, the @samp{!} must appear as the first character on the line. As discussed in @ref{Units Data Files}, it's usually best to put such definitions in supplemental data files linked by an @samp{!include} command or in a personal units data file. When Unicode support is not active, @command{units} makes no assumptions about character encoding, except that characters in the range 00--7F hexadecimal correspond to ASCII encoding. Non-ASCII characters are simply sequences of bytes, and have no special meanings; for definitions in supplementary units data files, you can use any encoding consistent with this assumption. For example, if you wish to use non-ASCII characters in definitions when running @command{units} under Windows, you can use a character set such as Windows ``ANSI'' (code page 1252 in the US and Western Europe). You can even use UTF-8, though some messages may be improperly aligned, and @command{units} will not detect invalid UTF-8 sequences. If you use UTF-8 encoding when Unicode support is not active, you should place any definitions with non-ASCII characters @emph{outside} @samp{!utf8} @dots{} @samp{!endutf8} blocks---otherwise, they will be ignored. Typeset material other than code examples usually uses the Unicode minus (U+2212) rather than the ASCII hyphen-minus operator (U+002D) used in @command{units}; the figure dash (U+2012) and en dash (U+2013) are also occasionally used. To allow such material to be copied and pasted for interactive use or in units data files, @command{units} converts these characters to U+002D before further processing. Because of this, none of these characters can appear in unit names. @node Readline Support @chapter Readline Support @cindex @command{readline}, use with @command{units} If the @command{readline} package has been compiled in, then when @command{units} is used interactively, numerous command line editing features are available. To check if your version of @command{units} includes @command{readline}, invoke the program with the @option{--version} option. For complete information about @command{readline}, consult the documentation for the @command{readline} package. Without any configuration, @command{units} will allow editing in the style of emacs. Of particular use with @command{units} are the completion commands. @cindex @samp{?} for unit completion with @command{readline} @cindex unit completion using @samp{?} (@command{readline} only) @cindex completion, unit, using @samp{?} (@command{readline} only) If you type a few characters and then hit @key{ESC} followed by @kbd{?} then @command{units} will display a list of all the units that start with the characters typed. For example, if you type @kbd{metr} and then request completion, you will see something like this: @cindex unit name completion @example @group You have: metr metre metriccup metrichorsepower metrictenth metretes metricfifth metricounce metricton metriccarat metricgrain metricquart metricyarncount You have: metr @end group @end example @noindent If there is a unique way to complete a unitname, you can hit the @key{TAB} key and @command{units} will provide the rest of the unit name. If @command{units} beeps, it means that there is no unique completion. Pressing the @key{TAB} key a second time will print the list of all completions. The readline library also keeps a history of the values you enter. You can move through this history using the up and down arrows. The history is saved to the file @file{.units_history} in your home directory so that it will persist across multiple @command{units} invocations. If you wish to keep work for a certain project separate you can change the history filename using the @option{--history} option. You could, for example, make an alias for @command{units} to @command{units --history .units_history} so that @command{units} would save separate history in the current directory. The length of each history file is limited to 5000 lines. Note also that if you run several concurrent copies of @command{units} each one will save its new history to the history file upon exit. @node Currency @chapter Updating Currency Exchange Rates @cindex currency, updating @cindex exchange rates, updating The units program includes currency exchange rates and prices for some precious metals in the database. Of course, these values change over time, sometimes very rapidly, and @command{units} cannot provide real time values. To update the exchange rates run the @command{units_cur}, which rewrites the files containing the currency rates, typically @file{/usr/share/units/currency.units}. This program requires @command{python} and the @command{unidecode} package, and must be run with suitable permissions to write the file. To keep the rates updated automatically, run it using a cron job on a Unix-like system, or a similar scheduling program on a different system. Currency exchange rates are taken from Time Genie (@uref{http://www.timegenie.com}) and precious metals pricing from Packetizer (@uref{www.packetizer.com}). These sites update once per day, so there is no benefit in running the update script more often than daily. You can run @command{units_cur} with a filename specified on the command line and it will write the data to that file. If you give @samp{-} for the file it will write to standard output. @node Database Syntax @chapter Database Command Syntax @cindex database syntax summary @cindex syntax of units database @cindex commands in units database @table @t @item @var{unit} @var{definition} Define a regular unit. @item @var{prefix}- @var{definition} Define a prefix. @item @var{funcname}(@var{var}) noerror units=[@var{in-units},@var{out-units}] domain=[@var{x1},@var{x2}] range=[@var{y1},@var{y2}] @var{definition(var)} ; @var{inverse(funcname)} Define a nonlinear unit or unit function. The four optional keywords @command{noerror}, @command{units=}, @command{range=} and @command{domain=} can appear in any order. The definition of the inverse is optional. @item @var{tabname}[@var{out-units}] noerror @var{pair-list} Define a piecewise linear unit. The pair list gives the points on the table listed in ascending order. The @command{noerror} keyword is optional. @item !endlocale End a block of definitions beginning with @samp{!locale} @item !endutf8 End a block of definitions begun with @samp{!utf8} @item !endvar End a block of definitions begun with @samp{!var} or @samp{!varnot} @item !include @var{file} Include the specified file. @item !locale @var{value} Load the following definitions only of the locale is set to @var{value}. @item !message @var{text} Display @var{text} when the database is read unless the quiet option (@option{-q}) is enabled. @item !set @var{variable} @var{value} Sets the environment variable, @var{variable}, to the specified value @emph{only if} it is not already set. @item !unitlist @var{alias} @var{definition} Define a unit list alias. @item !utf8 Load the following definitions only if @command{units} is running with UTF-8 enabled. @item !var @var{envar} @var{value-list} Load the block of definitions that follows only if the environment variable @var{envar} is set to one of the values listed in the space-separated value list. If @var{envar} is not set, @command{units} prints an error message and ignores the block of definitions. @item !varnot @var{envar} @var{value-list} Load the block of definitions that follows only if the environment variable @var{envar} is set to value that is @emph{not} listed in the space-separated value list. If @var{envar} is not set, @command{units} prints an error message and ignores the block of definitions. @end table @node GNU Free Documentation License @chapter GNU Free Documentation License @include fdl-1.3.texi @node Index @unnumbered Index @printindex cp @bye @c man .SH FILES @c man @DATAFILE@ \(em the standard units data file @c man .SH AUTHOR units-2.12/README.Win0000664000175000017500000001732612316637517013520 0ustar adrianadrianWith Unix-Like Utilities ======================== If you have Unix-like utilities, you may be able to build and install in much the same manner as on most Unix-like systems with a few adjustments. Version 2.11 was built using Microsoft Visual C/C++ 6.0, Visual C/C++ Express 9.0 and 10.0, and the MKS Toolkit version 9.6 under Windows XP, SP3--see README.MKS for the details. Without Unix-Like Utilities =========================== If you have Microsoft Visual C/C++ or Visual Studio but don't have Unix- like utilities, you may be able to build and install using Makefile.Win. nmake /f Makefile.Win nmake /f Makefile.Win installprog By default, the units executable and data files are placed in the directory given by %ProgramFiles%\GNU\units; in most cases, this is C:\Program Files\GNU\units. You can preview the installation directories with nmake /f Makefile.Win showdest If the destination directories don't exist, they will be created during installation. You can change these locations by editing Makefile.Win. If you want to run units from a command prompt or from the Run box, you can add the installation directory to the PATH environment variable. Alternatively, you can create a shortcut to the program and place it in a convenient location. Icons ===== The installation creates an association between the units data files and the notepad editor, and associates these files with icons in unitsfile.ico. An additional icon file, unitsprog.ico, is provided in case you wish to use it in a shortcut to the units program. Updating Currency Definitions ============================= The script units_cur.py can be used to update currency definitions (if your system hides file extensions, this script will display as “units_cur”). The script requires Python (available from http://www.python.org/) and the unidecode package (available at http://pypi.python.org/). Installing Python ----------------- If you want to use the currency updater, install Python and then install the unidecode package. Unless you have (or anticipate having) applications that depend on Python 2, the best choice is probably to install Python 3. To install the unidecode package, follow the instructions in the PKG-INFO file included with the package. You then should be able to run units_cur.py using the shortcut on the Start Menu, or if you have added the units installation directory to your PATH, from a command window. Installing units_cur.py ----------------------- To create the appropriate script for the version of Python that you will be using, use either nmake /f Makefile.Win currency2 (for Python 2) or nmake /f Makefile.Win currency3 (for Python 3) The script will then be installed when using the 'installprog' target. Setting PATHEXT --------------- If you add ".py" to the PATHEXT environment variable, you can simply type "units_cur" to run the updater from a command window. You can do this from a command window by typing set PATHEXT=%PATHEXT%;.py but you'll need to do this with every new instance. You can make a permanent change by adding ";.py" to PATHEXT from the Advanced tab of the System dialog: click the 'Environment Variables' button, find PATHEXT in either the list of User variables or the list of System variables; click the ‘Edit’ button, make the change, and click 'OK'. Updating Currency Definitions from a Command Prompt --------------------------------------------------- Unless you run the currency-update script from the program installation directory, you will need to modify units_cur.py to give the full pathname of the output file currency.units, i.e., change outfile = 'currency.units' to outfile = '/currency.units' For the default installation directory, this would be outfile = 'C:/Program Files/GNU/units/currency.units' Be sure to use forward slashes to avoid confusing Python. The best approach is to modify this file before installation after creating it with the 'currency?' target. Automatic Updates ----------------- The easiest way to keep currency values up to date is by having the Windows Task Scheduler run units_cur.py on a regular basis. Python Version -------------- By default, the currency updater is configured to use Python 3. If you have older programs that depend on Python 2 and do not wish to install Python 3, rename units_cur to "units_cur3" and rename units_cur2 to "units_cur". If your system is configured to not hide filename extensions, these files will show a ".py" extension; if that's the case, be sure to retain the ".py" when renaming, because the extension is needed for Windows to know how to process the script. If you have both Python 2 and Python 3 installed, the Python launcher will use the latest installed version of Python 2 by default, and the default units_cur will fail. The easiest approach here is to run nmake using the 'currency2' target as shown above before installing to let Python 2 handle the script--the result from either script is the same. If you want to use Python 3, you can do it several ways, including * Changing the first line of the default units_cur from #!/usr/bin/python to "#!python3". The default directive is for compatibility with Unix-like systems; the Python launcher for Windows simply interprets it to mean "use Python", and doesn't actually expect to find the program in /usr/bin. The "#!python3" form tells the Python launcher to find and use Python 3. This should work fine for double clicking the script's icon or running it from a command window, but it may fail if the script is run from a Unix-like shell that interprets the "#!" directive literally. * Confirming that the Python launcher py.exe is in the Windows directory (usually C:\Windows) and changing the first line of the default units_cur from #!/usr/bin/python to "#!C:\Windows\py.exe - 3"; this will cause the Python launcher to use the latest installed version of Python 3. A fully qualified pathname is interpreted literally by the Python launcher, so if the Python launcher is located elsewhere, the first line should give that location. This approach should work for a Unix-like shell as well as the Windows command interpreter. * Setting the environment variable PY_PYTHON to "3"; the best way to do this is from the Advanced tab of the System dialog. This also should work for both Windows and Unix-like command interpreters, but it will affect all Python scripts. Example ======= If you are using Python 3 and installing units in the default location of C:/Program Files/GNU/units, the process would be to 1. Build the executable by running nmake /f Makefile.Win 2. Create the currency updater script by running nmake /f Makefile.Win currency3 3. Modify units_cur.py so that the output file is given by outfile = 'C:/Program Files/GNU/units/currency.units' 4. Confirm the installation location by running nmake /f Makefile.Win showdest It is assumed that the program will be installed in a subdirectory of the standard location for executables (typically, C:\Program Files), and a warning is given if this directory does not exist. Ignore the warning if you are intentionally installing in another location. 5. Install the files by running nmake /f Makefile.Win installprog 6. Ensure that currency.units is writable by ordinary users. The installation should do this automatically, but if for some reason it does not, set permissions manually by adding 'Modify' permission for the appropriate groups (typically 'Power Users' and 'Users') This build and installation were tested for units 2.11 using Microsoft Visual C/C++ 6, 9.0, and 10.0 under Windows XP SP3. -- Jeff Conrad (jeff_conrad@msn.com) 1 April 2014 units-2.12/texi2man0000775000175000017500000003225012270035511013533 0ustar adrianadrian#!/usr/bin/perl # $Id: $ # Written by Adrian Mariano, additional features by Eric Backus and # Jeff Conrad. # Script to translate a texinfo file into an nroff/troff manual page. # last revision: 20 January 2014 Jeff Conrad $version="1.01s"; $html=0; $example=0; $ignore=0; $tex=0; $doman=0; $title=0; $diditem=0; $justdidlp=1; $noman=0; $manprefix=""; $args=($#ARGV < 0) ? "stdin" : "@ARGV"; printf(".\\\"Do not edit this file. It was created from %s\n", $args); printf(".\\\"using texi2man version %s on %s", $version, `date`); while(<>) { # use font CW in tables if (/\@c man\s+l\s/) { s/\@c man //; s/l/lfCWp-1/; print; next; } if (s/\@c man //) { print; if (/\.TH/) { add_extensions(); } next; } if (/\@c noman/) { $noman=1; next; } if (/\@c end noman/) { $noman=0; next; } if ($noman) { next; } if (/\@c ifman\s*(.*)/) { $doman=1; $manprefix = $1; next; } if (/\@c end ifman/) { $doman=0; $manprefix = ""; next; } if (/^\\input/) { next; } if (/^\*/) { next; } if (/^START-INFO-DIR-ENTRY/) { next; } if (/^END-INFO-DIR-ENTRY/) { next; } if (/\@titlepage/) { $title=1; next; } if (/\@end titlepage/) { $title=0; next; } if (/\@tex/) { $tex=1; next; } if (/\@end tex/) { $tex=0; next; } if (/\@ignore/) { $ignore=1; next; } if (/\@end ignore/) { $ignore=0; next; } if (/\@ifhtml/) { $html=1; next; } if (/\@end ifhtml/) { $html=0; next; } if (!$doman && ($ignore || $html || $title || $tex)) { next; } if (/\@codequoteundirected/) { next; } s/\@\*$/\n\.br/g; s/^\@\*/.br/g; s/\@\*$/\n.br/g; s/\@ / /g; s/\@dmn\{([^}]*)}/\\|$1/g; s/\@tie\{}/\@no_break_space\{}/g; s/\@w\{}/\@no_break_space\{}/g; s/\@backslashchar\{}/\\e/g; # ellipsis, defined in extensions s/\@dots\{}/\\*(El/g; s/\@cite\{([^}]*)}/\@in_sgl_quotes\{$1}/g; s/\@url\{([^}]*)}/\@in_sgl_quotes\{$1}/g; s/\@email\{([^}]*)}/\@in_sgl_quotes\{$1}/g; s/\@dfn\{([^}]*)}/\@in_italics\{$1}/g; s/\@emph\{([^}]*)}/\@in_italics\{$1}/g; s/\@i\{([^}]*)}/\@in_italics\{$1}/g; s/\@r\{([^}]*)}/\@in_roman\{$1}/g; s/\@var\{([^}]*)}/\@in_italics\{$1}/g; s/\@b\{([^}]*)}/\@in_bold\{$1}/g; s/\@strong\{([^}]*)}/\@in_bold\{$1}/g; # remove trailing comma from xref because man won't include the page number s/\@xref\{([^}]*)},/\@xref\{$1}/g; s/\@xref\{([^}]*)}/See \@in_italics\{$1}/g; s/\@ref\{([^}]*)}/\@ref\{$1}/g; s/\@ref\{([^}]*)}/\@in_italics\{$1}/g; s/\@pxref\{([^}]*)}/see \@in_italics\{$1}/g; s/\@uref\{([^}]*)}/\@in_roman\{$1}/g; if (/\@chapter.*\@command/) { s/\@command\{([^}]*)}/\@in_italics\{$1}/g; } # show in constant-width font s/\@code\{([^}]*)}/\@constwid\{$1}/g; s/\@command\{([^}]*)}/\@constwid\{$1}/g; s/\@env\{([^}]*)}/\@constwid\{$1}/g; # show in constant-width oblique font s/\@kbd\{([^}]*)}/\@constwidI\{$1}/g; # show in constant-width font with single quotes s/\@file\{([^}]*)}/\@constwidQ\{$1}/g; s/\@option\{([^}]*)}/\@constwidQ\{$1}/g; # Pass ASCII double quotes to .CQ encoded as two double quotes # disallow single quotes here because groff converts them to # typographical closing quotes. # This substitution works only in very limited circumstances, and # needs extension to handle the general case of ASCII quotes in # sample text s/\@samp\{([^}]*)["']{2,2}}/\@samp\{$1""""}/g; s/\@samp\{(.*\@(tie|no_break_space)\{})["']{2,2}}/\@samp\{$1""""}/g; s/\@samp\{([^}]*)}/\@constwidQ\{$1}/g; s/\@sc\{([^}]*)}/\@to_upper\{$1}/g; s/\@key\{([^}]*)}/\@in_italics\{$1}/g; s/\@footnote\{([^}]*)}/\@in_square_br\{$1}/g; s/\@math\{([^}]*)}/\@no_decoration\{$1}/g; if (/\@w\{([^}]*)}/) { s/\@w\{([^}]*)}/\@no_break_word\{$1}/g; } s/\@minus\{}/\\-/g; s/\@copyright\{}/\\(co/g; s/\@noindent//; s/\@\{/{/g; s/\@}/}/g; s/\@\@/@/g; s/---/\\(em/g; s/\@in_sgl_quotes\{([^}]+)}/`$1'/g; s/\@in_dbl_quotes\{([^}]+)}/\"$1\"/g; s/\@in_italics\{([^}]+)}/\\fI$1\\fP/g; s/\@in_roman\{([^}]+)}/\\fR$1\\fP/g; s/\@in_bold\{([^}]+)}/\\fB$1\\fP/g; s/\@to_upper\{([^}]*)}/\U$1\E/g; s/\@no_decoration\{([^}]*)}/$1/g; if (/\@no_break_word\{([^}]+)}(\S*)/) { $_ = no_break_word("$_", '@no_break_word'); } s/\@no_break_space\{}/\\ /g; s/\@[ ]/ /g; s/\@in_angle_br\{([^}]*)}/<$1>/g; s/\@in_square_br\{([^}]*)}/[$1]/g; # set up to use CW, CI, and CQ macros # put every instance on a new line # ensure that prepended and appended macros go on separate lines # separate concatenated commands with spaces s/([}])(\@constwid[IQ]*)/$1 $2/g; s/(\@constwid[IQ]*\{[^}]+})(\@)/$1 $2/g; # space before -> newline s/\s+(\S*\@constwid[IQ]*\{[^}]+}\S*)/\n$1/g; # space after -> newline s/(\S*\@constwid[IQ]*\{[^}]+}\S*)\s+/$1\n/g; if (/(\S*)\@constwidI\{([^}]+)}(\S*)/) { $_ = CW_macro("$_", '@constwidI', ".CI"); } if (/(\S*)\@constwidQ\{([^}]+)}(\S*)/) { $_ = CW_macro("$_", '@constwidQ', ".CQ"); } if (/(\S*)\@constwid\{([^}]+)}(\S*)/) { $_ = CW_macro("$_", '@constwid', ".CW"); } # handle backslash character in sample s/(\.C[IQW]\s+\S+\s+)"\\"/$1"\\e"/g; s/(\.C[IQW]\s+)"\\"/$1"\\e"/g; # handle backslash character in Windows pathname # starts with a drive specifier ... if (/(\.C[IQW]\s+"[[:alpha:]]:)/) { # don't change font switches or escaped spaces s/(\S)\\(?!(\s|f[RIBP]|f\([A-Z]{2}))/$1\\e/g; } # some versions of n/troff don't have \(en, so use \- # don't replace double hyphens in C[IQW] macros; assume true en # dashes will be closed up to previous word s/([^" ]+)--/$1\\-/g; s/\@value\{([^\s]+)}/$value{$1}/eg; if (/\@set\s+([^\s]+)\s+(.*)$/) { $value{$1} = $2; next; } if (/\@clear\s+([^\s]+)\s+(.*)$/) { delete $value{$1}; next; } # works only for @item and @itemx as used in units(1) if (/\@itemx (.*)/) { $samp = $1; # add hair space to visually separate the hyphens in roman type $samp =~ s/--/-\\^-/; $samp =~ s/-([[:alnum:]])/-\\^$1/; if (!$diditem) { printf(".TP\n.BR \"$samp\""); } else { printf(" \", \" \"$samp\""); } $diditem=1; next; } elsif ($diditem) { printf("\n"); $diditem=0; } if (/\@item (.*)/) { $samp = $1; # add hair space to visually separate the hyphens in roman type $samp =~ s/--/-\\^-/; $samp =~ s/-([[:alnum:]])/-\\^$1/; printf("%s.TP\n%s.BR \"$samp\"", $manprefix, $manprefix); $diditem=1; next; } if (s/\@chapter (.*)/.SH \U$1\E/) { # restore proper case on font switches s/\\FR/\\fR/g; s/\\FI/\\f(BI/g; # chapter headings (SH in man) are bold s/\\FP/\\fP/g; printf("%s%s", $manprefix, $_); $justdidlp=1; next; } if (s/\@section (.*)/$1/) { printf("%s.SS %s", $manprefix, $_); next; } # FIXME? why do we need $manprefix for these? # input/output example macros if (/\@example/) { printf("%s.ES\n", $manprefix); $example=1; next; } if (/\@end example/) { printf("%s.EE\n", $manprefix); $example=0; $justdidlp=0; next; } if (/\@smallexample/) { printf("%s.ES S\n", $manprefix); $example=1; next; } if (/\@end smallexample/) { printf("%s.EE\n", $manprefix); $example=0; $justdidlp=0; next; } # no CW font if (/\@display/) { printf("%s.DS\n", $manprefix, $manprefix); $example=1; next; } if (/\@end display/) { printf("%s.DE\n", $manprefix, $manprefix); $example=0; next; } # no CW font, no indent if (/\@format/) { printf("%s.nf\n", $manprefix); $example=1; next; } if (/\@end format/) { printf("%s.fi\n", $manprefix); $example=0; next; } if ($example) { s/\\\s*$/\\e\n/ }; if (!$example && /^\s*$/ && !$doman) { if ($justdidlp) { next; } printf(".PP\n"); $justdidlp=1; next; } if (/^\@/) { next; } printf("%s%s", $manprefix, $_); if (!$doman) { $justdidlp=0; } } # Extensions to legacy man macro package. groff loads the man macro file # after the call of TH, so these definitions must likewise follow that # call of TH if they are overwrite any groff extensions with the same # names that might be added in the future. sub add_extensions { # ensure that ASCII circumflex U+005E (^) is not remapped with groff printf(".\\\"\n"); printf(".\\\" ensure that ASCII circumflex U+005E (^) is not remapped with groff\n"); printf(".if \\n(.g .tr ^\\(ha\n"); # ellipsis: space periods with troff but not with nroff printf(".\\\" ellipsis: space periods with troff but not with nroff\n"); printf(".if n .ds El \\&...\n"); printf(".if t .ds El \\&.\\ .\\ .\n"); # constant-width font printf(".\\\"\n"); printf(".\\\" Extensions to man macros\n"); printf(".\\\"\n"); printf(".\\\" Constant-width font\n"); printf(".de CW\n"); printf(".hy 0\n"); # just single quotes with nroff printf(".if n \\{\\\n"); printf(".ie \\\\n(.\$>2 \\&\\\\\$1'\\\\\$2'\\\\\$3\n"); printf(".el \\&'\\\\\$1'\\\\\$2\n"); printf(".\\}\n"); # constant-width font with troff printf(".if t \\{\\\n"); printf(".ie \\\\n(.\$>2 \\&\\\\\$1\\f(CW\\\\\$2\\fR\\\\\$3\n"); printf(".el \\&\\f(CW\\\\\$1\\fR\\\\\$2\n"); printf(".\\}\n"); printf(".hy 14\n"); printf("..\n"); # constant-width oblique font printf(".\\\" Constant-width oblique font\n"); printf(".de CI\n"); printf(".hy 0\n"); # single quotes with nroff printf(".if n \\{\\\n"); printf(".ie \\\\n(.\$>2 \\&\\\\\$1'\\fI\\\\\$2\\fR'\\\\\$3\n"); printf(".el \\&'\\fI\\\\\$1\\fR'\\\\\$2\n"); printf(".\\}\n"); # constant-width oblique font with troff printf(".if t \\{\\\n"); printf(".ie \\\\n(.\$>2 \\&\\\\\$1\\f(CI\\\\\$2\\fR\\\\\$3\n"); printf(".el \\&\\f(CI\\\\\$1\\fR\\\\\$2\n"); printf(".\\}\n"); printf(".hy 14\n"); printf("..\n"); # constant-width font with quotes with troff printf(".\\\" Constant-width font with quotes\n"); printf(".de CQ\n"); printf(".hy 0\n"); # just single quotes with nroff printf(".if n \\{\\\n"); printf(".ie \\\\n(.\$>2 \\&\\\\\$1'\\\\\$2'\\\\\$3\n"); printf(".el \\&'\\\\\$1'\\\\\$2\n"); printf(".\\}\n"); # constant-width font with troff printf(".if t \\{\\\n"); # quotes passed as literal text encoded as \(fm # make it a double quote because groff converts ` and ' to opening and # closing quotes printf(".ie \\\\n(.\$>2 \\&\\\\\$1`\\f(CW\\\\\$2\\fR'\\\\\$3\n"); printf(".el \\&`\\f(CW\\\\\$1\\fR'\\\\\$2\n"); printf(".\\}\n"); printf(".hy 14\n"); printf("..\n"); # Display Start--indent, no fill printf(".\\\" Display start\n"); printf(".de DS\n"); printf(".hy 0\n"); printf(".if t .in +4n\n"); printf(".if n .in +3n\n"); printf(".nf\n"); printf("..\n"); # Display End printf(".\\\" Display end\n"); printf(".de DE\n"); printf(".fi\n"); printf(".in\n"); printf(".hy 14\n"); printf("..\n"); # Example Start--like display, but with font CW printf(".\\\" Example start\n"); printf(".de ES\n"); # call before size or font change to get consistent indent printf(".DS\n"); # CW font with troff; optionally reduce size printf(".if t \\{\\\n"); printf(".if '\\\\\$1'S' \\{\\\n"); printf(".nr Ex 1\n"); printf(".ps -1\n"); printf(".\\}\n"); printf(".el .nr Ex 0\n"); printf(".nr mE \\\\n(.f\n"); printf(".ft CW\n"); printf(".\\}\n"); printf("..\n"); # Example End printf(".\\\" Example end\n"); printf(".de EE\n"); # restore font and size with troff printf(".if t \\{\\\n"); printf(".ft \\\\n(mE\n"); printf(".if \\\\n(Ex=1 .ps\n"); printf(".\\}\n"); printf(".DE\n"); printf("..\n"); } # convert texinfo commands to .C[IQW] macros sub CW_macro { my $line = shift; my $from = shift; my $to = shift; # prepended and appended punctuation $line =~ s/(\S+)$from\{([^}]+)}(\S+)/$to $1 "$2" $3/g; # prepended punctuation $line =~ s/(\S+)$from\{([^}]+)}/$to $1 "$2" ""/g; # appended punctuation $line =~ s/$from\{([^}]+)}(\S+)/$to "$1" $2/g; # just the argument $line =~ s/$from\{([^}]+)}/$to "$1"/g; return $line; } # convert all spaces within @w{...} to unbreakable sub no_break_word { my $line = shift; my $pattern = (shift) . "\{"; my $len = length($pattern); my $ndx = -1; my $bracelevel = 0; my $char; while (($ndx = index($line, $pattern, $ndx)) > -1) { # get rid of the @ command and opening brace substr($line, $ndx, $len, ''); $bracelevel = 1; while ($bracelevel > 0) { $char = substr($line, $ndx, 1); # end of line and braces not closed if ($char eq "") { last; } elsif ($char eq '{') { $bracelevel++; } elsif ($char eq '}') { $bracelevel--; } # make spaces nonbreaking if ($char eq ' ') { substr($line, $ndx++, 1, '\ '); $ndx++; # assume multiple spaces are not wanted while (substr($line, $ndx, 1) eq ' ') { substr($line, $ndx, 1, ''); } } $ndx++; } # get rid of the closing brace for the @ command. This should # always be true unless there’s an internal brace mismatch ... if (substr($line, $ndx - 1, 1) eq '}' ) { substr($line, $ndx - 1, 1, ''); } else { die "Missing closing '}'"; } } return $line; } units-2.12/NEWS0000664000175000017500000002447212607610570012574 0ustar adrianadrianGNU units NEWS - User visible changes. Copyright (C) 1996, 1997, 1999-2007, 2010-2015 Free Software Foundation, Inc. Version 2.12 - 14 October 2015 * Updated and revised units database, with constants now based on 2014 CODATA. * Readline history is persistent and is saved to ~/.units_history, or to the file specified with --history (-H) option. * Fixed bug where '_' didn't give last result after conversion to function. * Fixed sporadic segmentation fault with --log. * Comments allowed on interactive input with '#', most useful with logging. * Added configure test for rl_completion_suppress_append, which helps compilation under MacOS. * Comment processing happens before checking UTF-8 validity---comments are allowed to contain bogus UTF-8. * Changed units_cur to skip bogus precious metals data from timegenie and to skip currencies with no rate. Version 2.11 - 2 April 2014 (bug fix release) * Many long options didn't work. * units_cur wouldn't print to stdout Version 2.10 - 19 March 2014 * Added '_' to represent the previous result. * Added support for rational exponents with numerators larger than 1 so you can do calculations like liter^2|3. * Added logging with --log (-L) option. * Fixed some unit definitions (R_infinity, planckmass), and added R_K90 and K_J90 for the conventional values of the von Klitzing and Josephson constants. * Don't use readline unless reading from a tty. This makes it much faster to run units through a pipe and also gives consistent behavior between versions compiled with and without readline. * Display of nonlinear unit definitions shows the range over which the unit is defined and the required dimensions of the argument. * Unit completion with readline will now complete nonlinear units, functions (e.g. cuberoot), prefixes, and unit list aliases. It will no longer insert a space after the completion. * Running "units --version" returns success. * Combining "--version" with "--terse" gives a terse version output. * Combining "--version" with "--verbose" or running with "--info" gives a detailed output of how units was compiled and where its supporting files are found. * A nonlinear unit can be defined equal to another nonlinear unit using the syntax: "newfunc() oldfunc". * Domain and range specified with nonlinear units can be open intervals, indicated by parentheses instead of brackets. * The "noerror" keyword on a nonlinear unit supresses error checking with "units --check" for that unit. * Changes to units_cur to work with timegenie changes and to support Python 3. The Python module unidecode is now required for units_cur. * The method for finding supporting files has changed when units is compiled to be relocatable. See the manual for details. The --enable-path-search configure option is replaced by --enable-relocation. * Fix to compile with Bison 3.0. * Improved error messages for various cases. * Units can be compiled and installed under Windows with Microsoft Visual C++ using Makefile.Win. A Windows binary distribution is available. * Some simple icons are included. Version 2.02 - 11 July 2013 * Added support for %a and %A output formats (hexadecimal floating point), and eliminated the restriction on the number of displayed digits when specifying an output format with the --output-format (-o) option. Improved error handling for formats specified with --output-format. * Added --digits (-d) to specify the number of digits to display. Giving '--digits max' (-dmax) will use the full available precision. * Added support for various Unicode minus sign symbols. Units now treats the figure dash (U+2012), the en dash (U+2013), and the minus (U+2212) as identical to the ASCII hyphen/minus symbol (U+002D). * The !message command in units data files has been fixed so it does not produce output when the --quiet option is given. * Improved error handling when unit names end with numbers without a '_'. * Removed six unicode entries from definition.units that were flagged as invalid under MacOS. * Modified units_cur to work with XML format as the txt format disappeared. * Corrected error in definition of the nat. * Improved manual. Version 2.01 - 24 October 2012 (bug fix release) * Fixed error in electronmass * New definition for au * Fixed DESTDIR support for installation * Changed configure script for success with Solaris * Small changes to manual Version 2.00 - 6 June 2012 General changes: * Unit lists provide conversion to sums of units (e.g. feet and inches). * Added --round (-r) and --show-factor (-S) options for use with unit lists. * Added unit lists aliases (e.g. time, usvol). * A python script, units_cur, can update currency data. * Units now flushes its output so you can talk to it with a pipe. * Units now works in UTF-8 if the system supports it. * Added --locale (-l) option to set the locale. * English units such as the gallon are defined in all locales, with US definitions by default except in the en_BG locale. You can force the desired definition (Great Britain or US) by setting the environment variable UNITS_ENGLISH to GB or US. * Revised and extended the documentation, with more examples. * Added locale mapping to address Windows locale names. * Updated and revised units database, including UTF-8 definitions and the 2010 CODATA. * Fixed parsing bug for "1..2" or "1.2.3". These now give an error. * Unit names can end with a number in the form of a subscript that starts with a '_', as in 'X_3'. * Units now performs error checking on the printf format specified with the --output-format (-o) option. Changes for units definition files: * Changed location and names of unit database, splitting off currency Files are /usr/local/share/units/{definitions,currency}.units and the personal units file is $HOME/.units instead of $HOME/units.dat. (Under windows personal unit file is unitdef.units.) * Personal units filename can be changed with MYUNITSFILE environment variable. * Prefixes can be defined in any order: it is no longer necessary to define longer ones before shorter ones. * New definitions replace previous ones. Personal units file is read after the system file rather than before. * Changed syntax for function definitions. Instead of [in-unit,out-unit] you must now write units=[in-unit,out-unit]. Use 'units -c' to find places in your personal data files that need to be updated. * Add optional domain and range to function definitions with syntax domain=[min,max] and range=[min,max]. Either min or max can be omitted to signal infinity. * Unit list aliases can be defined with !unitlist command. * Added !var and !varnot and !endvar to include definitions based on environment variable settings. * Added !set to set environment variables (if they aren't already set). * Added !message to display a message * Data files are in UTF-8, with !utf8 and !endutf8 commands to mark definitions that require UTF-8 support. * Improved error handling when reading units.dat. Version 1.88 - 15 Feb 2010 * Updated units.dat * Fixed bug involving readline version 4.2 Version 1.87 - 25 Sep 2007 * Units reads ~/.units.dat if it exists before reading the standard units database. * Added support for ** as an exponent operator. * Type 'search text' to list units that contain 'text' in their name. * Precedence of '*' changed to match precedence of '/'. (Multiplication by juxtaposition retains a higher precedence than '/'.) The --oldstar option selects the old precedence and --newstar forces the new precedence. Version 1.86 - 10 Nov 2006 * Added --one-line (-1) option which causes the program to print only one line of output. * Added --compact option which causes the program to print only the conversion factors and a newline on output. * Added build support for DESTDIR. * Made minor changes that allow the program to be compiled into a library and linked with other programs. * Fixed bug that caused bus error on Intel Mac. Version 1.85 - 20 May 2005 * The '-' character by default indicates subtraction. Multiplication can be obtained by '*' or ' '. The --product (-p) option selects the old behavior where '-' acts as a multiplication operator. The --minus (-m) option forces the default behavior where '-' indicates subtraction. * Handing of radian and steradian changed. These units are now treated as conformable with 1 for units conversions. This is indicated by the "!dimensionless" tag in units.dat. * Unit files can be included using !include. * Multiple -f (--file) options can appear on the command line; giving a null filename (-f '') causes the default units database to be loaded. * Added -t (--terse) option. * Improved error checking for units.dat. * Corrected and extended units.dat. Version 1.81 - October 28, 2002 * Fixed missing definition of "au" in units.dat. Version 1.80 - June 16, 2002 * Rewritten parser supports - () for grouping - noninteger powers of numbers (e.g. 3^0.25) - functions with dimensionless arguments (log, ln, log2, sin, cos, tan, exp) - roots of units: sqrt(unit), cuberoot(unit), and higher roots as unit^(1|4) * Functions can be defined in units.dat, and conversion to a function performed by specifying the function name alone as the "want" item. * Unit conversions can be specified as tables with linear interpolation. * The "help" command summarizes operations, and "help unit" browses the units database at the definition of the specified unit. * Specifying "?" for the want unit gets a list of all conformable units. * Support for locales added. * Units file extended and corrected. Version 1.55 - July 30, 1999 * Added over 600 new units and corrected errors in the units data file. * Minor bug fix affecting unit name completion. Version 1.54 - July 15, 1997 * Switched order of prefix and plural handling (plurals are now done first) * Added reciprocal unit conversion and --strict (-s) option * Fixed some erroneous unit definitions, added currency codes and other units * Improved Makefile (exec-prefix, program-transform-name supported) * Bug fixes Version 1.53 - Jan 13, 1997 * Added units containing ISO 8859-1 characters * Bug fixes Version 1.52 - Dec 18, 1996 * Sums of conformable units * Printing of unit definitions * Unitname completion with readline * Added --verbose (-v) option and moved --version to -V * Improved portability, old style C support, improved Makefile units-2.12/units.txt0000664000175000017500000033042312607541441013774 0ustar adrianadrianUNITS(1) General Commands Manual UNITS(1) NAME units -- unit conversion and calculation program SYNOPSIS 'units' [options] [from-unit [to-unit]] DESCRIPTION The 'units' program converts quantities expressed in various systems of measurement to their equivalents in other systems of measurement. Like many similar programs, it can handle multiplicative scale changes. It can also handle nonlinear conversions such as Fahrenheit to Celsius; see Temperature Conversions. The program can also perform conversions from and to sums of units, such as converting between meters and feet plus inches. Basic operation is simple: you enter the units that you want to convert from and the units that you want to convert to. You can use the pro- gram interactively with prompts, or you can use it from the command line. Beyond simple unit conversions, 'units' can be used as a general-pur- pose scientific calculator that keeps track of units in its calcula- tions. You can form arbitrary complex mathematical expressions of dimensions including sums, products, quotients, powers, and even roots of dimensions. Thus you can ensure accuracy and dimensional consis- tency when working with long expressions that involve many different units that may combine in complex ways; for an illustration, see Com- plicated Unit Expressions. The units are defined in an external data file. You can use the exten- sive data file that comes with this program, or you can provide your own data file to suit your needs. You can also use your own data file to supplement the standard data file. You can change the default behavior of 'units' with various options given on the command line. See Invoking Units for a description of the available options. INTERACTING WITH UNITS To invoke units for interactive use, type 'units' at your shell prompt. The program will print something like this: Currency exchange rates from www.timegenie.com on 2014-03-05 2860 units, 109 prefixes, 85 nonlinear units You have: At the 'You have:' prompt, type the quantity and units that you are converting from. For example, if you want to convert ten meters to feet, type '10 meters'. Next, 'units' will print 'You want:'. You should type the units you want to convert to. To convert to feet, you would type 'feet'. If the 'readline' library was compiled in then tab will complete unit names. See Readline Support for more information about 'readline'. To quit the program under Unix, press Ctrl-C or Ctrl-D. Under Windows, press Ctrl-C or Ctrl-Z; with the latter, you may also need to press Enter. The result will be displayed in two ways. The first line of output, which is marked with a '*' to indicate multiplication, gives the result of the conversion you have asked for. The second line of output, which is marked with a '/' to indicate division, gives the inverse of the conversion factor. If you convert 10 meters to feet, 'units' will print * 32.808399 / 0.03048 which tells you that 10 meters equals about 32.8 feet. The second num- ber gives the conversion in the opposite direction. In this case, it tells you that 1 foot is equal to about 0.03 dekameters since the dekameter is 10 meters. It also tells you that 1/32.8 is about 0.03. The 'units' program prints the inverse because sometimes it is a more convenient number. In the example above, for example, the inverse value is an exact conversion: a foot is exactly 0.03048 dekameters. But the number given the other direction is inexact. If you convert grains to pounds, you will see the following: You have: grains You want: pounds * 0.00014285714 / 7000 From the second line of the output you can immediately see that a grain is equal to a seven thousandth of a pound. This is not so obvi- ous from the first line of the output. If you find the output format confusing, try using the '--verbose' option: You have: grain You want: aeginamina grain = 0.00010416667 aeginamina grain = (1 / 9600) aeginamina If you request a conversion between units that measure reciprocal dimensions, then 'units' will display the conversion results with an extra note indicating that reciprocal conversion has been done: You have: 6 ohms You want: siemens reciprocal conversion * 0.16666667 / 6 Reciprocal conversion can be suppressed by using the '--strict' option. As usual, use the '--verbose' option to get more comprehensible output: You have: tex You want: typp reciprocal conversion 1 / tex = 496.05465 typp 1 / tex = (1 / 0.0020159069) typp You have: 20 mph You want: sec/mile reciprocal conversion 1 / 20 mph = 180 sec/mile 1 / 20 mph = (1 / 0.0055555556) sec/mile If you enter incompatible unit types, the 'units' program will print a message indicating that the units are not conformable and it will dis- play the reduced form for each unit: You have: ergs/hour You want: fathoms kg^2 / day conformability error 2.7777778e-11 kg m^2 / sec^3 2.1166667e-05 kg^2 m / sec If you only want to find the reduced form or definition of a unit, sim- ply press Enter at the 'You want:' prompt. Here is an example: You have: jansky You want: Definition: fluxunit = 1e-26 W/m^2 Hz = 1e-26 kg / s^2 The output from 'units' indicates that the jansky is defined to be equal to a fluxunit which in turn is defined to be a certain combina- tion of watts, meters, and hertz. The fully reduced (and in this case somewhat more cryptic) form appears on the far right. Some named units are treated as dimensionless in some situations. These units include the radian and steradian. These units will be treated as equal to 1 in units conversions. Power is equal to torque times angular velocity. This conversion can only be performed if the radian is dimensionless. You have: (14 ft lbf) (12 radians/sec) You want: watts * 227.77742 / 0.0043902509 It is also possible to compute roots and other non-integer powers of dimensionless units; this allows computations such as the altitude of geosynchronous orbit: You have: cuberoot(G earthmass / (circle/siderealday)^2) - earthradius You want: miles * 22243.267 / 4.4957425e-05 Named dimensionless units are not treated as dimensionless in other contexts. They cannot be used as exponents so for example, 'meter^radian' is forbidden. If you want a list of options you can type '?' at the 'You want:' prompt. The program will display a list of named units that are con- formable with the unit that you entered at the 'You have:' prompt above. Conformable unit combinations will not appear on this list. Typing 'help' at either prompt displays a short help message. You can also type 'help' followed by a unit name. This will invoke a pager on the units data base at the point where that unit is defined. You can read the definition and comments that may give more details or histori- cal information about the unit. (You can generally quit out of the page by pressing 'q'.) Typing 'search' text will display a list of all of the units whose names contain text as a substring along with their definitions. This may help in the case where you aren't sure of the right unit name. USING UNITS NON-INTERACTIVELY The 'units' program can perform units conversions non-interactively from the command line. To do this, type the command, type the original unit expression, and type the new units you want. If a units expres- sion contains non-alphanumeric characters, you may need to protect it from interpretation by the shell using single or double quote charac- ters. If you type units "2 liters" quarts then 'units' will print * 2.1133764 / 0.47317647 and then exit. The output tells you that 2 liters is about 2.1 quarts, or alternatively that a quart is about 0.47 times 2 liters. If the conversion is successful, then 'units' will return success (zero) to the calling environment. If you enter non-conformable units then 'units' will print a message giving the reduced form of each unit and it will return failure (nonzero) to the calling environment. When you invoke 'units' with only one argument, it will print out the definition of the specified unit. It will return failure if the unit is not defined and success if the unit is defined. UNIT DEFINITIONS The conversion information is read from a units data file that is called 'definitions.units' and is usually located in the '/usr/share/units' directory. If you invoke 'units' with the '-V' option, it will print the location of this file. The default file includes definitions for all familiar units, abbreviations and metric prefixes. It also includes many obscure or archaic units. Many constants of nature are defined, including these: pi ratio of circumference to diameter c speed of light e charge on an electron force acceleration of gravity mole Avogadro's number water pressure per unit height of water Hg pressure per unit height of mercury au astronomical unit k Boltzman's constant mu0 permeability of vacuum epsilon0 permittivity of vacuum G Gravitational constant mach speed of sound The standard data file includes atomic masses for all of the elements and numerous other constants. Also included are the densities of vari- ous ingredients used in baking so that '2 cups flour_sifted' can be converted to 'grams'. This is not an exhaustive list. Consult the units data file to see the complete list, or to see the definitions that are used. The 'pound' is a unit of mass. To get force, multiply by the force conversion unit 'force' or use the shorthand 'lbf'. (Note that 'g' is already taken as the standard abbreviation for the gram.) The unit 'ounce' is also a unit of mass. The fluid ounce is 'fluidounce' or 'floz'. When British capacity units differ from their US counterparts, such as the British Imperial gallon, the unit is defined both ways with 'br' and 'us' prefixes. Your locale settings will determine the value of the unprefixed unit. Currency is prefixed with its country name: 'belgiumfranc', 'britainpound'. When searching for a unit, if the specified string does not appear exactly as a unit name, then the 'units' program will try to remove a trailing 's', 'es'. Next units will replace a trailing 'ies' with 'y'. If that fails, 'units' will check for a prefix. The database includes all of the standard metric prefixes. Only one prefix is permitted per unit, so 'micromicrofarad' will fail. However, prefixes can appear alone with no unit following them, so 'micro*microfarad' will work, as will 'micro microfarad'. To find out which units and prefixes are available, read the standard units data file, which is extensively annotated. English Customary Units English customary units differ in various ways in different regions. In Britain a complex system of volume measurements featured different gallons for different materials such as a wine gallon and ale gallon that different by twenty percent. This complexity was swept away in 1824 by a reform that created an entirely new gallon, the British Impe- rial gallon defined as the volume occupied by ten pounds of water. Meanwhile in the USA the gallon is derived from the 1707 Winchester wine gallon, which is 231 cubic inches. These gallons differ by about twenty percent. By default if 'units' runs in the 'en_GB' locale you will get the British volume measures. If it runs in the 'en_US' locale you will get the US volume measures. In other locales the default val- ues are the US definitions. If you wish to force different definitions then set the environment variable 'UNITS_ENGLISH' to either 'US' or 'GB' to set the desired definitions independent of the locale. Before 1959, the value of a yard (and other units of measure defined in terms of it) differed slightly among English-speaking countries. In 1959, Australia, Canada, New Zealand, the United Kingdom, the United States, and South Africa adopted the Canadian value of 1 yard = 0.9144 m (exactly), which was approximately halfway between the values used by the UK and the US; it had the additional advantage of making 1 inch = 2.54 cm (exactly). This new standard was termed the Interna- tional Yard. Australia, Canada, and the UK then defined all customary lengths in terms of the International Yard (Australia did not define the furlong or rod); because many US land surveys were in terms of the pre-1959 units, the US continued to define customary surveyors' units (furlong, chain, rod, and link) in terms of the previous value for the foot, which was termed the US survey foot. The US defined a US survey mile as 5280 US survey feet, and defined a statute mile as a US survey mile. The US values for these units differ from the international val- ues by about 2 ppm. The 'units' program uses the international values for these units; the US values can be obtained by using either the 'US' or the 'survey' pre- fix. In either case, the simple familiar relationships among the units are maintained, e.g., 1 'furlong' = 660 'ft', and 1 'USfurlong' = 660 'USft', though the metric equivalents differ slightly between the two cases. The 'US' prefix or the 'survey' prefix can also be used to obtain the US survey mile and the value of the US yard prior to 1959, e.g., 'USmile' or 'surveymile' (but not 'USsurveymile'). To get the US value of the statute mile, use either 'USstatutemile' or 'USmile'. Except for distances that extend over hundreds of miles (such as in the US State Plane Coordinate System), the differences in the miles are usually insignificant: You have: 100 surveymile - 100 mile You want: inch * 12.672025 / 0.078913984 The pre-1959 UK values for these units can be obtained with the prefix 'UK'. In the US, the acre is officially defined in terms of the US survey foot, but 'units' uses a definition based on the international foot. If you want the official US acre use 'USacre' and similarly use 'USacrefoot' for the official US version of that unit. The difference between these units is about 4 parts per million. UNIT EXPRESSIONS Operators You can enter more complicated units by combining units with operations such as multiplication, division, powers, addition, subtraction, and parentheses for grouping. You can use the customary symbols for these operators when 'units' is invoked with its default options. Addition- ally, 'units' supports some extensions, including high priority multi- plication using a space, and a high priority numerical division opera- tor ('|') that can simplify some expressions. You multiply units using a space or an asterisk ('*'). The next exam- ple shows both forms: You have: arabicfoot * arabictradepound * force You want: ft lbf * 0.7296 / 1.370614 You can divide units using the slash ('/') or with 'per': You have: furlongs per fortnight You want: m/s * 0.00016630986 / 6012.8727 You can use parentheses for grouping: You have: (1/2) kg / (kg/meter) You want: league * 0.00010356166 / 9656.0833 Multiplication using a space has a higher precedence than division using a slash and is evaluated left to right; in effect, the first '/' character marks the beginning of the denominator of a unit expression. This makes it simple to enter a quotient with several terms in the denominator: 'J / mol K'. The '*' and '/' operators have the same precedence, and are evaluated left to right; if you multiply with '*', you must group the terms in the denominator with parentheses: 'J / (mol * K)'. The higher precedence of the space operator may not always be advanta- geous. For example, 'm/s s/day' is equivalent to 'm / s s day' and has dimensions of length per time cubed. Similarly, '1/2 meter' refers to a unit of reciprocal length equivalent to 0.5/meter, perhaps not what you would intend if you entered that expression. The get a half meter you would need to use parentheses: '(1/2) meter'. The '*' operator is convenient for multiplying a sequence of quotients. For example, 'm/s * s/day' is equivalent to 'm/day'. Similarly, you could write '1/2 * meter' to get half a meter. The 'units' program supports another option for numerical fractions: you can indicate division of numbers with the vertical bar ('|'), so if you wanted half a meter you could write '1|2 meter'. You cannot use the vertical bar to indicate division of non-numerical units (e.g., 'm|s' results in an error message). Powers of units can be specified using the '^' character, as shown in the following example, or by simple concatenation of a unit and its exponent: 'cm3' is equivalent to 'cm^3'; if the exponent is more than one digit, the '^' is required. You can also use '**' as an exponent operator. You have: cm^3 You want: gallons * 0.00026417205 / 3785.4118 Concatenation only works with a single unit name: if you write '(m/s)2', 'units' will treat it as multiplication by 2. When a unit includes a prefix, exponent operators apply to the combination, so 'centimeter3' gives cubic centimeters. If you separate the prefix from the unit with any multiplication operator (e.g., 'centi meter^3'), the prefix is treated as a separate unit, so the exponent applies only to the unit without the prefix. The second example is equivalent to 'centi * (meter^3)', and gives a hundredth of a cubic meter, not a cubic centimeter. The 'units' program is limited internally to prod- ucts of 99 units; accordingly, expressions like 'meter^100' or 'joule^34' (represented internally as 'kg^34 m^68 / s^68') will fail. The '|' operator has the highest precedence, so you can write the square root of two thirds as '2|3^1|2'. The '^' operator has the sec- ond highest precedence, and is evaluated right to left, as usual: You have: 5 * 2^3^2 You want: Definition: 2560 With a dimensionless base unit, any dimensionless exponent is meaning- ful (e.g., 'pi^exp(2.371)'). Even though angle is sometimes treated as dimensionless, exponents cannot have dimensions of angle: You have: 2^radian ^ Exponent not dimensionless If the base unit is not dimensionless, the exponent must be a rational number p/q, and the dimension of the unit must be a power of q, so 'gallon^2|3' works but 'acre^2|3' fails. An exponent using the slash ('/') operator (e.g., 'gallon^(2/3)') is also acceptable; the parenthe- ses are needed because the precedence of '^' is higher than that of '/'. Since 'units' cannot represent dimensions with exponents greater than 99, a fully reduced exponent must have q < 100. When raising a non-dimensionless unit to a power, 'units' attempts to convert a deci- mal exponent to a rational number with q < 100. If this is not possi- ble 'units' displays an error message: You have: ft^1.234 Base unit not dimensionless; rational exponent required A decimal exponent must match its rational representation to machine precision, so 'acre^1.5' works but 'gallon^0.666' does not. Sums and Differences of Units You may sometimes want to add values of different units that are out- side the SI. You may also wish to use 'units' as a calculator that keeps track of units. Sums of conformable units are written with the '+' character, and differences with the '-' character. You have: 2 hours + 23 minutes + 32 seconds You want: seconds * 8612 / 0.00011611705 You have: 12 ft + 3 in You want: cm * 373.38 / 0.0026782366 You have: 2 btu + 450 ft lbf You want: btu * 2.5782804 / 0.38785542 The expressions that are added or subtracted must reduce to identical expressions in primitive units, or an error message will be displayed: You have: 12 printerspoint - 4 heredium ^ Illegal sum of non-conformable units As usual, the precedence for '+' and '-' is lower than that of the other operators. A fractional quantity such as 2 1/2 cups can be given as '(2+1|2) cups'; the parentheses are necessary because multiplication has higher precedence than addition. If you omit the parentheses, 'units' attempts to add '2' and '1|2 cups', and you get an error mes- sage: You have: 2+1|2 cups ^ Illegal sum or difference of non-conformable units The expression could also be correctly written as '(2+1/2) cups'. If you write '2 1|2 cups' the space is interpreted as multiplication so the result is the same as '1 cup'. The '+' and '-' characters sometimes appears in exponents like '3.43e+8'. This leads to an ambiguity in an expression like '3e+2 yC'. The unit 'e' is a small unit of charge, so this can be regarded as equivalent to '(3e+2) yC' or '(3 e)+(2 yC)'. This ambiguity is resolved by always interpreting '+' and '-' as part of an exponent if possible. Numbers as Units For 'units', numbers are just another kind of unit. They can appear as many times as you like and in any order in a unit expression. For example, to find the volume of a box that is 2 ft by 3 ft by 12 ft in steres, you could do the following: You have: 2 ft 3 ft 12 ft You want: stere * 2.038813 / 0.49048148 You have: $ 5 / yard You want: cents / inch * 13.888889 / 0.072 And the second example shows how the dollar sign in the units conver- sion can precede the five. Be careful: 'units' will interpret '$5' with no space as equivalent to 'dollar^5'. Built-in Functions Several built-in functions are provided: 'sin', 'cos', 'tan', 'ln', 'log', 'log2', 'exp', 'acos', 'atan' and 'asin'. The 'sin', 'cos', and 'tan' functions require either a dimensionless argument or an argument with dimensions of angle. You have: sin(30 degrees) You want: Definition: 0.5 You have: sin(pi/2) You want: Definition: 1 You have: sin(3 kg) ^ Unit not dimensionless The other functions on the list require dimensionless arguments. The inverse trigonometric functions return arguments with dimensions of angle. If you wish to take roots of units, you may use the 'sqrt' or 'cuberoot' functions. These functions require that the argument have the appropriate root. You can obtain higher roots by using fractional exponents: You have: sqrt(acre) You want: feet * 208.71074 / 0.0047913202 You have: (400 W/m^2 / stefanboltzmann)^(1/4) You have: Definition: 289.80882 K You have: cuberoot(hectare) ^ Unit not a root Previous Result You can insert the result of the previous conversion using the under- score ('_'). It is useful when you want to convert the same input to several different units, for example You have: 2.3 tonrefrigeration You want: btu/hr * 27600 / 3.6231884e-005 You have: _ You want: kW * 8.0887615 / 0.12362832 Suppose you want to do some deep frying that requires an oil depth of 2 inches. You have 1/2 gallon of oil, and want to know the largest- diameter pan that will maintain the required depth. The nonlinear unit 'circlearea' gives the radius of the circle (see Other Nonlinear Units, for a more detailed description) in SI units; you want the diameter in inches: You have: 1|2 gallon / 2 in You want: circlearea 0.10890173 m You have: 2 _ You want: in * 8.5749393 / 0.1166189 In most cases, surrounding white space is optional, so the previous example could have used '2_'. If '_' follows a non-numerical unit sym- bol, however, the space is required: You have: m_ ^ Parse error When '_' is followed by a digit, the operation is multiplication rather than exponentiation, so that '_2', is equivalent to '_ * 2' rather than '_^2'. You can use the '_' symbol any number of times; for example, You have: m You want: Definition: 1 m You have: _ _ You want: Definition: 1 m^2 Using '_' before a conversion has been performed (e.g., immediately after invocation) generates an error: You have: _ ^ No previous result; '_' not set Accordingly, '_' serves no purpose when 'units' is invoked non-interac- tively. If 'units' is invoked with the '--verbose' option (see Invoking Units), the value of '_' is not expanded: You have: mile You want: ft mile = 5280 ft mile = (1 / 0.00018939394) ft You have: _ You want: m _ = 1609.344 m _ = (1 / 0.00062137119) m You can give '_' at the 'You want:' prompt, but it usually is not very useful. Complicated Unit Expressions The 'units' program is especially helpful in ensuring accuracy and dimensional consistency when converting lengthy unit expressions. For example, one form of the Darcy-Weisbach fluid-flow equation is Delta P = (8 / pi)^2 (rho fLQ^2) / d^5, where Delta P is the pressure drop, rho is the mass density, f is the (dimensionless) friction factor, L is the length of the pipe, Q is the volumetric flow rate, and d is the pipe diameter. It might be desired to have the equation in the form Delta P = A1 rho fLQ^2 / d^5 that accepted the user's normal units; for typical units used in the US, the required conversion could be something like You have: (8/pi^2)(lbm/ft^3)ft(ft^3/s)^2(1/in^5) You want: psi * 43.533969 / 0.022970568 The parentheses allow individual terms in the expression to be entered naturally, as they might be read from the formula. Alternatively, the multiplication could be done with the '*' rather than a space; then parentheses are needed only around 'ft^3/s' because of its exponent: You have: 8/pi^2 * lbm/ft^3 * ft * (ft^3/s)^2 /in^5 You want: psi * 43.533969 / 0.022970568 Without parentheses, and using spaces for multiplication, the previous conversion would need to be entered as You have: 8 lb ft ft^3 ft^3 / pi^2 ft^3 s^2 in^5 You want: psi * 43.533969 / 0.022970568 Backwards Compatibility: '*' and '-' The original 'units' assigned multiplication a higher precedence than division using the slash. This differs from the usual precedence rules, which give multiplication and division equal prece- dence, and can be confusing for people who think of units as a calculator. The star operator ('*') included in this 'units' program has, by default, the same precedence as division, and hence follows the usual precedence rules. For backwards compatibility you can invoke 'units' with the '--oldstar' option. Then '*' has a higher precedence than division, and the same precedence as multiplication using the space. Historically, the hyphen ('-') has been used in technical publications to indicate products of units, and the original 'units' program treated it as a multiplication operator. Because 'units' provides several other ways to obtain unit products, and because '-' is a subtraction operator in general algebraic expressions, 'units' treats the binary '-' as a subtraction operator by default. For backwards compatibility use the '--product' option, which causes 'units' to treat the binary '-' operator as a product operator. When '-' is a multiplication oper- ator it has the same precedence as multiplication with a space, giving it a higher precedence than division. When '-' is used as a unary operator it negates its operand. Regard- less of the 'units' options, if '-' appears after '(' or after '+' then it will act as a negation operator. So you can always compute 20 degrees minus 12 minutes by entering '20 degrees + -12 arcmin'. You must use this construction when you define new units because you cannot know what options will be in force when your definition is processed. NONLINEAR UNIT CONVERSIONS Nonlinear units are represented using functional notation. They make possible nonlinear unit conversions such as temperature. Temperature Conversions Conversions between temperatures are different from linear conversions between temperature increments--see the example below. The absolute temperature conversions are handled by units starting with 'temp', and you must use functional notation. The temperature-increment conver- sions are done using units starting with 'deg' and they do not require functional notation. You have: tempF(45) You want: tempC 7.2222222 You have: 45 degF You want: degC * 25 / 0.04 Think of 'tempF(x)' not as a function but as a notation that indicates that x should have units of 'tempF' attached to it. See Defining Non- linear Units. The first conversion shows that if it's 45 degrees Fahrenheit outside, it's 7.2 degrees Celsius. The second conversion indicates that a change of 45 degrees Fahrenheit corresponds to a change of 25 degrees Celsius. The conversion from 'tempF(x)' is to absolute temperature, so that You have: tempF(45) You want: degR * 504.67 / 0.0019814929 gives the same result as You have: tempF(45) You want: tempR * 504.67 / 0.0019814929 But if you convert 'tempF(x)' to 'degC', the output is probably not what you expect: You have: tempF(45) You want: degC * 280.37222 / 0.0035666871 The result is the temperature in K, because 'degC' is defined as 'K', the Kelvin. For consistent results, use the 'tempX' units when convert- ing to a temperature rather than converting a temperature increment. The 'tempC()' and 'tempF()' definitions are limited to positive abso- lute temperatures, and giving a value that would result in a negative absolute temperature generates an error message: You have: tempC(-275) ^ Argument of function outside domain ^ Other Nonlinear Units Some other examples of nonlinear units are numerous different ring sizes and wire gauges, the grit sizes used for abrasives, the decibel scale, shoe size, scales for the density of sugar (e.g., baume). The standard data file also supplies units for computing the area of a cir- cle and the volume of a sphere. See the standard units data file for more details. Wire gauges with multiple zeroes are signified using negative numbers where two zeroes is '-1'. Alternatively, you can use the synonyms 'g00', 'g000', and so on that are defined in the standard units data file. You have: wiregauge(11) You want: inches * 0.090742002 / 11.020255 You have: brwiregauge(g00) You want: inches * 0.348 / 2.8735632 You have: 1 mm You want: wiregauge 18.201919 You have: grit_P(600) You want: grit_ansicoated 342.76923 The last example shows the conversion from P graded sand paper, which is the European standard and may be marked ``P600'' on the back, to the USA standard. You can compute the area of a circle using the nonlinear unit, 'circlearea'. You can also do this using the circularinch or cir- cleinch. The next example shows two ways to compute the area of a cir- cle with a five inch radius and one way to compute the volume of a sphere with a radius of one meter. You have: circlearea(5 in) You want: in2 * 78.539816 / 0.012732395 You have: 10^2 circleinch You want: in2 * 78.539816 / 0.012732395 You have: spherevol(meter) You want: ft3 * 147.92573 / 0.0067601492 The inverse of a nonlinear conversion is indicated by prefixing a tilde ('~') to the nonlinear unit name: You have: ~wiregauge(0.090742002 inches) You want: Definition: 11 You can give a nonlinear unit definition without an argument or paren- theses, and press Enter at the 'You want:' prompt to get the definition of a nonlinear unit; if the definition is not valid for all real num- bers, the range of validity is also given. If the definition requires specific units this information is also displayed: You have: tempC Definition: tempC(x) = x K + stdtemp defined for x >= -273.15 You have: ~tempC Definition: ~tempC(tempC) = (tempC +(-stdtemp))/K defined for tempC >= 0 K You have: circlearea Definition: circlearea(r) = pi r^2 r has units m To see the definition of the inverse use the '~' notation. In this case the parameter in the functional definition will usually be the name of the unit. Note that the inverse for 'tempC' shows that it requires units of 'K' in the specification of the allowed range of val- ues. Nonlinear unit conversions are described in more detail in Defin- ing Nonlinear Units. UNIT LISTS: CONVERSION TO SUMS OF UNITS Outside of the SI, it is sometimes desirable to convert a single unit to a sum of units--for example, feet to feet plus inches. The conver- sion from sums of units was described in Sums and Differences of Units, and is a simple matter of adding the units with the '+' sign: You have: 12 ft + 3 in + 3|8 in You want: ft * 12.28125 / 0.081424936 Although you can similarly write a sum of units to convert to, the result will not be the conversion to the units in the sum, but rather the conversion to the particular sum that you have entered: You have: 12.28125 ft You want: ft + in + 1|8 in * 11.228571 / 0.089058524 The unit expression given at the 'You want:' prompt is equivalent to asking for conversion to multiples of '1 ft + 1 in + 1|8 in', which is 1.09375 ft, so the conversion in the previous example is equivalent to You have: 12.28125 ft You want: 1.09375 ft * 11.228571 / 0.089058524 In converting to a sum of units like miles, feet and inches, you typi- cally want the largest integral value for the first unit, followed by the largest integral value for the next, and the remainder converted to the last unit. You can do this conversion easily with 'units' using a special syntax for lists of units. You must list the desired units in order from largest to smallest, separated by the semicolon (';') char- acter: You have: 12.28125 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in The conversion always gives integer coefficients on the units in the list, except possibly the last unit when the conversion is not exact: You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3.00096 * 1|8 in The order in which you list the units is important: You have: 3 kg You want: oz;lb 105 oz + 0.051367866 lb You have: 3 kg You want: lb;oz 6 lb + 9.8218858 oz Listing ounces before pounds produces a technically correct result, but not a very useful one. You must list the units in descending order of size in order to get the most useful result. Ending a unit list with the separator ';' has the same effect as repeating the last unit on the list, so 'ft;in;1|8 in;' is equivalent to 'ft;in;1|8 in;1|8 in'. With the example above, this gives You have: 12.28126 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in + 0.00096 * 1|8 in in effect separating the integer and fractional parts of the coeffi- cient for the last unit. If you instead prefer to round the last coef- ficient to an integer you can do this with the '--round' ('-r') option. With the previous example, the result is You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in (rounded down to nearest 1|8 in) When you use the '-r' option, repeating the last unit on the list has no effect (e.g., 'ft;in;1|8 in;1|8 in' is equivalent to 'ft;in;1|8 in'), and hence neither does ending a list with a ';'. With a single unit and the '-r' option, a terminal ';' does have an effect: it causes 'units' to treat the single unit as a list and produce a rounded value for the single unit. Without the extra ';', the '-r' option has no effect on single unit conversions. This example shows the output using the '-r' option: You have: 12.28126 ft You want: in * 147.37512 / 0.0067854058 You have: 12.28126 ft You want: in; 147 in (rounded down to nearest in) Each unit that appears in the list must be conformable with the first unit on the list, and of course the listed units must also be conform- able with the unit that you enter at the 'You have:' prompt. You have: meter You want: ft;kg ^ conformability error ft = 0.3048 m kg = 1 kg You have: meter You want: lb;oz conformability error 1 m 0.45359237 kg In the first case, 'units' reports the disagreement between units appearing on the list. In the second case, 'units' reports disagree- ment between the unit you entered and the desired conversion. This conformability error is based on the first unit on the unit list. Other common candidates for conversion to sums of units are angles and time: You have: 23.437754 deg You want; deg;arcmin;arcsec 23 deg + 26 arcmin + 15.9144 arcsec You have: 7.2319 hr You want: hr;min;sec 7 hr + 13 min + 54.84 sec In North America, recipes for cooking typically measure ingredients by volume, and use units that are not always convenient multiples of each other. Suppose that you have a recipe for 6 and you wish to make a portion for 1. If the recipe calls for 2 1/2 cups of an ingredient, you might wish to know the measurements in terms of measuring devices you have available, you could use 'units' and enter You have: (2+1|2) cup / 6 You want: cup;1|2 cup;1|3 cup;1|4 cup;tbsp;tsp;1|2 tsp;1|4 tsp 1|3 cup + 1 tbsp + 1 tsp By default, if a unit in a list begins with fraction of the form 1|x and its multiplier is an integer, the fraction is given as the product of the multiplier and the numerator; for example, You have: 12.28125 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in In many cases, such as the example above, this is what is wanted, but sometimes it is not. For example, a cooking recipe for 6 might call for 5 1/4 cup of an ingredient, but you want a portion for 2, and your 1-cup measure is not available; you might try You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3|2 cup + 1|4 cup This result might be fine for a baker who has a 1 1/2-cup measure (and recognizes the equivalence), but it may not be as useful to someone with more limited set of measures, who does want to do additional cal- culations, and only wants to know ``How many 1/2-cup measures to I need to add?'' After all, that's what was actually asked. With the '--show-factor' option, the factor will not be combined with a unity numerator, so that you get You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3 * 1|2 cup + 1|4 cup A user-specified fractional unit with a numerator other than 1 is never overridden, however--if a unit list specifies '3|4 cup;1|2 cup', a result equivalent to 1 1/2 cups will always be shown as '2 * 3|4 cup' whether or not the '--show-factor' option is given. Some applications for unit lists may be less obvious. Suppose that you have a postal scale and wish to ensure that it's accurate at 1 oz, but have only metric calibration weights. You might try You have: 1 oz You want: 100 g;50 g; 20 g;10 g;5 g;2 g;1 g; 20 g + 5 g + 2 g + 1 g + 0.34952312 * 1 g You might then place one each of the 20 g, 5 g, 2 g, and 1 g weights on the scale and hope that it indicates close to You have: 20 g + 5 g + 2 g + 1 g You want: oz; 0.98767093 oz Appending ';' to 'oz' forces a one-line display that includes the unit; here the integer part of the result is zero, so it is not displayed. A unit list such as cup;1|2 cup;1|3 cup;1|4 cup;tbsp;tsp;1|2 tsp;1|4 tsp can be tedious to enter. The 'units' program provides shorthand names for some common combinations: hms hours, minutes, seconds dms angle: degrees, minutes, seconds time years, days, hours, minutes and seconds usvol US cooking volume: cups and smaller Using these shorthands, or unit list aliases, you can do the following conversions: You have: anomalisticyear You want: time 1 year + 25 min + 3.4653216 sec You have: 1|6 cup You want: usvol 2 tbsp + 2 tsp You cannot combine a unit list alias with other units: it must appear alone at the 'You want:' prompt. You can display the definition of a unit list alias by entering it at the 'You have:' prompt: You have: dms Definition: unit list, deg;arcmin;arcsec When you specify compact output with '--compact', '--terse' or '-t' and perform conversion to a unit list, 'units' lists the conversion factors for each unit in the list, separated by semicolons. You have: year You want: day;min;sec 365;348;45.974678 Unlike the case of regular output, zeros are included in this output list: You have: liter You want: cup;1|2 cup;1|4 cup;tbsp 4;0;0;3.6280454 LOGGING CALCULATIONS The '--log' option allows you to save the results of calculations in a file; this can be useful if you need a permanent record of your work. For example, the fluid-flow conversion in Complicated Unit Expressions, is lengthy, and if you were to use it in designing a piping system, you might want a record of it for the project file. If the interactive session # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 You have: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units You want: psi * 43.533969 / 0.022970568 were logged, the log file would contain ### Log started Fri Oct 02 15:55:35 2015 # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 From: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units To: psi * 43.533969 / 0.022970568 The time is written to the log file when the file is opened. The use of comments can help clarify the meaning of calculations for the log. The log includes conformability errors between the units at the 'You have:' and 'You want:' prompts, but not other errors, includ- ing lack of conformability of items in sums or differences or among items in a unit list. For example, a conversion between zenith angle and elevation angle could involve You have: 90 deg - (5 deg + 22 min + 9 sec) ^ Illegal sum or difference of non-conformable units You have: 90 deg - (5 deg + 22 arcmin + 9 arcsec) You want: dms 84 deg + 37 arcmin + 51 arcsec You have: _ You want: deg * 84.630833 / 0.011816024 You have: The log file would contain From: 90 deg - (5 deg + 22 arcmin + 9 arcsec) To: deg;arcmin;arcsec 84 deg + 37 arcmin + 51 arcsec From: _ To: deg * 84.630833 / 0.011816024 The initial entry error (forgetting that minutes have dimension of time, and that arcminutes must be used for dimensions of angle) does not appear in the output. When converting to a unit list alias, 'units' expands the alias in the log file. The 'From:' and 'To:' tags are written to the log file even if the '--quiet' option is given. If the log file exists when 'units' is invoked, the new results are appended to the log file. The time is written to the log file each time the file is opened. The '--log' option is ignored when 'units' is used non-interactively. INVOKING UNITS You invoke 'units' like this: units [options] [from-unit [to-unit]] If the from-unit and to-unit are omitted, the program will use interac- tive prompts to determine which conversions to perform. See Interac- tive Use. If both from-unit and to-unit are given, 'units' will print the result of that single conversion and then exit. If only from-unit appears on the command line, 'units' will display the definition of that unit and exit. Units specified on the command line may need to be quoted to protect them from shell interpretation and to group them into two arguments. See Command Line Use. The default behavior of 'units' can be changed by various options given on the command line. In most cases, the options may be given in either short form (a single '-' followed by a single character) or long form ('--' followed by a word or hyphen-separated words). Short-form options are cryptic but require less typing; long-form options require more typing but are more explanatory and may be more mnemonic. With long-form options you need only enter sufficient characters to uniquely identify the option to the program. For example, '--out %f' works, but '--o %f' fails because 'units' has other long options beginning with 'o'. However, '--q' works because '--quiet' is the only long option beginning with 'q'. Some options require arguments to specify a value (e.g., '-d 12' or '--digits 12'). Short-form options that do not take arguments may be concatenated (e.g., '-erS' is equivalent to '-e -r -S'); the last option in such a list may be one that takes an argument (e.g., '-ed 12'). With short-form options, the space between an option and its argument is optional (e.g., '-d12' is equivalent to '-d 12'). Long-form options may not be concatenated, and the space between a long-form option and its argument is required. Short-form and long- form options may be intermixed on the command line. Options may be given in any order, but when incompatible options (e.g., '--output- format' and '--exponential') are given in combination, behavior is con- trolled by the last option given. For example, '-o%.12f -e' gives exponential format with the default eight significant digits). The following options are available: -c, --check Check that all units and prefixes defined in the units data file reduce to primitive units. Print a list of all units that can- not be reduced. Also display some other diagnostics about sus- picious definitions in the units data file. Only definitions active in the current locale are checked. You should always run 'units' with this option after modifying a units data file. --check-verbose, --verbose-check Like the '--check' option, this option prints a list of units that cannot be reduced. But to help find unit definitions that cause endless loops, it lists the units as they are checked. If 'units' hangs, then the last unit to be printed has a bad defi- nition. Only definitions active in the current locale are checked. -d ndigits, --digits ndigits Set the number of significant digits in the output to the value specified (which must be greater than zero). For example, '-d 12' sets the number of significant digits to 12. With expo- nential output 'units' displays one digit to the left of the decimal point and eleven digits to the right of the decimal point. On most systems, the maximum number of internally meaningful digits is 15; if you specify a greater number than your system's maximum, 'units' will print a warning and set the number to the largest meaningful value. To directly set the maximum value, give an argument of 'max' (e.g., '-d max'). Be aware, of course, that ``significant'' here refers only to the display of numbers; if results depend on physical constants not known to this precision, the physically meaningful precision may be less than that shown. The '--digits' option conflicts with the '--output-format' option. -e, --exponential Set the numeric output format to exponential (i.e., scientific notation), like that used in the Unix 'units' program. The default precision is eight significant digits (seven digits to the right of the decimal point); this can be changed with the '--digits' option. The '--exponential' option conflicts with the '--output-format' option. -o format, --output-format format This option affords complete control over the numeric output format using the specified format. The format is a single float- ing point numeric format for the 'printf()' function in the C programming language. All compilers support the format types 'g' and 'G' to specify significant digits, 'e' and 'E' for sci- entific notation, and 'f' for fixed-point decimal. The ISO C99 standard introduced the 'F' type for fixed-point decimal and the 'a' and 'A' types for hexadecimal floating point; these types are allowed with compilers that support them. The default for- mat is '%.8g'; for greater precision, you could specify '-o %.15g'. See Numeric Output Format and the documentation for 'printf()' for more detailed descriptions of the format specifi- cation. The '--output-format' option affords the greatest con- trol of the output appearance, but requires at least rudimentary knowledge of the 'printf()' format syntax. If you don't want to bother with the 'printf()' syntax, you can specify greater pre- cision more simply with the '--digits' option or select exponen- tial format with '--exponential'. The '--output-format' option is incompatible with the '--exponential' and '--digits' options. -f filename, --file filename Instruct 'units' to load the units file filename. You can spec- ify up to 25 units files on the command line. When you use this option, 'units' will load only the files you list on the command line; it will not load the standard file or your personal units file unless you explicitly list them. If filename is the empty string ('-f ""'), the default units file (or that specified by 'UNITSFILE') will be loaded in addition to any others specified with '-f'. -L logfile, --log logfile Save the results of calculations in the file logfile; this can be useful if it is important to have a record of unit conver- sions or other calculations that are to be used extensively or in a critical activity such as a program or design project. If logfile exits, the new results are appended to the file. This option is ignored when 'units' is used non-interactively. See Logging Calculations for a more detailed description and some examples. -H filename, --history filename Instruct 'units' to save history to filename, so that a record of your commands is available for retrieval across different 'units' invocations. To prevent the history from being saved set filename to the emptry string ('-f ""'). This option has no effect if readline is not available. -h, --help Print out a summary of the options for 'units'. -m, --minus Causes '-' to be interpreted as a subtraction operator. This is the default behavior. -p, --product Causes '-' to be interpreted as a multiplication operator when it has two operands. It will act as a negation operator when it has only one operand: '(-3)'. By default '-' is treated as a subtraction operator. --oldstar Causes '*' to have the old-style precedence, higher than the precedence of division so that '1/2*3' will equal '1/6'. --newstar Forces '*' to have the new (default) precedence that follows the usual rules of algebra: the precedence of '*' is the same as the precedence of '/', so that '1/2*3' will equal '3/2'. --compact Give compact output featuring only the conversion factor. This turns off the '--verbose' option. -q, --quiet, --silent Suppress prompting of the user for units and the display of sta- tistics about the number of units loaded. -n, --nolists Disable conversion to unit lists. -r, --round When converting to a combination of units given by a unit list, round the value of the last unit in the list to the nearest integer. -S, --show-factor When converting to a combination of units specified in a list, always show a non-unity factor before a unit that begins with a fraction with a unity denominator. By default, if the unit in a list begins with fraction of the form 1|x and its multiplier is an integer other than 1, the fraction is given as the product of the multiplier and the numerator (e.g., '3|8 in' rather than '3 * 1|8 in'). In some cases, this is not what is wanted; for example, the results for a cooking recipe might show '3 * 1|2 cup' as '3|2 cup'. With the '--show-factor' option, a result equivalent to 1.5 cups will display as '3 * 1|2 cup' rather than '3|2 cup'. A user-specified fractional unit with a numerator other than 1 is never overridden, however--if a unit list specifies '3|4 cup;1|2 cup', a result equivalent to 1 1/2 cups will always be shown as '2 * 3|4 cup' whether or not the '--show-factor' option is given. -s, --strict Suppress conversion of units to their reciprocal units. For example, 'units' will normally convert hertz to seconds because these units are reciprocals of each other. The strict option requires that units be strictly conformable to perform a conver- sion, and will give an error if you attempt to convert hertz to seconds. -1, --one-line Give only one line of output (the forward conversion). Do not print the reverse conversion. If a reciprocal conversion is performed then 'units' will still print the ``reciprocal conver- sion'' line. -t, --terse Give terse output when converting units. This option can be used when calling 'units' from another program so that the output is easy to parse. This option has the combined effect of these options: '--strict' '--quiet' '--one-line' '--compact'. When combined with '--version' it produces a display showing only the program name and version number. -v, --verbose Give slightly more verbose output when converting units. When combined with the '-c' option this gives the same effect as '--check-verbose'. When combined with '--version' produces a more detailed output, equivalent to the '--info' option. -V, --version Print the program version number, tell whether the 'readline' library has been included, tell whether UTF-8 support has been included; give the locale, the location of the default units data file, and the location of the personal units data file; indicate if the personal units data file does not exist. When given in combination with the '--terse' option, the program prints only the version number and exits. When given in combination with the '--verbose' option, the program, the '--version' option has the same effect as the '--info' option below. -I, --info Print the information given with the '--version' option, show the pathname of the units program, show the status of the 'UNITSFILE' and 'MYUNITSFILE' environment variables, and addi- tional information about how 'units' locates the related files. On systems running Microsoft Windows, the status of the 'UNITSLOCALE' environment variable and information about the related locale map are also given. This option is usually of interest only to developers and administrators, but it can some- times be useful for troubleshooting. Combining the '--version' and '--verbose' options has the same effect as giving '--info'. -U, --unitsfile Print the location of the default units data file and exit; if the file cannot be found, print ``Units data file not found''. -l locale, --locale locale Print the information given with the '--version' option, show the Force a specified locale such as 'en_GB' to get British def- initions by default. This overrides the locale determined from system settings or environment variables. See Locale for a description of locale format. ADDING YOUR OWN DEFINITIONS Units Data Files The units and prefixes that 'units' can convert are defined in the units data file, typically '/usr/share/units/definitions.units'. If you can't find this file, run 'units --version' to get information on the file locations for your installation. Although you can extend or modify this data file if you have appropriate user privileges, it's usually better to put extensions in separate files so that the defini- tions will be preserved if you update 'units'. You can include additional data files in the units database using the '!include' command in the standard units data file. For example !include /usr/local/share/units/local.units might be appropriate for a site-wide supplemental data file. The loca- tion of the '!include' statement in the standard units data file is important; later definitions replace earlier ones, so any definitions in an included file will override definitions before the '!include' statement in the standard units data file. With normal invocation, no warning is given about redefinitions; to ensure that you don't have an unintended redefinition, run 'units -c' after making changes to any units data file. If you want to add your own units in addition to or in place of stan- dard or site-wide supplemental units data files, you can include them in the '.units' file in your home directory. If this file exists it is read after the standard units data file, so that any definitions in this file will replace definitions of the same units in the standard data file or in files included from the standard data file. This file will not be read if any units files are specified on the command line. (Under Windows the personal units file is named 'unitdef.units'.) Run- ning 'units -V' will display the location and name of your personal units file. The 'units' program first tries to determine your home directory from the 'HOME' environment variable. On systems running Microsoft Windows, if 'HOME' does not exist, 'units' attempts to find your home directory from 'HOMEDRIVE', 'HOMEPATH' and 'USERPROFILE'. You can specify an arbitrary file as your personal units data file with the 'MYUNITSFILE' environment variable; if this variable exists, its value is used with- out searching your home directory. The default units data files are described in more detail in Data Files. Defining New Units and Prefixes A unit is specified on a single line by giving its name and an equiva- lence. Comments start with a '#' character, which can appear anywhere in a line. The backslash character ('\') acts as a continuation char- acter if it appears as the last character on a line, making it possible to spread definitions out over several lines if desired. A file can be included by giving the command '!include' followed by the file's name. The '!' must be the first character on the line. The file will be sought in the same directory as the parent file unless you give a full path. The name of the file to be included cannot contain the comment character '#'. Unit names must not contain any of the operator characters '+', '-', '*', '/', '|', '^', ';', '~', the comment character '#', or parenthe- ses. They cannot begin or end with an underscore ('_'), a comma (',') or a decimal point ('.'). The figure dash (U+2012), typographical minus (`-'; U+2212), and en dash (`-'; U+2013) are converted to the operator '-', so none of these characters can appear in unit names. Names cannot begin with a digit, and if a name ends in a digit other than zero, the digit must be preceded by a string beginning with an underscore, and afterwards consisting only of digits, decimal points, or commas. For example, 'foo_2', 'foo_2,1', or 'foo_3.14' are valid names but 'foo2' or 'foo_a2' are invalid. You could define nitrous oxide as N2O nitrogen 2 + oxygen but would need to define nitrogen dioxide as NO_2 nitrogen + oxygen 2 Be careful to define new units in terms of old ones so that a reduction leads to the primitive units, which are marked with '!' characters. Dimensionless units are indicated by using the string '!dimensionless' for the unit definition. When adding new units, be sure to use the '-c' option to check that the new units reduce properly. If you create a loop in the units defini- tions, then 'units' will hang when invoked with the '-c' option. You will need to use the '--check-verbose' option, which prints out each unit as it is checked. The program will still hang, but the last unit printed will be the unit that caused the infinite loop. If you define any units that contain '+' characters, carefully check them because the '-c' option will not catch non-conformable sums. Be careful with the '-' operator as well. When used as a binary operator, the '-' character can perform addition or multiplication depending on the options used to invoke 'units'. To ensure consistent behavior use '-' only as a unary negation operator when writing units definitions. To multiply two units leave a space or use the '*' operator with care, recalling that it has two possible precedence values and may require parentheses to ensure consistent behavior. To compute the difference of 'foo' and 'bar' write 'foo+(-bar)' or even 'foo+-bar'. Here is an example of a short data file that defines some basic units: m ! # The meter is a primitive unit sec ! # The second is a primitive unit rad !dimensionless # A dimensionless primitive unit micro- 1e-6 # Define a prefix minute 60 sec # A minute is 60 seconds hour 60 min # An hour is 60 minutes inch 0.0254 m # Inch defined in terms of meters ft 12 inches # The foot defined in terms of inches mile 5280 ft # And the mile A unit that ends with a '-' character is a prefix. If a prefix defini- tion contains any '/' characters, be sure they are protected by paren- theses. If you define 'half- 1/2' then 'halfmeter' would be equivalent to '1 / (2 meter)'. Defining Nonlinear Units Some unit conversions of interest are nonlinear; for example, tempera- ture conversions between the Fahrenheit and Celsius scales cannot be done by simply multiplying by conversion factors. When you give a linear unit definition such as 'inch 2.54 cm' you are providing information that 'units' uses to convert values in inches into primitive units of meters. For nonlinear units, you give a func- tional definition that provides the same information. Nonlinear units are represented using a functional notation. It is best to regard this notation not as a function call but as a way of adding units to a number, much the same way that writing a linear unit name after a number adds units to that number. Internally, nonlinear units are defined by a pair of functions that convert to and from lin- ear units in the database, so that an eventual conversion to primitive units is possible. Here is an example nonlinear unit definition: tempF(x) units=[1;K] domain=[-459.67,) range=[0,) \ (x+(-32)) degF + stdtemp ; (tempF+(-stdtemp))/degF + 32 A nonlinear unit definition comprises a unit name, a formal parameter name, two functions, and optional specifications for units, the domain, and the range (the domain of the inverse function). The functions tell 'units' how to convert to and from the new unit. To produce valid results, the arguments of these functions need to have the correct dimensions and be within the domains for which the functions are defined. The definition begins with the unit name followed immediately (with no spaces) by a '(' character. In the parentheses is the name of the for- mal parameter. Next is an optional specification of the units required by the functions in the definition. In the example above, the 'units=[1;K]' specification indicates that the 'tempF' function requires an input argument conformable with '1' (i.e., the argument is dimensionless), and that the inverse function requires an input argu- ment conformable with 'K'. For normal nonlinear units definition, the forward function will always take a dimensionless argument; in general, the inverse function will need units that match the quantity measured by your nonlinear unit. Specifying the units enables 'units' to per- form error checking on function arguments, and also to assign units to domain and range specifications, which are described later. Next the function definitions appear. In the example above, the 'tempF' function is defined by tempF(x) = (x+(-32)) degF + stdtemp This gives a rule for converting 'x' in the units 'tempF' to linear units of absolute temperature, which makes it possible to convert from tempF to other units. To enable conversions to Fahrenheit, you must give a rule for the inverse conversions. The inverse will be 'x(tempF)' and its definition appears after a ';' character. In our example, the inverse is x(tempF) = (tempF+(-stdtemp))/degF + 32 This inverse definition takes an absolute temperature as its argument and converts it to the Fahrenheit temperature. The inverse can be omitted by leaving out the ';' character and the inverse definition, but then conversions to the unit will not be possible. If the inverse definition is omitted, the '--check' option will display a warning. It is up to you to calculate and enter the correct inverse function to obtain proper conversions; the '--check' option tests the inverse at one point and prints an error if it is not valid there, but this is not a guarantee that your inverse is correct. With some definitions, the units may vary. For example, the definition square(x) x^2 can have any arbitrary units, and can also take dimensionless argu- ments. In such a case, you should not specify units. If a definition takes a root of its arguments, the definition is valid only for units that yield such a root. For example, squirt(x) sqrt(x) is valid for a dimensionless argument, and for arguments with even pow- ers of units. Some definitions may not be valid for all real numbers. In such cases, 'units' can handle errors better if you specify an appropriate domain and range. You specify the domain and range as shown below: baume(d) units=[1;g/cm^3] domain=[0,130.5] range=[1,10] \ (145/(145-d)) g/cm^3 ; (baume+-g/cm^3) 145 / baume In this example the domain is specified after 'domain=' with the end- points given in brackets. In accord with mathematical convention, square brackets indicate a closed interval (one that includes its end- points), and parentheses indicate an open interval (one that does not include its endpoints). An interval can be open or closed on one or both ends; an interval that is unbounded on either end is indicated by omitting the limit on that end. For example, a quantity to which deci- bel (dB) is applied may have any value greater than zero, so the range is indicated by '(0,)': decibel(x) units=[1;1] range=(0,) 10^(x/10); 10 log(decibel) If the domain or range is given, the second endpoint must be greater than the first. The domain and range specifications can appear independently and in any order along with the units specification. The values for the domain and range endpoints are attached to the units given in the units speci- fication, and if necessary, the parameter value is adjusted for compar- ison with the endpoints. For example, if a definition includes 'units=[1;ft]' and 'range=[3,)', the range will be taken as 3 ft to infinity. If the function is passed a parameter of '900 mm', that value will be adjusted to 2.9527559 ft, which is outside the specified range. If you omit the units specification from the previous example, 'units' can not tell whether you intend the lower endpoint to be 3 ft or 3 microfurlongs, and can not adjust the parameter value of 900 mm for comparison. Without units, numerical values other than zero or plus or minus infinity for domain or range endpoints are meaningless, and accordingly they are not allowed. If you give other values without units then the definition will be ignored and you will get an error message. Although the units, domain, and range specifications are optional, it's best to give them when they are applicable; doing so allows 'units' to perform better error checking and give more helpful error messages. Giving the domain and range also enables the '--check' option to find a point in the domain to use for its point check of your inverse defini- tion. You can make synonyms for nonlinear units by providing both the forward and inverse functions; inverse functions can be obtained using the '~' operator. So to create a synonym for 'tempF' you could write fahrenheit(x) units=[1;K] tempF(x); ~tempF(fahrenheit) This is useful for creating a nonlinear unit definition that differs slightly from an existing definition without having to repeat the orig- inal functions. For example, dBW(x) units=[1;W] range=[0,) dB(x) W ; ~dB(dBW/W) If you wish a synonym to refer to an existing nonlinear unit without modification, you can do so more simply by adding the synonym with appended parentheses as a new unit, with the existing nonlinear unit-- without parentheses--as the definition. So to create a synonym for 'tempF' you could write fahrenheit() tempF The definition must be a nonlinear unit; for example, the synonym fahrenheit() meter will result in an error message when 'units' starts. You may occasionally wish to define a function that operates on units. This can be done using a nonlinear unit definition. For example, the definition below provides conversion between radius and the area of a circle. This definition requires a length as input and produces an area as output, as indicated by the 'units=' specification. Specifying the range as the nonnegative numbers can prevent cryptic error mes- sages. circlearea(r) units=[m;m^2] range=[0,) pi r^2 ; sqrt(circlearea/pi) Defining Piecewise Linear Units Sometimes you may be interested in a piecewise linear unit such as many wire gauges. Piecewise linear units can be defined by specifying con- versions to linear units on a list of points. Conversion at other points will be done by linear interpolation. A partial definition of zinc gauge is zincgauge[in] 1 0.002, 10 0.02, 15 0.04, 19 0.06, 23 0.1 In this example, 'zincgauge' is the name of the piecewise linear unit. The definition of such a unit is indicated by the embedded '[' charac- ter. After the bracket, you should indicate the units to be attached to the numbers in the table. No spaces can appear before the ']' char- acter, so a definition like 'foo[kg meters]' is invalid; instead write 'foo[kg*meters]'. The definition of the unit consists of a list of pairs optionally separated by commas. This list defines a function for converting from the piecewise linear unit to linear units. The first item in each pair is the function argument; the second item is the value of the function at that argument (in the units specified in brackets). In this example, we define 'zincgauge' at five points. For example, we set 'zincgauge(1)' equal to '0.002 in'. Definitions like this may be more readable if written using continuation characters as zincgauge[in] \ 1 0.002 \ 10 0.02 \ 15 0.04 \ 19 0.06 \ 23 0.1 With the preceding definition, the following conversion can be per- formed: You have: zincgauge(10) You want: in * 0.02 / 50 You have: .01 inch You want: zincgauge 5 If you define a piecewise linear unit that is not strictly monotonic, then the inverse will not be well defined. If the inverse is requested for such a unit, 'units' will return the smallest inverse. After adding nonlinear units definitions, you should normally run 'units --check' to check for errors. If the 'units' keyword is not given, the '--check' option checks a nonlinear unit definition using a dimensionless argument, and then checks using an arbitrary combination of units, as well as the square and cube of that combination; a warning is given if any of these tests fail. For example, Warning: function 'squirt(x)' defined as 'sqrt(x)' failed for some test inputs: squirt(7(kg K)^1): Unit not a root squirt(7(kg K)^3): Unit not a root Running 'units --check' will print a warning if a non-monotonic piece- wise linear unit is encountered. For example, the relationship between ANSI coated abrasive designation and mean particle size is non-mono- tonic in the vicinity of 800 grit: ansicoated[micron] \ . . . 600 10.55 \ 800 11.5 \ 1000 9.5 \ Running 'units --check' would give the error message Table 'ansicoated' lacks unique inverse around entry 800 Although the inverse is not well defined in this region, it's not really an error. Viewing such error messages can be tedious, and if there are enough of them, they can distract from true errors. Error checking for nonlinear unit definitions can be suppressed by giving the 'noerror' keyword; for the examples above, this could be done as squirt(x) noerror domain=[0,) range=[0,) sqrt(x); squirt^2 ansicoated[micron] noerror \ . . . Use the 'noerror' keyword with caution. The safest approach after adding a nonlinear unit definition is to run 'units --check' and con- firm that there are no actual errors before adding the 'noerror' key- word. Defining Unit List Aliases Unit list aliases are treated differently from unit definitions, because they are a data entry shorthand rather than a true definition for a new unit. A unit list alias definition begins with '!unitlist' and includes the alias and the definition; for example, the aliases included in the standard units data file are !unitlist hms hr;min;sec !unitlist time year;day;hr;min;sec !unitlist dms deg;arcmin;arcsec !unitlist ftin ft;in;1|8 in !unitlist usvol cup;3|4 cup;2|3 cup;1|2 cup;1|3 cup;1|4 cup;\ tbsp;tsp;1|2 tsp;1|4 tsp;1|8 tsp Unit list aliases are only for unit lists, so the definition must include a ';'. Unit list aliases can never be combined with units or other unit list aliases, so the definition of 'time' shown above could not have been shortened to 'year;day;hms'. As usual, be sure to run 'units --check' to ensure that the units listed in unit list aliases are conformable. NUMERIC OUTPUT FORMAT By default, 'units' shows results to eight significant digits. You can change this with the '--exponential', '--digits', and '--output-format' options. The first sets an exponential format (i.e., scientific nota- tion) like that used in the original Unix 'units' program, the second allows you to specify a different number of significant digits, and the last allows you to control the output appearance using the format for the 'printf()' function in the C programming language. If you only want to change the number of significant digits or specify exponential format type, use the '--digits' and '--exponential' options. The '--output-format' option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the 'printf()' format syntax. See Invoking Units for descriptions of these options. Format Specification The format specification recognized with the '--output-format' option is a subset of that for 'printf()'. The format specification has the form '%'[flags][width]['.'precision]type; it must begin with '%', and must end with a floating-point type specifier: 'g' or 'G' to specify the number of significant digits, 'e' or 'E' for scientific notation, and 'f' for fixed-point decimal. The ISO C99 standard added the 'F' type for fixed-point decimal and the 'a' and 'A' types for hexadecimal floating point; these types are allowed with compilers that support them. Type length modifiers (e.g., 'L' to indicate a long double) are inapplicable and are not allowed. The default format for 'units' is '%.8g'; for greater precision, you could specify '-o %.15g'. The 'g' and 'G' format types use exponential format whenever the exponent would be less than -4, so the value 0.000013 displays as '1.3e-005'. These types also use exponential notation when the exponent is greater than or equal to the precision, so with the default format, the value 5e7 displays as '50000000' and the value 5e8 displays as '5e+008'. If you prefer fixed-point display, you might specify '-o %.8f'; however, small numbers will display very few significant digits, and values less than 0.5e-8 will show nothing but zeros. The format specification may include one or more optional flags: '+', ' ' (space), '#', '-', or '0' (the digit zero). The digit-grouping flag ''' is allowed with compilers that support it. Flags are followed by an optional value for the minimum field width, and an optional pre- cision specification that begins with a period (e.g., '.6'). The field width includes the digits, decimal point, the exponent, thousands sepa- rators (with the digit-grouping flag), and the sign if any of these are shown. Flags The '+' flag causes the output to have a sign ('+' or '-'). The space flag ' ' is similar to the '+' flag, except that when the value is pos- itive, it is prefixed with a space rather than a plus sign; this flag is ignored if the '+' flag is also given. The '+' or ' ' flag could be useful if conversions might include positive and negative results, and you wanted to align the decimal points in exponential notation. The '#' flag causes the output value to contain a decimal point in all cases; by default, the output contains a decimal point only if there are digits (which can be trailing zeros) to the right of the point. With the 'g' or 'G' types, the '#' flag also prevents the suppression of trailing zeros. The digit-grouping flag ''' shows a thousands sepa- rator in digits to the left of the decimal point. This can be useful when displaying large numbers in fixed-point decimal; for example, with the format '%f', You have: mile You want: microfurlong * 8000000.000000 / 0.000000 the magnitude of the first result may not be immediately obvious with- out counting the digits to the left of the decimal point. If the thou- sands separator is the comma (','), the output with the format '%'f' might be You have: mile You want: microfurlong * 8,000,000.000000 / 0.000000 making the magnitude readily apparent. Unfortunately, few compilers support the digit-grouping flag. With the '-' flag, the output value is left aligned within the speci- fied field width. If a field width greater than needed to show the output value is specified, the '0' (zero) flag causes the output value to be left padded with zeros until the specified field width is reached; for example, with the format '%011.6f', You have: troypound You want: grain * 5760.000000 / 0000.000174 The '0' flag has no effect if the '-' (left align) flag is given. Field Width By default, the output value is left aligned and shown with the minimum width necessary for the specified (or default) precision. If a field width greater than this is specified, the value shown is right aligned, and padded on the left with enough spaces to provide the specified field width. A width specification is typically used with fixed-point decimal to have columns of numbers align at the decimal point; this arguably is less useful with 'units' than with long columnar output, but it may nonetheless assist in quickly assessing the relative magni- tudes of results. For example, with the format '%12.6f', You have: km You want: in * 39370.078740 / 0.000025 You have: km You want: rod * 198.838782 / 0.005029 You have: km You want: furlong * 4.970970 / 0.201168 Precision The meaning of ``precision'' depends on the format type. With 'g' or 'G', it specifies the number of significant digits (like the '--digits' option); with 'e', 'E', 'f', or 'F', it specifies the maximum number of digits to be shown after the decimal point. With the 'g' and 'G' format types, trailing zeros are suppressed, so the results may sometimes have fewer digits than the specified preci- sion (as indicated above, the '#' flag causes trailing zeros to be dis- played). The default precision is 6, so '%g' is equivalent to '%.6g', and would show the output to six significant digits. Similarly, '%e' or '%f' would show the output with six digits after the decimal point. The C 'printf()' function allows a precision of arbitrary size, whether or not all of the digits are meaningful. With most compilers, the max- imum internal precision with 'units' is 15 decimal digits (or 13 hexa- decimal digits). With the '--digits' option, you are limited to the maximum internal precision; with the '--output-format' option, you may specify a precision greater than this, but it may not be meaningful. In some cases, specifying excess precision can result in rounding arti- facts. For example, a pound is exactly 7000 grains, but with the for- mat '%.18g', the output might be You have: pound You want: grain * 6999.9999999999991 / 0.00014285714285714287 With the format '%.25g' you might get the following: You have: 1/3 You want: Definition: 0.333333333333333314829616256247 In this case the displayed value includes a series of digits that rep- resent the underlying binary floating-point approximation to 1/3 but are not meaningful for the desired computation. In general, the result with excess precision is system dependent. The precision affects only the display of numbers; if a result relies on physical constants that are not known to the specified precision, the number of physically meaningful digits may be less than the number of digits shown. See the documentation for 'printf()' for more detailed descriptions of the format specification. The '--output-format' option is incompatible with the '--exponential' or '--digits' options; if the former is given in combination with either of the latter, the format is controlled by the last option given. LOCALIZATION Some units have different values in different locations. The localiza- tion feature accommodates this by allowing a units data file to specify definitions that depend on the user's locale. Locale A locale is a subset of a user's environment that indicates the user's language and country, and some attendant preferences, such as the for- matting of dates. The 'units' program attempts to determine the locale from the POSIX setlocale function; if this cannot be done, 'units' examines the environment variables 'LC_CTYPE' and 'LANG'. On POSIX systems, a locale is of the form language'_'country, where language is the two-character code from ISO 639-1 and country is the two-character code from ISO 3166-1; language is lower case and country is upper case. For example, the POSIX locale for the United Kingdom is 'en_GB'. On systems running Microsoft Windows, the value returned by setlocale() is different from that on POSIX systems; 'units' attempts to map the Windows value to a POSIX value by means of a table in the file 'locale_map.txt' in the same directory as the other data files. The file includes entries for many combinations of language and country, and can be extended to include other combinations. The 'locale_map.txt' file comprises two tab-separated columns; each entry is of the form Windows-locale POSIX-locale where POSIX-locale is as described above, and Windows-locale typically spells out both the language and country. For example, the entry for the United States is English_United States en_US You can force 'units' to run in a desired locale by using the '-l' option. In order to create unit definitions for a particular locale you begin a block of definitions in a unit datafile with '!locale' followed by a locale name. The '!' must be the first character on the line. The 'units' program reads the following definitions only if the current locale matches. You end the block of localized units with '!endlocale'. Here is an example, which defines the British gallon. !locale en_GB gallon 4.54609 liter !endlocale Additional Localization Sometimes the locale isn't sufficient to determine unit preferences. There could be regional preferences, or a company could have specific preferences. Though probably uncommon, such differences could arise with the choice of English customary units outside of English-speaking countries. To address this, 'units' allows specifying definitions that depend on environment variable settings. The environment variables can be controled based on the current locale, or the user can set them to force a particular group of definitions. A conditional block of definitions in a units data file begins with either '!var' or '!varnot' following by an environment variable name and then a space separated list of values. The leading '!' must appear in the first column of a units data file, and the conditional block is terminated by '!endvar'. Definitions in blocks beginning with '!var' are executed only if the environment variable is exactly equal to one of the listed values. Definitions in blocks beginning with '!varnot' are executed only if the environment variable does not equal any of the list values. The inch has long been a customary measure of length in many places. The word comes from the latin uncia meaning ``one twelfth,'' referring to its relationship with the foot. By the 20th century, the inch was officially defined in English-speaking countries relative to the yard, but until 1959, the yard differed slightly among those countries. In France the customary inch, which was displaced in 1799 by the meter, had a different length based on a french foot. These customary defini- tions could be accommodated as follows: !var INCH_UNIT usa yard 3600|3937 m !endvar !var INCH_UNIT canada yard 0.9144 meter !endvar !var INCH_UNIT uk yard 0.91439841 meter !endvar !var INCH_UNIT canada uk usa foot 1|3 yard inch 1|12 foot !endvar !var INCH_UNIT france foot 144|443.296 m inch 1|12 foot line 1|12 inch !endvar !varnot INCH_UNIT usa uk france canada !message Unknown value for INCH_UNIT !endvar When 'units' reads the above definitions it will check the environment variable 'INCH_UNIT' and load only the definitions for the appropriate section. If 'INCH_UNIT' is unset or is not set to one of the four val- ues listed then 'units' will run the last block. In this case that block uses the '!message' command to display a warning message. Alter- natively that block could set default values. In order to create default values that are overridden by user settings the data file can use the '!set' command, which sets an environment variable only if it is not already set; these settings are only for the current 'units' invocation and do not persist. So if the example above were preceded by '!set INCH_UNIT france' then this would make 'france' the default value for 'INCH_UNIT'. If the user had set the variable in the environment before invoking 'units', then 'units' would use the user's value. To link these settings to the user's locale you combine the '!set' com- mand with the '!locale' command. If you wanted to combine the above example with suitable locales you could do by preceding the above defi- nition with the following: !locale en_US !set INCH_UNIT usa !endlocale !locale en_GB !set INCH_UNIT uk !endlocale !locale en_CA !set INCH_UNIT canada !endlocale !locale fr_FR !set INCH_UNIT france !endlocale !set INCH_UNIT france These definitions set the overall default for 'INCH_UNIT' to 'france' and set default values for four locales appropriately. The overall default setting comes last so that it only applies when 'INCH_UNIT' was not set by one of the other commands or by the user. If the variable given after '!var' or '!varnot' is undefined then 'units' prints an error message and ignores the definitions that fol- low. Use '!set' to create defaults to prevent this situation from arising. The '-c' option only checks the definitions that are active for the current environment and locale, so when adding new definitions take care to check that all cases give rise to a well defined set of definitions. ENVIRONMENT VARIABLES The 'units' program uses the following environment variables: HOME Specifies the location of your home directory; it is used by 'units' to find a personal units data file '.units'. On systems running Microsoft Windows, the file is 'unitdef.units', and if 'HOME' does not exist, 'units' tries to determine your home directory from the 'HOMEDRIVE' and 'HOMEPATH' environment vari- ables; if these variables do not exist, units finally tries 'USERPROFILE'--typically 'C:\Users\username' (Windows Vista and Windows 7) or 'C:\Documents and Settings\username' (Windows XP). LC_CTYPE, LANG Checked to determine the locale if 'units' cannot obtain it from the operating system. Sections of the standard units data file are specific to certain locales. MYUNITSFILE Specifies your personal units data file. If this variable exists, 'units' uses its value rather than searching your home directory for '.units'. The personal units file will not be loaded if any data files are given using the '-f' option. PAGER Specifies the pager to use for help and for displaying the con- formable units. The help function browses the units database and calls the pager using the '+n'n syntax for specifying a line number. The default pager is 'more'; 'PAGER' can be used to specify alternatives such as 'less', 'pg', 'emacs', or 'vi'. UNITS_ENGLISH Set to either 'US' or 'GB' to choose United States or British volume definitions, overriding the default from your locale. UNITSFILE Specifies the units data file to use (instead of the default). You can only specify a single units data file using this envi- ronment variable. If units data files are given using the '-f' option, the file specified by 'UNITSFILE' will be not be loaded unless the '-f' option is given with the empty string ('units -f ""'). UNITSLOCALEMAP Windows only; this variable has no effect on Unix-like systems. Specifies the units locale map file to use (instead of the default). This variable seldom needs to be set, but you can use it to ensure that the locale map file will be found if you spec- ify a location for the units data file using either the '-f' option or the 'UNITSFILE' environment variable, and that loca- tion does not also contain the locale map file. DATA FILES The 'units' program uses two default data files: 'definitions.units' and 'currency.units'. The program can also use an optional personal units data file '.units' ('unitdef.units' under Windows) located in the user's home directory. The personal units data file is described in more detail in Units Data Files. On Unix-like systems, the data files are typically located in '/usr/share/units' if 'units' is provided with the operating system, or in '/usr/local/share/units' if 'units' is compiled from the source dis- tribution. On systems running Microsoft Windows, the files may be in the same locations if Unix-like commands are available, a Unix-like file struc- ture is present (e.g., 'C:/usr/local'), and 'units' is compiled from the source distribution. If Unix-like commands are not available, a more common location is 'C:\Program Files (x86)\GNU\units' (for 64-bit Windows installations) or 'C:\Program Files\GNU\units' (for 32-bit installations). If 'units' is obtained from the GNU Win32 Project (http://gnuwin32.sourceforge.net/), the files are commonly in 'C:\Program Files\GnuWin32\share\units'. If the default units data file is not an absolute pathname, 'units' will look for the file in the directory that contains the 'units' pro- gram; if the file is not found there, 'units' will look in a directory '../share/units' relative to the directory with the 'units' program. You can determine the location of the files by running 'units --version'. Running 'units --info' will give you additional information about the files, how 'units' will attempt to find them, and the status of the related environment variables. UNICODE SUPPORT The standard units data file is in Unicode, using UTF-8 encoding. Most definitions use only ASCII characters (i.e., code points U+0000 through U+007F); definitions using non-ASCII characters appear in blocks begin- ning with '!utf8' and ending with '!endutf8'. When 'units' starts, it checks the locale to determine the character set. If 'units' is compiled with Unicode support and definitions; oth- erwise these definitions are ignored. When Unicode support is active, 'units' will check every line of all of the units data files for invalid or non-printing UTF-8 sequences; if such sequences occur, 'units' ignores the entire line. In addition to checking validity, 'units' determines the display width of non-ASCII characters to ensure proper positioning of the pointer in some error messages and to align columns for the 'search' and '?' commands. At present, 'units' does not support Unicode under Microsoft Windows. The UTF-16 and UTF-32 encodings are not supported on any systems. If definitions that contain non-ASCII characters are added to a units data file, those definitions should be enclosed within '!utf8' ... '!endutf8' to ensure that they are only loaded when Unicode support is available. As usual, the '!' must appear as the first character on the line. As discussed in Units Data Files, it's usually best to put such definitions in supplemental data files linked by an '!include' command or in a personal units data file. When Unicode support is not active, 'units' makes no assumptions about character encoding, except that characters in the range 00-7F hexadeci- mal correspond to ASCII encoding. Non-ASCII characters are simply sequences of bytes, and have no special meanings; for definitions in supplementary units data files, you can use any encoding consistent with this assumption. For example, if you wish to use non-ASCII char- acters in definitions when running 'units' under Windows, you can use a character set such as Windows ``ANSI'' (code page 1252 in the US and Western Europe). You can even use UTF-8, though some messages may be improperly aligned, and 'units' will not detect invalid UTF-8 sequences. If you use UTF-8 encoding when Unicode support is not active, you should place any definitions with non-ASCII characters out- side '!utf8' ... '!endutf8' blocks--otherwise, they will be ignored. Typeset material other than code examples usually uses the Unicode minus (U+2212) rather than the ASCII hyphen-minus operator (U+002D) used in 'units'; the figure dash (U+2012) and en dash (U+2013) are also occasionally used. To allow such material to be copied and pasted for interactive use or in units data files, 'units' converts these charac- ters to U+002D before further processing. Because of this, none of these characters can appear in unit names. READLINE SUPPORT If the 'readline' package has been compiled in, then when 'units' is used interactively, numerous command line editing features are avail- able. To check if your version of 'units' includes 'readline', invoke the program with the '--version' option. For complete information about 'readline', consult the documentation for the 'readline' package. Without any configuration, 'units' will allow editing in the style of emacs. Of particular use with 'units' are the completion commands. If you type a few characters and then hit ESC followed by '?' then 'units' will display a list of all the units that start with the char- acters typed. For example, if you type 'metr' and then request comple- tion, you will see something like this: You have: metr metre metriccup metrichorsepower metrictenth metretes metricfifth metricounce metricton metriccarat metricgrain metricquart metricyarncount You have: metr If there is a unique way to complete a unitname, you can hit the TAB key and 'units' will provide the rest of the unit name. If 'units' beeps, it means that there is no unique completion. Pressing the TAB key a second time will print the list of all completions. The readline library also keeps a history of the values you enter. You can move through this history using the up and down arrows. The his- tory is saved to the file '.units_history' in your home directory so that it will persist across multiple 'units' invocations. If you wish to keep work for a certain project separate you can change the history filename using the '--history' option. You could, for example, make an alias for 'units' to 'units --history .units_history' so that 'units' would save separate history in the current directory. The length of each history file is limited to 5000 lines. Note also that if you run several concurrent copies of 'units' each one will save its new history to the history file upon exit. UPDATING CURRENCY EXCHANGE RATES The units program includes currency exchange rates and prices for some precious metals in the database. Of course, these values change over time, sometimes very rapidly, and 'units' cannot provide real time val- ues. To update the exchange rates run the 'units_cur', which rewrites the files containing the currency rates, typically '/usr/share/units/currency.units'. This program requires 'python' and the 'unidecode' package, and must be run with suitable permissions to write the file. To keep the rates updated automatically, run it using a cron job on a Unix-like system, or a similar scheduling program on a different system. Currency exchange rates are taken from Time Genie (http://www.timegenie.com) and precious metals pricing from Packetizer (www.packetizer.com). These sites update once per day, so there is no benefit in running the update script more often than daily. You can run 'units_cur' with a filename specified on the command line and it will write the data to that file. If you give '-' for the file it will write to standard output. DATABASE COMMAND SYNTAX unit definition Define a regular unit. prefix- definition Define a prefix. funcname(var) noerror units=[in-units,out-units] domain=[x1,x2] range=[y1,y2] definition(var) ; inverse(funcname) Define a nonlinear unit or unit function. The four optional keywords 'noerror', 'units=', 'range=' and 'domain=' can appear in any order. The definition of the inverse is optional. tabname[out-units] noerror pair-list Define a piecewise linear unit. The pair list gives the points on the table listed in ascending order. The 'noerror' keyword is optional. !endlocale End a block of definitions beginning with '!locale' !endutf8 End a block of definitions begun with '!utf8' !endvar End a block of definitions begun with '!var' or '!varnot' !include file Include the specified file. !locale value Load the following definitions only of the locale is set to value. !message text Display text when the database is read unless the quiet option ('-q') is enabled. !set variable value Sets the environment variable, variable, to the specified value only if it is not already set. !unitlist alias definition Define a unit list alias. !utf8 Load the following definitions only if 'units' is running with UTF-8 enabled. !var envar value-list Load the block of definitions that follows only if the environ- ment variable envar is set to one of the values listed in the space-separated value list. If envar is not set, 'units' prints an error message and ignores the block of definitions. !varnot envar value-list Load the block of definitions that follows only if the environ- ment variable envar is set to value that is not listed in the space-separated value list. If envar is not set, 'units' prints an error message and ignores the block of definitions. GNU FREE DOCUMENTATION LICENSE FILES /usr/local/share/units/definitions.units -- the standard units data file AUTHOR 19 March 2014 UNITS(1) units-2.12/INSTALL0000664000175000017500000001705110232761036013115 0ustar adrianadrianBasic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. units-2.12/getopt.h0000664000175000017500000001066112040123025013524 0ustar adrianadrian/* Declarations for getopt. Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifdef STRINGS_H # include #else # include #endif #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if defined (__STDC__) && __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #if defined (__STDC__) && __STDC__ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #else /* not __STDC__ */ extern int getopt (); extern int getopt_long (); extern int getopt_long_only (); extern int _getopt_internal (); #endif /* __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ units-2.12/units.dvi0000664000175000017500000073412012607541442013742 0ustar adrianadrianїƒ’Р;ш TeX output 2015.10.14:1703‹џџџџŸђŽ ƒ33 ўšр‘GѓJТжN Мj cmbx12ыJUnits‘ЦqCon–џZv“ersionŽŽ‘GŸ‰БžИŸ šЊ’Цѓ6Kё`y ѓ3 cmr10сEdition–Іf2.11“for“ѓ7пъ  b> ѓ3 cmmi10щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ с5ŽЉ —‘Gы\5‘32Unit‘ffExpressionsgt‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ лы\6ŽЁ‘!Gс5.1‘ ѓ5OpMоerators‘Ю‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ RHс6ŽЄ 33‘!G5.2‘ ѓ5Sums–Іfand“Di erences“of“Units‘#™‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ Їбс8ŽЁ‘!G5.3‘ ѓ5NumВ!bMоers–Іfas“Units‘7$‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ Л\с9ŽЁ‘!G5.4‘ ѓ5Built-in‘ІfF‘џeunctions‘Ўп‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ 3с9ŽЁ‘!G5.5‘ ѓ5Previous‘ІfResult‘>ю‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ У&с10ŽЁ‘!G5.6‘ ѓ5Complicated–ІfUnit“Expressions‘‡л‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ с11ŽЁ‘!G5.7‘ ѓ5Bac•В!kw“ards›ІfCompatibilit“y:‘нн`т*с'˜and˜`т-с'‘:э‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ П$с12ŽŸ ˜‘Gы\6‘32Nonlinear–ffUnit“Con•ŒЬv“ersions‘\‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ вФы\12ŽŸџ‘!Gс6.1‘ ѓ5T‘џeempMоerature‘ІfCon•В!v“ersions‘GŸ‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ Ыжс13ŽЁ‘!G6.2‘ ѓ5Other–ІfNonlinear“Units‘,a‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ А˜с14ŽІ‘Gы\7‘32Unit›ffLists:‘32Con•ŒЬv“ersion˜to˜Sums˜of˜Units‘П ‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž‘ vsы\15ŽЄmd‘G8‘32Logging‘ffCalculations‘Ÿ‚‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ Vъы\19ŽŸmc‘G9‘32In•ŒЬv“oking‘ffы_units‘Я_‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ †Чы\20ŽЁ‘G10‘32Adding–ffY‘ўІfour“Own“De nitions@s‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ їлы\25ŽŸџ‘!Gс10.1‘ ѓ5Units–ІfData“Files‘Ў‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ хс25ŽЄ 33‘!G10.2‘ ѓ5De ning–ІfNew“Units“and“Pre xes‘ГŸ‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ 7жс26ŽЁ‘!G10.3‘ ѓ5De ning–ІfNonlinear“Units‘Оc‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ B›с27ŽЁ‘!G10.4‘ ѓ5De ning–ІfPiecewise“Linear“Units‘RK‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ жƒс29ŽЁ‘!G10.5‘ ѓ5De ning–ІfUnit“List“Aliases‘э‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ qRс31ŽІ‘Gы\11‘32Numeric–ffOutput“F‘ўІformat’‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ Лњы\31ŽŸџ‘!Gс11.1‘ ѓ5F‘џeormat‘ІfSpMоeci cation‘aя‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ ц&с32ŽЁ‘!G11.2‘ ѓ5Flags‘Ќ‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ 08с32ŽЁ‘!G11.3‘ ѓ5Field‘ІfWidth‘(‹‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ ЌТс33ŽЁ‘!G11.4‘ ѓ5Precision‘jР‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ юјс33ŽŽŒ‹џџџўŸђ’НšЉсiiŽŽŽ ƒ33 §†ЬЭ‘Gы\12‘32Los3calizationwэ‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ /Uы\34ŽŸџ‘!Gс12.1‘ ѓ5LoMоcale‘eъ‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ ъ"с34ŽŸ 33‘!G12.2‘ ѓ5Additional‘ІfLoMоcalization‘к›‘щ˜щ:Ž–нл‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž“‘щ˜:Ž‘ ^вс35ŽŸ33‘Gы\13‘32En•ŒЬvironmen“t‘ffV‘ўІfariables‘!˜‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘йы\37ŽЄ џ‘G14‘32Data‘ffFilesg‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ ~ы\38ŽЁ‘G15‘32Unico•s3de‘ffSupp“ort‘›‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ Rvы\38ŽЁ‘G16‘32Readline‘ffSupps3ort‘№a‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ЇЩы\39ŽЁ‘G17‘32Ups3dating–ffCurrency“ExcŒЬhange“RatesC’‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ њљы\40ŽЁ‘G18‘32Database–ffCommand“SynŒЬtax‘EЯ‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ §7ы\40ŽЁ‘G19‘32GNU–ffF‘ўІfree“Dos3cumenŒЬtation“License‘іЧ‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘Ў.ы\41ŽЁ‘GIndex‘rИ‘32ыc:Ž–Q ‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž“‘32:Ž‘ *ы\49ŽŽŒ‹,ЦŸђ‘GсUnits‘ІfCon•В!v“ersion’Yо*1ŽŽŽ ƒ33 § ЬЭ‘GыS1‘ ИQOv‘џuТerview–zГof“ѓVп†ЕTGЎ cmtt12ыVunitsŽŽŸ)=‘GсThe–Этunits“сprogram“con•В!v“erts›Эquan“tities˜expressed˜in˜v‘џdDarious˜systems˜of˜measuremen“t˜to˜theirŽЄ 33‘Gequiv‘џdDalenšВ!ts–;in“other‘;systems“of“measuremen˜t.‘›ЛLik˜e“man˜y“similar‘;programs,‘`-it“can“handleŽЁ‘Gm•В!ultiplicativ“e–\{scale“cšВ!hanges.‘It“can‘\zalso“handle“nonlinear“con˜v˜ersions“suc˜h“as“F‘џeahrenheitŽЁ‘Gto–йaCelsius;ŸќОѓй“ Rcmr7Ў1Ž‘ яQсsee›й`Section“6.1“[T‘џeempMоerature“Con•В!v“ersions],‘&page˜13.‘vЮThe˜program–йacan“alsoŽЁ‘GpMоerform›YЇcon•В!v“ersions–YЈfrom˜and˜to“sums˜of˜units,‘isucВ!h˜as“con•В!v“erting˜bMоet“w“een˜meters‘YЈand˜feetŽЁ‘Gplus‘ІfincВ!hes.ŽЉ15‘!GBasic–JkopMоeration“is“simple:‘%чyšВ!ou“en˜ter“the“units“that“y˜ou“w˜an˜t“to“con˜v˜ert“ѓ9§': ѓ3 cmti10фfr‘џpЙom‘!vсand“theŽЁ‘Gunits–€ that“yšВ!ou“w˜an˜t“to“con˜v˜ert“фtoс.‘бY‘џeou“can“use“the“program“in˜teractiv˜ely“with“prompts,‘‡ИorŽЁ‘GyВ!ou–Іfcan“use“it“from“the“command“line.ŽІ‘!GBeyšВ!ond–ˆsimple‘‰unit“con˜v˜ersions,‘:тunits›‰сcan“bMоe˜used“as˜a“general-purpMоose˜scienВ!ti c“cal-ŽЁ‘Gculator–m(that‘m)kšВ!eeps“trac˜k“of“units›m)in“its“calculations.‘ЪЩY‘џeou“can“form“arbitrary˜complex“math-ŽЁ‘Gematical– кexpressions“of“dimensions‘ лincluding“sums,–?wprošMоducts,“quotienВ!ts,“p˜o•В!w“ers,‘?wand‘ кev“enŽЁ‘GroMоots–ЮЇof“dimensions.‘•ѓThšВ!us“y˜ou“can“ensure“accuracy“and“dimensional“consistency“when“w˜ork-ŽЁ‘Ging–!Чwith“long›!Шexpressions“that“in•В!v“olv“e‘!Чman“y˜di eren“t–!Чunits“that“ma•В!y˜com“bine–!Чin“complexŽЁ‘Gw•В!a“ys;–Іffor“an“illustration,“see“Section“5.6“[Complicated“Unit“Expressions],“page“11.ŽІ‘!GThe–ђunits“are“de ned“in“an“external“data“ le.‘РУY‘џeou“can“use“the“extensivВ!e“data“ le“thatŽЁ‘Gcomes–MІwith›MЅthis“program,‘wuor“yВ!ou˜can“pro•В!vide˜y“our‘MІo“wn˜data–MІ le“to˜suit“yВ!our˜needs.‘гœY‘џeouŽЁ‘Gcan–Іfalso“use“yšВ!our“o˜wn“data“ le“to“supplemen˜t“the“standard“data“ le.ŽІ‘!GY‘џeou–‘Ucan›‘TcВ!hange“the˜default“bMоehaВ!vior˜of“тunits“сwith˜v‘џdDarious“options˜givВ!en“on˜the“commandŽЁ‘Gline.‘ннSee–ІfChapter“9“[In•В!v“oking–ІfUnits],“page“20,“for“a“description“of“the“aВ!v‘џdDailable“options.ŽŸ!ќ‘GыS2‘ ИQIn‘џuТteracting–zГwith“ыVunitsŽŽŸ)=‘GсT‘џeo›­xin•В!v“ok“e‘­wunits˜for˜in“teractiv“e˜use,‘яњѓprompt,‘Ђ t˜ypMоe“the“quan˜tit˜y‘ єand“units“that“y˜ou“are‘ єcon˜v˜erting“фfr‘џpЙomс.‘м F‘џeorŽЁ‘Gexample,‘ˆxif›€ќy•В!ou‘€§w“an“t˜to‘€§con“v“ert˜ten–€§meters˜to“feet,–ˆxtВ!ypMоe˜ш10‘Іfmetersс.‘бeNext,“тunits‘€§сwill˜prinВ!tŽЁ‘G`тYou‘Іfwant:с'Ž‘IЪS.‘Z=Y‘џeou–z†should‘z‡tšВ!ypMоe“the“units“y˜ou“w˜an˜t“to“con˜v˜ert“фtoс.‘Z>T‘џeo“con˜v˜ert“to“feet,‘ЏŽy˜ouŽЁ‘Gw•В!ould›вЏt“ypMоe–вЎшfeetс.‘bЗIf˜the“тreadline˜сlibrary˜wВ!as“compiled˜in˜then“тtab˜сwill“complete˜unitŽЁ‘Gnames.‘КЛSee–<џChapter›<ў16“[Readline“SuppMоort],‘Rpage“39,‘Rfor“more˜information“abMоout“тreadlineс.ŽЁ‘GT‘џeo–ц7quit›ц6the“program˜under“Unix,‘і+press˜тCtrl-C“сor˜тCtrl-Dс.‘OUnder“WindoВ!ws,‘і*press“тCtrl-CŽЁ‘Gсor–ІfтCtrl-Zс;“with“the“latter,“yšВ!ou“ma˜y“also“need“to“press“тEnterс.ŽІ‘!GThe–‡rresult›‡qwill“bMоe˜displa•В!y“ed‘‡rin˜t“w“o›‡rw“a“ys.‘г‹The˜ rst–‡qline˜of“output,‘ЂwhicВ!h˜is“markВ!ed˜withŽЁ‘Ga–шL`т*с'›шMto“indicate˜m•В!ultiplication,‘јЦgiv“es–шLthe˜result“of“the˜con•В!v“ersion‘шLy“ou˜ha“v“e‘шLask“ed˜for.‘ЃTheŽЁ‘Gsecond–#line“of“output,‘RwhicšВ!h“is“mark˜ed“with‘$a“`т/с'“to“indicate“division,‘Rgiv˜es“the“in˜v˜erse“ofŽЁ‘Gthe›Іfcon•В!v“ersion˜factor.‘ннIf˜y“ou˜con“v“ert˜10˜meters˜to˜feet,˜тunits˜сwill˜prin“tŽ‘GŸ ‰ffŠ=Ÿ ѓ/‘уŸќ-=Ў1ŽŽ‘ѓoД‹Ч cmr9ЌBut–F‘џ:Ћahrenheit“to“Celsius›is“linear,‘YэyО9ou“insist.‘'zNot“so.‘'yA‘Пtransformation“ѓ5љž" cmmi9ВT‘aхЌis“linear“if˜ВT‘HуЌ(Вx–ЛWЌ+“ВyRЊЌ)‘B’=ŽŸ €‘ВT›HуЌ(ВxЌ)–8+“ВT˜Ќ(ВyRЊЌ)–Tand“this“fails“for“ВT˜Ќ(ВxЌ)–‘Ц=“Вax–8Ќ+“ВbЌ.‘pThis–Ttransformation“is“ane,“but“not“linear.ŽŽŒ‹9„Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Yо*2ŽŽŽ ƒ33 § ЬЭ‘EјDт*‘ПЊ32.808399ŽŸ 33‘EјD/‘ПЊ0.03048ŽŽŸ34‘Gсwhic•В!h›#хtells‘#цy“ou˜that–#ц10˜meters“equals˜abMоout“32.8˜feet.‘V\The˜second“n•В!um“bMоer˜giv“es‘#цthe˜con-ŽЄ 33‘GvВ!ersion–g­in“the›gЌoppMоosite“direction.‘ШѕIn˜this“case,‘t8it“tells“yВ!ou“that˜1“foMоot“is“equal˜to“abMоout“0.03ŽЁ‘Gdek›џdDameters–Іfsince“the“dek˜ameter“is“10“meters.‘ннIt“also“tells“yВ!ou“that“1/32.8“is“abMоout“0.03.ŽЉ‘!GThe–ЖИтunits“сprogram“prinšВ!ts“the“in˜v˜erse“bMоecause“sometimes“it“is“a“more“con˜v˜enien˜t“n˜um˜bMоer.ŽЁ‘GIn–хthe›хexample“abMоo•В!v“e,– Бfor˜example,“the‘хin•В!v“erse˜v‘џdDalue–хis“an˜exact“con•В!v“ersion:‘}-a–хfoMоot˜is“exactlyŽЁ‘G0.03048–Іfdek‘џdDameters.‘ннBut“the“n•В!um“bMоer›Іfgiv“en˜the˜other˜direction˜is˜inexact.ŽŸ‘!GIf–ІfyšВ!ou“con˜v˜ert“grains“to“pMоounds,“y˜ou“will“see“the“follo˜wing:ŽІ‘.љœтYou–ПЊhave:“grainsŽЁ‘.љœYou–ПЊwant:“poundsŽЁ‘\іь*‘ПЊ0.00014285714ŽЁ‘\іь/‘ПЊ7000ŽŽŸ9™š‘GсF‘џerom–CTthe“second›CUline“of“the“output˜yВ!ou“can“immediately“see“that˜a“grain“is“equal˜to“a“sevВ!enŽЁ‘Gthousandth–‹Kof›‹La“pMоound.‘ддThis“is˜not“so“obВ!vious“from˜the“ rst“line˜of“the“output.‘ддIf˜yВ!ou“ ndŽЁ‘Gthe–Іfoutput“format“confusing,“try“using“the“т--verbose“сoption:ŽІ‘.љœтYou–ПЊhave:“grainŽЁ‘.љœYou–ПЊwant:“aeginaminaŽЁ‘\іьgrain–ПЊ=“0.00010416667“aeginaminaŽЁ‘\іьgrain–ПЊ=“(1“/“9600)“aeginaminaŽŽŸ9™š‘GсIf–еpyВ!ou›еorequest“a˜con•В!v“ersion‘еpbMоet“w“een˜units–еpthat˜measure“reciproMоcal“dimensions,‘с1then“тunitsŽЁ‘Gсwill–РXdisplašВ!y“the‘РYcon˜v˜ersion“results“with“an“extra“note‘РYindicating“that“reciproMоcal“con˜v˜ersionŽЁ‘Ghas–ІfbMоeen“done:ŽІ‘.љœтYou–ПЊhave:“6“ohmsŽЁ‘.љœYou–ПЊwant:“siemensŽЁ‘\іьreciprocal‘ПЊconversionŽЁ‘\іь*‘ПЊ0.16666667ŽЁ‘\іь/‘ПЊ6ŽŽŸFЬЭ‘GсReciproMоcal›уЌcon•В!v“ersion–у­can˜bMоe“suppressed˜bВ!y“using˜the˜т--strict“сoption.‘•АAs“usual,‘ђўuse˜theŽЁ‘Gт--verbose–Іfсoption“to“get“more“comprehensible“output:ŽІ‘.љœтYou–ПЊhave:“texŽЁ‘.љœYou–ПЊwant:“typpŽЁ‘\іьreciprocal‘ПЊconversionŽЁ‘\іь1–ПЊ/“tex“=“496.05465“typpŽЁ‘\іь1–ПЊ/“tex“=“(1“/“0.0020159069)“typpŽŸff‘.љœYou–ПЊhave:“20“mphŽЁ‘.љœYou–ПЊwant:“sec/mileŽЁ‘\іьreciprocal‘ПЊconversionŽЁ‘\іь1–ПЊ/“20“mph“=“180“sec/mileŽЁ‘\іь1–ПЊ/“20“mph“=“(1“/“0.0055555556)“sec/mileŽŽ •џџ‘GсIf›—юy•В!ou‘—яen“ter˜incompatible˜unit˜t“ypMоes,‘дPthe˜тunits‘—ясprogram˜will˜prin“t˜a‘—яmessage˜indicatingŽЁ‘Gthat–Іfthe“units“are“not“conformable“and“it“will“displašВ!y“the“reduced“form“for“eac˜h“unit:ŽŽŒ‹K Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Yо*3ŽŽŽ ƒ33 § ЬЭ‘.љœтYou–ПЊhave:“ergs/hourŽЄ 33‘.љœYou–ПЊwant:“fathoms“kg^2“/“dayŽЁ‘.љœconformability‘ПЊerrorŽЁ‘\іь2.7777778e-11–ПЊkg“m^2“/“sec^3ŽЁ‘\іь2.1166667e-05–ПЊkg^2“m“/“secŽŽŸJff‘GсIf–{yšВ!ou“only“w˜an˜t›{to“ nd“the“reduced“form“or“de nition“of˜a“unit,‘ƒСsimply˜press“тEnter“сat“theŽЄ 33‘G`тYou‘Іfwant:с'Ž‘MpЙprompt.‘ннHere–Іfis“an“example:ŽЉ™š‘.љœтYou–ПЊhave:“janskyŽЁ‘.љœYou‘ПЊwant:ŽЁ‘\іьDefinition:–ПЊfluxunit“=“1e-26“W/m^2“Hz“=“1e-26“kg“/“s^2ŽŽŸ0‘GсThe–w­output“from“тunits“сindicates›wЎthat“the“jansky“is“de ned“to“bMоe“equal˜to“a“ uxunit“whicВ!hŽЁ‘Gin–їЖturn›їЗis“de ned“to˜bMоe“a˜certain“comВ!bination“of˜wВ!atts,–Іmeters,“and˜hertz.‘ЃЂThe˜fully‘їЖreducedŽЁ‘G(and–Іfin“this“case“somewhat“more“cryptic)“form“appMоears“on“the“far“righВ!t.ŽІ‘!GSome–Нnamed›Нunits“are“treated˜as“dimensionless˜in“some“situations.‘"These˜units“includeŽЁ‘Gthe–joradian“and“steradian.‘)јThese“units“will“bMоe“treated“as“equal“to“1“in“units“con•В!v“ersions.ŽЁ‘GP•В!o“w“er–эяis“equal“to“torque“times“angular“v•В!eloMоcit“y‘џe.‘ДxThis›эяcon“v“ersion˜can˜only˜b•Mоe˜p“erformed˜ifŽЁ‘Gthe–Іfradian“is“dimensionless.ŽІ‘.љœтYou–ПЊhave:“(14“ft“lbf)“(12“radians/sec)ŽЁ‘.љœYou–ПЊwant:“wattsŽЁ‘\іь*‘ПЊ227.77742ŽЁ‘\іь/‘ПЊ0.0043902509ŽŽŸ=34‘GсIt–y;is“also“pšMоossible“to“compute“ro˜ots‘y:and“other“non-inВ!teger“p˜o•В!w“ers–y;of“dimensionless“units;ŽЁ‘Gthis–ІfallošВ!ws“computations“suc˜h“as“the“altitude“of“geosync˜hronous“orbit:ŽІ‘.љœтYou–ПЊhave:“cuberoot(G“earthmass“/“(circle/siderealday)^2)“-“earthradiusŽЁ‘.љœYou–ПЊwant:“milesŽЁ‘\іь*‘ПЊ22243.267ŽЁ‘\іь/‘ПЊ4.4957425e-05ŽŽŸ=33‘GсNamed–Šdimensionless›‹units“are˜not“treated˜as“dimensionless“in˜other“conВ!texts.‘ЎъThey“cannotŽЁ‘GbšMоe–Іfused“as“exp˜onenВ!ts“so“for“example,“`тmeter^radianс'“is“forbidden.ŽІ‘!GIf›.›y•В!ou‘.šw“an“t˜a–.šlist˜of“options˜yВ!ou“can˜tВ!ypMоe˜ш?“сat˜the“`тYou‘Іfwant:с'Ž‘@Aprompt.‘vzThe˜programŽЁ‘Gwill–@ЊdisplaВ!y“a“list›@Ћof“named“units“that“are“conformable“with“the˜unit“that“yšВ!ou“en˜tered“atŽЁ‘Gthe‘C_`тYou‘Іfhave:с'Ž‘>?Ыprompt›C_abMоo•В!v“e.‘МлConformable˜unit–C`фc‘џpЙombinations‘)wсwill“not˜appMоear˜on“this˜list.ŽІ‘!GTšВ!yping–Dћшhelp‘Dќсat“either“prompt“displa˜ys›Dќa“short“help“message.‘ЙY‘џeou“can˜also“tВ!ypMоe“шhelpŽЁ‘Gсfollo•В!w“ed›50b“y˜a˜unit˜name.‘И This˜will˜in“v“ok“e˜a˜pager˜on˜the˜units‘5/data˜base˜at˜the˜pMоoin“t˜whereŽЁ‘Gthat–„Еunit›„Жis“de ned.‘вЃY‘џeou“can˜read“the˜de nition“and˜commenВ!ts“that˜mašВ!y“giv˜e‘„Жmore“detailsŽЁ‘Gor–ъїhistorical›ъјinformation“abMоout˜the“unit.‘Ÿd(Y‘џeou“can˜generally“quit˜out“of˜the“page˜bВ!y“pressingŽЁ‘G`тqс'.)ŽІ‘!GTšВ!yping‘Нзшsearch–Ниѓ:pЎ0J ѓ3 cmsl10хtext‘њзсwill“displa˜y›Нзa“list˜of“all˜of“the˜units“whose˜names“conВ!tain˜хtext‘њисas˜aŽЁ‘Gsubstring–ѓЭalong“with“their“de nitions.‘ЦThis“mašВ!y“help“in“the“case“where“y˜ou“aren't“sure“ofŽЁ‘Gthe–ІfrighВ!t“unit“name.ŽŽŒ‹UfŸђ‘GсUnits‘ІfCon•В!v“ersion’Yо*4ŽŽŽ ƒ33 § ЬЭ‘GыS3‘ ИQUsing–zГыVunits“ыSNon-In–џuТteractiv“elyŽŽŸ"#‘GсThe–ћtтunits›ћsсprogram“can“pMоerform“units˜con•В!v“ersions›ћtnon-in“teractiv“ely˜from‘ћsthe˜commandŽЄ 33‘Gline.‘ДўT‘џeo–Cqdo“this,›jДtВ!ypMоe“the“command,˜tВ!ypMоe“the“original“unit“expression,˜and“tВ!ypMоe“the“newŽЁ‘Gunits–БRyšВ!ou“w˜an˜t.‘ўЁIf“a“units‘БSexpression“con˜tains“non-alphan˜umeric“c˜haracters,‘Д y˜ou“ma˜y“needŽЁ‘Gto–Іfprotect“it“from“inšВ!terpretation“b˜y“the“shell“using“single“or“double“quote“c˜haracters.ŽЄи.‘!GIf–ІfyšВ!ou“t˜ypMоeŽЁ‘.љœтunits–ПЊ"2“liters"“quartsŽŸи-‘Gсthen–Іfтunits“сwill“prinВ!tŽЁ‘EјDт*‘ПЊ2.1133764ŽŸ 33‘EјD/‘ПЊ0.47317647ŽŽŸ a‘Gсand–ь]then›ь^exit.‘ЏУThe“output˜tells“yВ!ou˜that“2“liters˜is“abMоout˜2.1“quarts,‘§лor˜alternativВ!ely“thatŽЉ 33‘Ga–Іfquart“is“abMоout“0.47“times“2“liters.ŽЁ‘!GIf–Tthe“con•В!v“ersion–Tis“successful,‘€then“тunits“сwill“return“success“(zero)“to“the“calling“en-ŽІ‘Gvironmen•В!t.‘{&If›кдy“ou˜en“ter˜non-conformable˜units‘кгthen˜тunits˜сwill˜prin“t˜a‘кгmessage˜giving˜theŽІ‘Greduced–Іfform“of“eacšВ!h“unit“and“it“will“return“failure“(nonzero)“to“the“calling“en˜vironmen˜t.ŽŸи-‘!GWhen›0y•В!ou‘/in“v“ok“e˜тunits˜сwith‘/only˜one˜argumen“t,‘Ёit˜will˜prin“t–/out˜the˜de nition“of˜theŽІ‘GspMоeci ed–ъunit.‘Њ]It“will›ъ‘return“failure˜if“the˜unit“is˜not“de ned˜and“success˜if“the˜unit“isŽІ‘Gde ned.ŽŸ#Iі‘GыS4‘ ИQUnit‘zГDe nitionsŽŽŸ"#‘GсThe›;2con•В!v“ersion–;3information˜is˜read“from˜a˜units˜data“ le˜that˜is“called˜тdefinitions.unitsŽІ‘Gсand–\ is“usually‘\ŸloMоcated“in“the“т/usr/share/units“сdirectory‘џe.‘ŠIf“yšВ!ou“in˜v˜ok˜e‘\Ÿтunits“сwith“theŽІ‘Gт-V–ћКсoption,‘it›ћЛwill“prinВ!t“the˜loMоcation“of“this“ le.‘нкThe˜default“ le“includes“de nitions˜for“allŽІ‘Gfamiliar–еюunits,‘саabbreviations“and“metric“pre xes.‘lvIt“also“includes“manšВ!y“obscure“or“arc˜haicŽІ‘Gunits.ŽЁ‘!GMan•В!y›Іfconstan“ts˜of˜nature˜are˜de ned,˜including˜these:ŽŸи-‘.љœтpi‘9|Єсratio–Іfof“circumference“to“diameterŽІ‘.љœтc‘?a›>sequence“of˜quotienšВ!ts.‘ЄТF‘џeor“example,‘c№`тm/s–Іf*“s/dayс'Ž‘IСis“equiv‘џdDalen˜t‘>to“`тm/dayс'.ŽЁ‘GSimilarly‘џe,–ІfyВ!ou“could“write“`т1/2“*“meterс'Ž‘Hkшto“get“half“a“meter.ŽŸЬЭ‘!GThe–+Rтunits“сprogram‘+SsuppMоorts“another“option“for“nšВ!umerical“fractions:‘чЖy˜ou“can“indicateŽЁ‘Gdivision–of“фnumb‘џpЙers‘щ.сwith‘the“všВ!ertical“bar“(`т|с'),‘#Рso“if“y˜ou“w˜an˜ted“half“a‘meter“y˜ou“could“writeŽЁ‘G`т1|2‘Іfmeterс'Ž‘IЪS.‘ЅY‘џeou–‡Јcannot›‡Љuse“the˜vВ!ertical“bar˜to“indicate˜division“of˜non-nВ!umerical“unitsŽЁ‘G(e.g.,–Іf`тm|sс'“results“in“an“error“message).ŽІ‘!GP•В!o“w“ers–KСof“units‘KРcan“bšMоe“sp˜eci ed“using‘KРthe“`т^с'“cšВ!haracter,‘uas“sho˜wn“in‘KРthe“follo˜wing“ex-ŽЁ‘Gample,‘Яor–xЉbВ!y›xЈsimple“concatenation“of“a“unit“and˜its“expMоonenВ!t:‘Цџ`тcm3с'˜is“equiv‘џdDalenВ!t“to“`тcm^3с';ŽЁ‘Gif–ХAthe“expMоonenВ!t“is“more“than“one“digit,‘ јthe“`т^с'“is“required.‘:nY‘џeou“can“also“use“`т**с'“as“anŽЁ‘Gexp•MоonenВ!t‘Іfop“erator.ŽІ‘.љœтYou–ПЊhave:“cm^3ŽЁ‘.љœYou–ПЊwant:“gallonsŽЁ‘\іь*‘ПЊ0.00026417205ŽЁ‘\іь/‘ПЊ3785.4118ŽŽŸ;ff‘GсConcatenation–Ъ%only›Ъ&wВ!orks“with“a“single˜unit“name:‘%\if“yВ!ou“write“`т(m/s)2с',‘гтunits˜сwill“treatŽЁ‘Git– мas“mšВ!ultiplication“b˜y“2.‘?When“a“unit“includes“a“pre x,‘&zexpMоonen˜t“opMоerators“apply“to“theŽЁ‘GcomšВ!bination,‘‡Ђso–№`тcentimeter3с'“giv˜es‘ёcubic“cen˜timeters.‘б If‘ёy˜ou“separate›ёthe“pre x˜from“theŽЁ‘Gunit–#dwith‘#eanšВ!y“m˜ultiplication“opMоerator›#e(e.g.,‘=—`тcenti‘Іfmeter^3с'),‘=˜the“pre x˜is“treated“as˜a“sep-ŽЁ‘Garate–unit,‘7Rso“the›ŽexpMоonenВ!t“applies“only“to“the“unit˜without“the“pre x.‘Џ•The“second“exampleŽЁ‘Gis–дequiv‘џdDalenВ!t›дto“`тcenti–Іf*“(meter^3)с',‘пxand˜giv•В!es‘дa˜h“undredth–дof“a˜cubic“meter,‘пxnot˜a“cubicŽЁ‘GcenšВ!timeter.‘.The–Ђтunits“сprogram“is“limited‘Ёin˜ternally“to“proMоducts“of“99‘Ёunits;‘NРaccordingly‘џe,ŽЁ‘Gexpressions–wlikВ!e›x`тmeter^100с'“or“`тjoule^34с'˜(represenšВ!ted“in˜ternally‘xas“`тkg^34–Іfm^68“/“s^68с'Ž‘eK)ŽЁ‘Gwill‘Іffail.ŽІ‘!GThe–†ћ`т|с'›†ќopMоerator“has“the˜highest“precedence,‘П so˜yВ!ou“can“write˜the“square“roMоot˜of“t•В!w“oŽЁ‘Gthirds–ёјas“`т2|3^1|2с'.‘Р”The“`т^с'›ёљopMоerator“has“the“second˜highest“precedence,‘нand“is“ev‘џdDaluatedŽЁ‘GrighВ!t–Іfto“left,“as“usual:ŽŸЬЭ‘.љœтYou–ПЊhave:“5“*“2^3^2ŽЁ‘.љœYou‘ПЊwant:ŽЁ‘\іьDefinition:‘ПЊ2560ŽŽŸ.34‘GсWith–‹кa“dimensionless‘‹лbase“unit,‘ Х5anšВ!y“dimensionless“expMоonen˜t‘‹лis“meaningful“(e.g.,ŽЁ‘G`тpi^exp(2.371)с').‘T‰EvšВ!en–Эѕthough“angle“is“sometimes‘Эєtreated“as“dimensionless,‘иexpMоonen˜tsŽЁ‘Gcannot›Іfha•В!v“e˜dimensions˜of˜angle:ŽŽŒ‹‹\Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Yо*8ŽŽŽ ƒ33 § ЬЭ‘.љœтYou–ПЊhave:“2^radianŽЄ 33’Гц^ŽЁ‘.љœExponent–ПЊnot“dimensionlessŽŽŸ-rs‘GсIf–\фthe›\хbase“unit˜is“not˜dimensionless,‘k˜the“expMоonenšВ!t“m˜ust›\хbMоe“a˜rational“n•В!um“bMоer˜хpUс/хqŽ‘I3с,‘k˜and‘\фtheŽЄ 33‘Gdimension–EЙof›EИthe“unit˜mВ!ust“bMоe˜a“pMоo•В!w“er–EЙof˜хqс,‘mso“`тgallon^2|3с'˜wВ!orks“but˜`тacre^2|3с'“fails.ŽЁ‘GAn–€oexpšMоonenВ!t“using“the‘€pslash“(`т/с')“op˜erator“(e.g.,‘Жё`тgallon^(2/3)с')“is“also‘€pacceptable;‘эstheŽЁ‘GparenВ!theses–:Kare“needed“bMоecause›:Jthe“precedence“of“`т^с'“is“higher“than˜that“of“`т/с'.‘ЙдSince“тunitsŽЁ‘Gсcannot–ћzrepresenšВ!t“dimensions‘ћ{with“expMоonen˜ts“greater“than›ћ{99,‘Љa“fully˜reduced“expMоonenšВ!t“m˜ustŽЁ‘Gha•В!v“e‘ьИхq‘чLт<‘Іfс100Ž‘&nY.‘ŸјWhen–ьИraising›ьЗa“non-dimensionless˜unit“to˜a“pMоo•В!w“er,‘ктunits–ьИсattempts˜to“con•В!v“ertŽЁ‘Ga–decimal“expMоonenšВ!t“to“a‘rational“n˜um˜bšMоer“with“хq‘чLт<‘Іfс100Ž‘&М.‘ЋIf“this‘is“not“p˜ossible“тunits“сdisplaВ!ysŽЁ‘Gan–Іferror“message:ŽЉ ‘.љœтYou–ПЊhave:“ft^1.234ŽЁ‘.љœBase–ПЊunit“not“dimensionless;“rational“exponent“requiredŽŽŸ ??‘GсA‘vѓdecimal›wЌexpMоonen•В!t‘w­m“ust˜matc“h˜its˜rational‘w­represen“tation˜to˜mac“hine˜precision,‘+§soŽЁ‘G`тacre^1.5с'–ІfwВ!orks“but“`тgallon^0.666с'“doMоes“not.ŽŸ EG‘Gы\5.2‘™Sums–f@and“Di erences“of“UnitsŽŽŸ33‘GсY‘џeou–™НmašВ!y“sometimes‘™Оw˜an˜t“to“add“v‘џdDalues‘™Оof“di eren˜t“units“that›™Оare“outside“the“SI.˜Y‘џeou“maВ!yŽЁ‘Galso–jywish›jzto“use“тunits˜сas“a“calculator“that˜kšВ!eeps“trac˜k“of›jzunits.‘ЩуSums“of˜conformable“unitsŽЁ‘Gare–Іfwritten“with“the“`т+с'“cšВ!haracter,“and“di erences“with“the“`т-с'“c˜haracter.ŽІ‘.љœтYou–ПЊhave:“2“hours“+“23“minutes“+“32“secondsŽЁ‘.љœYou–ПЊwant:“secondsŽЁ‘\іь*‘ПЊ8612ŽЁ‘\іь/‘ПЊ0.00011611705ŽŽЉAџџ‘.љœYou–ПЊhave:“12“ft“+“3“inŽЁ‘.љœYou–ПЊwant:“cmŽЁ‘\іь*‘ПЊ373.38ŽЁ‘\іь/‘ПЊ0.0026782366ŽŽІ‘.љœYou–ПЊhave:“2“btu“+“450“ft“lbfŽЁ‘.љœYou–ПЊwant:“btuŽЁ‘\іь*‘ПЊ2.5782804ŽЁ‘\іь/‘ПЊ0.38785542ŽŽŸ:ЅЅ‘GсThe–fMexpressions›fLthat“are“added˜or“subtracted“mВ!ust“reduce˜to“idenВ!tical“expressions˜in“prim-ŽЁ‘GitivšВ!e–Іfunits,“or“an“error“message“will“bMоe“displa˜y˜ed:ŽŸ ‘.љœтYou–ПЊhave:“12“printerspoint“-“4“herediumŽЁ’ lи^ŽЁ‘.љœIllegal–ПЊsum“of“non-conformable“unitsŽŽŸ-rs‘GсAs–Ѓ;usual,‘зthe“precedence“for“`т+с'“and›Ѓ:`т-с'“is“lo•В!w“er–Ѓ;than“that“of“the˜other“opMоerators.‘‡zA‘ЂљfractionalŽЁ‘Gquan•В!tit“y›ЅDsuc“h–ЅEas˜2“1/2˜cups˜can“bMоe˜givВ!en“as˜`т(2+1|2)‘Іfcupsс';‘ЅЅthe˜parenВ!theses“are˜necessaryŽЁ‘GbMоecause–3&mВ!ultiplication“has“higher›3'precedence“than“addition.‘„If˜yšВ!ou“omit“the“paren˜theses,ŽЁ‘Gтunits–Іfсattempts“to“add“`т2с'“and“`т1|2“cupsс',“and“yВ!ou“get“an“error“message:ŽŽŒ‹ ›МŸђ‘GсUnits‘ІfCon•В!v“ersion’Yо*9ŽŽŽ ƒ33 § ЬЭ‘.љœтYou–ПЊhave:“2+1|2“cupsŽЄ 33’œ3:^ŽЁ‘.љœIllegal–ПЊsum“or“difference“of“non-conformable“unitsŽŽŸ,Ч‘GсThe– uexpression“could“also‘ vbMоe“correctly“written“as“`т(2+1/2)›Іfcupsс'.‘ЉуIf“yВ!ou“write“`т2‘ПЊ1|2˜cupsс'ŽЄ 33‘Gthe–Іfspace“is“inВ!terpreted“as“фmultiplic‘џpЙation‘}qсso“the“result“is“the“same“as“`т1“cupс'.ŽŸ`Ж‘!GThe–pЅ`т+с'“and›pЄ`т-с'“cВ!haracters“sometimes“appMоears˜in“expMоonenšВ!ts“lik˜e“`т3.43e+8с'.‘ЫёThis“leads“toŽЁ‘Gan›Ѕыam•В!biguit“y˜in˜an˜expression˜lik“e‘Ѕъ`т3e+2‘ІfyCс'.‘нДThe˜unit˜`тeс'˜is˜a˜small˜unit˜of˜c“harge,‘Іso˜thisŽЁ‘Gcan–iѕbMоe“regarded“as“equiv‘џdDalenВ!t“to“`т(3e+2)›ІfyCс'“or“`т(3˜e)+(2˜yC)с'.‘ЩИThis“am•В!biguit“y–iѕis“resolvВ!edŽЁ‘Gb•В!y›Іfalw“a“ys˜in“terpreting˜`т+с'˜and˜`т-с'˜as˜part˜of˜an˜expMоonen“t˜if˜pMоossible.ŽЉDF‘Gы\5.3‘™NumŒЬbs3ers–f@as“UnitsŽŽŸ33‘GсF‘џeor›ФБтunitsс,‘ЬCn•В!um“b•Mоers˜are˜just˜another˜kind˜of˜unit.‘8ОThey˜can‘ФАapp“ear˜as˜man•В!y˜times˜as˜y“ouŽЁ‘GlikšВ!e–{сand‘{тin“an˜y›{тorder“in˜a“unit˜expression.‘ЯБF‘џeor“example,‘„bto˜ nd“the˜vВ!olume“of˜a“bMоoВ!x˜that“isŽЁ‘G2–Іfft“bšВ!y“3“ft“b˜y“12“ft“in“steres,“y˜ou“could“do“the“follo˜wing:ŽŸ`З‘.љœтYou–ПЊhave:“2“ft“3“ft“12“ftŽЁ‘.љœYou–ПЊwant:“stereŽЁ‘\іь*‘ПЊ2.038813ŽЁ‘\іь/‘ПЊ0.49048148ŽŸff‘.љœYou–ПЊhave:“$“5“/“yardŽЁ‘.љœYou–ПЊwant:“cents“/“inchŽЁ‘\іь*‘ПЊ13.888889ŽЁ‘\іь/‘ПЊ0.072ŽŽŸ{њN‘GсAnd–Œѕthe›Œєsecond“example“sho•В!ws˜ho“w–Œѕthe“dollar˜sign“in“the˜units“con•В!v“ersion–Œѕcan˜precede“theŽЁ‘G vВ!e.–ннBe›Іfcareful:“тunits˜сwill˜in•В!terpret˜`т$5с'˜with˜no˜space˜as˜equiv‘џdDalen“t˜to˜`тdollar^5с'.ŽІ‘Gы\5.4‘™Built-in‘f@F‘ўІfunctionsŽŽŸ33‘GсSevšВ!eral–ЃYbuilt-in“functions‘ЃXare“pro˜vided:‘мW`тsinс',–Ѓѕ`тcosс',“`тtanс',“`тlnс',“`тlogс',“`тlog2с',“`тexpс',“`тacosс',ŽЁ‘G`тatanс'–:?and“`тasinс'.‘ ™gThe“`тsinс',–Ÿ4`тcosс',“and–:?`тtanс'“functions“require‘:>either“a“dimensionlessŽЁ‘GargumenšВ!t–Іfor“an“argumen˜t“with“dimensions“of“angle.ŽŸ`Ж‘.љœтYou–ПЊhave:“sin(30“degrees)ŽЁ‘.љœYou‘ПЊwant:ŽЁ‘\іьDefinition:‘ПЊ0.5ŽЉff‘.љœYou–ПЊhave:“sin(pi/2)ŽЁ‘.љœYou‘ПЊwant:ŽЁ‘\іьDefinition:‘ПЊ1ŽІ‘.љœYou–ПЊhave:“sin(3“kg)ŽЁ’–s^ŽЁ‘.љœUnit–ПЊnot“dimensionlessŽŽ –`Е‘GсThe–WDother“functions“on“the“list“require“dimensionless“argumenšВ!ts.‘У|The“in˜v˜erse“trigonometricŽЁ‘Gfunctions–Іfreturn“argumenВ!ts“with“dimensions“of“angle.ŽŽŒ‹ ЇŸђ‘GсUnits‘ІfCon•В!v“ersion’Td10ŽŽŽ ƒ33 § ЬЭ‘!GIf–VyšВ!ou“wish“to“tak˜e“roMоots“of‘Wunits,‘'&y˜ou“ma˜y“use“the“`тsqrtс'“or“`тcuberootс'“functions.‘ЈиTheseŽЄ 33‘Gfunctions–drequire“that“the“argumenšВ!t“ha˜v˜e“the“appropriate‘crošMоot.‘Ќ2Y‘џeou“can“obtain“higher“ro˜otsŽЁ‘GbšВ!y–Іfusing“fractional“expMоonen˜ts:ŽЉз ‘.љœтYou–ПЊhave:“sqrt(acre)ŽЁ‘.љœYou–ПЊwant:“feetŽЁ‘\іь*‘ПЊ208.71074ŽЁ‘\іь/‘ПЊ0.0047913202ŽЉff‘.љœYou–ПЊhave:“(400“W/m^2“/“stefanboltzmann)^(1/4)ŽЁ‘.љœYou‘ПЊhave:ŽЁ‘\іьDefinition:–ПЊ289.80882“KŽІ‘.љœYou–ПЊhave:“cuberoot(hectare)ŽЁ’Фpр^ŽЁ‘.љœUnit–ПЊnot“a“rootŽŽ Ў(ѕ‘Gы\5.5‘™Previous‘f@ResultŽŽŸ33‘GсY‘џeou–П–can“insert“the“result“of“the“previous“con•В!v“ersion‘П•using–П–the“underscore“(`т_с').‘)mIt“is“usefulŽЁ‘Gwhen–ІfyšВ!ou“w˜an˜t“to“con˜v˜ert“the“same“input“to“sev˜eral“di eren˜t“units,“for“exampleŽІ‘.љœтYou–ПЊhave:“2.3“tonrefrigerationŽЁ‘.љœYou–ПЊwant:“btu/hrŽЁ‘\іь*‘ПЊ27600ŽЁ‘\іь/‘ПЊ3.6231884e-005ŽЁ‘.љœYou–ПЊhave:“_ŽЁ‘.љœYou–ПЊwant:“kWŽЁ‘\іь*‘ПЊ8.0887615ŽЁ‘\іь/‘ПЊ0.12362832ŽŽŸm=q‘GсSuppMоose–ДНyšВ!ou“w˜an˜t“to“do“some“deep“frying“that“requires‘ДМan“oil“depth“of“2“inc˜hes.‘тY‘џeou“ha˜v˜eŽЁ‘G1/2–Žgallon›of“oil,‘(and“w•В!an“t‘Žto˜kno“w–Žthe“largest-diameter“pan˜that“will“mainВ!tain˜the“requiredŽЁ‘Gdepth.‘™3The–иgnonlinear›иfunit“`тcircleareaс'“givВ!es“the“фr‘џpЙadius‘О~сof“the“circle“(see˜Section“6.2“[OtherŽЁ‘GNonlinear–cUnits],›Чўpage“14,˜for“a›dmore“detailed˜description)“in“SI‘units;‘эyšВ!ou“w˜an˜t‘dthe“фdiameterŽЁ‘Gсin‘Іfфinches‘цс:ŽІ‘.љœтYou–ПЊhave:“1|2“gallon“/“2“inŽЁ‘.љœYou–ПЊwant:“circleareaŽЁ‘\іь0.10890173‘ПЊmŽŽŸ4ЬЬ‘.љœYou–ПЊhave:“2“_ŽЁ‘.љœYou–ПЊwant:“inŽЁ‘\іь*‘ПЊ8.5749393ŽЁ‘\іь/‘ПЊ0.1166189ŽŽŸ8pЄ‘GсIn–7most“cases,‘#йsurrounding“white“space“is›6optional,‘#кso“the“previous“example˜could“ha•В!v“e‘7usedŽЁ‘G`т2_с'.‘ннIf–Іf`т_с'“follošВ!ws“a“non-n˜umerical“unit“sym˜bMоol,“ho˜w˜ev˜er,“the“space“is“required:ŽІ‘.љœтYou–ПЊhave:“m_ŽЁ‘n5ъ^ŽЁ‘.љœParse‘ПЊerrorŽŽŽŒ‹ АсŸђ‘GсUnits‘ІfCon•В!v“ersion’Td11ŽŽŽ ƒ33 § ЬЭ‘GWhen–‡љ`т_с'›‡њis“follo•В!w“ed‘‡љb“y˜a–‡љdigit,‘Žthe“opMоeration˜is“mВ!ultiplication“rather˜than“expMоonenВ!tiation,ŽЉ 33‘Gso–Іfthat“`т_2с',“is“equiv‘џdDalenВ!t“to“`т_“*“2с'Ž‘%эьrather“than“`т_^2с'.ŽЄОс‘!GY‘џeou–Іfcan“use“the“`т_с'“symšВ!bMоol“an˜y“n˜um˜bMоer“of“times;“for“example,ŽЁ‘.љœтYou–ПЊhave:“mŽІ‘.љœYou‘ПЊwant:ŽІ‘\іьDefinition:–ПЊ1“mŽІ‘.љœYou–ПЊhave:“_“_ŽІ‘.љœYou‘ПЊwant:ŽІ‘\іьDefinition:–ПЊ1“m^2ŽŽŸQОр‘GсUsing–УЁ`т_с'›УЂbMоefore“a˜con•В!v“ersion–УЁhas˜bšMоeen“p˜erformed“(e.g.,‘Ъёimmediately“after‘УЂin•В!v“o˜cation)‘УЁgen-ŽІ‘Gerates–Іfan“error:ŽЁ‘.љœтYou–ПЊhave:“_ŽІ‘hv@^ŽІ‘.љœNo–ПЊprevious“result;“ _ “not“setŽŽŸ*%G‘GсAccordingly‘џe,–Іf`т_с'“servšВ!es“no“purpMоose“when“тunits“сis“in˜v˜ok˜ed“non-in˜teractiv˜ely‘џe.ŽЁ‘!GIf–ёУтunits›ёФсis“in•В!v“ok“ed˜with–ёУthe˜т--verbose“сoption˜(see“Chapter˜9“[In•В!v“oking˜Units],‘фpage‘ёУ20),ŽІ‘Gthe–Іfv‘џdDalue“of“`т_с'“is“not“expanded:ŽЁ‘.љœтYou–ПЊhave:“mileŽІ‘.љœYou–ПЊwant:“ftŽІ‘\іьmile–ПЊ=“5280“ftŽІ‘\іьmile–ПЊ=“(1“/“0.00018939394)“ftŽІ‘.љœYou–ПЊhave:“_ŽІ‘.љœYou–ПЊwant:“mŽІ‘\іь_–ПЊ=“1609.344“mŽІ‘\іь_–ПЊ=“(1“/“0.00062137119)“mŽŽŸl%F‘GсY‘џeou–Іfcan“givšВ!e“`т_с'“at“the“`тYou“want:с'Ž‘?иprompt,“but“it“usually“is“not“v˜ery“useful.ŽŸ\‘Gы\5.6‘™Complicated–f@Unit“ExpressionsŽŽŸ33‘GсThe–Итunits›Исprogram“is“espMоecially˜helpful“in˜ensuring“accuracy“and˜dimensional“consistencyŽІ‘Gwhen›#‘con•В!v“erting‘#length“y˜unit–#expressions.‘U]F‘џeor˜example,‘Bлone“form˜of“the˜Darcy{W‘џeeisbacВ!hŽІ‘G uid- oВ!w–Іfequation“isŽŸ"’ТaŸщP‘§с=Ÿј—ž‘ƒ8Ž‘=кŸоШ‰fe ьŸ tщd“Ÿќж0Ў2ŽŽŽŽŽ‘љщf‘-МLŸј—ž‘33QŸќОЎ2ŽŽ‘33ŸоШ‰fe $ˆŸ t‘z‡щdŸќж0Ў5ŽŽŽŽŽŽŸŽ‘Gсwhere–мщP‘aђсis“the“pressure›мœdrop,‘јщ“сis˜the“mass“densitВ!y‘џe,‘јщf‘ Xсis“the“(dimensionless)˜friction“factor,ŽІ‘GщL–EТсis“the›EУlength“of“the“pipMоe,‘m™щQ“сis˜the“všВ!olumetric“ o˜w“rate,‘m™and‘EУщd“сis“the“pipMоe“diameter.‘ЛђItŽІ‘GmighšВ!t–ІfbMоe“desired“to“ha˜v˜e“the“equation“in“the“formŽŸA’ТЪлщP‘§с=‘ ЇщAŸЄzЎ1Ž‘|sщf‘-МLŸј—ž‘33QŸќОЎ2ŽŽ‘33ŸоШ‰fe $ˆŸ t‘z‡щdŸќж0Ў5ŽŽŽŽŽŽŸ 8‘Gсthat–.ˆaccepted›.‰the“user's“normal˜units;‘r™for“tВ!ypical˜units“used“in˜the“US,“the˜required“con-ŽІ‘GvšВ!ersion–Іfcould“bMоe“something“lik˜eŽЁ‘.љœтYou–ПЊhave:“(8/pi^2)(lbm/ft^3)ft(ft^3/s)^2(1/in^5)ŽІ‘.љœYou–ПЊwant:“psiŽІ‘\іь*‘ПЊ43.533969ŽІ‘\іь/‘ПЊ0.022970568ŽŽŽŒ‹ Й0Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td12ŽŽŽ ƒ33 § ЬЭ‘GThe›,јparen•В!theses‘,їallo“w˜individual–,їterms˜in˜the“expression˜to“bMоe˜enВ!tered˜naturally‘џe,‘N›as˜theyŽЄ 33‘GmighšВ!t–mbMоe“read“from‘nthe“form˜ula.‘ђAlternativ˜ely‘џe,‘ яthe“m˜ultiplication“could‘nbMоe“done“with“theŽЁ‘G`т*с'–Q+rather›Q,than“a˜space;‘Іthen˜parenВ!theses“are˜needed“only“around˜`тft^3/sс'“bMоecause˜of“itsŽЁ‘GexpMоonenВ!t:ŽЉМk‘.љœтYou–ПЊhave:“8/pi^2“*“lbm/ft^3“*“ft“*“(ft^3/s)^2“/in^5ŽЁ‘.љœYou–ПЊwant:“psiŽЁ‘\іь*‘ПЊ43.533969ŽЁ‘\іь/‘ПЊ0.022970568ŽŽŸ;V‘GсWithout–™ЁparenšВ!theses,‘жoand“using“spaces‘™Ђfor“m˜ultiplication,‘жothe“previous“con˜v˜ersion“w˜ouldŽЁ‘Gneed–Іfto“bMоe“enВ!tered“asŽІ‘.љœтYou–ПЊhave:“8“lb“ft“ft^3“ft^3“/“pi^2“ft^3“s^2“in^5ŽЁ‘.љœYou–ПЊwant:“psiŽЁ‘\іь*‘ПЊ43.533969ŽЁ‘\іь/‘ПЊ0.022970568ŽŽŸHчl‘Gы\5.7›™Bac•ŒЬkw“ards‘f@Compatibilit“y:˜`ы_*ы\'–f@and“`ы_-ы\'ŽŽŸ33‘GсThe– ?original› >тunits“сassigned“mВ!ultiplication˜a“higher“precedence˜than“division“using˜the“slash.ŽЁ‘GThis–3di ers“from“the“usual›3€precedence“rules,‘VШwhic•В!h˜giv“e›3m“ultiplication˜and˜division˜equalŽЁ‘Gprecedence,–Іfand“can“bšMоe“confusing“for“p˜eople“who“think“of“units“as“a“calculator.ŽІ‘!GThe–˜star›—џopMоerator“(`т*с')˜included“in˜this“тunits˜сprogram“has,–šсbВ!y˜default,“the˜same‘˜prece-ŽЁ‘Gdence›Їas–Їdivision,‘к+and“hence˜folloВ!ws˜the“usual˜precedence“rules.‘ˆХF‘џeor“bac•В!kw“ards˜compatibilit“yŽЁ‘Gy•В!ou›jcan‘kin“v“ok“e˜тunits–kсwith˜the˜т--oldstar“сoption.‘юъThen˜`т*с'“has˜a˜higher“precedence˜thanŽЁ‘Gdivision,–Іfand“the“same“precedence“as“mВ!ultiplication“using“the“space.ŽІ‘!GHistorically‘џe,‘ѓсthe–Ч@hВ!yphen›Ч?(`т-с')“has˜bMоeen“used“in˜tecВ!hnical“publications“to˜indicate“proMоductsŽЁ‘Gof–Њunits,‘.ћand›Ћthe“original“тunits˜сprogram“treated“it“as˜a“mВ!ultiplication“opMоerator.‘%ЊBecauseŽЁ‘Gтunits–r8сprošВ!vides“sev˜eral“other“w˜a˜ys“to“obtain‘r7unit“prošMоducts,‘Ѕ,and“b˜ecause“`т-с'“is“a“subtrac-ŽЁ‘Gtion–Й4opMоerator“in“general“algebraic›Й3expressions,‘Нштunits“сtreats“the˜binary“`т-с'“as“a“subtractionŽЁ‘GopMоerator–Ш}bšВ!y“default.‘D!F‘џeor“bac˜kw˜ards“compatibilit˜y‘Ш|use“the“т--product“сoption,‘бwhic˜h“causesŽЁ‘Gтunits–Їбсto“treat›Ївthe“binary“`т-с'“opMоerator˜as“a“prošMоduct“op˜erator.‘тWhen“`т-с'‘Ївis“a“mВ!ultiplica-ŽЁ‘Gtion–Ь-opMоerator“it“has“the“same“precedence“as“mВ!ultiplication“with“a“space,‘еžgiving“it“a“higherŽЁ‘Gprecedence–Іfthan“division.ŽІ‘!GWhen–Hя`т-с'“is“used“as“a“unary“opšMоerator“it‘H№negates“its“op˜erand.‘ХxRegardless“of“the“тunitsŽЁ‘Gсoptions,‘if–``т-с'›_appMоears“after“`т(с'“or˜after“`т+с'“then“it˜will“act“as“a˜negation“opMоerator.‘њЪSo“yВ!ouŽЁ‘Gcan›„ђalw•В!a“ys–„ёcompute˜20“degrees˜minВ!us˜12“min•В!utes˜b“y‘„ёen“tering˜`т20›ПЊdegrees–Іf+“-12˜arcminс'.ŽЁ‘GY‘џeou–Г/mšВ!ust“use“this“construction“when“y˜ou“de ne“new“units“bMоecause“y˜ou“cannot“kno˜w“whatŽЁ‘Goptions–Іfwill“bšMоe“in“force“when“yВ!our“de nition“is“pro˜cessed.ŽŸ)o‘GыS6‘ ИQNonlinear–zГUnit“Con–џuТv“ersionsŽŽŸ&Юл‘GсNonlinear–c7units“are“represenšВ!ted“using“functional‘c8notation.‘PThey“mak˜e“pMоossible“nonlinearŽЁ‘Gunit›Іfcon•В!v“ersions˜suc“h˜as˜tempMоerature.ŽŽŒ‹ УMŸђ‘GсUnits‘ІfCon•В!v“ersion’Td13ŽŽŽ ƒ33 § ЬЭ‘Gы\6.1‘™T‘ўІfemps3erature‘f@Con•ŒЬv“ersionsŽŽŸ33‘GсCon•В!v“ersions‘їbšMоet“w“een‘іtemp˜eratures–їare“di erenšВ!t‘іfrom“linear“con˜v˜ersions‘іbMоet˜w˜een“tempMоera-ŽЄ 33‘Gture–Бtфincr‘џpЙementsс|see›Бsthe“example“bMоeloВ!w.‘Œ7The˜absolute“tempMоerature“con•В!v“ersions˜are‘БthandledŽЁ‘GbšВ!y–зкunits“starting“with“`тtempс',‘$6and“y˜ou“m˜ust“use“functional‘зйnotation.‘r9The“tempMоerature-ŽЁ‘Gincremen•В!t› –con“v“ersions˜are˜done˜using˜units˜starting‘ —with˜`тdegс'˜and˜they˜do˜not˜requireŽЁ‘Gfunctional‘Іfnotation.ŽЉGЏ‘.љœтYou–ПЊhave:“tempF(45)ŽЁ‘.љœYou–ПЊwant:“tempCŽЁ‘\іь7.2222222ŽŸff‘.љœYou–ПЊhave:“45“degFŽЁ‘.љœYou–ПЊwant:“degCŽЁ‘\іь*‘ПЊ25ŽЁ‘\іь/‘ПЊ0.04ŽŽŸnЎ‘GсThink–Ф+of“`тtempF(шxт)с'›Ф*not“as“a“function“but“as˜a“notation“that“indicates“that˜хx‘…Šсshould“ha•В!v“eŽЁ‘Gunits–я\of›я[`тtempFс'“attacВ!hed˜to“it.‘ИНSee“Section˜10.3“[De ning˜Nonlinear“Units],‘™page˜27.‘ИОTheŽЁ‘G rst›№їcon•В!v“ersion‘№јsho“ws˜that˜if˜it's–№ј45˜degrees˜F‘џeahrenheit“outside,‘@it's˜7.2“degrees˜Celsius.‘ЁcTheŽЁ‘Gsecond›<љcon•В!v“ersion˜indicates˜that‘<јa˜c“hange˜of˜45˜degrees˜F‘џeahrenheit‘<јcorrespMоonds˜to˜a˜c“hangeŽЁ‘Gof–Іf25“degrees“Celsius.‘ннThe“con•В!v“ersion–Іffrom“`тtempF(шxт)с'“is“to“absolute“tempMоerature,“so“thatŽІ‘.љœтYou–ПЊhave:“tempF(45)ŽЁ‘.љœYou–ПЊwant:“degRŽЁ‘\іь*‘ПЊ504.67ŽЁ‘\іь/‘ПЊ0.0019814929ŽŽŸ9сH‘GсgivВ!es–Іfthe“same“result“asŽІ‘.љœтYou–ПЊhave:“tempF(45)ŽЁ‘.љœYou–ПЊwant:“tempRŽЁ‘\іь*‘ПЊ504.67ŽЁ‘\іь/‘ПЊ0.0019814929ŽŽŸ9сG‘GсBut–Іfif“yšВ!ou“con˜v˜ert“`тtempF(шxт)с'“to“`тdegCс',“the“output“is“probably“not“what“y˜ou“expMоect:ŽІ‘.љœтYou–ПЊhave:“tempF(45)ŽЁ‘.љœYou–ПЊwant:“degCŽЁ‘\іь*‘ПЊ280.37222ŽЁ‘\іь/‘ПЊ0.0035666871ŽŽŸ9сH‘GсThe–qъresult“is“the“tempšMоerature“in‘qыK,“b˜ecause“`тdegCс'“is“de ned“as“`тKс',‘|ithe“Kelvin.‘Ь_F‘џeor“consis-ŽЁ‘GtenВ!t–6wresults,‘Lйuse“the›6v`тtempшXс'“units˜when“con•В!v“erting˜to–6wa˜tempMоerature“rather˜than“con•В!v“ertingŽЁ‘Ga–ІftempMоerature“incremenВ!t.ŽŸGЎ‘!GThe–је`тtempC()с'“and“`тtempF()с'“de nitions‘јжare“limited“to“pšMоositivВ!e“absolute“temp˜eratures,ŽЁ‘Gand–‘аgiving›‘Яa“v‘џdDalue˜that“wВ!ould˜result“in“a˜negativВ!e“absolute˜tempMоerature“generates˜an“errorŽЁ‘Gmessage:ŽІ‘.љœтYou–ПЊhave:“tempC(-275)ŽЁ’Ёђф^ŽЁ‘.љœArgument–ПЊof“function“outside“domainŽЁ’Ёђф^ŽŽŽŒ‹аoŸђ‘GсUnits‘ІfCon•В!v“ersion’Td14ŽŽŽ ƒ33 § ЬЭ‘Gы\6.2‘™Other–f@Nonlinear“UnitsŽŽŸ33‘GсSome–Ю†other›Ю…examples“of˜nonlinear“units˜are“n•В!umerous˜di eren“t–Ю†ring˜sizes“and˜wire“gauges,ŽЄ 33‘Gthe–Рфgrit“sizes“used“for“abrasivВ!es,›Ч„the“decibMоel“scale,˜shoMоe“size,˜scales“for“the“densitВ!y“of“sugarŽЁ‘G(e.g.,‘ч3baume).‘ F2The–sзstandard›sиdata“ le˜also“supplies˜units“for˜computing“the˜area“of˜aŽЁ‘Gcircle–јяand›јюthe“vВ!olume˜of“a“sphere.‘еvSee“the“standard˜units“data˜ le“for“more˜details.‘еwWireŽЁ‘Ggauges–љЇwith“mšВ!ultiple“zeroMоes“are“signi ed“using“negativ˜e“n˜um˜bMоers“where“t˜w˜o“zeroMоes“is“`т-1с'.ŽЁ‘GAlternativ•В!ely‘џe,›ЋЯy“ou–w‡can“use“the“synonВ!yms“`тg00с',‘ЋЮ`тg000с',˜and“so“on“that“are“de ned“in“theŽЁ‘Gstandard–Іfunits“data“ le.ŽЉi‘.љœтYou–ПЊhave:“wiregauge(11)ŽЁ‘.љœYou–ПЊwant:“inchesŽЁ‘\іь*‘ПЊ0.090742002ŽЁ‘\іь/‘ПЊ11.020255ŽЉff‘.љœYou–ПЊhave:“brwiregauge(g00)ŽЁ‘.љœYou–ПЊwant:“inchesŽЁ‘\іь*‘ПЊ0.348ŽЁ‘\іь/‘ПЊ2.8735632ŽІ‘.љœYou–ПЊhave:“1“mmŽЁ‘.љœYou–ПЊwant:“wiregaugeŽЁ‘\іь18.201919ŽІ‘.љœYou–ПЊhave:“grit_P(600)ŽЁ‘.љœYou–ПЊwant:“grit_ansicoatedŽЁ‘\іь342.76923ŽŽ цE™‘GсThe–ђZlast“example“shošВ!ws“the“con˜v˜ersion“from“P‘ђFgraded“sand“papMоer,‘Wwhic˜h“is“the“EuropMоeanŽЁ‘Gstandard–Іfand“mašВ!y“bMоe“mark˜ed“\P600"“on“the“bac˜k,“to“the“USA“standard.ŽІ‘!GY›џeou–Ыcan“compute“the“area“of“a“circle‘Ъusing“the“nonlinear“unit,‘(ф`тcircleareaс'.‘ Y˜ou“canŽЁ‘Galso–!ўdo›!џthis“using˜the“circularincВ!h“or˜circleincВ!h.‘ PІThe“next˜example“shošВ!ws“t˜w˜o‘!џw˜a˜ys“toŽЁ‘Gcompute–™йthe“area“of“a‘™кcircle“with“a“ všВ!e“inc˜h“radius“and“one“w˜a˜y‘™кto“compute“the“v˜olume“ofŽЁ‘Ga–Іfsphere“with“a“radius“of“one“meter.ŽІ‘.љœтYou–ПЊhave:“circlearea(5“in)ŽЁ‘.љœYou–ПЊwant:“in2ŽЁ‘\іь*‘ПЊ78.539816ŽЁ‘\іь/‘ПЊ0.012732395ŽЉff‘.љœYou–ПЊhave:“10^2“circleinchŽЁ‘.љœYou–ПЊwant:“in2ŽЁ‘\іь*‘ПЊ78.539816ŽЁ‘\іь/‘ПЊ0.012732395ŽІ‘.љœYou–ПЊhave:“spherevol(meter)ŽЁ‘.љœYou–ПЊwant:“ft3ŽЁ‘\іь*‘ПЊ147.92573ŽЁ‘\іь/‘ПЊ0.0067601492ŽŽŽŒ‹к?Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td15ŽŽŽ ƒ33 § ЬЭ‘GThe›…+in•В!v“erse–…,of˜a˜nonlinear“con•В!v“ersion˜is˜indicated‘…,b“y˜pre xing˜a–…,tilde˜(`т~с')˜to“the˜nonlinearŽЄ 33‘Gunit‘Іfname:ŽЉ­K‘.љœтYou–ПЊhave:“~wiregauge(0.090742002“inches)ŽЁ‘.љœYou‘ПЊwant:ŽЁ‘\іьDefinition:‘ПЊ11ŽŽŸ+Б‘GсY‘џeou–Ж|can“givВ!e›Ж{a“nonlinear“unit“de nition˜without“an“argumenВ!t“or˜parenВ!theses,‘њand“pressŽЁ‘GтEnter–У сat›У the“`тYou‘Іfwant:с'Ž‘?? prompt“to˜get“the“de nition“of˜a“nonlinear“unit;‘б\if˜the“de nitionŽЁ‘Gis–Eнnot“v›џdDalid“for“all“real“n•В!um“bMоers,‘Y,the–Eнrange“of“v˜aliditšВ!y“is“also“giv˜en.‘НЏIf“the“de nition“requiresŽЁ‘GspMоeci c–Іfunits“this“information“is“also“displa•В!y“ed:ŽŸ­L‘.љœтYou–ПЊhave:“tempCŽЁ‘\іьDefinition:–ПЊtempC(x)“=“x“K“+“stdtempŽЁ’Ёђфdefined–ПЊfor“x“>=“-273.15ŽЁ‘.љœYou–ПЊhave:“~tempCŽЁ‘\іьDefinition:–ПЊ~tempC(tempC)“=“(tempC“+(-stdtemp))/KŽЁ’Ёђфdefined–ПЊfor“tempC“>=“0“KŽЁ‘.љœYou–ПЊhave:“circleareaŽЁ‘\іьDefinition:–ПЊcirclearea(r)“=“pi“r^2ŽЁ’Ёђфr–ПЊhas“units“mŽŽŸzFу‘GсT‘џeo–†see›‡the“de nition˜of“the“in•В!v“erse˜use–†the˜`т~с'“notation.‘ў>In“this˜case“the˜parameter“inŽЁ‘Gthe–Мfunctional›Лde nition“will˜usually“bMоe“the˜name“of˜the“unit.‘УоNote˜that“the˜in•В!v“erse‘МforŽЁ‘G`тtempCс'–C›shošВ!ws“that“it“requires“units“of“`тKс'“in‘Cœthe“spMоeci cation“of“the“allo˜w˜ed“range“of“v‘џdDalues.ŽЁ‘GNonlinear›xQunit‘xRcon•В!v“ersions˜are–xRdescribMоed˜in˜more“detail˜in“Section˜10.3“[De ning˜NonlinearŽЁ‘GUnits],–Іfpage“27.ŽŸ"є0‘GыS7– ИQUnit›zГLists:“Con–џuТv“ersion˜to˜Sums˜of˜UnitsŽŽŸЁ|‘GсOutside–œбof“the›œвSI,“it“is“sometimes˜desirable“to“con•В!v“ert–œбa˜single“unit“to“a˜sum“of“units|ŽЁ‘Gfor–vexample,‘,:feet“to“feet“plus“incšВ!hes.‘ The“con˜v˜ersion“фfr‘џpЙom‘шсsums“of“units“w˜as“describMоed“inŽЁ‘GSection–ц5.2›ч[Sums“and˜Di erences“of“Units],‘9Gpage“8,‘9Fand˜is“a“simple˜matter“of˜adding“theŽЁ‘Gunits–Іfwith“the“`т+с'“sign:ŽІ‘.љœтYou–ПЊhave:“12“ft“+“3“in“+“3|8“inŽЁ‘.љœYou–ПЊwant:“ftŽЁ‘\іь*‘ПЊ12.28125ŽЁ‘\іь/‘ПЊ0.081424936ŽŽŸ8Fх‘GсAlthough–VŸyВ!ou“can›Vžsimilarly“write“a“sum˜of“units“to“con•В!v“ert˜фtoс,‘‚­the–VŸresult“will˜not“bMоe“theŽЁ‘Gcon•В!v“ersion–hkto›hlthe“units˜in“the“sum,‘˜эbut“rather˜the“con•В!v“ersion–hkto˜the“particular˜sum“thatŽЁ‘Gy•В!ou›Іfha“v“e˜en“tered:ŽІ‘.љœтYou–ПЊhave:“12.28125“ftŽЁ‘.љœYou–ПЊwant:“ft“+“in“+“1|8“inŽЁ‘\іь*‘ПЊ11.228571ŽЁ‘\іь/‘ПЊ0.089058524ŽŽŸ8Fф‘GсThe–šlunit“expression“givšВ!en‘škat“the“`тYou‘Іfwant:с'Ž‘>эфprompt“is“equiv‘џdDalen˜t‘škto“asking“for“con˜v˜ersionŽЁ‘Gto–Џ8mВ!ultiples‘Џ7of“`т1›ПЊft–Іf+“1˜in“+“1|8˜inс',‘рЇwhicšВ!h–Џ8is“1.09375–Џ7ft,‘рЈso“the–Џ8con˜v˜ersion“in‘Џ7the“previousŽЁ‘Gexample–Іfis“equiv‘џdDalenВ!t“toŽŽŒ‹тŸђ‘GсUnits‘ІfCon•В!v“ersion’Td16ŽŽŽ ƒ33 § ЬЭ‘.љœтYou–ПЊhave:“12.28125“ftŽЄ 33‘.љœYou–ПЊwant:“1.09375“ftŽЁ‘\іь*‘ПЊ11.228571ŽЁ‘\іь/‘ПЊ0.089058524ŽŽŸ8š‘GсIn›5лcon•В!v“erting˜to–5мa˜sum˜of˜units“likВ!e˜miles,‘YИfeet˜and“inc•В!hes,‘YИy“ou˜t“ypically‘5мw“an“t˜the˜largestŽЄ 33‘GinВ!tegral–Мv‘џdDalue›Мfor“the˜ rst“unit,‘С†follo•В!w“ed›Мb“y˜the‘Мlargest˜in“tegral–Мv‘џdDalue˜for“the˜next,‘С†and˜theŽЁ‘Gremainder›пcon•В!v“erted˜to˜the˜last˜unit.‘)HY‘џeou˜can˜do˜this˜con“v“ersion˜easily˜with˜тunits˜сusingŽЁ‘Ga–ќuspMоecial“synšВ!tax‘ќtfor“lists“of“units.‘р Y‘џeou“m˜ust“list›ќtthe“desired“units“in“order˜from“largest“toŽЁ‘Gsmallest,–Іfseparated“bšВ!y“the“semicolon“(`т;с')“c˜haracter:ŽЉ€‘.љœтYou–ПЊhave:“12.28125“ftŽЁ‘.љœYou–ПЊwant:“ft;in;1|8“inŽЁ‘\іь12–ПЊft“+“3“in“+“3|8“inŽŽŸ*цg‘GсThe›ƒhcon•В!v“ersion‘ƒialw“a“ys˜giv“es‘ƒiin“teger˜coMоecien“ts˜on–ƒithe˜units“in˜the˜list,‘Šhexcept“pMоossibly˜theŽЁ‘Glast–Іfunit“when“the“con•В!v“ersion–Іfis“not“exact:ŽІ‘.љœтYou–ПЊhave:“12.28126“ftŽЁ‘.љœYou–ПЊwant:“ft;in;1|8“inŽЁ‘\іь12–ПЊft“+“3“in“+“3.00096“*“1|8“inŽŽŸ*цg‘GсThe–Іforder“in“whicšВ!h“y˜ou“list“the“units“is“impMоortan˜t:ŽІ‘.љœтYou–ПЊhave:“3“kgŽЁ‘.љœYou–ПЊwant:“oz;lbŽЁ‘\іь105–ПЊoz“+“0.051367866“lbŽŸff‘.љœYou–ПЊhave:“3“kgŽЁ‘.љœYou–ПЊwant:“lb;ozŽЁ‘\іь6–ПЊlb“+“9.8218858“ozŽŽŸ_Г3‘GсListing–jounces‘jbšMоefore“p˜ounds“pro˜duces“a›jtecВ!hnically“correct“result,‘›but“not“a˜vВ!ery“usefulŽЁ‘Gone.‘Щ^Y‘џeou›Ÿ’mВ!ust–Ÿ‘list“the“units“in“descending˜order“of“size“in“order“to˜get“the“most“usefulŽЁ‘Gresult.ŽІ‘!GEnding–3a“unit“list“with“the“separator“`т;с'‘4has“the“same“e ect“as“repMоeating“the“last“unitŽЁ‘Gon›Б˜the–Б™list,‘Дdso“`тft;in;1|8‘Іfin;с'˜is˜equiv‘џdDalenВ!t˜to“`тft;in;1|8–Іfin;1|8“inс'.‘џsWith‘Б™the˜exampleŽЁ‘GabMоo•В!v“e,–Іfthis“givВ!esŽЉ€‘.љœтYou–ПЊhave:“12.28126“ftŽЁ‘.љœYou–ПЊwant:“ft;in;1|8“in;ŽЁ‘\іь12–ПЊft“+“3“in“+“3|8“in“+“0.00096“*“1|8“inŽŽŸ*цf‘Gсin–Љe ect“separating›Њthe“inВ!teger“and“fractional“parts“of˜the“coMоecienВ!t“for“the“last˜unit.‘­žIf“yВ!ouŽЁ‘Ginstead–ЮЫprefer“to“round“the“last“coMоecienšВ!t“to“an“in˜teger“y˜ou“can“do“this“with“the“т--roundŽЁ‘Gс(т-rс)–Іfoption.‘ннWith“the“previous“example,“the“result“isŽІ‘.љœтYou–ПЊhave:“12.28126“ftŽЁ‘.љœYou–ПЊwant:“ft;in;1|8“inŽЁ‘\іь12–ПЊft“+“3“in“+“3|8“in“(rounded“down“to“nearest“1|8“in)ŽŽŸ*цf‘GсWhen–ŒyВ!ou“use“the“т-r“сoption,‘Ф~repMоeating“the“last“unit“on“the“list“has‘Œno“e ect“(e.g.,‘Ф`тft;in;1|8ŽЁ‘Gin;1|8›Іfinс'– is“equiv‘џdDalenВ!t“to‘ ‚`тft;in;1|8˜inс'),‘,and“hence“neither“doMоes“ending“a‘ ‚list“with“a“`т;с'.ŽЁ‘GWith–w*a›w+single“unit˜and“the˜т-r“сoption,‘€a“terminal˜`т;с'“фdo‘џpЙes‘]Cсha•В!v“e–w*an“e ect:‘Ц@it“causes˜тunits“сtoŽЁ‘Gtreat–‚)the“single›‚(unit“as“a“list˜and“proMоduce“a“rounded“v‘џdDalue˜for“the“single“unit.‘бШWithout“theŽŽŒ‹эЛŸђ‘GсUnits‘ІfCon•В!v“ersion’Td17ŽŽŽ ƒ33 § ЬЭ‘Gextra–83`т;с',‘\Ѕthe“т-r“сoption“has“no›82e ect“on“single“unit˜con•В!v“ersions.‘“DThis˜example›83sho“ws˜theŽЄ 33‘Goutput–Іfusing“the“т-r“сoption:ŽЉX‰‘.љœтYou–ПЊhave:“12.28126“ftŽЁ‘.љœYou–ПЊwant:“inŽЁ‘\іь*‘ПЊ147.37512ŽЁ‘\іь/‘ПЊ0.0067854058ŽŸff‘.љœYou–ПЊhave:“12.28126“ftŽЁ‘.љœYou–ПЊwant:“in;ŽЁ‘\іь147–ПЊin“(rounded“down“to“nearest“in)ŽŽŸnОя‘GсEacВ!h–Юunit›Юthat“appMоears˜in“the˜list“mВ!ust˜bMоe“conformable˜with“the˜ rst“unit˜on“the˜list,‘и andŽЁ‘Gof–аИcourse“the“listed“units“mšВ!ust“also“bMоe“conformable‘аЗwith“the“unit“that“y˜ou“en˜ter“at“theŽЁ‘G`тYou‘Іfhave:с'Ž‘MpЙprompt.ŽІ‘.љœтYou–ПЊhave:“meterŽЁ‘.љœYou–ПЊwant:“ft;kgŽЁ‘yЕ>^ŽЁ‘.љœconformability‘ПЊerrorŽЁ‘\іьft–ПЊ=“0.3048“mŽЁ‘\іьkg–ПЊ=“1“kgŽŽŸ\fe‘.љœYou–ПЊhave:“meterŽЁ‘.љœYou–ПЊwant:“lb;ozŽЁ‘.љœconformability‘ПЊerrorŽЁ‘\іь1‘ПЊmŽЁ‘\іь0.45359237‘ПЊkgŽŽŸG%V‘GсIn–Frthe›Fq rst“case,‘nuтunits˜сrepMоorts“the“disagreemen•В!t˜bšMоet“w“een–Frunits“app˜earing‘Fqon“the“list.‘ОInŽЁ‘Gthe–Ѓїsecond“case,‘Єsтunits“сrepšMоorts“disagreemenВ!t“b˜et•В!w“een–Ѓїthe“unit“yšВ!ou“en˜tered“and“the“desiredŽЁ‘Gcon•В!v“ersion.‘ннThis›Іfconformabilit“y˜error˜is˜based˜on˜the˜ rst˜unit˜on˜the˜unit˜list.ŽІ‘!GOther–Іfcommon“candidates“for“con•В!v“ersion–Іfto“sums“of“units“are“angles“and“time:ŽІ‘.љœтYou–ПЊhave:“23.437754“degŽЁ‘.љœYou–ПЊwant;“deg;arcmin;arcsecŽЁ‘EјD23–ПЊdeg“+“26“arcmin“+“15.9144“arcsecŽŽŸ4ЬЬ‘.љœYou–ПЊhave:“7.2319“hrŽЁ‘.љœYou–ПЊwant:“hr;min;secŽЁ‘EјD7–ПЊhr“+“13“min“+“54.84“secŽŽŸ,О№‘GсIn–Ї North“America,‘ч2recipšMоes“for“co˜oking“tšВ!ypically‘Ї measure“ingredien˜ts“b˜y“v˜olume,‘ч2and“useŽЁ‘Gunits–ъƒthat›ъ„are“not˜alw•В!a“ys›ъƒcon“v“enien“t˜m“ultiples‘ъ„of˜eac“h˜other.‘Њ6SuppMоose˜that˜y“ou‘ъ„ha“v“e˜aŽЁ‘GrecipMоe–ќcfor“6“and“yšВ!ou“wish“to“mak˜e“a“pšMоortion“for“1.‘пдIf“the“recip˜e“calls“for“2“1/2“cups“of“anŽЁ‘Gingredien•В!t,‘^ y“ou›9Omigh“t˜wish˜to˜kno“w˜the‘9Pmeasuremen“ts˜in˜terms˜of˜measuring˜devices˜y“ouŽЁ‘Gha•В!v“e›Іfa“v‘џdDailable,˜y“ou˜could˜use˜тunits˜сand˜en“terŽІ‘.љœтYou–ПЊhave:“(2+1|2)“cup“/“6ŽЁ‘.љœYou–ПЊwant:“cup;1|2“cup;1|3“cup;1|4“cup;tbsp;tsp;1|2“tsp;1|4“tspŽЁ‘\іь1|3–ПЊcup“+“1“tbsp“+“1“tspŽŽŽŒ‹љwŸђ‘GсUnits‘ІfCon•В!v“ersion’Td18ŽŽŽ ƒ33 § ЬЭ‘GBy–м9default,‘)Ўif“a›м:unit“in˜a“list“bMоegins˜with“fraction“of˜the“form˜1т|хx‘˜сand“its˜mВ!ultiplier“isŽЄ 33‘Gan–ЅinšВ!teger,‘фЇthe“fraction“is“giv˜en“as“the“proMоduct‘Ѕof“the“m˜ultiplier“and“the“n˜umerator;‘$NforŽЁ‘Gexample,ŽЉИR‘.љœтYou–ПЊhave:“12.28125“ftŽЁ‘.љœYou–ПЊwant:“ft;in;1|8“in;ŽЁ‘\іь12–ПЊft“+“3“in“+“3|8“inŽŽŸ+Й‘GсIn‘Љman•В!y›Љcases,‘ЉЏsuc“h˜as–Љthe“example˜abMоo•В!v“e,‘ЉЏthis˜is–Љwhat˜is“w•В!an“ted,‘ЉЏbut˜sometimes–Љit˜is“not.ŽЁ‘GF‘џeor–xbexample,‘•a“co•Mоoking›xarecip“e–xbfor˜6“mighВ!t˜call“for“5˜1/4“cup˜of“an˜ingredien•В!t,‘–but˜y“ou‘xbw“an“tŽЁ‘Ga–ІfpMоortion“for“2,“and“yšВ!our“1-cup“measure“is“not“a˜v‘џdDailable;“y˜ou“migh˜t“tryŽІ‘.љœтYou–ПЊhave:“(5+1|4)“cup“/“3ŽЁ‘.љœYou–ПЊwant:“1|2“cup;1|3“cup;1|4“cupŽЁ‘\іь3|2–ПЊcup“+“1|4“cupŽŽŸ+И‘GсThis–ЯПresult“mighšВ!t“bMоe“ ne“for“a“bak˜er‘ЯРwho“has“a“1“1/2-cup“measure“(and“recognizes“theŽЁ‘Gequiv‘џdDalence),‘ •but–nŒit“maВ!y“not“bMоe‘nas“useful“to“someone“with“more“limited“set“of“measures,ŽЁ‘Gwho–нмdoMоes“w•В!an“t–нмto“do“additional“calculations,‘+Иand“only“w•В!an“ts–нмto“knošВ!w“\Ho˜w“man˜y“1/2-ŽЁ‘Gcup– measures› to“I‘Ќneed“to˜add?"‘ ШAfter˜all,‘jrthat's˜what“wВ!as˜actually“askВ!ed.‘ ЧWith“theŽЁ‘Gт--show-factor–~ сoption,‘Дthe›~!factor“will“not˜bMоe“comВ!bined˜with“a“unit•В!y˜n“umerator,‘Дso‘~ thatŽЁ‘GyВ!ou‘ІfgetŽІ‘.љœтYou–ПЊhave:“(5+1|4)“cup“/“3ŽЁ‘.љœYou–ПЊwant:“1|2“cup;1|3“cup;1|4“cupŽЁ‘\іь3–ПЊ*“1|2“cup“+“1|4“cupŽŽŸ+Й‘GсA‘|Ѕuser-spMоeci ed–|№fractional“unit“with›|ёa“nВ!umerator“other“than“1“is˜nevšВ!er“o˜v˜erridden,‘Иnho˜w˜ev˜er|ŽЁ‘Gif–GТa“unit“list“spMоeci es“`т3|4–Іfcup;1|2“cupс',‘pa–GТresult“equiv‘џdDalenšВ!t“to“1“1/2“cups“will“alw˜a˜ys“bMоeŽЁ‘GshošВ!wn–Іfas“`т2“*“3|4‘ПЊcupс'“whether“or“not“the“т--show-factor“сoption“is“giv˜en.ŽІ‘!GSome–pЦapplications›pХfor“unit“lists˜mašВ!y“bMоe“less“ob˜vious.‘<ќSuppMоose‘pХthat“y˜ou“ha˜v˜e‘pХa“pMоostalŽЁ‘Gscale–cand“wish›bto“ensure“that“it's“accurate˜at“1“oz,‘8Ъbut“ha•В!v“e–conly˜metric“calibration“w•В!eigh“ts.ŽЁ‘GY‘џeou–ІfmighВ!t“tryŽІ‘.љœтYou–ПЊhave:“1“ozŽЁ‘.љœYou–ПЊwant:“100“g;50“g;“20“g;10“g;5“g;2“g;1“g;ŽЁ‘\іь20–ПЊg“+“5“g“+“2“g“+“1“g“+“0.34952312“*“1“gŽŽЉ+И‘GсY‘џeou–”юmighšВ!t“then“place“one“eac˜h‘”яof“the“20“g,›˜l5“g,‘˜m2“g,˜and“1“g‘”яw•В!eigh“ts–”юon“the“scale“and“hopMоeŽЁ‘Gthat–Іfit“indicates“close“toŽŸИS‘.љœтYou–ПЊhave:“20“g“+“5“g“+“2“g“+“1“gŽЁ‘.љœYou–ПЊwant:“oz;ŽЁ‘\іь0.98767093‘ПЊozŽŽІ‘GсAppMоending–Ѕн`т;с'“to“`тozс'“forces“a‘Ѕоone-line“displašВ!y“that“includes“the“unit;‘І here“the“in˜teger“partŽЁ‘Gof–Іfthe“result“is“zero,“so“it“is“not“displa•В!y“ed.ŽЄИR‘!GA–Іfunit“list“sucВ!h“asŽЁ‘.љœтcup;1|2–ПЊcup;1|3“cup;1|4“cup;tbsp;tsp;1|2“tsp;1|4“tspŽŸИS‘Gсcan–чIbMоe›чJtedious“to“enВ!ter.‘ ‡The“тunits“сprogram˜proВ!vides“shorthand“names“for˜some“commonŽЉ 33‘GcomВ!binations:ŽЁ‘.љœтhms‘3Мњсhours,–ІfminВ!utes,“secondsŽІ‘.љœтdms‘3Мњсangle:–Іfdegrees,“minВ!utes,“secondsŽŽŒ‹‘Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td19ŽŽŽ ƒ33 § ЬЭ‘.љœтtime‘-§Pсy•В!ears,›Іfda“ys,˜hours,˜min“utes˜and˜secondsŽЄ 33‘.љœтusvol‘(=ІсUS–ІfcoMоoking“vВ!olume:“cups“and“smallerŽЉ&g‘GUsing–Іfthese“shorthands,“or“хunit“list“aliasesс,“yšВ!ou“can“do“the“follo˜wing“con˜v˜ersions:ŽŸ&f‘.љœтYou–ПЊhave:“anomalisticyearŽЁ‘.љœYou–ПЊwant:“timeŽЁ‘\іь1–ПЊyear“+“25“min“+“3.4653216“secŽЁ‘.љœYou–ПЊhave:“1|6“cupŽЁ‘.љœYou–ПЊwant:“usvolŽЁ‘\іь2–ПЊtbsp“+“2“tspŽŽŸV&f‘GсY‘џeou–&йcannot›&иcomВ!bine“a˜unit“list˜alias“with“other˜units:‘ оТit“mВ!ust˜appMоear“alone˜at“theŽЁ‘G`тYou‘Іfwant:с'Ž‘MpЙprompt.ŽІ‘!GY‘џeou–Дtcan“displaВ!y›Дuthe“de nition“of“a“unit“list˜alias“bšВ!y“en˜tering“it“at‘Дuthe“`тYou‘Іfhave:с'Ž‘=!єprompt:ŽЉ&f‘.љœтYou–ПЊhave:“dmsŽЁ‘\іьDefinition:–ПЊunit“list,“deg;arcmin;arcsecŽŽŸ!Yš‘GсWhen–aЪyВ!ou›aЩspMоecify“compact˜output“with˜т--compactс,‘o‚т--terse“сor˜т-t“сand˜pMоerform“con•В!v“ersionŽЁ‘Gto–/‚a“unit›/list,‘‘Штunits“сlists“the“con•В!v“ersion–/‚factors˜for“eacВ!h“unit“in˜the“list,‘‘Шseparated“bВ!yŽЁ‘Gsemicolons.ŽІ‘.љœтYou–ПЊhave:“yearŽЁ‘.љœYou–ПЊwant:“day;min;secŽЁ‘.љœ365;348;45.974678ŽŽŸ.ŒЭ‘GсUnlikВ!e–Іfthe“case“of“regular“output,“zeros“фar‘џpЙe‘yсincluded“in“this“output“list:ŽŸ&g‘.љœтYou–ПЊhave:“literŽЁ‘.љœYou–ПЊwant:“cup;1|2“cup;1|4“cup;tbspŽЁ‘.љœ4;0;0;3.6280454ŽŽŸDLЭ‘GыS8‘ ИQLogging‘zГCalculationsŽŽŸ( Ю‘GсThe–УФт--log“сoption“allošВ!ws“y˜ou‘УУto“sa˜v˜e“the“results“of“calculations“in“a“ le;‘вrthis“can“bMоe“usefulŽЁ‘Gif–ЎцyВ!ou›Ўчneed“a˜pMоermanenВ!t“record˜of“y•В!our˜w“ork.‘ї^F‘џeor–Ўцexample,‘ёthe“ uid- o•В!w˜con“v“ersion‘ЎцinŽЁ‘GSection–чф5.6‘чу[Complicated“Unit“Expressions],›8Bpage“11,˜is“lengthšВ!y‘џe,‘8Cand‘чуif“y˜ou“w˜ere‘чуto“useŽЁ‘Git–UНin“designing“a“piping“system,‘’yšВ!ou“migh˜t“w˜an˜t“a“record“of“it“for“the“pro‘›Лject“ le.‘ытIf“theŽЁ‘Gin•В!teractiv“e‘ІfsessionŽІ‘.љœт#–ПЊConversion“factor“A1“for“pressure“dropŽЁ‘.љœ#–ПЊdP“=“A1“rho“f“L“Q^2/d^5ŽЁ‘.љœYou–ПЊhave:“(8/pi^2)“(lbm/ft^3)ft(ft^3/s)^2(1/in^5)“#“Input“unitsŽЁ‘.љœYou–ПЊwant:“psiŽЁ‘\іь*‘ПЊ43.533969ŽЁ‘\іь/‘ПЊ0.022970568ŽŽŸV&f‘GсwšВ!ere–Іflogged,“the“log“ le“w˜ould“con˜tainŽŽŒ‹ђŸђ‘GсUnits‘ІfCon•В!v“ersion’Td20ŽŽŽ ƒ33 § ЬЭ‘.љœт###–ПЊLog“started“Fri“Oct“02“15:55:35“2015ŽŸff‘.љœ#–ПЊConversion“factor“A1“for“pressure“dropŽЄ 33‘.љœ#–ПЊdP“=“A1“rho“f“L“Q^2/d^5ŽЁ‘.љœFrom:–ПЊ(8/pi^2)“(lbm/ft^3)ft(ft^3/s)^2(1/in^5)‘>ў#“Input“unitsŽЁ‘.љœTo:‘>ўpsiŽЁ‘\іь*‘ПЊ43.533969ŽЁ‘\іь/‘ПЊ0.022970568ŽŽŸm]н‘GсThe–Іftime“is“written“to“the“log“ le“when“the“ le“is“opMоened.ŽЉїx‘!GThe–2єuse“of“commenВ!ts“can›2ѓhelp“clarify“the“meaning“of“calculations“for“the˜log.‘ ƒ‡TheŽЄ 33‘Glog–б$includes‘б#conformabilitšВ!y“errors“bMоet˜w˜een“the‘б#units“at“the“`тYou‘Іfhave:с'Ž‘A[Sand“`тYou‘Іfwant:с'ŽŽЁ‘Gprompts,›ПŠbut–…гnot“other“errors,˜including“lacšВ!k“of‘…дconformabilit˜y“of“items“in“sums“or“di erencesŽЁ‘Gor–#Damong›#Eitems“in“a“unit˜list.‘В'F‘џeor“example,‘=~a˜con•В!v“ersion›#DbMоet“w“een˜zenith˜angle‘#Eand˜elev‘џdDationŽЁ‘Gangle–Іfcould“in•В!v“olv“eŽІ‘.љœтYou–ПЊhave:“90“deg“-“(5“deg“+“22“min“+“9“sec)ŽЁ’ј-к^ŽЁ‘.љœIllegal–ПЊsum“or“difference“of“non-conformable“unitsŽЁ‘.љœYou–ПЊhave:“90“deg“-“(5“deg“+“22“arcmin“+“9“arcsec)ŽЁ‘.љœYou–ПЊwant:“dmsŽЁ‘\іь84–ПЊdeg“+“37“arcmin“+“51“arcsecŽЁ‘.љœYou–ПЊhave:“_ŽЁ‘.љœYou–ПЊwant:“degŽЁ‘\іь*‘ПЊ84.630833ŽЁ‘\іь/‘ПЊ0.011816024ŽЁ‘.љœYou‘ПЊhave:ŽŽ ”їv‘GсThe–Іflog“ le“wšВ!ould“con˜tainŽІ‘.љœтFrom:–ПЊ90“deg“-“(5“deg“+“22“arcmin“+“9“arcsec)ŽЁ‘.љœTo:‘>ўdeg;arcmin;arcsecŽЁ‘\іь84–ПЊdeg“+“37“arcmin“+“51“arcsecŽЁ‘.љœFrom:‘ПЊ_ŽЁ‘.љœTo:‘>ўdegŽЁ‘\іь*‘ПЊ84.630833ŽЁ‘\іь/‘ПЊ0.011816024ŽŽŸ`*Њ‘GсThe–рinitial›рenВ!try“error˜(forgetting“that˜minšВ!utes“ha˜v˜e“dimension›рof“time,‘Нand˜that“arcminВ!utesŽЁ‘GmВ!ust–КbMоe›Кused“for˜dimensions“of˜angle)“doMоes˜not“appMоear˜in“the˜output.‘юWhen˜con•В!v“erting‘КtoŽЁ‘Ga–Іfunit“list“alias,“тunits“сexpands“the“alias“in“the“log“ le.ŽŸїw‘!GThe–"l`тFrom:с'›"mand“`тTo:с'˜tags“are˜written“to˜the“log˜ le“evВ!en˜if“the˜т--quiet“сoption˜is“givВ!en.ŽЁ‘GIf–_the›_log“ le˜exists“when˜тunits“сis“in•В!v“ok“ed,‘.the–_new“results˜are“appMоended˜to“the˜log“ le.ŽЁ‘GThe–_оtime›_пis“written˜to“the“log˜ le“eacВ!h“time˜the“ le˜is“opMоened.‘ЦZThe˜т--log“сoption˜is“ignoredŽЁ‘Gwhen–Іfтunits“сis“used“non-in•В!teractiv“ely‘џe.ŽŸ#ˆŠ‘GыS9‘ ИQIn–џuТv“oking‘zГыVunitsŽŽŸ€‘GсY‘џeou›Іfin•В!v“ok“e˜тunits˜сlik“e˜this:ŽŽŒ‹бŸђ‘GсUnits‘ІfCon•В!v“ersion’Td21ŽŽŽ ƒ33 § ЬЭ‘.љœтunits–ПЊ[шoptionsт]“[шfrom-unit“т[шto-unitт]]ŽЉzт‘GсIf‘$@the–$Aхfrom-unit›a@сand“хto-unit˜сare›$@omitted,‘CЗthe“program˜will˜use“in•В!teractiv“e˜prompts‘$Ato˜de-ŽЄ 33‘Gtermine–ЄќwhicšВ!h“con˜v˜ersions›Єћto“pMоerform.‘йŸSee“Chapter˜2“[In•В!teractiv“e–ЄќUse],‘фЁpage“1.‘йžIf“bMоothŽЁ‘Gхfrom-unit–‰Всand‘LБхto-unit“сare–LВgivšВ!en,‘vDтunits“сwill“prin˜t“the›LБresult“of“that“single˜con•В!v“ersion‘LВandŽЁ‘Gthen–]‘exit.‘Х—If“only›]’хfrom-unit‘š‘сappMоears“on˜the“command˜line,‘l"тunits˜сwill“displaВ!y˜the“de nitionŽЁ‘Gof–У}that›У~unit“and˜exit.‘5#Units˜spMоeci ed“on˜the“command˜line“maВ!y˜need“to˜bMоe“quoted˜to“pro-ŽЁ‘Gtect–МЧthem›МШfrom“shell“inВ!terpretation˜and“to“group˜them“inšВ!to“t˜w˜o“argumen˜ts.‘!See‘МШChapter“3ŽЁ‘G[Command–ІfLine“Use],“page“4.ŽІ‘!GThe–adefault“bšMоehaВ!vior‘`of“тunits“сcan“b˜e‘`cšВ!hanged“b˜y“v‘џdDarious“options“giv˜en‘`on“the“commandŽЁ‘Gline.‘ЛRIn–>Чmost›>Цcases,‘Sthe“options˜ma•В!y˜bMоe˜giv“en˜in˜either˜short˜form˜(a‘>Чsingle˜`т-с'˜follo“w“ed˜b“y˜aŽЁ‘Gsingle–|cšВ!haracter)“or“long“form“(`т--с'‘|follo˜w˜ed“b˜y“a“w˜ord“or“h˜yphen-separated“w˜ords).‘ЯУShort-ŽЁ‘Gform–nsoptions›nrare“cryptic“but˜require“less“tВ!yping;‘long-form˜options“require“more˜tВ!yping“butŽЁ‘Gare–Еrmore›Еqexplanatory“and“maВ!y“bMоe˜more“mnemonic.‘ With“long-form“options“yВ!ou˜need“onlyŽЁ‘Gen•В!ter›З{sucien“t˜c“haracters˜to˜uniquely˜iden“tify˜the˜option‘Зzto˜the˜program.‘F‘џeor˜example,ŽЁ‘G`т--out›ПЊ%fс'–ЮvwВ!orks,‘и{but“`т--o˜%fс'“fails›ЮwbMоecause“тunits“сhas˜other“long“options˜bMоeginning“withŽЁ‘G`тoс'.‘ннHo•В!w“ev“er,–Іf`т--qс'“wВ!orks“bšMоecause“`т--quietс'“is“the“only“long“option“b˜eginning“with“`тqс'.ŽŸzу‘!GSome–=ќoptions“require›=§argumenВ!ts“to“spMоecify“a“v‘џdDalue˜(e.g.,‘Ѓс`т-d›ПЊ12с'“or“`т--digits˜12с').ŽЁ‘GShort-form–ŽЋoptions›ŽЌthat“do˜not“tak•В!e˜argumen“ts‘ŽЋma“y˜bMоe–ŽЋconcatenated˜(e.g.,‘“j`т-erSс'˜is“equiv-ŽЁ‘GalenВ!t›фђto‘фѓ`т-e–ПЊ-r“-Sс');‘„8the˜last˜option–фѓin˜sucВ!h˜a“list˜maВ!y˜bMоe“one˜that˜takВ!es“an˜argumenВ!tŽЁ‘G(e.g.,›\O`т-ed‘ПЊ12с').‘’tWith–7юshort-form“options,˜the“space“bMоet•В!w“een›7эan–7юoption“and˜its“argumenВ!tŽЁ‘Gis–_optional“(e.g.,‘;`т-d12с'“is“equiv‘џdDalenšВ!t“to“`т-d‘ПЊ12с').‘BЩLong-form“options“ma˜y‘`not“bMоe“concate-ŽЁ‘Gnated,‘ЃPand–ЂŠthe“space“bMоet•В!w“een–ЂŠa“long-form‘Ђ‹option“and“its“argumenВ!t“is“required.‘м”Short-formŽЁ‘Gand–Щlong-form“options‘ЩmašВ!y“bMоe“in˜termixed“on“the›Щcommand“line.‘EѓOptions˜mašВ!y“bMоe“giv˜enŽЁ‘Gin–…ўanВ!y“order,›Œybut“when“incompatible‘…џoptions“(e.g.,˜т--output-format“сand“т--exponentialс)ŽЁ‘Gare–кIgivšВ!en“in‘кHcom˜bination,‘'AbMоeha˜vior“is“con˜trolled“b˜y‘кHthe“last“option“giv˜en.‘y…F‘џeor“example,ŽЁ‘G`т-o%.12f‘ПЊ-eс'–ІfgivšВ!es“expMоonen˜tial“format“with“the“default“eigh˜t“signi can˜t“digits).ŽІ‘!GThe–ІffollošВ!wing“options“are“a˜v‘џdDailable:ŽŸК‘Gт-cŽЁ‘G--check‘“MсChecВ!k–Ž.that›Ž-all“units˜and“pre xes˜de ned“in“the˜units“data˜ le“reduce˜to“primitivВ!eŽЁ‘Kт:units.‘иЧPrinВ!t–—$a›—%list“of“all“units“that˜cannot“bMоe“reduced.‘иЧAlso˜displaВ!y“some“otherŽЁ‘Kт:diagnostics–ЬЬabMоout›ЬЭsuspicious“de nitions˜in“the˜units“data“ le.‘QOnly“de nitionsŽЁ‘Kт:activšВ!e–!№in“the‘!ёcurren˜t“loMоcale“are“c˜hec˜k˜ed.‘БЖY‘џeou“should“alw˜a˜ys“run‘!ётunits“сwith“thisŽЁ‘Kт:option–Іfafter“moMоdifying“a“units“data“ le.ŽЉzт‘Gт--check-verboseŽЁ‘G--verbose-checkŽЁ‘Kт:сLikšВ!e–dthe“т--check‘dсoption,‘“Œthis“option“prin˜ts“a›dlist“of“units“that˜cannot“bMоe“re-ŽЁ‘Kт:duced.‘[_But–zцto›zчhelp“ nd˜unit“de nitions˜that“cause˜endless˜loMоops,‘Аit“lists˜theŽЁ‘Kт:units–Њas“they“are“c•В!hec“k“ed.‘шѕIf–Њтunits“сhangs,‘Ћthen“the“last‘Њunit“to“bMоe“prinВ!ted“hasŽЁ‘Kт:a–Іfbad“de nition.‘ннOnly“de nitions“activšВ!e“in“the“curren˜t“loMоcale“are“c˜hec˜k˜ed.ŽІ‘Gт-d‘ІfшndigitsŽЁ‘Gт--digits‘ІfшndigitsŽЁ‘Kт:сSet›ŸRthe‘ŸQn•В!um“bMоer˜of˜signi can“t–ŸQdigits˜in˜the˜output“to˜the˜v‘џdDalue“spMоeci ed˜(whicВ!hŽЁ‘Kт:mВ!ust–# bMоe“greater“than›# zero).‘ВF‘џeor“example,‘=Q`т-d‘ПЊ12с'“sets˜the“n•В!um“bMоer–# of“signi canВ!tŽЁ‘Kт:digits›ctto–cu12.‘With“expMоonen•В!tial˜output˜тunits˜сdispla“ys–cuone˜digit˜to˜the“left˜ofŽŽŒ‹!-Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td22ŽŽŽ ƒ33 § ЬЭ‘Kт:the–˜decimal“pMоoinšВ!tŸќОЎ2Ž‘ › сand“elev˜en“digits“to“the‘™righ˜t“of“the“decimal“pMоoin˜t.‘ FtOnŽЄ 33‘Kт:most–Жуsystems,‘ћthe“maximšВ!um“n˜um˜bMоer‘Жтof“in˜ternally“meaningful“digits‘Жтis“15;‘?!ifŽЁ‘Kт:yВ!ou–Š&spMоecify›Š'a“greater˜n•В!um“bMоer–Š&than“yВ!our˜system's“maximВ!um,‘Этunits“сwill˜prinВ!t“aŽЁ‘Kт:wšВ!arning–…and‘„set“the“n˜um˜bMоer›„to“the“largest“meaningful˜v‘џdDalue.‘Ј=T‘џeo“directly˜set“theŽЁ‘Kт:maxim•В!um›h(v‘џdDalue,‘tšgiv“e˜an˜argumen“t‘h'of˜тmax˜с(e.g.,‘tš`т-d‘ПЊmaxс').‘ЩBe˜a“w“are,‘tšof˜course,ŽЁ‘Kт:that–хц\signi canВ!t"›хчhere“refers˜only“to˜the“фdisplay‘ншсof“n•В!um“b•Mоers;‘Їif˜results‘хцdep“endŽЁ‘Kт:on›ЂПph•В!ysical‘ЂРconstan“ts˜not˜kno“wn–ЂРto˜this˜precision,‘сеthe“phВ!ysically˜meaningfulŽЁ‘Kт:precision–@кmašВ!y“bMоe‘@йless“than“that“sho˜wn.‘МThe“т--digits“сoption‘@йcon icts“with“theŽЁ‘Kт:т--output-format‘Іfсoption.ŽЉчz‘Gт-eŽЁ‘G--exponentialŽЁ‘Kт:сSet–!|the›!{nВ!umeric“output“format˜to“expMоonen•В!tial˜(i.e.,‘€Ascien“ti c‘!|notation),‘€@lik“eŽЁ‘Kт:that–ZDused›ZEin“the“Unix˜тunits“сprogram.‘Ф|The˜default“precision“is˜eighšВ!t“signi can˜tŽЁ‘Kт:digits–e(sevВ!en›eŒdigits“to“the˜righВ!t“of“the˜decimal“pšMоoinВ!t);‘{*this“can“b˜e‘eŒcВ!hanged“withŽЁ‘Kт:the–&žт--digits“сoption.‘ГEThe“т--exponential“сoption“con icts“with“the“т--output-ŽЁ‘Kт:format‘Іfсoption.ŽІ‘Gт-o‘ІfшformatŽЁ‘Gт--output-format‘ІfшformatŽЁ‘Kт:сThis–…їoption‘…іa ords“complete“conšВ!trol“o˜v˜er‘…іthe“n˜umeric“output“format‘…іusing“theŽЁ‘Kт:spMоeci ed– зхformatс.‘.The“format› жis“a“single˜ oating“pMоoin•В!t˜n“umeric– зformat˜for“theŽЁ‘Kт:тprintf()–ЉХсfunction›ЉЦin“the˜C“programming“language.‘чќAll“compilers˜suppMоort“theŽЁ‘Kт:format–ИєtВ!ypšMоes“`тgс'“and‘Иѕ`тGс'“to“sp˜ecify“signi canšВ!t“digits,‘§—`тeс'‘Иѕand“`тEс'“for“scien˜ti cŽЁ‘Kт:notation,‘н=and–Ÿ`тfс'“for›Ÿ xed-pMоoinВ!t“decimal.‘ЧтThe“ISO‘žгC99˜standard“inВ!troMоducedŽЁ‘Kт:the–DЄ`тFс'“tВ!ypšMоe‘DЃfor“ xed-p˜oinВ!t“decimal“and›DЃthe“`тaс'“and“`тAс'˜tВ!ypMоes“for“hexadecimalŽЁ‘Kт: oating–ПтpMоoinšВ!t;‘ЬŸthese“t˜ypMоes“are‘Псallo˜w˜ed“with“compilers‘Псthat“suppMоort“them.‘*PTheŽЁ‘Kт:default–грformat“is“`т%.8gс';‘jœfor“greater“precision,‘>yВ!ou“could“spMоecify“`т-o‘ПЊ%.15gс'.ŽЁ‘Kт:See–љpChapter“11“[Numeric“Output“F‘џeormat],›N2page“31,˜and“the“doMоcumenВ!tationŽЁ‘Kт:for–‘mтprintf()“сfor“more‘‘ldetailed“descriptions“of“the“format“spMоeci cation.‘žёTheŽЁ‘Kт:т--output-format–;сoption›EсandŽЁ‘Kт:its–ЌžmšВ!ultiplier‘ЌŸis“an“in˜teger“other›ЌŸthan“1,‘Ў,the“fraction˜is“givВ!en“as“the˜proMоduct“ofŽЁ‘Kт:the–ШмmšВ!ultiplier‘Шлand“the“n˜umerator“(e.g.,‘бy`т3|8›ПЊinс'‘Шлrather“than“`т3–Іf*“1|8˜inс').‘E>InŽЁ‘Kт:some–0”cases,›Sthis“is“not‘0“what“is“w•В!an“ted;‘uЊfor–0”example,˜the“results“for‘0“a“coMоokingŽЁ‘Kт:recipMоe›dўmigh•В!t‘dџsho“w˜`т3–Іf*“1|2–ПЊcupс'‘dџas˜`т3|2“cupс'.‘ЇWith˜the‘dџт--show-factor˜сop-ŽЁ‘Kт:tion,‘o•a–GXresult›GYequiv‘џdDalenВ!t“to˜1.5“cups˜will“displaВ!y˜as“`т3–Іf*“1|2‘ПЊcupс'˜rather‘GXthanŽЁ‘Kт:`т3|2‘ПЊcupс'.‘ЎзA‘–{user-spMоeci ed›–Кfractional––Йunit“with˜a“nВ!umerator“other“than˜1“isŽЁ‘Kт:nev•В!er›VЬo“v“erridden,‘‚хho“w“ev“er|if˜a˜unit‘VЭlist˜spMоeci es˜`т3|4–Іfcup;1|2“cupс',‘‚хa˜resultŽЁ‘Kт:equiv‘џdDalenšВ!t–ѕto“1‘і1/2“cups“will“alw˜a˜ys‘іbMоe“sho˜wn“as“`т2–Іf*“3|4‘ПЊcupс'‘іwhether–ѕor“notŽЁ‘Kт:the–Іfт--show-factor“сoption“is“givВ!en.ŽІ‘Gт-sŽЁ‘G--strict‘ гЃсSuppress›ЋЭcon•В!v“ersion˜of˜units˜to˜their˜reciproMоcal˜units.‘юF‘џeor˜example,‘­'тunits˜сwillŽЁ‘Kт:normally›\tcon•В!v“ert˜hertz–\sto˜seconds˜bMоecause˜these˜units˜are“reciproMоcals˜of˜eacВ!hŽЁ‘Kт:other.‘нЈThe–ЅШstrict›ЅЧoption“requires“that˜units“bMоe˜strictly“conformable˜to“pMоerformŽЁ‘Kт:a›‹ћcon•В!v“ersion,‘‘Dand˜will‘‹ќgiv“e˜an˜error˜if‘‹ќy“ou˜attempt˜to˜con“v“ert‘‹ќhertz˜to˜seconds.ŽŸ™š‘Gт-1ŽЁ‘G--one-lineŽЁ‘Kт:сGivšВ!e–Rмonly“one‘Rлline“of“output“(the“forw˜ard‘Rлcon˜v˜ersion).‘ТDo“not‘Rлprin˜t“the“rev˜erseŽЁ‘Kт:con•В!v“ersion.‘Ь^If›K;a–Kand“the˜loMоcation“of“the˜pMоersonal“unitsŽЁ‘Kт:data–Іf le;“indicate“if“the“pšMоersonal“units“data“ le“do˜es“not“exist.ŽŽŒ‹M^Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td25ŽŽŽ ƒ33 § ЬЭ‘Kт:When–Й9givšВ!en“in‘Й8com˜bination“with“the“т--terse–Й8сoption,‘Нюthe“program–Й9prin˜ts“onlyŽЄ 33‘Kт:the–ІfvšВ!ersion“n˜um˜bMоer“and“exits.ŽЉn˜‘Kт:When–д9givšВ!en‘д8in“com˜bination“with“the›д8т--verbose“сoption,–_­the˜program,“theŽЁ‘Kт:т--version–Іfсoption“has“the“same“e ect“as“the“т--info“сoption“bMоeloВ!w.ŽŸЉќ‘Gт-IŽЁ‘G--info‘RїсPrinšВ!t–Дthe˜argumenВ!t“is“dimensionless),‘L?and“that˜the“in•В!v“erseŽЄ 33‘Gfunction–DHrequires›DIan“input“argumenВ!t˜conformable“with“`тKс'.‘ З„F‘џeor“normal˜nonlinear“unitsŽЁ‘Gde nition,‘нЫthe–вЗforwšВ!ard“function“will‘вЖalw˜a˜ys“tak˜e“a“dimensionless“argumen˜t;‘шпin“general,‘нЫtheŽЁ‘Gin•В!v“erse–Чяfunction›Чюwill“need“units˜that“matcšВ!h“the“quan˜tit˜y‘Чюmeasured“b˜y“y˜our‘Чюnonlinear“unit.ŽЁ‘GSpšMоecifying–$фthe“units‘$уenables“тunits“сto“p˜erform“error‘$уc•В!hec“king–$фon“function“argumenВ!ts,‘DƒandŽЁ‘Galso–Іfto“assign“units“to“domain“and“range“spšMоeci cations,“whicВ!h“are“describ˜ed“later.ŽЉ€‘!GNext–Ќthe›Ћfunction“de nitions“appMоear.‘ћЎIn“the“example˜abMоo•В!v“e,‘]}the–Ќ`тtempFс'˜function“isŽЁ‘Gde ned‘ІfbВ!yŽŸ€‘.љœтtempF(x)–ПЊ=“(x+(-32))“degF“+“stdtempŽŽІ‘GсThis–‚пgivšВ!es“a‘‚рrule“for“con˜v˜erting“`тxс'“in“the›‚рunits“`тtempFс'“to“linear“units˜of“absolute“tempMоera-ŽЁ‘Gture,–ІfwhicšВ!h“mak˜es“it“pMоossible“to“con˜v˜ert“from“tempF“to“other“units.ŽІ‘!GT›џeo–V›enable“con•В!v“ersions‘Vœto‘V›F˜ahrenheit,‘‚Јy“ou›V›m“ust‘Vœgiv“e˜a˜rule˜for‘Vœthe˜in“v“erse˜con“v“ersions.ŽЁ‘GThe›@Њin•В!v“erse–@Љwill˜bMоe˜`тx(tempF)с'“and˜its˜de nition˜appMоears“after˜a˜`т;с'“cВ!haracter.‘ ЌЈIn˜ourŽЁ‘Gexample,–Іfthe“in•В!v“erse‘ІfisŽŸ€‘.љœтx(tempF)–ПЊ=“(tempF+(-stdtemp))/degF“+“32ŽŽІ‘GсThis›*\in•В!v“erse˜de nition‘*]tak“es˜an˜absolute˜tempMоerature˜as‘*]its˜argumen“t˜and˜con“v“erts‘*]it˜to˜theŽЁ‘GF‘џeahrenheit› tempMоerature.‘ јThe‘ in•В!v“erse˜can˜bMоe‘ omitted˜b“y˜lea“ving– out˜the˜`т;с'“cВ!haracter˜andŽЁ‘Gthe›љТin•В!v“erse˜de nition,‘˜but˜then˜con“v“ersions–љСфto‘ЊДсthe˜unit˜will˜not“b•Mоe˜p“ossible.‘з№If˜the˜in•В!v“erseŽЁ‘Gde nition–#Еis“omitted,‘=иthe“т--check“сoption“will“displašВ!y“a“w˜arning.‘ВLIt“is“up“to“y˜ou“to“calculateŽЁ‘Gand–ОИenšВ!ter‘ОЙthe“correct“in˜v˜erse›ОЙfunction“to“obtain˜propMоer“con•В!v“ersions;‘Jсthe˜т--check‘ОИсoptionŽЁ‘Gtests›чthe‘шin•В!v“erse˜at‘шone˜pMоoin“t‘шand˜prin“ts–шan˜error˜if“it˜is“not˜v‘џdDalid“there,‘>Gbut“this˜is“not˜aŽЁ‘GguaranšВ!tee–Іfthat“y˜our“in˜v˜erse“is“correct.ŽІ‘!GWith–Іfsome“de nitions,“the“units“maВ!y“v‘џdDary–џe.‘ннF“or–Іfexample,“the“de nitionŽŸ€‘.љœтsquare(x)‘(=Іx^2ŽŽІ‘Gсcan›Eha•В!v“e‘Fan“y˜arbitrary–Funits,‘9Нand˜can˜also“takВ!e˜dimensionless“argumen•В!ts.‘?{In˜suc“h‘Fa˜case,ŽЁ‘GyšВ!ou–Пюshould“фnot‘ЩисspMоecify“units.‘*vIf“a“de nition“tak˜es“a“roMоot“of‘Пяits“argumen˜ts,‘ЦPthe“de nition“isŽЁ‘Gv‘џdDalid–Іfonly“for“units“that“yield“sucВ!h“a“roMоot.‘ннF‘џeor“example,ŽІ‘.љœтsquirt(x)‘(=Іsqrt(x)ŽŽІ‘Gсis–Іfv‘џdDalid“for“a“dimensionless“argumenšВ!t,“and“for“argumen˜ts“with“ev˜en“pMоo˜w˜ers“of“units.ŽŸ€‘!GSome–qњde nitions“maВ!y›qљnot“bMоe“v‘џdDalid“for“all˜real“n•В!um“bMоers.‘ЬdIn›qњsuc“h˜cases,‘|uтunits˜сcan˜handleŽЁ‘Gerrors–ЇкbšMоetter“if“yВ!ou“sp˜ecify›Їйan“appropriate“domain“and“range.‘т9Y‘џeou˜spMоecify“the“domain“andŽЁ‘Grange–Іfas“shošВ!wn“bMоelo˜w:ŽІ‘.љœтbaume(d)–ПЊunits=[1;g/cm^3]“domain=[0,130.5]“range=[1,10]“\ŽЁ‘bЖ–(145/(145-d))–ПЊg/cm^3“;“(baume+-g/cm^3)“145“/“baumeŽŽŸГ3‘GсIn–фJthis“example“the“domain“is“spšMоeci ed‘фIafter“`тdomain=с'“with“the“endp˜oinšВ!ts“giv˜en“in“brac˜k˜ets.ŽЁ‘GIn–Уcaccord›Уdwith“mathematical˜con•В!v“en“tion,‘№Ъsquare‘Уcbrac“k“ets˜indicate–Уca˜closed“inВ!terv‘џdDal˜(one“thatŽЁ‘Gincludes–олits“endpMоoinšВ!ts),‘Фand“paren˜theses“indicate“an“opMоen“in˜terv‘џdDal‘ом(one“that“doMоes“not“includeŽЁ‘Gits–џ endpMоoinšВ!ts).‘чЪAn“in˜terv‘џdDal“can‘џ bšMоe“op˜en“or›џ closed“on˜one“or“bMоoth˜ends;‘+]an“inВ!terv‘џdDal˜that“isŽЁ‘GunšВ!bMоounded–Y™on“either“end“is“indicated‘Yšb˜y“omitting“the“limit“on“that“end.‘їvF‘џeor“example,‘†faŽЁ‘Gquan•В!tit“y–Ыto“whicšВ!h“decibMоel“(dB)‘Ы4is“applied“ma˜y‘Ы€ha˜v˜e“an˜y“v‘џdDalue“greater“than“zero,‘Хso“theŽЁ‘Grange–Іfis“indicated“bВ!y“`т(0,)с':ŽŸ€‘.љœтdecibel(x)–ПЊunits=[1;1]“range=(0,)“10^(x/10);“10“log(decibel)ŽŽІ‘GсIf–Іfthe“domain“or“range“is“givšВ!en,“the“second“endpMоoin˜t“m˜ust“bMоe“greater“than“the“ rst.ŽŽŒ‹‹RŸђ‘GсUnits‘ІfCon•В!v“ersion’Td29ŽŽŽ ƒ33 § ЬЭ‘!GThe–ъmdomain“and›ъlrange“spMоeci cations“can˜appšMоear“indep˜endenšВ!tly“and“in“an˜y‘ъlorder“alongŽЄ 33‘Gwith–xthe›yunits“spMоeci cation.‘Ќ8The˜v‘џdDalues“for“the“domain˜and“range“endpMоoinВ!ts“are˜attacВ!hed“toŽЁ‘Gthe–ЛUunits›ЛVgivВ!en“in˜the“units˜spMоeci cation,‘Р‘and“if˜necessary‘џe,‘Р‘the˜parameter“v‘џdDalue˜is“adjustedŽЁ‘Gfor–p‘comparison›pwith“the“endpMоoinВ!ts.‘<]F‘џeor“example,‘Ѓif“a“de nition˜includes“`тunits=[1;ft]с'ŽЁ‘Gand–wˆ`тrange=[3,)с',‘Ћаthe›w‡range“will“bMоe“takВ!en“as˜3“ft“to“in nitВ!y‘џe.‘QBIf“the“function˜is“passed“aŽЁ‘Gparameter–ъ7of“`т900‘Іfmmс'Ž‘+dE,›;+that“v‘џdDalue“will“bMоe‘ъ8adjusted“to“2.9527559“ft,˜whicВ!h“is“outside“theŽЁ‘GspMоeci ed–Ÿrange.‘ŠIf“yВ!ou› omit“the˜units“spMоeci cation˜from“the“previous˜example,‘,nтunits“сcanŽЁ‘Gnot–ћЕtell“whether“y•В!ou‘ћЖin“tend–ћЕthe“lo•В!w“er›ћЕendpMоoin“t˜to˜bMоe˜3‘ћЖft˜or˜3˜microfurlongs,‘ and˜can˜notŽЁ‘Gadjust–эthe›ьparameter“v‘џdDalue˜of“900˜mm“for˜comparison.‘ФqWithout“units,‘лЭnВ!umerical“v‘џdDaluesŽЁ‘Gother–WBthan›WCzero“or˜plus“or˜minšВ!us“in nit˜y“for›WCdomain“or˜range“endpMоoinВ!ts˜are“meaningless,ŽЁ‘Gand–4љaccordingly“they‘4јare“not“allo•В!w“ed.‘ ‰•If›4љy“ou˜giv“e–4јother˜v‘џdDalues˜without˜units“then˜theŽЁ‘Gde nition–Іfwill“bMоe“ignored“and“yВ!ou“will“get“an“error“message.ŽЉсЉ‘!GAlthough–Bsthe“units,–Vpdomain,“and–Bsrange“spšMоeci cations“are“optional,‘Vpit's“b˜est“to“givВ!e“themŽЁ‘Gwhen–Б#they“are›Б$applicable;‘Ж‚doing“so“alloВ!ws“тunits˜сto“pšMоerform“b˜etter“error‘Б$c•В!hec“king–Б#and“givВ!eŽЁ‘Gmore–1ъhelpful“error“messages.‘З Giving“the“domain“and“range“also‘1ыenables“the“т--check“сoptionŽЁ‘Gto–Іf nd“a“pšMоoinВ!t“in“the“domain“to“use“for“its“p˜oinšВ!t“c˜hec˜k“of“y˜our“in˜v˜erse“de nition.ŽІ‘!GY‘џeou–ЯЁcan“makšВ!e“synon˜yms‘ЯЂfor“nonlinear“units“b˜y“pro˜viding“bMоoth‘ЯЂthe“forw˜ard“and“in˜v˜erseŽЁ‘Gfunctions;‘sЎin•В!v“erse›ZSfunctions–ZRcan“bMоe“obtained“using˜the“`т~с'“opMоerator.‘ФSo“to˜create“a“synonВ!ymŽЁ‘Gfor–Іf`тtempFс'“yВ!ou“could“writeŽІ‘.љœтfahrenheit(x)–ПЊunits=[1;K]“tempF(x);“~tempF(fahrenheit)ŽŽŸсЊ‘GсThis–‚is›ƒuseful“for˜creating“a˜nonlinear“unit“de nition˜that“di ers˜slighВ!tly“from˜an“existingŽЁ‘Gde nition–Іfwithout“haВ!ving“to“repMоeat“the“original“functions.‘ннF‘џeor“example,ŽІ‘.љœтdBW(x)‘ОRunits=[1;W]–ПЊrange=[0,)“dB(x)“W“;‘ T~dB(dBW/W)ŽІ‘GсIf–•yšВ!ou“wish“a“synon˜ym‘•to“refer“to“an“existing“nonlinear“unit“without“moMоdi cation,‘˜y˜ou“canŽЁ‘Gdo–Б so“more›БŸsimply“bВ!y“adding“the˜synonšВ!ym“with“appMоended“paren˜theses‘БŸas“a“new“unit,‘ДnwithŽЁ‘Gthe–Юexisting“nonlinear›Юunit|without“parenВ!theses|as“the“de nition.‘•ХSo“to˜create“a“synonВ!ymŽЁ‘Gfor–Іf`тtempFс'“yВ!ou“could“writeŽІ‘.љœтfahrenheit()‘ TtempFŽІ‘GсThe–Іfde nition“mšВ!ust“bMоe“a“nonlinear“unit;“for“example,“the“synon˜ymŽІ‘.љœтfahrenheit()‘ TmeterŽІ‘Gсwill–Іfresult“in“an“error“message“when“тunits“сstarts.ŽŸсЊ‘!GY‘џeou–%maВ!y›%oMоccasionally“wish“to˜de ne“a“function“that˜opMоerates“on“units.‘ВМThis“can˜bMоe“doneŽЁ‘Gusing–Сa›Сnonlinear“unit˜de nition.‘-кF‘џeor“example,‘Кthe˜de nition“bMоelo•В!w˜pro“vides‘Сcon“v“ersionŽЁ‘GbMоet•В!w“een–і#radius“and›і"the“area“of“a“circle.‘ЭThis“de nition“requires“a“length˜as“input“andŽЁ‘GproMоduces– an› area“as“output,‘+Вas“indicated˜bВ!y“the“`тunits=с'˜sp•Mоeci cation.‘ЊМSp“ecifying˜the‘ rangeŽЁ‘Gas–Іfthe“nonnegativšВ!e“n˜um˜bMоers“can“prev˜en˜t“cryptic“error“messages.ŽІ‘.љœтcirclearea(r)–ПЊunits=[m;m^2]“range=[0,)‘>ўpi“r^2“;“sqrt(circlearea/pi)ŽŽŸБ‘Gы\10.4‘™De ning–f@Piecewise“Linear“UnitsŽŽŸ33‘GсSometimes–yyšВ!ou“ma˜y“bMоe‘xin˜terested“in“a“piecewise“linear“unit“suc˜h‘xas“man˜y“wire“gauges.ŽЁ‘GPiecewise–*?linear“units“can“bšMоe“de ned“bВ!y“sp˜ecifying“con•В!v“ersions–*?to“linear“units“on“a“list“ofŽЁ‘GpšMоoin•В!ts.‘ТCon“v“ersion‘Rїat–Rјother“p˜oinВ!ts“will‘Rїb˜e“done“bšВ!y‘Rїlinear“in˜terpMоolation.‘ТA‘Rтpartial“de nitionŽЁ‘Gof–Іfzinc“gauge“isŽŽŒ‹œFŸђ‘GсUnits‘ІfCon•В!v“ersion’Td30ŽŽŽ ƒ33 § ЬЭ‘.љœтzincgauge[in]–ПЊ1“0.002,“10“0.02,“15“0.04,“19“0.06,“23“0.1ŽŽЉyі‘GсIn–ўъthis›ўыexample,‘ i`тzincgaugeс'“is˜the“name“of˜the“piecewise“linear˜unit.‘І The“de nition˜of“sucВ!hŽЄ 33‘Ga–ыunit“is‘ъindicated“bšВ!y“the“em˜bMоedded“`т[с'‘ъc˜haracter.‘5lAfter“the“brac˜k˜et,‘5‹y˜ou“should“indicateŽЁ‘Gthe–кunits›к to“bMоe“attacВ!hed“to˜the“n•В!um“bMоers–кin“the˜table.‘xУNo˜spaces“can“appšMоear“b˜efore‘к the“`т]с'ŽЁ‘GcšВ!haracter,‘ˆ)so–€ša‘€™de nition“lik˜e“`тfoo[kg‘Іfmeters]с'“is–€™in˜v‘џdDalid;‘4instead“write‘€š`тfoo[kg*meters]с'.ŽЁ‘GThe–юУde nition“of“the“unit“consists“of“a“list‘юФof“pairs“optionally“separated“bВ!y“commas.‘ЖєThisŽЁ‘Glist–D›de nes“a›Dšfunction“for“con•В!v“erting–D›from˜the“piecewise“linear“unit“to˜linear“units.‘НDThe“ rstŽЁ‘Gitem–ЭŒin›ЭeacВ!h“pair“is“the˜function“argumenВ!t;‘сthe˜second“item“is˜the“v‘џdDalue“of“the˜function“atŽЁ‘Gthat–бЮargumenВ!t›бЭ(in“the˜units“spMоeci ed˜in“brac•В!k“ets).‘`In–бЮthis“example,‘мЇwВ!e˜de ne“`тzincgaugeс'ŽЁ‘Gat–} všВ!e“pMоoin˜ts.‘aэF‘џeor“example,‘ВТw˜e“set“`тzincgauge(1)с'“equal“to“`т0.002‘Іfinс'Ž‘6vx.‘aэDe nitions“lik˜eŽЁ‘Gthis–ІfmašВ!y“bMоe“more“readable“if“written“using“con˜tin˜uation“c˜haracters“asŽŸyѕ‘.љœтzincgauge[in]‘ПЊ\ŽЁ‘KЗю1‘ПЊ0.002‘ T\ŽЁ‘EјD10‘ПЊ0.02‘>ў\ŽЁ‘EјD15‘ПЊ0.04‘>ў\ŽЁ‘EјD19‘ПЊ0.06‘>ў\ŽЁ‘EјD23‘ПЊ0.1ŽŽŸRyѕ‘GсWith–Іfthe“preceding“de nition,“the“follošВ!wing“con˜v˜ersion“can“bšMоe“p˜erformed:ŽІ‘.љœтYou–ПЊhave:“zincgauge(10)ŽЁ‘.љœYou–ПЊwant:“inŽЁ‘EјD*‘ПЊ0.02ŽЁ‘EјD/‘ПЊ50ŽЁ‘.љœYou–ПЊhave:“.01“inchŽЁ‘.љœYou–ПЊwant:“zincgaugeŽЁ‘EјD5ŽŽŸ_­'‘GсIf–ZyВ!ou“de ne›Za“piecewise“linear“unit˜that“is“not“strictly“monotonic,‘iHthen“the˜in•В!v“erse–Zwill“notŽЁ‘GbMоe–ЦwšВ!ell‘Хde ned.‘"ќIf“the“in˜v˜erse›Хis“requested“for˜sucВ!h“a“unit,‘-нтunits“сwill“return˜the“smallestŽЁ‘Gin•В!v“erse.ŽІ‘!GAfter–Uadding“nonlinear“units“de nitions,‘|PyВ!ou“should“normally“run“тunits‘Іf--checkŽ‘RпсtoŽЁ‘Gc•В!hec“k–;†for“errors.‘К=If›;‡the“`тunitsс'“k•В!eyw“ord–;†is“not“givВ!en,‘Pцthe“т--check˜сoption“c•В!hec“ks–;†a“nonlinearŽЁ‘Gunit–Пбde nition›Паusing“a“dimensionless˜argumenВ!t,‘Ц,and“then˜c•В!hec“ks–Пбusing“an˜arbitrary“comВ!bi-ŽЁ‘Gnation–"ћof“units,‘B as“wšВ!ell“as“the‘"њsquare“and“cubMоe“of“that“com˜bination;‘aEa“w˜arning“is“giv˜en“ifŽЁ‘GanВ!y–Іfof“these“tests“fail.‘ннF‘џeor“example,ŽІ‘.љœтWarning:–ПЊfunction“ squirt(x) “defined“as“ sqrt(x) ŽЁ‘bЖ–failed–ПЊfor“some“test“inputs:ŽЁ‘bЖ–squirt(7(kg–ПЊK)^1):“Unit“not“a“rootŽЁ‘bЖ–squirt(7(kg–ПЊK)^3):“Unit“not“a“rootŽŽŸ8Ž‘GсRunning‘ стunits‘Іf--checkŽ‘Qф сwill– сprinšВ!t“a“w˜arning“if“a“non-monotonic“piecewise“linear“unit“isŽЁ‘GencounšВ!tered.‘вЧF‘џeor–…$example,‘‹Ыthe“relationship“bMоet˜w˜een“ANSI‘…coated“abrasiv˜e“designation“andŽЁ‘Gmean–Іfparticle“size“is“non-monotonic“in“the“vicinitВ!y“of“800“grit:ŽІ‘.љœтansicoated[micron]‘ПЊ\ŽЁ‘KЗю.–ПЊ.“.ŽЁ‘EјD600–ПЊ10.55“\ŽЁ‘EјD800–ПЊ11.5“\ŽЁ‘EјD1000–ПЊ9.5“\ŽŽŽŒ‹ЌлŸђ‘GсUnits‘ІfCon•В!v“ersion’Td31ŽŽŽ ƒ33 § ЬЭ‘GRunning–Іfтunits“--checkŽ‘Oя*сw•В!ould›Іfgiv“e˜the˜error˜messageŽЄF*‘.љœтTable–ПЊ ansicoated “lacks“unique“inverse“around“entry“800ŽŽЁ‘GсAlthough–Ÿ‘the“in•В!v“erse–Ÿ‘is“not“wВ!ell“de ned›Ÿin“this“region,‘нмit's˜not“really“an“error.‘Щ^ViewingŽЄ 33‘GsucВ!h–Aerror›Amessages“can“bMоe˜tedious,‘UUand“if˜there“are“enough˜of“them,‘UUthey“can˜distract“fromŽЁ‘Gtrue–(Аerrors.‘dМError“c•В!hec“king–(Аfor“nonlinear“unit“de nitions“can“bMоe‘(Бsuppressed“bВ!y“giving“theŽЁ‘G`тnoerrorс'›Іfk•В!eyw“ord;˜for˜the˜examples˜abMоo“v“e,˜this˜could˜bMоe˜done˜asŽЉF*‘.љœтsquirt(x)–ПЊnoerror“domain=[0,)“range=[0,)“sqrt(x);“squirt^2ŽЁ‘.љœansicoated[micron]–ПЊnoerror“\ŽЁ‘KЗю.–ПЊ.“.ŽŽŸ,Ќ‘GсUse–*the“`тnoerrorс'“k•В!eyw“ord–*with“caution.‘ДgThe“safest“approacВ!h“after“adding“a“nonlinear“unitŽЁ‘Gde nition–лєis›лѓto“run“тunits‘Іf--checkŽ‘NZEсand“con rm“that˜there“are˜no“actual“errors˜bMоefore“addingŽЁ‘Gthe–Іf`тnoerrorс'“k•В!eyw“ord.ŽŸs‘Gы\10.5‘™De ning–f@Unit“List“AliasesŽŽŸ33‘GсUnit–Ћлlist›Ћкaliases“are“treated˜di erenВ!tly“from˜unit“de nitions,‘­8bMоecause˜they“are“a˜data“enВ!tryŽЁ‘Gshorthand–5Фrather“than“a“true‘5Хde nition“for“a“new“unit.‘‹їA‘5 unit“list“alias“de nition“bMоeginsŽЁ‘Gwith–С`т!unitlistс'“and›Рincludes“the“alias“and“the˜de nition;‘<Ѓfor“example,‘'{the“aliases“includedŽЁ‘Gin–Іfthe“standard“units“data“ le“areŽІ‘.љœт!unitlist‘>ўhms‘ОRhr;min;secŽЁ‘.љœ!unitlist‘>ўtime‘ўЈyear;day;hr;min;secŽЁ‘.љœ!unitlist‘>ўdms‘ОRdeg;arcmin;arcsecŽЁ‘.љœ!unitlist‘>ўftin‘ўЈft;in;1|8‘ПЊinŽЁ‘.љœ!unitlist–>ўusvol“cup;3|4–ПЊcup;2|3“cup;1|2“cup;1|3“cup;1|4“cup;\ŽЁ’Ёђфtbsp;tsp;1|2–ПЊtsp;1|4“tsp;1|8“tspŽŽŸTF)‘GсUnit–šTlist›šSaliases“are“only˜for“unit˜lists,‘œОso“the˜de nition“mВ!ust“include˜a“`т;с'.‘йзUnit˜list“aliasesŽЁ‘Gcan–оnevšВ!er‘пbMоe“com˜bined›пwith“units˜or“other“unit˜list“aliases,‘9њso“the˜de nition“of˜`тtimeс'“shoВ!wnŽЁ‘GabšMоo•В!v“e–Іfcould“фnot‘АPсha•В!v“e–Іfb˜een“shortened“to“`тyear;day;hmsс'.ŽІ‘!GAs–busual,‘5–bMоe“sure“to›arun“тunits‘Іf--checkŽ‘Nе"сto“ensure“that“the“units“listed˜in“unit“list“aliasesŽЁ‘Gare‘Іfconformable.ŽŸ&%ю‘GыS11‘ ИQNumeric–zГOutput“F‘ўaGormatŽŽŸ"l‘GсBy–Sbdefault,‘~ тunits“сshošВ!ws“results“to‘Saeigh˜t“signi can˜t“digits.‘фаY‘џeou“can“c˜hange‘Sathis“with“theŽЁ‘Gт--exponentialс,‘žqт--digitsс,‘žrand›lет--output-format–lжсoptions.‘1,The“ rst“sets˜an“expMоonenВ!tialŽЁ‘Gformat– Н(i.e.,‘g‘scienšВ!ti c“notation)‘ Мlik˜e“that› Мused“in˜the“original˜Unix“тunits˜сprogram,‘g’theŽЁ‘Gsecond›ТŠallo•В!ws‘Т‰y“ou˜to‘Т‰spMоecify˜a˜di eren“t‘Т‰n“um“bMоer˜of‘Т‰signi can“t˜digits,‘ ’and˜the‘Т‰last˜allo“wsŽЁ‘Gy•В!ou› ,to‘ +con“trol˜the˜output– +appMоearance˜using˜the“format˜for˜the“тprintf()˜сfunction˜in“the˜CŽЁ‘Gprogramming–…хlanguage.‘}ВIf“yšВ!ou“only‘…цw˜an˜t“to“c˜hange“the“n˜um˜bMоer“of“signi can˜t“digits“or“spMоecifyŽЁ‘GexpMоonenšВ!tial–Eћformat“t˜ypMоe,‘mпuse“the“т--digits‘Eњсand“т--exponential“сoptions.‘М›The“т--output-ŽЁ‘Gformat–їсoption“a ords“the‘ї€greatest“conВ!trol“of“the“output“appMоearance,‘ Цbut“requires“at“leastŽЁ‘Grudimen•В!tary› kno“wledge˜of˜the˜тprintf()˜сformat˜syn“tax.‘oŠSee˜Chapter˜9˜[In“v“oking˜Units],ŽЁ‘Gpage–Іf20,“for“descriptions“of“these“options.ŽŽŒ‹ Й8Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td32ŽŽŽ ƒ33 § ЬЭ‘Gы\11.1‘™F‘ўІformat‘f@Sps3eci cationŽŽŸ33‘GсThe–мformat“spMоeci cation“recognized“with“the‘нт--output-format“сoption“is“a“subset“of“thatŽЄ 33‘Gfor–,Ттprintf()с.‘ЕQThe“format“spMоeci cation“has“the“form“т%с[ф ags‘цс][фwidth›з с][т.фpr–џpЙe“cision˜с]фtyp“e‘вЁс;‘UNit‘,ТmВ!ustŽЁ‘GbšMоegin–)Сwith“`т%с',‘J—and“mВ!ust‘)Рend“with“a“ oating-p˜oinšВ!t“t˜yp•Mоe›)Рsp“eci er:‘ф“`тgс'–)Сor“`тGс'˜to“spMоecify“theŽЁ‘Gn•В!um“bMоer›Oёof‘O№signi can“t˜digits,‘a;`тeс'–O№or˜`тEс'“for˜scienВ!ti c˜notation,‘a;and“`тfс'˜for“ xed-pMоoinВ!t˜decimal.ŽЁ‘GThe–Ђ§ISO‘ЂќC99“standard“added“the“`тFс'“tВ!ypšMоe“for“ xed-p˜oinšВ!t“decimal“and“the“`тaс'“and“`тAс'“t˜ypMоesŽЁ‘Gfor–ѓЂhexadecimal“ oating“pMоoinšВ!t;‘@these“t˜ypMоes“are“allo˜w˜ed“with“compilers“that“suppMоort“them.ŽЁ‘GTВ!yp•Mоe›!length‘"mo“di ers˜(e.g.,‘j`тLс'˜to–"indicate˜a“long˜double)˜are“inapplicable˜and“are˜notŽЁ‘Gallo•В!w“ed.ŽЉтП‘!GThe–§Qdefault›§Rformat“for˜тunits“сis˜`т%.8gс';‘ЈЦfor˜greater“precision,‘г yВ!ou˜could“spMоecifyŽЁ‘G`т-o‘ПЊ%.15gс'.‘$5The–h„`тgс'›hƒand“`тGс'˜format˜tВ!ypMоes“use˜expMоonenВ!tial“format˜whenevВ!er“the˜expMоonenВ!tŽЁ‘GwВ!ould–УJbMоe›УKless“than˜ъс4,‘Ъƒso˜the“v‘џdDalue˜0.000013“displaВ!ys˜as“`т1.3e-005с'.‘4‹These“tВ!ypMоes˜also“useŽЁ‘GexpšMоonenВ!tial–ћЂnotation‘ћЃwhen“the“exp˜onenВ!t“is›ћЃgreater“than“or˜equal“to“the“precision,‘ђso“withŽЁ‘Gthe›ž,default–ž-format,‘Ÿбthe“v‘џdDalue˜5–^yъ“с10ŸќОЎ7Ž‘ сdisplaВ!ys˜as–ž-`т50000000с'˜and“the˜v‘џdDalue“5–^yъ“с10ŸќОЎ8Ž‘ŸсdisplaВ!ysŽЁ‘Gas–йH`т5e+008с'.‘v‚If“yšВ!ou“prefer“ xed-pMоoin˜t“displa˜y‘џe,‘цy˜ou“migh˜t‘йGspMоecify“`т-o‘ПЊ%.8fс';‘ђЙho˜w˜ev˜er,‘цsmallŽЁ‘Gn•В!um“bMоers›оwill‘пdispla“y˜v“ery˜few‘пsigni can“t˜digits,‘/‘Gсmaking–c-the›c,magnitude“readily“apparenВ!t.‘1Unfortunately‘џe,‘’^few“compilers“suppMоort˜the“digit-ŽЉ 33‘Ggrouping‘Іf ag.ŽЁ‘!GWith–Йгthe“`т-с'“ ag,‘щ#the“output“v‘џdDalue“is“left‘Йвaligned“within“the“spMоeci ed“ eld“width.‘If“a“ eldŽІ‘Gwidth–њ"greater›њ!than“needed˜to“shoВ!w˜the“output˜v‘џdDalue“is˜spMоeci ed,‘the˜`т0с'“(zero)˜ ag“causesŽІ‘Gthe–СKoutput›СJv‘џdDalue“to˜bMоe“left˜padded“with˜zeros“unВ!til˜the“spMоeci ed“ eld˜width“is˜reacВ!hed;‘ЮНforŽІ‘Gexample,–Іfwith“the“format“`т%011.6fс',ŽЁ‘.љœтYou–ПЊhave:“troypoundŽІ‘.љœYou–ПЊwant:“grainŽІ‘\іь*‘ПЊ5760.000000ŽІ‘\іь/‘ПЊ0000.000174ŽЁ‘GсThe–Іf`т0с'“ ag“has“no“e ect“if“the“`т-с'“(left“align)“ ag“is“givВ!en.ŽŸ‚‘‘Gы\11.3‘™Field‘f@WidthŽŽŸ33‘GсBy–г2default,‘оfthe“output›г3v‘џdDalue“is˜left“aligned“and˜shoВ!wn“with˜the“minimВ!um˜width“necessaryŽІ‘Gfor–dothe›dnspMоeci ed“(or˜default)“precision.‘їIf˜a“ eld“width˜greater“than˜this“is“spMоeci ed,‘“№theŽІ‘Gv‘џdDalue–ЧdshošВ!wn‘Чeis“righ˜t›Чealigned,‘Ѓand“padded˜on“the˜left“with“enough˜spaces“to˜proВ!vide“theŽІ‘GspšMоeci ed‘АE eld–АDwidth.‘ћyA‘Аwidth“sp˜eci cation–АEis“tВ!ypically‘АDused“with“ xed-p˜oinВ!t‘АDdecimal“toŽІ‘Gha•В!v“e–Tcolumns›Tof“n•В!um“bMоers–Talign˜at“the“decimal“pMоoinВ!t;‘oŠthis“arguably˜is“less“useful˜with“тunitsŽІ‘Gсthan–ќwith“long“columnar“output,‘kЁbut‘ћit“mašВ!y“nonetheless“assist“in“quic˜kly“assessing“theŽІ‘GrelativВ!e–Іfmagnitudes“of“results.‘ннF‘џeor“example,“with“the“format“`т%12.6fс',ŽЁ‘.љœтYou–ПЊhave:“kmŽІ‘.љœYou–ПЊwant:“inŽІ‘\іь*‘ПЊ39370.078740ŽІ‘\іь/‘ОR0.000025ŽŽЄ4ЬЬ‘.љœYou–ПЊhave:“kmŽІ‘.љœYou–ПЊwant:“rodŽІ‘\іь*‘>ў198.838782ŽІ‘\іь/‘ОR0.005029ŽŽЁ‘.љœYou–ПЊhave:“kmŽІ‘.љœYou–ПЊwant:“furlongŽІ‘\іь*‘ОR4.970970ŽІ‘\іь/‘ОR0.201168ŽŽŸD)‘Gы\11.4‘™PrecisionŽŽŸ33‘GсThe–g%meaning›g$of“\precision"˜depMоends“on˜the“format˜tВ!ypMоe.‘ With˜`тgс'“or˜`тGс',‘—Tit˜spMоeci es“theŽІ‘Gn•В!um“bMоer–дЇof“signi canšВ!t‘дЈdigits“(lik˜e“the“т--digits“сoption);‘ыШwith“`тeс',–р7`тEс',›р8`тfс',“or–дЇ`тFс',˜it“spMоeci esŽІ‘Gthe–ІfmaximšВ!um“n˜um˜bšMоer“of“digits“to“b˜e“shoВ!wn“after“the“decimal“p˜oinВ!t.ŽЄŠ>‘!GWith–/ёthe›/ђ`тgс'“and“`тGс'˜format“tВ!ypMоes,›’Ttrailing“zeros“are“suppressed,˜so“the‘/ђresults“maВ!yŽІ‘Gsometimes›Yha•В!v“e˜few“er˜digits˜than‘Zthe˜sp•Mоeci ed˜precision˜(as˜indicated˜ab“o•В!v“e,‘Чthe˜`т#с'˜ agŽІ‘Gcauses–Іftrailing“zeros“to“bMоe“displa•В!y“ed).ŽЁ‘!GThe–‘\default“precision›‘]is“6,‘•‘so“`т%gс'“is˜equiv‘џdDalenšВ!t“to“`т%.6gс',‘•‘and“w˜ould“sho˜w‘‘]the“output“toŽІ‘Gsix›ž"signi canВ!t–ž!digits.‘лSimilarly‘џe,‘ŸЩ`т%eс'“or˜`т%fс'“w•В!ould˜sho“w–ž!the˜output˜with“six˜digits“after˜theŽІ‘Gdecimal‘ІfpMоoinВ!t.ŽŽŒ‹"и Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td34ŽŽŽ ƒ33 § ЬЭ‘!GThe–ш2C‘ш!тprintf()›ш3сfunction“alloВ!ws“a“precision“of˜arbitrary“size,‘јЅwhether“or“not˜all“of“theŽЄ 33‘Gdigits–D{are“meaningful.‘ИWith“most‘Dzcompilers,‘lthe“maximšВ!um“in˜ternal“precision“with“тunitsŽЁ‘Gсis–ŒP15“decimal“digits“(or“13“hexadecimal“digits).‘е+With“the“т--digits“сoption,‘‘ˆyВ!ou“are“limitedŽЁ‘Gto–јлthe‘јмmaximšВ!um“in˜ternal“precision;‘"with‘јмthe“т--output-format“сoption,‘ yy˜ou“ma˜y‘јмspMоecify“aŽЁ‘Gprecision–žgreater“than“this,‘ "but“it“maВ!y“not“bšMоe“meaningful.‘л@In‘ž‘some“cases,‘ !sp˜ecifying“excessŽЁ‘Gprecision–a'can“result“in‘a&rounding“artifacts.‘ЦШF‘џeor“example,›oa“pMоound“is“exactly“7000“grains,˜butŽЁ‘Gwith–Іfthe“format“`т%.18gс',“the“output“mighВ!t“bMоeŽЉQ‹‘.љœтYou–ПЊhave:“poundŽЁ‘.љœYou–ПЊwant:“grainŽЁ‘\іь*‘ПЊ6999.9999999999991ŽЁ‘\іь/‘ПЊ0.00014285714285714287ŽІ‘GсWith–Іfthe“format“`т%.25gс'“yšВ!ou“migh˜t“get“the“follo˜wing:ŽŸQŠ‘.љœтYou–ПЊhave:“1/3ŽЁ‘.љœYou‘ПЊwant:ŽЁ‘\іьDefinition:‘ПЊ0.333333333333333314829616256247ŽІ‘GсIn–{чthis“case“the›{цdispla•В!y“ed–{чv‘џdDalue“includes“a“series“of“digits“that˜represenВ!t“the“underlying“binaryŽЁ‘G oating-pMоoin•В!t›sЌappro“ximation˜to˜1/3˜but˜are‘sЋnot˜meaningful˜for˜the˜desired˜computation.ŽЁ‘GIn–œgeneral,‘ž-the“result“with‘œ excess“precision“is“system“depMоendenВ!t.‘кpThe“precision“a ects“onlyŽЁ‘Gthe–9„фdisplay‘1†сof“n•В!um“bMоers;‘ƒif–9…a›9„result“relies˜on“ph•В!ysical˜constan“ts–9…that˜are“not˜knoВ!wn“to˜theŽЁ‘GspšMоeci ed–precision,‘6ђthe“n•В!um“b˜er–of“phšВ!ysically“meaningful‘digits“ma˜y“bMоe“less“than“the“n˜um˜bMоerŽЁ‘Gof–Іfdigits“shoВ!wn.ŽІ‘!GSee–’жthe“doMоcumenВ!tation“for›’зтprintf()“сfor“more“detailed“descriptions“of˜the“format“spMоeci-ŽЁ‘G cation.ŽІ‘!GThe–65т--output-format›64сoption“is˜incompatible“with“the˜т--exponential“сor˜т--digits“сop-ŽЁ‘Gtions;‘Pyif–%‚the“former“is“givšВ!en“in“com˜bination“with“either“of‘%ƒthe“latter,‘?Ithe“format“is“con˜trolledŽЁ‘GbšВ!y–Іfthe“last“option“giv˜en.ŽŸ"<Џ‘GыS12‘ ИQLo‘Š=calizationŽŽŸŽ;‘GсSome–јsunits“ha•В!v“e›јsdi eren“t‘јtv‘џdDalues˜in˜di eren“t˜lo•Mоcations.‘дThe˜lo“calization˜feature˜accommo-ŽЁ‘Gdates– this“b•В!y› allo“wing– a“units“data“ le˜to“spšMоecify“de nitions“that“dep˜end‘ on“the“user'sŽЁ‘GloMоcale.ŽŸ-ƒ‘Gы\12.1‘™Los3caleŽŽŸ33‘GсA‘ёloMоcale–ћis“a“subset“of“a“user's“en•В!vironmen“t–ћthat‘њindicates“the“user's“language“and“counВ!try‘џe,ŽЁ‘Gand–Hїsome“attendanšВ!t“preferences,‘Б›suc˜h“as“the“formatting“of‘Hјdates.‘ ХThe“тunits“сprogramŽЁ‘Gattempts–^to“determine“the“lošMоcale‘]from“the“POSIX‘ўen_USŽŸPu‘GсY‘џeou–Іfcan“force“тunits“сto“run“in“a“desired“loMоcale“bВ!y“using“the“т-l“сoption.ŽІ‘!GIn–y&order›y'to“create˜unit“de nitions˜for“a˜particular“loMоcale˜yВ!ou“bMоegin˜a“bloMоcВ!k˜of“de nitionsŽЁ‘Gin–a›џunit“data le˜with“`т!localeс'“follo•В!w“ed˜b“y–a“loMоcale˜name.‘ 8ЊThe“`т!с'˜mВ!ust“bMоe˜the“ rstŽЁ‘GcšВ!haracter–1™on“the“line.‘ЖюThe‘1˜тunits“сprogram“reads“the“follo˜wing“de nitions‘1˜only“if“the“curren˜tŽЁ‘GlošMоcale–кэmatcВ!hes.‘š Y‘џeou‘кюend“the“blo˜cВ!k“of“lo˜calized›кюunits“with“`т!endlocaleс'.‘š Here˜is“an“example,ŽЁ‘GwhicВ!h–Іfde nes“the“British“gallon.ŽŸPu‘.љœт!locale‘ПЊen_GBŽЁ‘.љœgallon‘(=І4.54609‘ПЊliterŽЁ‘.љœ!endlocaleŽŽŸ9’J‘Gы\12.2‘™Additional‘f@Los3calizationŽŽŸ33‘GсSometimes–cОthe›cПloMоcale“isn't˜sucienВ!t“to˜determine“unit“preferences.‘ЧІThere“could˜bMоe“regionalŽЁ‘Gpreferences,‘ЏХor–zВa“companšВ!y“could“ha˜v˜e“spMоeci c“preferences.‘ZТThough“probably“uncommon,ŽЁ‘GsucВ!h–к€di erences›кcould“arise˜with“the“cВ!hoice˜of“English“customary˜units“outside˜of“English-ŽЁ‘GspMоeaking–йРcounšВ!tries.‘wыT‘џeo“address“this,‘&—тunits“сallo˜ws“spšMоecifying“de nitions“that“dep˜end“onŽЁ‘Gen•В!vironmen“t–sзv‘џdDariable›sжsettings.‘F/The“en•В!vironmen“t˜v‘џdDariables–sзcan“bMоe˜conВ!troled“based˜on“theŽЁ‘GcurrenВ!t–ІfloMоcale,“or“the“user“can“set“them“to“force“a“particular“group“of“de nitions.ŽІ‘!GA‘чЈconditional–ш1252“in›>the“US‘=ьand“W–џeestern˜EuropMоe).‘ЄфY“ou˜can–>evВ!en“use“UTF-8,‘c§though“some“mes-ŽЁ‘Gsages–цMmaВ!y“b•Mоe›цLimprop“erly–цMaligned,‘ Иand“тunits“сwill˜not“detect“inВ!v‘џdDalid“UTF-8˜sequences.‘еIf“yВ!ouŽЁ‘Guse–еgUTF-8›еhencoMоding“when˜UnicošMоde“supp˜ort›еhis“not˜activ•В!e,‘с'y“ou˜should‘еgplace˜an“y‘еgde nitionsŽЁ‘Gwith–Ѕ•non-ASCIšMоI“cВ!haracters–Ѕ–фoutside‘x6с`т!utf8с'‘Oy.–Ї‘.“.Ž‘Зљ`т!endutf8с'“blo˜cВ!ks|otherwise,‘ЅПthey–Ѕ•will“b˜eŽЁ‘Gignored.ŽЉ‚‘!GTВ!ypšMоeset–l}material“other‘l~than“co˜de“examples“usually“uses“the‘l~Unico˜de“minВ!us“(Uт+с2212)ŽЁ‘Grather–ЃZthan‘ЃYthe“ASCIšMоI‘Ѓh•В!yphen-min“us‘ЃZop˜erator–ЃY(Uт+с002D)‘Ѓused“in›ЃZтunitsс;‘!гthe“ gure˜dashŽЁ‘G(Uт+с2012)–1•and“en“dash“(Uт+с2013)›1”are“also“oMоccasionally“used.‘jT‘џeo“allo•В!w˜suc“h–1•material“to“bMоeŽЁ‘Gcopied–ŠРand“pasted“for“in•В!teractiv“e‘ŠПuse–ŠРor“in“units“data“ les,‘Gтunits“сcon•В!v“erts–ŠРthese“cВ!haractersŽЁ‘Gto–ДБUт+с002D‘Д­bšMоefore“further“pro˜cessing.‘НBecause“of“this,‘ИCnone“of“these‘ДАcВ!haracters“can“app˜earŽЁ‘Gin–Іfunit“names.ŽŸ!иŸ‘GыS16‘ ИQReadline‘zГSupp‘Š=ortŽŽŸаР‘GсIf–`Wthe“тreadline›`VсpacВ!k‘џdDage“has“bMоeen“compiled“in,‘Ювthen“when“тunits˜сis“used“in•В!teractiv“ely‘џe,ŽЁ‘GnВ!umerous–B"command›B!line“editing“features“are˜a•В!v‘џdDailable.‘БT‘џeo˜c“hec“k–B"if“yšВ!our“v˜ersion‘B!of“тunitsŽЁ‘Gсincludes–Іfтreadlineс,“in•В!v“ok“e–Іfthe“program“with“the“т--version“сoption.ŽІ‘!GF‘џeor–F'complete›F(information“abMоout“тreadlineс,‘Ygconsult˜the“doMоcumenВ!tation“for˜the“тreadlineŽЁ‘Gсpac•В!k‘џdDage.‘‚Without›Зђan“y‘Зѓcon guration,‘ќUтunits˜сwill˜allo“w˜editing‘Зѓin˜the˜st“yle‘Зѓof˜emacs.‘‚OfŽЁ‘Gparticular–Іfuse“with“тunits“сare“the“completion“commands.ŽŸƒ‘!GIf–7yšВ!ou“t˜ypMоe“a“few“c˜haracters“and“then“hit‘7тESC“сfollo˜w˜ed“b˜y“ш?“сthen“тunits“сwill“displa˜y“aŽЁ‘Glist–ZŸof“all“the›Zžunits“that“start“with“the“c•В!haracters˜t“ypMоed.‘Ф›F‘џeor‘ZŸexample,‘iЧif˜y“ou›ZŸt“ypMоe˜шmetr˜сandŽЁ‘Gthen–Іfrequest“completion,“yšВ!ou“will“see“something“lik˜e“this:ŽІ‘.љœтYou–ПЊhave:“metrŽЁ‘.љœmetre‘JЛЂmetriccup‘3Мњmetrichorsepower‘ TmetrictenthŽЁ‘.љœmetretes‘9|Єmetricfifth–(=Іmetricounce“metrictonŽЁ‘.љœmetriccarat–(=Іmetricgrain“metricquart“metricyarncountŽЁ‘.љœYou–ПЊhave:“metrŽŽŸDьO‘GсIf–SЏthere“is“a“unique“w•В!a“y›SАto–SЏcomplete“a“unitname,‘ПyВ!ou“can˜hit“the“тTAB“сkВ!ey“and“тunitsŽЁ‘Gсwill–l›proВ!vide›lšthe“rest“of˜the“unit˜name.‘0{If“тunits“сbMоeeps,‘ž'it“means˜that“there“is˜no“uniqueŽЁ‘Gcompletion.‘ннPressing–Іfthe“тTAB“сkšВ!ey“a“second“time“will“prin˜t“the“list“of“all“completions.ŽІ‘!GThe–jreadline“library“also›jkВ!eeps“a“history“of“the“v‘џdDalues˜yšВ!ou“en˜ter.‘ЩМY‘џeou“can“mo˜v˜e“throughŽЁ‘Gthis–@history›?using“the˜up“and“do•В!wn˜arro“ws.‘Џ&The˜history–@is“sa•В!v“ed˜to–@the˜ le“т.units_historyŽЁ‘Gсin–:еyšВ!our“home“directory‘:жso“that“it“will“pMоersist“across“m˜ultiple“тunits‘:жсin˜v˜oMоcations.‘КIf“y˜ou“wishŽЁ‘Gto›шk•В!eep‘щw“ork˜for–щa˜certain“pro‘›Лject˜separate“yВ!ou˜can“cВ!hange˜the“history˜ lename“using˜theŽЁ‘Gт--history–!№сoption.‘P|Y‘џeou“could,‘@вfor“example,‘@гmakВ!e“an“alias‘!ёfor“тunits“сto“тunits‘Іf--historyŽЁ‘G.units_history–Ісso“that‘Ѕтunits“сwšВ!ould“sa˜v˜e“separate“history‘Ѕin“the“curren˜t“directory‘џe.‘œTheŽЁ‘Glength–’]of“eacВ!h›’\history“ le“is“limited“to˜5000“lines.‘кNote“also“that“if“yВ!ou˜run“sevšВ!eral“concurren˜tŽЁ‘Gcopies–Іfof“тunits“сeacšВ!h“one“will“sa˜v˜e“its“new“history“to“the“history“ le“upMоon“exit.ŽŽŒ‹()ЬŸђ‘GсUnits‘ІfCon•В!v“ersion’Td40ŽŽŽ ƒ33 § ЬЭ‘GыS17‘ ИQUp‘Š=dating–zГCurrency“Exc‘џuТhange“RatesŽŽЉS4‘GсThe–žчunits›žшprogram“includes“currency“excВ!hange˜rates“and“prices“for˜some“preciousŽЄ 33‘Gmetals–ЅШin“the‘ЅЩdatabase.‘ мOf“course,‘e these“v‘џdDalues“cšВ!hange“o˜v˜er“time,‘e sometimes“v˜eryŽЁ‘Grapidly›џe,‘4уand–~Ытunits“сcannot“proВ!vide“real“time“v‘џdDalues.‘ g T˜o“upMоdate“the“excВ!hange“ratesŽЁ‘Grun–ЌUthe›ЌTтunits_curс,‘mЯwhicВ!h“rewrites“the˜ les“conВ!taining“the˜currency“rates,‘mЯtВ!ypicallyŽЁ‘Gт/usr/share/units/currency.unitsс.‘WjThis–y•program‘y”requires“тpython“сand“the“тunidecodeŽЁ‘Gсpac•В!k‘џdDage,‘њКand›PDm“ust‘PEb•Mоe˜run˜with˜suitable˜p“ermissions˜to˜write˜the˜ le.‘ лwT‘џeo˜kВ!eep˜theŽЁ‘Grates–ЇupMоdated›Їautomatically‘џe,‘чFrun“it˜using“a“cron˜job“on“a˜Unix-likВ!e“system,‘чFor˜a“similarŽЁ‘GscšВ!heduling–7program“on“a“di eren˜t“system.‘ЌCurrency“exc˜hange“rates“are“tak˜en“from“TimeŽЁ‘GGenie‘y+(тhttp:‘ЌŸ/–Ќ /›„Ъwww“.˜timegenie“.˜comс)–y+and›y*precious“metals“pricing“from“P•В!ac“k“etizer˜(тwww‘Ќ .ŽЁ‘Gpacketizercб.LЩcomс).‘K|These– Fsites“upšMоdate‘ Eonce“p˜er“daВ!y‘џe,‘>Оso‘ Ethere“is“no“b˜ene t‘ Ein“running“theŽЁ‘GupMоdate–щscript“more›щoften“than“daily–џe.‘Ї[Y“ou˜can–щrun“тunits_cur“сwith“a˜ lename“spMоeci ed“onŽЁ‘Gthe–уcommand›тline“and“it˜will“write“the˜data“to“that“ le.‘,SIf˜yšВ!ou“giv˜e“`т-с'›тfor“the“ le˜it“willŽЁ‘Gwrite–Іfto“standard“output.ŽŸ йš‘GыS18‘ ИQDatabase–zГCommand“Syn‘џuТtaxŽŽІ‘Gшunit‘ПЊdefinitionŽЁ‘Kт:сDe ne–Іfa“regular“unit.ŽЉ Э‘Gшprefixт-‘ПЊшdefinitionŽЁ‘Kт:сDe ne–Іfa“pre x.ŽІ‘Gшfuncnameт(шvarт)–ПЊnoerror“units=[шin-unitsт,шout-unitsт]“domain=[шx1т,шx2т]ŽЁ‘Grange=[шy1т,шy2т]–ПЊшdefinition(var)“т;“шinverse(funcname)ŽЁ‘Kт:сDe ne–Бa›Вnonlinear“unit˜or“unit˜function.‘ж The˜four“optional˜k•В!eyw“ords‘Бтnoerrorс,ŽЁ‘Kт:тunits=с,‘Ятrange=–Uэсand“тdomain=“сcan“appMоear“in“anВ!y“order.‘ьsThe“de nition“of“theŽЁ‘Kт:in•В!v“erse–Іfis“optional.ŽŸ Ю‘Gшtabnameт[шout-unitsт]–ПЊnoerror“шpair-listŽЁ‘Kт:сDe ne–ˆ#a“piecewise“linear“unit.‘гЧThe“pair“list“givšВ!es“the“pMоoin˜ts“on“the“table“listedŽЁ‘Kт:in–Іfascending“order.‘ннThe“тnoerror“сk•В!eyw“ord–Іfis“optional.ŽІ‘Gт!endlocaleŽЁ‘Kт:сEnd–Іfa“blošMоcВ!k“of“de nitions“b˜eginning“with“`т!localeс'ŽІ‘Gт!endutf8‘ гЃсEnd–Іfa“blošMоcВ!k“of“de nitions“b˜egun“with“`т!utf8с'ŽІ‘Gт!endvar‘“MсEnd–Іfa“blošMоcВ!k“of“de nitions“b˜egun“with“`т!varс'“or“`т!varnotс'ŽІ‘Gт!include‘ПЊшfileŽЁ‘Kт:сInclude–Іfthe“spMоeci ed“ le.ŽІ‘Gт!locale‘ПЊшvalueŽЁ‘Kт:сLoad–Іfthe“folloВ!wing“de nitions“only“of“the“loMоcale“is“set“to“хv‘џdDalueс.ŽІ‘Gт!message‘ПЊшtextŽЁ‘Kт:сDisplaВ!y–wJхtext‘ДJсwhen“the›wKdatabase“is“read“unless“the“quiet˜option“(т-qс)“is“enabled.ŽІ‘Gт!set–ПЊшvariable“valueŽЁ‘Kт:сSets–ъVthe“en•В!vironmen“t‘ъWv–џdDariable,›ћRхv“ariableс,˜to–ъVthe“spMоeci ed“v‘џdDalue‘ъWфonly‘)jif‘doMоcumen“tation:‘Гa˜free˜program˜should‘>come˜with˜man“ualsŽЁ‘'ПЋproВ!viding–urthe›ussame“freedoms˜that“the˜soft•В!w“are–urdoMоes.‘ЭŒBut˜this“License˜is“not˜limited“toŽЁ‘'ПЋsoft•В!w“are›­тman“uals;‘БЁit–­уcan˜bMоe“used˜for“anВ!y˜textual“wВ!ork,‘ЏСregardless“of˜sub‘›Лject“matter˜orŽЁ‘'ПЋwhether–Ч2it“is“published“as“a“prinВ!ted“b•Mоo“ok.‘@BW‘џee–Ч2recommend“this“License“principally“forŽЁ‘'ПЋwВ!orks–Іfwhose“purpMоose“is“instruction“or“reference.ŽŸх ‘-1.Ž‘'ПЋAPPLICABILITY–ІfAND“DEFINITIONSŽІ‘'ПЋThis–Ь>License‘Ь=applies“to“anšВ!y“man˜ual‘Ь=or“other“w˜ork,‘Гin“an˜y–Ь=medium,‘Дthat“con˜tains‘Ь>aŽЁ‘'ПЋnotice–§placed›§bВ!y“the˜cop•В!yrigh“t‘§holder˜sa“ying–§it˜can“bMоe˜distributed“under˜the“termsŽЁ‘'ПЋof–€†this“License.‘l=SucšВ!h“a“notice“gran˜ts“a“w˜orld-wide,‘З ro˜y˜alt˜y-free“license,‘Зunlimited“inŽЁ‘'ПЋduration,‘т to–oЗuse›oЖthat“wВ!ork“under˜the“conditions“stated˜herein.‘ 9ЯThe“\DoMоcumenВ!t",ŽЁ‘'ПЋbMоelošВ!w,‘tkrefers–gьto“an˜y“suc˜h‘gэman˜ual“or“w˜ork.‘Щ An˜y“mem˜bMоer“of“the‘gэpublic“is“a“licensee,‘tkandŽЁ‘'ПЋis–џaddressed“as“\yšВ!ou".‘І@Y‘џeou“accept“the“license“if“y˜ou“cop˜y‘џe,‘ юmoMоdify“or“distribute“the“w˜orkŽЁ‘'ПЋin–Іfa“w•В!a“y–Іfrequiring“pMоermission“under“cop•В!yrigh“t‘Іfla“w.ŽŽŒ‹*GyŸђ‘GсUnits‘ІfCon•В!v“ersion’Td42ŽŽŽ ƒ33 § ЬЭ‘'ПЋA‘ І\MošMоdi ed– РV‘џeersion"‘ Сof“the“Do˜cumenšВ!t“means‘ Сan˜y“w˜ork“con˜taining“the‘ СDoMоcumen˜t“orŽЄ 33‘'ПЋa–‚hpMоortion›‚gof“it,‘Йheither˜copied“vВ!erbatim,‘Йhor˜with“moMоdi cations“and/or˜translated“inВ!toŽЁ‘'ПЋanother‘Іflanguage.ŽЉјБ‘'ПЋA‘ž\Secondary–РSection"“is›Сa“named˜appMоendix“or˜a“fronВ!t-matter˜section“of˜the“DoMоcumenВ!tŽЁ‘'ПЋthat–Ž/deals“exclusivВ!ely›Ž0with“the“relationship“of˜the“publishers“or“authors˜of“the“DoMоcumenВ!tŽЁ‘'ПЋto–z the‘zDoMоcumenšВ!t's“o˜v˜erall›zsub‘›Лject“(or˜to“related“matters)˜and“conВ!tains˜nothing“thatŽЁ‘'ПЋcould–иЎfall›иЏdirectly“within“that“o•В!v“erall˜sub‘›Лject.‘tЕ(Th“us,‘%@if˜the›иЎDoMоcumen“t˜is˜in‘иЏpart˜aŽЁ‘'ПЋtextb•Mоo“ok›е†of–е…mathematics,‘џMa“Secondary˜Section˜maВ!y˜not“explain˜anВ!y˜mathematics.)‘˜=TheŽЁ‘'ПЋrelationship–Gоcould“bMоe“a“matter“of“historical“connection“with“the“sub‘›Лject“or“with“relatedŽЁ‘'ПЋmatters,–jor‘Bјof›Bїlegal,“commercial,‘jphilosophical,“ethical˜or˜p•Mоolitical‘Bјp“osition˜regardingŽЁ‘'ПЋthem.ŽŸјА‘'ПЋThe›r\In•В!v‘џdDarian“t–sSections"˜are˜certain˜Secondary“Sections˜whose˜titles˜are“designated,‘0жasŽЁ‘'ПЋbMоeing–2Dthose›2Cof“In•В!v‘џdDarian“t–2DSections,‘I}in“the“notice˜that“saВ!ys˜that“the“DoMоcumenВ!t˜is“releasedŽЁ‘'ПЋunder–S5this“License.‘Т"If›S4a“section“doMоes“not“ t˜the“abMоo•В!v“e–S5de nition“of“Secondary˜then“it“isŽЁ‘'ПЋnot›гallo•В!w“ed˜to‘гŽbMоe˜designated˜as˜In“v‘џdDarian“t.‘eSThe˜DoMоcumen“t˜ma“y‘гŽcon“tain˜zero˜In“v‘џdDarian“tŽЁ‘'ПЋSections.‘ЂФIf–ѕthe“DošMоcumenВ!t“do˜es‘ѕnot“idenšВ!tify“an˜y“In˜v‘џdDarian˜t“Sections“then‘ѕthere“are“none.ŽІ‘'ПЋThe›f­\Co•В!v“er–fЌT‘џeexts"˜are˜certain˜short“passages˜of˜text˜that“are˜listed,‘–Оas˜F‘џeron•В!t-Co“v“erŽЁ‘'ПЋT›џeexts–-or“Bac•В!k-Co“v“er‘,T˜exts,‘"8in–-the“notice“that‘,sašВ!ys“that“the“DoMоcumen˜t‘,is“released“underŽЁ‘'ПЋthis›’License.‘ЏAA‘nF‘џeron•В!t-Co“v“er˜T‘џeext˜ma“y˜bMоe˜at˜most˜5›‘w“ords,‘6Šand˜a›’Bac“k-Co“v“er˜T‘џeext˜ma“yŽЁ‘'ПЋbMоe–Іfat“most“25“wВ!ords.ŽŸјА‘'ПЋA‘CІ\T‘џeransparen•В!t"›CЮcop“y˜of‘CЯthe˜DoMоcumen“t˜means˜a‘CЯmac“hine-readable˜cop“y‘џe,‘k(represen“tedŽЁ‘'ПЋin–Jma“format›Jnwhose“spMоeci cation“is“aВ!v‘џdDailable“to“the˜general“public,‘snthat˜is“suitable“forŽЁ‘'ПЋrevising–Юрthe‘ЮпdoMоcumenšВ!t“straigh˜tforw˜ardly“with›Юпgeneric“text˜editors“or“(for˜images“com-ŽЁ‘'ПЋpMоosed–кУof›кФpixels)“generic˜painВ!t“programs˜or“(for˜draВ!wings)“some˜widely“a•В!v‘џdDailable˜dra“wingŽЁ‘'ПЋeditor,‘…њand–}пthat“is“suitable“for“input“to‘}рtext“formatters“or“for“automatic“translation“toŽЁ‘'ПЋa–9Ov‘џdDarietВ!y“of›9Nformats“suitable“for“input“to“text˜formatters.‘ЙA‘93copВ!y“made˜in“an“otherwiseŽЁ‘'ПЋT‘џeransparenВ!t–„ц le“format›„хwhose“markup,‘М†or“absence˜of“markup,‘М†has˜bMоeen“arranged“toŽЁ‘'ПЋth•В!w“art–0ћor›0ќdiscourage“subsequenВ!t“moMоdi cation˜bВ!y“readers“is˜not“T‘џeransparenВ!t.‘ЖКAn“imageŽЁ‘'ПЋformat– Щis“not“T‘џeransparenšВ!t“if“used‘ Шfor“an˜y“substan˜tial“amoun˜t“of“text.‘MA‘ Љcop˜y“that“isŽЁ‘'ПЋnot–Іf\T‘џeransparenВ!t"“is“called“\Opaque".ŽІ‘'ПЋExamples–кZof›кYsuitable“formats˜for“T‘џeransparenВ!t“copies˜include“plain˜ASCIMоI‘йЩwithoutŽЁ‘'ПЋmarkup,› kT‘џeexinfo–ѕinput“format,˜LaT‘ў,ГŸ[wEŽ‘B X“input“format,˜SGML›ѕ‰or“XML˜using“a“publiclyŽЁ‘'ПЋašВ!v‘џdDailable– эDTD,“and“standard-conforming“simple“HTML,“P˜ostScript“or“PDF‘ гdesignedŽЁ‘'ПЋfor–EбhšВ!uman“moMоdi cation.‘МExamples‘Eвof“transparen˜t“image“formats“include“PNG,“X˜CFŽЁ‘'ПЋand–НмJPG.›НнOpaque“formats“include“proprietary˜formats“that“can“bMоe˜read“and“editedŽЁ‘'ПЋonly–ѕbšВ!y‘ѕ‘proprietary“w˜ord“proMоcessors,‘ [SGML›ѕ|or“XML˜for“whicВ!h‘ѕ‘the“DTD˜and/or“pro-ŽЁ‘'ПЋcessing–ltoMоols›mare“not˜generally“aВ!v‘џdDailable,‘(and˜the“macВ!hine-generated˜HTML,“PВ!ostScriptŽЁ‘'ПЋor–ІfPDF“proMоduced“bšВ!y“some“w˜ord“prošMоcessors“for“output“purp˜oses“only‘џe.ŽŸјА‘'ПЋThe–м\Title›лPВ!age"“means,‘<љfor˜a“prinВ!ted˜b•Mоo“ok,‘<љthe–мtitle˜page“itself,‘<љplus˜sucšВ!h“follo˜wingŽЁ‘'ПЋpages–RУas“are“needed“to“hold,–c}legibly‘џe,“the–RУmaterial“this‘RТLicense“requires“to“appMоear“in“theŽЁ‘'ПЋtitle–1.page.‘ЖЪF‘џeor“wВ!orks›1-in“formats˜whicВ!h“do“not˜ha•В!v“e‘1.an“y˜title–1.page“as˜sucšВ!h,‘HŸ\Title“P˜age"ŽЁ‘'ПЋmeans–­Žthe“text“near›­the“most“prominenВ!t“appMоearance“of“the˜wВ!ork's“title,‘ЏXpreceding“theŽЁ‘'ПЋbšMоeginning–Іfof“the“b˜o˜dy“of“the“text.ŽІ‘'ПЋThe–)—\publisher"“means‘)˜anšВ!y“pMоerson“or“en˜tit˜y“that“distributes‘)˜copies“of“the“DoMоcumen˜tŽЁ‘'ПЋto–Іfthe“public.ŽŽŒ‹+VtŸђ‘GсUnits‘ІfCon•В!v“ersion’Td43ŽŽŽ ƒ33 § ЬЭ‘'ПЋA›эsection–ђ\EnВ!titled“XYZ"˜means“a“named›ѓsubunit“of“the“DoMоcumenВ!t˜whose“title“eitherŽЄ 33‘'ПЋis–UЊprecisely‘UЉXYZ›U•or“conВ!tains“XYZ˜in“paren•В!theses›UЉfollo“wing–UЊtext“that˜translates“XYZ‘U•inŽЁ‘'ПЋanother–ўЏlanguage.‘Ѕі(Here“XYZ‘ў„stands“for“a“spšMоeci c“section“name“menВ!tioned“b˜elo•В!w,‘ :suc“hŽЁ‘'ПЋas›aa\Ac•В!kno“wledgemen“ts",–o/\Dedications",“\EndorsemenВ!ts",“or˜\History".)‘ЦлT‘џeo˜\PreservВ!eŽЁ‘'ПЋthe–›Title"›šof“sucВ!h˜a“section“when˜yВ!ou“moMоdify˜the“DoMоcumenВ!t“means˜that“it˜remains“aŽЁ‘'ПЋsection–Іf\EnВ!titled“XYZ"“according“to“this“de nition.ŽЉ&g‘'ПЋThe–SuDoMоcumenšВ!t“ma˜y“include“W‘џearran˜t˜y“Disclaimers“next‘Svto“the“notice“whic˜h“states“thatŽЁ‘'ПЋthis–ЙLicense“applies‘Кto“the“DoMоcumenšВ!t.‘зThese“W‘џearran˜t˜y“Disclaimers‘Кare“considered“toŽЁ‘'ПЋbMоe–„§included›„ўbВ!y“reference“in“this˜License,‘МЃbut“only“as“regards˜disclaiming“w•В!arran“ties:ŽЁ‘'ПЋanВ!y–nother›n‘implication“that˜these“W‘џearran•В!t“y˜Disclaimers‘nma“y˜ha“v“e‘nis˜v“oid–nand˜has“noŽЁ‘'ПЋe ect–Іfon“the“meaning“of“this“License.ŽŸ&h‘-2.Ž‘'ПЋVERBA‘џeTIM‘ІfCOPYINGŽІ‘'ПЋY‘џeou–’љmašВ!y“cop˜y“and“distribute“the“DoMоcumen˜t“in“an˜y“medium,‘Юeither“commercially“orŽЁ‘'ПЋnoncommercially‘џe,›zЊproВ!vided–that‘this“License,˜the‘cop•В!yrigh“t–notices,˜and‘the“licenseŽЁ‘'ПЋnotice–KsaВ!ying›K this“License˜applies“to˜the“DoMоcumenВ!t“are˜reproMоduced“in˜all“copies,‘t7andŽЁ‘'ПЋthat–1'yšВ!ou“add“no‘1(other“conditions“whatsoMоev˜er“to“those“of“this“License.‘ЖЩY‘џeou“ma˜y“not“useŽЁ‘'ПЋtecВ!hnical–ђ“measures›ђ”to“obstruct˜or“conВ!trol˜the“reading˜or“further˜copВ!ying“of˜the“copiesŽЁ‘'ПЋy•В!ou›ђЧmak“e‘ђШor˜distribute.‘ЁўHo“w“ev“er,‘Дy“ou˜ma“y˜accept‘ђШcompMоensation˜in˜exc“hange‘ђШfor˜copies.ŽЁ‘'ПЋIf–оyВ!ou›оdistribute“a“large˜enough“n•В!um“bMоer˜of–оcopies“y•В!ou˜m“ust–оalso“folloВ!w˜the“conditionsŽЁ‘'ПЋin–Іfsection“3.ŽІ‘'ПЋY‘џeou–}ьmaВ!y“also›}ыlend“copies,‘Й7under“the“same“conditions“stated˜abMоo•В!v“e,‘Й8and˜y“ou›}ьma“y˜publiclyŽЁ‘'ПЋdisplaВ!y‘Іfcopies.ŽІ‘-3.Ž‘'ПЋCOPYING–ІfIN“QUANTITYŽŸ&h‘'ПЋIf–УyšВ!ou‘Тpublish“prin˜ted›Тcopies“(or˜copies˜in“media“that˜commonly“ha•В!v“e˜prin“ted˜co“v“ers)‘УofŽЁ‘'ПЋthe‘б.DošMоcumen•В!t,‘лпn“um“b˜ering–б.more“than–б-100,‘лрand“the–б.Do˜cumenВ!t's“license‘б-notice“requiresŽЁ‘'ПЋCo•В!v“er›мT‘џeexts,‘<љy“ou‘лm“ust˜enclose˜the˜copies‘лin˜co“v“ers˜that˜carry–џe,‘<љclearly‘лand˜legibly“,‘<љallŽЁ‘'ПЋthese›Д@Co•В!v“er˜T–џeexts:‘љF“ron•В!t-Co“v“er˜T‘џeexts˜on˜the˜fron“t˜co“v“er,‘їЕand˜Bac“k-Co“v“er˜T‘џeexts˜onŽЁ‘'ПЋthe›іbac•В!k‘ѕco“v“er.‘б Both˜co“v“ers˜m“ust–ѕalso˜clearly˜and˜legibly“iden•В!tify˜y“ou˜as‘ѕthe˜publisherŽЁ‘'ПЋof›,these–+copies.‘H/The“fron•В!t˜co“v“er˜m“ust˜presen“t–+the˜full˜title“with˜all˜wВ!ords˜of“the˜titleŽЁ‘'ПЋequally–ГxprominenšВ!t“and‘Гyvisible.‘Y‘џeou“ma˜y›Гyadd“other“material“on“the˜co•В!v“ers–Гxin“addition.ŽЁ‘'ПЋCop•В!ying›Y4with‘Y3c“hanges˜limited–Y3to˜the“co•В!v“ers,‘…чas–Y3long˜as“they˜preservВ!e“the˜title“of˜theŽЁ‘'ПЋDošMоcumenВ!t–uand“satisfy“these“conditions,‘ЈХcan“b˜e“treated‘uas“všВ!erbatim“cop˜ying“in“otherŽЁ‘'ПЋrespMоects.ŽІ‘'ПЋIf–ю|the“required›ю}texts“for“either“co•В!v“er–ю|are“toMоo˜všВ!oluminous“to“ t“legibly‘џe,‘‚y˜ou“should“putŽЁ‘'ПЋthe–ђ rst›ђones“listed“(as“manВ!y˜as“ t“reasonably)“on˜the“actual“co•В!v“er,‘љand˜con“tin“ue‘ђtheŽЁ‘'ПЋrest–ІfonšВ!to“adjacen˜t“pages.ŽІ‘'ПЋIf–?|yВ!ou›?{publish“or˜distribute“Opaque˜copies“of˜the“DoMоcumen•В!t˜n“um“bMоering–?|more˜than“100,ŽЁ‘'ПЋy•В!ou›\3m“ust˜either‘\4include˜a˜mac“hine-readable˜T‘џeransparen“t˜cop“y˜along‘\4with˜eac“h˜OpaqueŽЁ‘'ПЋcopВ!y‘џe,‘[>or›7state–7in“or˜with“eacšВ!h“Opaque“cop˜y‘7a“computer-net˜w˜ork“loMоcation‘7from“whic˜hŽЁ‘'ПЋthe›щSgeneral‘щRnet•В!w“ork-using˜public˜has‘щRaccess˜to˜do“wnload˜using‘щRpublic-standard˜net“w“orkŽЁ‘'ПЋprotoMоcols–Ќ=a“complete‘Ќ>T‘џeransparenšВ!t“cop˜y“of“the“DoMоcumen˜t,‘эГfree“of“added“material.‘яcIfŽЁ‘'ПЋyšВ!ou–Њuse“the‘Њlatter“option,‘ъљy˜ou“m˜ust‘Њtak˜e“reasonably“pruden˜t“steps,‘ъјwhen“y˜ou“bMоeginŽЁ‘'ПЋdistribution–—lof›—mOpaque“copies˜in“quan•В!tit“y‘џe,‘гЎto–—lensure“that˜this“T‘џeransparen•В!t˜cop“y‘—lwillŽЁ‘'ПЋremain– CthšВ!us“accessible‘ Dat“the“stated“loMоcation“un˜til‘ Dat“least“one“y˜ear“after‘ Dthe“last“timeŽŽŒ‹,i Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td44ŽŽŽ ƒ33 § ЬЭ‘'ПЋyšВ!ou–k‘distribute‘k’an“Opaque“cop˜y‘k’(directly“or“through“y˜our‘k’agen˜ts“or“retailers)‘k’of“thatŽЄ 33‘'ПЋedition–Іfto“the“public.ŽЉFх‘'ПЋIt–&Nis“requested,‘FHbut“not“required,‘FGthat“yšВ!ou“con˜tact“the“authors“of“the“DoMоcumen˜t“w˜ellŽЁ‘'ПЋbMоefore–oХredistributing‘oФanšВ!y“large“n˜um˜bMоer›oФof“copies,‘zВto˜givВ!e“them˜a“cВ!hance“to˜prošВ!vide“y˜ouŽЁ‘'ПЋwith–Іfan“upšMоdated“vВ!ersion“of“the“Do˜cumenВ!t.ŽІ‘-4.Ž‘'ПЋMODIFICA‘џeTIONSŽІ‘'ПЋY‘џeou–*mašВ!y“cop˜y“and›)distribute“a“MoMоdi ed“V‘џeersion“of“the˜DoMоcumenВ!t“under“the“conditionsŽЁ‘'ПЋof–…šsections›…›2“and˜3“abMоo•В!v“e,‘П]pro“vided˜that‘…šy“ou˜release–…šthe˜MoMоdi ed“V‘џeersion˜under“preciselyŽЁ‘'ПЋthis–{оLicense,‘„`with“the›{пMoMоdi ed“V‘џeersion“ lling˜the“role“of˜the“DoMоcumen•В!t,‘„`th“us‘{оlicensingŽЁ‘'ПЋdistribution–Иand“mošMоdi cation‘Йof“the“Mo˜di ed“V‘џeersion“to“who˜evВ!er‘Йp˜ossesses“a“copВ!y“ofŽЁ‘'ПЋit.‘ннIn–Іfaddition,“yšВ!ou“m˜ust“do“these“things“in“the“MoMоdi ed“V‘џeersion:ŽŸFф‘*ђФA.Ž‘=nUse–эpin“the“Title“PšВ!age“(and“on“the“co˜v˜ers,‘џ2if“an˜y)“a“title“distinct“from“that“of“theŽЁ‘=nDoMоcumenšВ!t,‘+and–ˆfrom“those“of“previous“v˜ersions‘‡(whic˜h“should,‘+if“there“w˜ere“an˜y‘џe,ŽЁ‘=nbšMоe–Тјlisted“in“the“History‘Тїsection“of“the“Do˜cumenšВ!t).‘3“Y‘џeou“ma˜y‘Тїuse“the“same“title“asŽЁ‘=na–Іfprevious“všВ!ersion“if“the“original“publisher“of“that“v˜ersion“giv˜es“pMоermission.ŽІ‘+gB.Ž‘=nList–Њ\on“the“Title›Њ[PВ!age,‘ЋZas“authors,‘ЋYone“or“more“pMоersons˜or“enВ!tities“respMоonsible“forŽЁ‘=nauthorship–"of›"the“moMоdi cations“in˜the“MoMоdi ed˜V‘џeersion,‘<|together“with“at˜least“ vВ!eŽЁ‘=nof–пИthe“principal“authors“of“the“DoMоcumenšВ!t“(all“of“its“principal“authors,‘uif“it“has“few˜erŽЁ‘=nthan–Іf všВ!e),“unless“they“release“y˜ou“from“this“requiremen˜t.ŽІ‘+@ЂC.Ž‘=nState–Бгon›Бвthe“Title˜page“the˜name“of˜the“publisher˜of“the˜MoMоdi ed“V‘џeersion,‘Д­as“theŽЁ‘=npublisher.ŽІ‘*ЫеD.Ž‘=nPreservšВ!e–Іfall“the“cop˜yrigh˜t“notices“of“the“DoMоcumen˜t.ŽІ‘+ЕoE.Ž‘=nAdd–Фean›Фdappropriate“cop•В!yrigh“t˜notice‘Фefor˜y“our‘ФemoMоdi cations˜adjacen“t–Фeto˜the“otherŽЁ‘=ncop•В!yrigh“t‘Іfnotices.ŽІ‘,LF.Ž‘=nInclude,›hSimmediately–XЮafter“the“cop•В!yrigh“t–XЮnotices,˜a“license“notice“giving“the“publicŽЁ‘=npMоermission–яЫto›яЪuse“the˜MoMоdi ed“V‘џeersion“under˜the“terms˜of“this“License,‘Pin˜the“formŽЁ‘=nshošВ!wn–Іfin“the“Addendum“bMоelo˜w.ŽŸFф‘*‘nG.Ž‘=nPreservВ!e–Мmin›Мlthat“license˜notice“the˜full“lists˜of“In•В!v‘џdDarian“t˜Sections–Мmand˜required“Co•В!v“erŽЁ‘=nT‘џeexts–ІfgivšВ!en“in“the“DoMоcumen˜t's“license“notice.ŽІ‘*ђФH.Ž‘=nInclude–Іfan“unaltered“copВ!y“of“this“License.ŽІ‘/4чI.Ž‘=nPreservšВ!e–к†the‘к‡section“En˜titled‘к‡\History",‘чŽPreserv˜e“its›к‡Title,‘чŽand“add˜to“it˜an“itemŽЁ‘=nstating–_ at›_ least“the˜title,–mQyВ!ear,“new˜authors,“and–_ publisher˜of“the˜MoMоdi ed“V‘џeersionŽЁ‘=nas–ФXgivšВ!en“on‘ФWthe“Title“P˜age.‘7ГIf‘ФWthere“is“no“section“En˜titled“\History"‘ФWin“the“DoMоcu-ŽЁ‘=nmenšВ!t,‘O#create‘-eone–-dstating“the“title,‘O$y˜ear,–O#authors,“and‘-epublisher–-dof“the“DoMоcumen˜tŽЁ‘=nas–WgivšВ!en“on“its“Title“P˜age,‘ƒFthen“add“an“item“describing“the“MoMоdi ed“V‘џeersion“asŽЁ‘=nstated–Іfin“the“previous“senВ!tence.ŽІ‘-ˆЂJ.Ž‘=nPreservšВ!e–цthe“net˜w˜ork“loMоcation,‘ѕњif“an˜y‘џe,‘ѕњgiv˜en“in“the“DoMоcumen˜t‘цfor“public“access“toŽЁ‘=na–Н…T‘џeransparenšВ!t“cop˜y‘Н†of“the“DoMоcumen˜t,‘УMand“lik˜ewise“the“net˜w˜ork‘Н†loMоcations“giv˜en“inŽЁ‘=nthe–Э„DoMоcumenšВ!t‘Эƒfor“previous“v˜ersions‘Эƒit“w˜as“based“on.‘S6These‘Эƒma˜y“bMоe“placed‘Эƒin“theŽЁ‘=n\History"–8section.‘ІЮY‘џeou›9maВ!y“omit˜a“net•В!w“ork–8loMоcation˜for“a˜wВ!ork“that˜wВ!as“publishedŽЁ‘=nat–Kleast“four‘KyВ!ears“bšMоefore“the“Do˜cumenВ!t“itself,‘t@or“if“the“original‘Kpublisher“of“theŽЁ‘=nvšВ!ersion–Іfit“refers“to“giv˜es“pMоermission.ŽŽŒ‹-zъŸђ‘GсUnits‘ІfCon•В!v“ersion’Td45ŽŽŽ ƒ33 § ЬЭ‘*ЄхK.Ž‘=nF‘џeor–йranšВ!y“section“En˜titled“\Ac˜kno˜wledgemen˜ts"“or“\Dedications",‘oPreserv˜e“the“TitleŽЄ 33‘=nof›/Rthe–/Qsection,‘G#and“preservВ!e˜in˜the“section˜all˜the“substance˜and“tone˜of˜eacВ!h“of˜theŽЁ‘=ncon•В!tributor›Іfac“kno“wledgemen“ts˜and/or˜dedications˜giv“en˜therein.ŽЉ€‘,Q*L.Ž‘=nPreservšВ!e–?дall‘?гthe“In˜v‘џdDarian˜t›?гSections“of˜the“DoMоcumenВ!t,‘f/unaltered˜in“their˜text“andŽЁ‘=nin›Pмtheir–Pнtitles.‘н@Section“n•В!um“bMоers˜or‘Pнthe˜equiv‘џdDalen“t–Pнare˜not“considered˜part“of˜theŽЁ‘=nsection‘Іftitles.ŽŸ€‘)M.Ž‘=nDelete–А5anšВ!y“section“En˜titled‘А4\Endorsemen˜ts".‘ћJSuc˜h“a“section‘А4ma˜y“not“bMоe“includedŽЁ‘=nin–Іfthe“MoMоdi ed“V‘џeersion.ŽІ‘*ђФN.Ž‘=nDo–g!not›g"retitle“anВ!y˜existing“section“to˜bMоe“EnšВ!titled“\Endorsemen˜ts"›g"or“to˜con ict“inŽЁ‘=ntitle–Іfwith“anšВ!y“In˜v‘џdDarian˜t“Section.ŽŸ€‘*ЄхO.Ž‘=nPreserv•В!e›Іfan“y˜W‘џearran“t“y˜Disclaimers.ŽŸЬЮ‘'ПЋIf–иthe›зMoMоdi ed“V‘џeersion˜includes“new˜fronВ!t-matter“sections˜or“appMоendices˜that“qualifyŽЁ‘'ПЋas–XSecondary›X Sections“and“conВ!tain“no˜material“copied“from˜the“DoMоcumen•В!t,‘gДy“ou˜ma“y‘XatŽЁ‘'ПЋyВ!our–уkoption›уldesignate“some˜or“all“of˜these“sections˜as“in•В!v‘џdDarian“t.‘”эT‘џeo˜do–уkthis,‘ђ­add“theirŽЁ‘'ПЋtitles–@Ћto“the“list›@Ќof“In•В!v‘џdDarian“t–@ЋSections“in“the“MoMоdi ed“V‘џeersion's“license˜notice.‘ЌЌTheseŽЁ‘'ПЋtitles–ІfmšВ!ust“bMоe“distinct“from“an˜y“other“section“titles.ŽІ‘'ПЋY‘џeou–pmašВ!y‘qadd“a“section“En˜titled‘q\Endorsemen˜ts",‘sВpro˜vided“it“con˜tains‘qnothing“butŽЁ‘'ПЋendorsemen•В!ts›‘of‘‘y“our˜MoMоdi ed˜V‘џeersion˜b“y‘‘v‘џdDarious˜parties|for˜example,‘•Zstatemen“ts˜ofŽЁ‘'ПЋpšMоeer–D review“or‘Dthat“the“text“has“b˜een‘Dappro•В!v“ed›D b“y˜an˜organization‘Das˜the˜authoritativ“eŽЁ‘'ПЋde nition–Іfof“a“standard.ŽŸ€‘'ПЋY‘џeou–f,maВ!y›f-add“a˜passage“of˜up“to˜ všВ!e“w˜ords›f-as“a˜F›џeron•В!t-Co“v“er–f,T˜ext,‘sand›f-a“passage˜of“upŽЁ‘'ПЋto–@25“wšВ!ords‘@Žas“a“Bac˜k-Co˜v˜er“T‘џeext,‘Tьto›@Žthe“end“of“the˜list“of“Co•В!v“er–@T‘џeexts˜in“the“MoMоdi edŽЁ‘'ПЋV›џeersion.‘е+Only–N+one‘N*passage“of“F˜ron•В!t-Co“v“er‘N*T˜ext–N+and“one‘N*of“Bac•В!k-Co“v“er‘N+T˜ext‘N*ma“y‘N+bMоeŽЁ‘'ПЋadded–NСbšВ!y“(or“through“arrangemen˜ts“made“b˜y)‘NТan˜y“one“en˜tit˜y‘џe.‘РІIf“the“DoMоcumen˜t“alreadyŽЁ‘'ПЋincludes›Щa‘Шco•В!v“er˜text–Шfor˜the˜same“co•В!v“er,‘/!previously˜added˜b“y‘Шy“ou˜or‘Шb“y˜arrangemen“tŽЁ‘'ПЋmade–:ЧbšВ!y“the“same“en˜tit˜y“y˜ou“are“acting“on“bMоehalf“of,‘_пy˜ou“ma˜y‘:Шnot“add“another;‘„їbutŽЁ‘'ПЋy•В!ou›)ma“y˜replace–*the˜old˜one,‘2on˜explicit˜pMоermission˜from˜the“previous˜publisher˜thatŽЁ‘'ПЋadded–Іfthe“old“one.ŽІ‘'ПЋThe–^author(s)›]and“publisher(s)˜of“the“DoMоcumenВ!t˜do“not“bВ!y˜this“License˜givВ!e“pMоermissionŽЁ‘'ПЋto–Єjuse“their›Єknames“for“publicitВ!y“for“or˜to“assert“or“imply“endorsemenВ!t˜of“anВ!y“MoMоdi edŽЁ‘'ПЋV‘џeersion.ŽŸ€‘-5.Ž‘'ПЋCOMBINING‘ІfDOCUMENTSŽІ‘'ПЋY‘џeou›ІЧma•В!y‘ІШcom“bine˜the˜DoMоcumen“t–ІШwith˜other“doMоcumenВ!ts˜released˜under“this˜License,ŽЁ‘'ПЋunder–—sthe“terms›—tde ned“in“section“4˜abšMоo•В!v“e–—sfor“mo˜di ed“v•В!ersions,‘гЗpro“vided–—sthat“yВ!ouŽЁ‘'ПЋinclude– in› the“comВ!bination“all“of˜the“In•В!v‘џdDarian“t– Sections˜of“all“of“the˜original“doMоcumenВ!ts,ŽЁ‘'ПЋunmoMоdi ed,‘L3and–5Іlist›5Їthem“all˜as“In•В!v‘џdDarian“t–5ІSections˜of“yšВ!our“com˜bined‘5Їw˜ork“in‘5Їits“licenseŽЁ‘'ПЋnotice,–Іfand“that“yšВ!ou“preserv˜e“all“their“W‘џearran˜t˜y“Disclaimers.ŽŸ€‘'ПЋThe–Ђ@comšВ!bined“w˜ork“need“only“con˜tain“one“cop˜y“of“this“License,‘Ѓand“m˜ultiple“iden˜ticalŽЁ‘'ПЋIn•В!v‘џdDarian“t–цнSections“mašВ!y“bMоe“replaced“with“a“single‘цмcop˜y‘џe.‘ŸBIf“there“are“m˜ultiple“In˜v‘џdDarian˜tŽЁ‘'ПЋSections–6Чwith›6Шthe“same˜name“but˜di erenšВ!t“con˜ten˜ts,‘Mmak˜e›6Шthe“title˜of“eac•В!h˜suc“h‘6ЧsectionŽЁ‘'ПЋunique–bbВ!y›cadding“at˜the“end˜of“it,‘1"in“parenВ!theses,‘1!the˜name“of˜the“original˜author“orŽЁ‘'ПЋpublisher–of“that›~section“if“knoВ!wn,‘!­or“else“a“unique˜n•В!um“bMоer.‘І‘Mak“e˜the–same“adjustmenВ!tŽЁ‘'ПЋto–ю‡the›ю†section“titles“in˜the“list“of˜In•В!v‘џdDarian“t–ю‡Sections“in“the˜license“notice“of˜the“comВ!binedŽЁ‘'ПЋwВ!ork.ŽŽŒ‹.‹Ÿђ‘GсUnits‘ІfCon•В!v“ersion’Td46ŽŽŽ ƒ33 § ЬЭ‘'ПЋIn›і"the‘і#com•В!bination,‘Jy“ou˜m“ust‘і#com“bine˜an“y‘і#sections˜En“titled–і#\History"˜in“the˜v‘џdDari-ŽЄ 33‘'ПЋous–млoriginal›мкdoMоcumenВ!ts,‘ъxforming“one˜section“EnšВ!titled“\History";‘јlik˜ewise‘мкcom˜bine“an˜yŽЁ‘'ПЋsections–бEnšВ!titled“\Ac˜kno˜wledgemen˜ts",‘лПand“an˜y“sections“En˜titled“\Dedications".‘]чY‘џeouŽЁ‘'ПЋmšВ!ust–Іfdelete“all“sections“En˜titled“\Endorsemen˜ts."ŽЉЬЭ‘-6.Ž‘'ПЋCOLLECTIONS–ІfOF“DOCUMENTSŽŸЬЮ‘'ПЋY‘џeou–вЄmašВ!y“mak˜e“a“collection“consisting“of‘вЃthe“DoMоcumen˜t“and“other“doMоcumen˜ts“releasedŽЁ‘'ПЋunder–this“License,‘sкand“replace“the“individual“copies“of“this“License“in“the“v‘џdDariousŽЁ‘'ПЋdoMоcumenšВ!ts–Dwith‘Ca“single“cop˜y›Cthat“is˜included“in“the˜collection,‘yЛproВ!vided˜that“yВ!ouŽЁ‘'ПЋfolloВ!w–t”the›t•rules“of˜this“License˜for“v•В!erbatim˜cop“ying‘t”of˜eac“h–t”of˜the“doMоcumenВ!ts˜in“allŽЁ‘'ПЋother‘ІfrespMоects.ŽІ‘'ПЋY‘џeou–Ц=mašВ!y“extract“a“single“doMоcumen˜t“from“suc˜h“a“collection,‘Ю2and“distribute“it“individu-ŽЁ‘'ПЋally–4under›4this“License,‘Wnpro•В!vided˜y“ou–4insert“a“copВ!y˜of“this“License“inВ!to˜the“extractedŽЁ‘'ПЋdoMоcumen•В!t,‘љјand›щBfollo“w–щAthis˜License“in“all˜other“respMоects˜regarding“v•В!erbatim˜cop“ying‘щAofŽЁ‘'ПЋthat‘ІfdoMоcumenВ!t.ŽІ‘-7.Ž‘'ПЋAšВ!GGREGA‘џeTION–ІfWITH“INDEPENDENT“W˜ORKSŽŸЬЮ‘'ПЋA‘]Цcompilation–]иof“the“DoMоcumenšВ!t‘]йor“its“deriv‘џdDativ˜es“with“other‘]йseparate“and“indepMоenden˜tŽЁ‘'ПЋdoMоcumen•В!ts›џhor‘џiw“orks,‘Љin˜or˜on‘џia˜v“olume–џiof˜a“storage˜or˜distribution“medium,‘Љis˜calledŽЁ‘'ПЋan– \aggregate"“if“the› cop•В!yrigh“t– resulting“from“the“compilation“is“not˜used“to“limit“theŽЁ‘'ПЋlegal–1 righВ!ts›1of“the“compilation's˜users“bMоeyВ!ond˜what“the“individual˜wВ!orks“pMоermit.‘ЖОWhenŽЁ‘'ПЋthe–žDošMоcumenВ!t“is“included‘žin“an“aggregate,‘л№this“License“do˜es“not‘žapply“to“the“otherŽЁ‘'ПЋwšВ!orks–Іfin“the“aggregate“whic˜h“are“not“themselv˜es“deriv‘џdDativ˜e“w˜orks“of“the“DoMоcumen˜t.ŽІ‘'ПЋIf–ЛVthe“Co•В!v“er–ЛVT‘џeext“requiremenšВ!t“of“section“3‘ЛUis“applicable“to“these“copies“of“the“DoMоcumen˜t,ŽЁ‘'ПЋthen–АDif›АEthe“DoMоcumenВ!t“is“less˜than“one“half“of˜the“enВ!tire“aggregate,‘с~the˜DoMоcumenšВ!t's“Co˜v˜erŽЁ‘'ПЋT‘џeexts–0mašВ!y“bMоe“placed“on“co˜v˜ers“that“brac˜k˜et“the“DoMоcumen˜t“within“the‘0aggregate,‘GАor“theŽЁ‘'ПЋelectronic–5qequiv‘џdDalenšВ!t‘5pof“co˜v˜ers›5pif“the˜DoMоcumenВ!t“is“in˜electronic“form.‘ŠќOtherwise“theyŽЁ‘'ПЋmšВ!ust–ІfappMоear“on“prin˜ted“co˜v˜ers“that“brac˜k˜et“the“whole“aggregate.ŽŸЬЮ‘-8.Ž‘'ПЋTRANSLA‘џeTIONŽІ‘'ПЋT‘џeranslation–ЬЏis›ЬАconsidered“a˜kind“of“moMоdi cation,‘Aso˜yšВ!ou“ma˜y‘ЬАdistribute“translationsŽЁ‘'ПЋof–Tўthe›T§DoMоcumenВ!t“under˜the“terms˜of“section“4.‘ щЃReplacing“In•В!v‘џdDarian“t˜Sections‘TўwithŽЁ‘'ПЋtranslations–vВrequires‘vГspšMоecial“p˜ermission“from“their›vГcop•В!yrigh“t‘vВholders,‘ъФbut˜y“ou‘vВma“yŽЁ‘'ПЋinclude–№ktranslations“of“some›№jor“all“In•В!v‘џdDarian“t–№kSections“in“addition˜to“the“original“vВ!ersionsŽЁ‘'ПЋof›Цthese‘ЦIn•В!v‘џdDarian“t˜Sections.‘=Y‘џeou‘Цma“y˜include–Цa˜translation˜of“this˜License,‘Ю and“all˜theŽЁ‘'ПЋlicense–ђњnotices›ђћin“the“DoMоcumen•В!t,‘Fand˜an“y›ђњW‘џearran“t“y˜Disclaimers,‘Fpro“vided‘ђћthat˜y“ouŽЁ‘'ПЋalso–Яinclude›Юџthe“original“English˜vВ!ersion“of“this“License˜and“the“original˜vВ!ersions“ofŽЁ‘'ПЋthose–notices“and“disclaimers.‘5хIn“case“of“a“disagreemen•В!t‘bMоet“w“een–the“translation“andŽЁ‘'ПЋthe–:•original›:”vВ!ersion“of˜this“License˜or“a˜notice“or˜disclaimer,‘_ the“original˜vВ!ersion“willŽЁ‘'ПЋprev‘џdDail.ŽІ‘'ПЋIf–pшa“section“in‘pщthe“DoMоcumenšВ!t“is“En˜titled“\Ac˜kno˜wledgemen˜ts",–{›\Dedications",“or‘pш\His-ŽЁ‘'ПЋtory",‘AПthe–(•requiremenšВ!t“(section“4)“to“Preserv˜e“its“Title“(section“1)“will“t˜ypically“requireŽЁ‘'ПЋcВ!hanging–Іfthe“actual“title.ŽŸЬЮ‘-9.Ž‘'ПЋTERMINA‘џeTIONŽІ‘'ПЋY‘џeou–”mašВ!y“not‘”cop˜y–џe,›—ОmoMоdify“,˜sublicense,˜or–”distribute“the“DoMоcumenВ!t‘”except“as“expresslyŽЁ‘'ПЋprošВ!vided–Ё№under‘Ёёthis“License.‘а|An˜y›Ёёattempt“otherwise˜to“copВ!y–џe,›ргmoMоdify“,‘рвsublicense,˜orŽЁ‘'ПЋdistribute–Іfit“is“všВ!oid,“and“will“automatically“terminate“y˜our“righ˜ts“under“this“License.ŽŽŒ‹/œGŸђ‘GсUnits‘ІfCon•В!v“ersion’Td47ŽŽŽ ƒ33 § ЬЭ‘'ПЋHo•В!w“ev“er,‘ѓЗif›фAy“ou–ф@cease˜all“violation˜of“this“License,‘ѓИthen“yВ!our˜license“from˜a“particularŽЄ 33‘'ПЋcop•В!yrigh“t–Jholder“is‘Jreinstated“(a)“prošВ!visionally‘џe,‘sšunless“and“un˜til‘Jthe“cop˜yrigh˜t“holderŽЁ‘'ПЋexplicitly–с_and“ nally“terminates“yšВ!our“license,‘0and“(b)“pMоermanen˜tly‘џe,‘0if“the“cop˜yrigh˜tŽЁ‘'ПЋholder–"fails“to“notify“yšВ!ou“of“the“violation‘"b˜y“some“reasonable“means“prior“to“60“da˜ysŽЁ‘'ПЋafter–Іfthe“cessation.ŽЉ(і‘'ПЋMoreo•В!v“er,‘Я8y“our–Ч license›Чfrom“a˜particular˜cop•В!yrigh“t–Ч holder˜is˜reinstated“pMоermanenВ!tly˜ifŽЁ‘'ПЋthe›V`cop•В!yrigh“t˜holder‘Vanoti es˜y“ou˜of˜the˜violation‘Vab“y˜some˜reasonable˜means,‘fbthis˜is˜theŽЁ‘'ПЋ rst–Wtime“y•В!ou‘Wha“v“e›Wreceiv“ed˜notice˜of˜violation‘Wof˜this˜License˜(for˜an“y‘Ww“ork)˜from˜thatŽЁ‘'ПЋcop•В!yrigh“t–ењholder,‘соand“yšВ!ou“cure“the“violation“prior‘ељto“30“da˜ys“after“y˜our‘ељreceipt“of“theŽЁ‘'ПЋnotice.ŽŸ(ї‘'ПЋT‘џeermination–Nuof“yšВ!our“righ˜ts“under“this“section‘NtdoMоes“not“terminate“the“licenses“of“partiesŽЁ‘'ПЋwho›•qha•В!v“e˜receiv“ed˜copies˜or˜righ“ts˜from˜y“ou‘•punder˜this˜License.‘ЊўIf˜y“our˜righ“ts˜ha“v“eŽЁ‘'ПЋbšMоeen–Юterminated“and“not‘Эp˜ermanenšВ!tly“reinstated,‘:Йreceipt“of“a“cop˜y“of“some‘Эor“all“of“theŽЁ‘'ПЋsame–Іfmaterial“doMоes“not“givšВ!e“y˜ou“an˜y“righ˜ts“to“use“it.ŽІ‘‡“10.Ž‘'ПЋFUTURE–ІfREVISIONS“OF“THIS“LICENSEŽŸ(ї‘'ПЋThe›џaF‘џeree‘џbSoft•В!w“are˜F‘џeoundation‘џbma“y˜publish–џbnew,‘UŸrevised“vВ!ersions˜of“the˜GNU‘џ F‘џereeŽЁ‘'ПЋDoMоcumenšВ!tation–йтLicense‘йуfrom“time“to“time.‘xRSuc˜h“new‘йуv˜ersions“will“bMоe“similar‘йуin“spiritŽЁ‘'ПЋto– цthe“presenšВ!t“v˜ersion,‘?…but“ma˜y“di er“in“detail“to“address‘ хnew“problems“or“concerns.ŽЁ‘'ПЋSee‘Іfтhttp://www.gnu.org/copyleft/с.ŽІ‘'ПЋEac•В!h›ˆзv“ersion˜of˜the˜License˜is˜giv“en˜a˜distinguishing˜v“ersion˜n“um“b•Mоer.‘дIf˜the˜Do“cumenВ!tŽЁ‘'ПЋspšMоeci es–r”that“a“particular“n•В!um“b˜ered›r”v“ersion˜of˜this˜License˜\or˜an“y˜later˜v“ersion"ŽЁ‘'ПЋapplies‘цQto–цPit,‘іLyšВ!ou“ha˜v˜e–цQthe“option‘цPof“follo˜wing“the“terms›цPand“conditions“either˜of“thatŽЁ‘'ПЋspMоeci ed–ŽvšВ!ersion“or“of“an˜y“later“v˜ersion“that‘Žhas“bMоeen“published“(not“as“a“draft)“b˜yŽЁ‘'ПЋthe›ю!F‘џeree‘ю"Soft•В!w“are˜F‘џeoundation.‘ЕIf‘ю"the˜DošMоcumen“t‘ю"do˜es–ю!not“sp˜ecify›ю"a“v•В!ersion˜n“um“bMоer‘ю!ofŽЁ‘'ПЋthis–$œLicense,‘D)yšВ!ou“ma˜y“c˜hoMоose‘$an˜y“v˜ersion“ev˜er“published“(not“as“a“draft)“b˜y“the“F‘џereeŽЁ‘'ПЋSoft•В!w“are–жUF‘џeoundation.‘mЉIf“the“DošMоcumenВ!t“sp˜eci es“that“a“prošВ!xy‘жTcan“decide“whic˜h“futureŽЁ‘'ПЋvВ!ersions–щ)of›щ*this“License˜can“bMоe“used,‘љкthat˜prošВ!xy's“public“statemen˜t›щ*of“acceptance˜of“aŽЁ‘'ПЋv•В!ersion›ІfpMоermanen“tly˜authorizes˜y“ou˜to˜c“hoMоose˜that˜v“ersion˜for˜the˜DoMоcumen“t.ŽІ‘‡“11.Ž‘'ПЋRELICENSINGŽŸ(ї‘'ПЋ\MassivšВ!e–{"Multiauthor‘{#CollabMоoration“Site"“(or“\MMC‘zьSite")“means“an˜y‘{#W‘џeorld“WideŽЁ‘'ПЋW‘џeeb–LeservšВ!er“that“publishes“cop˜yrigh˜table‘Lfw˜orks“and“also“pro˜vides“prominen˜t“facilitiesŽЁ‘'ПЋfor›M anВ!yb•Mоo“dy˜to˜edit˜those˜w•В!orks.‘РEA‘MŠpublic˜wiki˜that‘MŸan“yb•Mоo“dy˜can˜edit˜is˜an˜example˜ofŽЁ‘'ПЋsucšВ!h– Ya“serv˜er.‘ЕA‘ ?\Massiv˜e‘ XMultiauthor“CollabMоoration"“(or“\MMC")‘ >con˜tained“in“theŽЁ‘'ПЋsite–Іfmeans“anšВ!y“set“of“cop˜yrigh˜table“w˜orks“th˜us“published“on“the“MMC“site.ŽІ‘'ПЋ\CC-BY-SA"‘8Єmeans–8Щthe‘8ЪCreativšВ!e“Commons“A˜ttribution-Share‘8ЪAlik˜e“3.0‘8Ъlicense“pub-ŽЁ‘'ПЋlished›8b•В!y‘8Creativ“e˜Commons–8CorpMоoration,‘N(a˜not-for-pro t“corpMоoration˜with“a˜principalŽЁ‘'ПЋplace–ђof“business“in“San“F‘џerancisco,‘7ЃCalifornia,‘7Ђas“wšВ!ell“as“future“cop˜yleft“v˜ersions“of“thatŽЁ‘'ПЋlicense–Іfpublished“bВ!y“that“same“organization.ŽŸ(ї‘'ПЋ\IncorpšMоorate"–­zmeans“to“publish‘­yor“republish“a“Do˜cumenВ!t,›Џ?in“whole“or‘­yin“part,˜as“partŽЁ‘'ПЋof–Іfanother“DoMоcumenВ!t.ŽІ‘'ПЋAn–&\MMC‘&U‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘pЌ31ŽЁ‘Goutput–Tformat“ ags‘ѕњ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘'ЕЌ32ŽЁ‘Goutput–Tformat“spAЧeci cation‘™њ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЫЕЌ32ŽІ‘Goutput‘Tprecision‘l‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘H'Ќ33ŽŽ § ЬЭ’ѓс№ы\PŽŸ.’ѓс№ЌP‘џ:ЋA•О9GER›Ten“vironmen“t˜v‘џ|rariable}Й‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЏtЌ37ŽЄ šл’ѓс№parenО9theses‘ю‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЬЌ6,–T7,“8,“11,“26,“27ŽЁ’ѓс№`ЩperЌ'‘TopAЧerator‘к*‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ хЌ6ŽЉ šк’ѓс№pAЧersonal–Tunits“data“ le‘ѕŸ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ 'ZЌ25ŽЁ’ѓс№piecewise–Tlinear“units‘PK‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘‚Ќ29ŽЁ’ѓс№plus–T(`Щ+Ќ')“opAЧerator‘i ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘›[Ќ8ŽІ’ѓс№pAЧo•О9w“ers‘ќЅ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ ._Ќ7ŽЁ’ѓс№precision,‘Toutput‘лС‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ |Ќ33ŽЁ’ѓс№pre xesq‰‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЃDЌ5ŽІ’ѓс№pre xes–Tand“expAЧonenО9ts‘Šі‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘МАЌ7ŽЁ’ѓс№pre xes,–Tde nition“of‘ко‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ ™Ќ26ŽЁ’ѓс№previous‘Tresult&„‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘X>Ќ10ŽІ’ѓс№primitivО9e‘TunitsP‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘A Ќ26ŽЁ’ѓс№proAЧducts–Tof“units‘еŸ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ YЌ6ŽЄ—3’ѓс№ы\QŽŸ.’ѓс№ЌquotienО9ts–Tof“units‘ёŸ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘#ZЌ6ŽЁ’ѓс№ы\RŽŸ.’ѓс№Ќrange,–Tnonlinear“unit“de nitions У‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘=}Ќ28ŽІ’ѓс№ЩreadlineЌ,–Tuse“with“ЩunitsrЛ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЄuЌ39ŽЄ šл’ѓс№reciproAЧcal‘Tcon•О9v“ersionKQ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘} Ќ2ŽЁ’ѓс№roAЧots‘yˆ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЋCЌ9ŽŸ•я’ѓс№ы\SŽŸ.’ѓс№ЌsetloAЧcale‘Tfunction‘жо‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘™Ќ34ŽЁ’ѓс№slash–T(`Щ/Ќ')“opAЧerator‘цš‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ UЌ6ŽІ’ѓс№solidus–T(`Щ/Ќ')“opAЧerator)‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘KфЌ6ŽЁ’ѓс№sphere,–TvО9olume“of‘Вп‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ф™Ќ14ŽЁ’ѓс№square‘TroAЧots‘Nѕ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘€ЏЌ9ŽІ’ѓс№star–T(`Щ*Ќ')“opAЧerator‘ъ„‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ >Ќ6ŽЁ’ѓс№State–TPlane“CoAЧordinate“System,“US‘ф‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ТЌ5ŽІ’ѓс№strict‘Tcon•О9v“ersion‘.‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘_ЬЌ2ŽЁ’ѓс№subtraction–Tof“units‘­Ÿ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘пZЌ8ŽЁ’ѓс№sums–Tand“di erences“of“units~?‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЏњЌ8ŽІ’ѓс№sums–Tof“units‘ђ™‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ $SЌ8,‘T15ŽЁ’ѓс№survО9ey–TfoAЧot,“US‘дг‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ŽЌ5ŽЁ’ѓс№survО9ey–Tmeasure,“US‘ˆы‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘КЅЌ5ŽІ’ѓс№survО9ey–Tmile,“USPд‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘‚ŽЌ5ŽЁ’ѓс№synО9tax–Tof“units“database‘ я‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘=ЉЌ40ŽЄ—3’ѓс№ы\TŽŸ.’ѓс№ЌtempAЧerature‘Tcon•О9v“ersions‘Jі‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘|АЌ13ŽЁ’ѓс№ы\UŽŸ.’ѓс№ЌUnico•AЧde‘Tsupp“ortr)‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЃуЌ38ŽІ’ѓс№unit–Tcompletion“using“`Щ?Ќ'“(Щreadline“Ќonly)‘ЦЮ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ј‰Ќ39ŽЄ šл’ѓс№unit‘Tde nitions‘œЅ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘Ю_Ќ4ŽЁ’ѓс№unit‘Texpressions‘я ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ ЦЌ6ŽІ’ѓс№unit–Texpressions,“complicated‘k ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘œЦЌ11ŽЁ’ѓс№unit–Tlist“aliases,“de ning‘MD‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘~џЌ31ŽŽŽŽŒ‹4AЈŸђ‘GсUnits‘ІfCon•В!v“ersion’Td52ŽŽŽ ƒ33 ўXN џH~П‘GЌunit‘Tlists‘иI‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ Ќ15ŽЄ Ы^‘Gunit–Tname“completion‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘IиЌ39ŽЁ‘Gunits–Tdata“ le,“pAЧersonal‘ЌМ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘оwЌ25ŽЉ Ы_‘Gunits–Tdata“ les,“additional‘–‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЧЫЌ25ŽЁ‘Gunits–Tde nitions,“adding‘–‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЧЫЌ26ŽЁ‘Gunits–Tde nitions,“cО9hanging‘u-‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ІшЌ26ŽЁ‘Gunits‘Tfunctions‘љ-‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ *чЌ29ŽЁ‘Gunits‘TquotienО9ts g‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘=!Ќ6ŽЁ‘Gunits,–Tde nition“of‘ј3‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘)юЌ26ŽІ‘Gunits,–TlošAЧokup“metho˜d‘9њ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘kЕЌ5ŽЁ‘Gunits,–Tpiecewise“linearh‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘9"Ќ29ŽЁ‘Gunits,‘TprimitivО9e‘дЅ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘`Ќ26ŽЁ‘Gunits,–Tsums“and“di erences]\‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘Ќ8ŽЁ‘Gunits,–Tsums“of‘Ав‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘тŒЌ15ŽЁ‘GUNITS‘ЅЦ‰c4ЦgŽ‘ѓENGLISH›Ten•О9vironmen“t˜v‘џ|rariable‘§џ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ /ЙЌ37ŽІ‘GUNITSFILE›Ten•О9vironmen“t˜v‘џ|rariable‘ЯT‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ Ќ37ŽЁ‘GUNITSLOCALEMAP›Ten•О9vironmen“t˜v‘џ|rariable‘й‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ зЌ37ŽЁ‘GUS–TState“Plane“CoAЧordinate“SystemГ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘PmЌ5ŽŽ џH~П’ѓс№US–TsurvО9ey“foAЧot~‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘A9Ќ5ŽЄ ‰x’ѓс№US–TsurvО9ey“measure‘бЮ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ ˆЌ5ŽЉ ‰y’ѓс№US–TsurvО9ey“mile‘™З‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ЫqЌ5ŽЁ’ѓс№UTF-8‘еE‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ џЌ38ŽŸ:Ћ’ѓс№ы\VŽŸ u’ѓс№ЌvО9erbAЧose‘Toutput‘ќ3‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ -юЌ2ŽІ’ѓс№vО9ertical–Tbar“(`Щ|Ќ')“opAЧerator‘цр‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘šЌ7ŽЁ’ѓс№vО9olume–Tmeasure,“English“customary‘’В‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘ФlЌ5ŽЄ;я’ѓс№ы\WŽŸ t’ѓс№Ќwire‘Tgauges‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘G-Ќ14ŽЁ’ѓс№ы\YŽŸ u’ѓс№Ќy•О9ard,‘Tin“ternational‘ЗЋ‘ХUВ:Ž–p‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž“‘ХU:Ž‘щfЌ5ŽŽŽŽŒјšуƒ’Р;ш‡33УЏџ8ѓcЗсgЃff cmmi12ѓ_п†ЕTff cmtt12ѓ\ТжN ff cmbx12ѓVп†ЕTGЎ cmtt12ѓSТжN GЎ cmbx12ѓJТжN Мj cmbx12ѓEпъ  b> ѓ3 cmmi10ѓ=пъ2: sys.stderr.write('Usage: {0} [filename]\n\n'.format(sys.argv[0])) sys.stderr.write('Update currency information for \'units\' into the specified\n') sys.stderr.write('filename or the default location, \'{0}\'.\n'.format(outfile)) sys.exit(1) try: currencies = ET.parse(urllib.request.urlopen('http://rss.timegenie.com/forex.xml')).findall('data') except IOError as exc: sys.stderr.write('Error connecting to currency server. {0}\n'.format(exc)) sys.exit(1) # print codes here codes = [x.find('code').text for x in currencies] names = [x.find('description').text for x in currencies] values = [x.find('rate').text for x in currencies] # Sometimes currency rates are missing from the xml file # Delete such currencies while True: try: none = values.index(None) sys.stderr.write('no rate for "%s" (%s)\n' % (names[none], codes[none])) del codes[none] del names[none] del values[none] except ValueError: break # Precious metals are showing up with weird prices (per gram?) # Delete them metalcodes = ['XAG','XAU','XPD','XPT'] for i in range(len(metalcodes)): try: badind = codes.index(metalcodes[i]) del codes[badind] del names[badind] del values[badind] except ValueError: break names = [x.lower().replace(' ','') for x in names] foundunicode=False for i in range(len(names)): if names[i] == 'anguilla(ecd)': names[i] = 'eastcaribbeandollar' if isinstance(names[i],str): # this test needed only for python2 ascii = unidecode(names[i]) else: ascii = names[i] if names[i] != ascii: if not foundunicode: foundunicode = True outstr += '# Unicode Currency Names\n\n!utf8\n' outstr += names[i] + ' ' *(23-len(names[i])) + ascii + '\n' names[i] = ascii if foundunicode: outstr += '!endutf8\n\n' outstr += '# ISO Currency Codes\n\n' outstr += '\n'.join([x + ' '*20 + y for x,y in zip(codes,names)]) usd = codes.index('USD') euro = codes.index('EUR') usdval = values[usd] values = ['1|' + x +' euro' for x in values] values[euro] = usdval + ' US$' del names[usd] del values[usd] # print rates here now = datetime.now() outstr += '\n\n# Currency exchange rates from Time Genie (www.timegenie.com)\n' outstr += '\n!message Currency exchange rates from www.timegenie.com on '+now.strftime('%Y-%m-%d')+'\n\n' maxlen = max(list(map(len,names))) + 2 outstr += '\n'.join([x.ljust(maxlen) + y for x,y in zip(names, values)]) # precious metals prices outstr += '\n\n# Precious metals prices from http://services.packetizer.com/spotprices/\n\n' try: spotprices = ET.parse(urllib.request.urlopen('http://services.packetizer.com/spotprices/?f=xml')) except IOError as exc: sys.stderr.write('Error connecting to spotprices server. {0}\n'.format(exc)) sys.exit(1) metals = ['gold','platinum','silver'] for metal in metals: outstr += '{0} {1} US$/troyounce\n'.format((metal+'price').ljust(15), spotprices.find(metal).text) try: if outfile == '-': info = codecs.lookup('utf8') outfile = codecs.StreamReaderWriter(sys.stdout, info.streamreader, info.streamwriter) else: outfile = codecs.open(outfile,'w','utf8') except IOError as exc: sys.stderr.write('Unable to write to output file. {0}\n'.format(exc)) sys.exit(1) outfile.write(outstr.replace('\n',os.linesep)) # In python3, open(outfile,mode='w',encoding='utf8') should work # and then the explicit newline handling won't be needed units-2.12/Makefile.Win0000664000175000017500000000660112316637514014267 0ustar adrianadrian# Makefile for units, a program for units conversion # created for Microsoft Visual C/C++ under Microsoft Windows(R) # # Copyright (C) 1996, 1997, 1999, 2005, 2006, 2012, 2013, 2014 # Free Software Foundation, Inc # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # # The units program was written by Adrian Mariano (adrianm@gnu.org). # This makefile was written by Adrian Mariano and Jeff Conrad # (jeff_conrad@msn.com), and tested with Microsoft Visual C/C++ 6.0, # 9.0, and 10.0 under Windows XP SP3. # Change these to suit the system configuration # Normal location for 32-bit executable on 64-bit system # ProgFilesDir = %ProgramFiles(x86)% # Normal location ProgFilesDir = %ProgramFiles% bindir = "$(ProgFilesDir)\GNU\units" datadir = "$(ProgFilesDir)\GNU\units" srcdir = . # These are for Microsoft Visual C; edit to suit for other compilers. # Do NOT give the 'Za' flag with MSVC. CC = cl CFLAGS = /O2 /W3 /nologo OBJS = units.obj getopt.obj getopt1.obj parse.obj CDEFS = /DNO_SETENV /DNO_ISFINITE /D_CRT_SECURE_NO_WARNINGS UDEFS = /DUNITSFILE=\"definitions.units\" /DLOCALEMAP=\"locale_map.txt\" units.exe: $(OBJS) $(CC) $(CFLAGS) $(CDEFS) $(UDEFS) $(OBJS) $(LIBS) units.obj: units.c units.h getopt.obj: getopt.c $(CC) $(CFLAGS) $(CDEFS) /c getopt.c getopt1.obj: getopt1.c getopt.h $(CC) $(CFLAGS) $(CDEFS) /c getopt1.c units.obj: units.c $(CC) $(CFLAGS) $(CDEFS) $(UDEFS) /c units.c parse.obj: parse.tab.c units.h $(CC) $(CFLAGS) $(CDEFS) /c parse.tab.c del /f/q parse.obj rename parse.tab.obj parse.obj showdest: @echo datadir=$(datadir) & echo bindir=$(bindir) @if not exist "$(ProgFilesDir)" \ echo '$(ProgFilesDir)' does not exist and will be created currency2: copy /y units_cur2 units_cur.py currency3: copy /y units_cur3 units_cur.py installprog: units.exe $(srcdir)\winmkdirs $(bindir) $(datadir) copy /y units.exe $(bindir) copy /y definitions.units $(datadir) copy /y currency.units $(datadir) copy /y locale_map.txt $(datadir) copy /y unitsfile.ico $(datadir) copy /y unitsprog.ico $(datadir) cacls $(datadir)\definitions.units /e /g Users:c cacls $(datadir)\definitions.units /e /g "Power Users":c cacls $(datadir)\currency.units /e /g Users:c cacls $(datadir)\currency.units /e /g "Power Users":c if exist units_cur.py ( \ copy /y units_cur.py $(datadir) & \ cacls $(datadir)\units_cur.py /e /g Users:c & \ cacls $(datadir)\units_cur.py /e /g "Power Users":c \ ) assoc .units=Units.DataFile # change this if you want a different editor for units data files for %%i in (notepad.exe) do \ if exist %%~$$PATH:i (ftype Units.DataFile="%%~$$PATH:i" "%1") \ else (ftype Units.DataFile=notepad.exe "%1") reg add "HKCR\Units.DataFile\DefaultIcon" /f /ve /d $(datadir)\unitsfile.ico /t REG_SZ clean: del /f/q $(OBJS) units-2.12/ChangeLog0000664000175000017500000003430512407773204013645 0ustar adrianadrian2014-09-22 Adrian Mariano * units.c (readunits): changed comment processing to happen before unicode validity check, so that comments can contain bogus unicode (if desired). 2014-03-28 Adrian Mariano * units.c (main): Changed getprogname->getprogramname to avoid CYGWIN conflict. 2014-01-23 Adrian Mariano * units.c (processargs): Only print error message for invalid entries plus the short message on how to get longer help. 2014-01-03 Adrian Mariano * parse.y: Switch to %parse-param and %lex-param so that parser will work with Bison 3.0. 2013-12-20 Adrian Mariano * units.c: Put functions into hash table like the table used for prefixes. * units.c (unitpower): Convert exponents to rationals using new function float2rat. This enables support for rational exponents with numerators larger than 1. * units.c (completeunits): Rewrote this function to handle hashed functions as well as prefixes and built in functions. 2011-01-23 Adrian Mariano * parse.y (yylex): Tweaked scanner to raise a new error (BADNUMBER) when a number is immediately followed by more numeric characters. This prevents things like 1.2.3 and 1..2 which were both legal and had possibly unexpected parsings before. Added new error code to units.h and new error message to units.c. 2010-05-20 Adrian Mariano * units.c: Added utf8 support. Added code to check for !utf8 in units.dat. Added better checking for locale. Added strwidth() to determine with of a utf8 string, and corrected code to use this function where appropriate. 2009-12-05 Adrian Mariano * units.c (rootunit): Fixed bug (n & 1==0) is always false * Numerous minor changes for eliminating warnings with -Wall 2009-10-03 Adrian Mariano * units.c (main): Changed RL_READLINE_VERSION test from > to >=. 2007-05-18 adrian * units.c (personalunitsfile): Added personalunitsfile() function to find ~/.units.dat if it exists. Added code in main() to load this file (first) when no -f specifications occur. (tryallunits): Modified to perform searching either for conformable units or for text matching units. This required changes to addtolist() as well. * parse.y: Added entry to support x^-y when - is not a multiply operator. Added MULTSTAR type and support for lower multiply precedence for '*'. Added special check for '**' operator as the old code didn't work. 2006-02-26 adrian * units.c: Added -1/--one-line option to display one line of output only. * units.c: Added --compact option to print output with only the conversion factor. * units.c: Changed verbose variable. Now it is 1 for normal output, zero for less output and 2 for more verbose output. The --compact option sets it to zero, and --verbose sets it to 2. The --terse option now simply sets other options. 2005-09-10 adrian * parse.y: Declared err as static and added %name-prefix to parser to make it possible to use units as a library. Note that declaring err as static also averts a bus error on the Intel Mac. 2004-12-12 adrian * units.c (checkunits): Added check for units that use '-' as a binary operator. These units will act differently depending on the way the program is invoked, so print a warning. * units.c (compareproducts): Modified to use a pointer to a function to decide whether a unit should be regarded as dimensionless. Added functions ignore_dimless(), ignore_primitive() and ignore_nothing() to use for invoking compareproducts. Modified compareunits to take this parameter as well. 2004-06-20 Adrian Mariano * parse.y: Added MINUS token and changed lexer to treat '-' according to the global variable minusminus either as MINUS or in the old fashion as MULTMINUS. * parse.y (funcunit): Added call to freeunit() to close memory leak. * units.c (compareproducts): Altered this function to use isdimless() when comparing units so that dimensionless units can be ignored in the comparison. Added isdimless() which checks whether a unit is defined as NODIM. 2003-12-04 Adrian Mariano * units.c (lookupunit): Added check for -ies plural 2003-09-20 Adrian Mariano * units.c (readunits): Wrote in a file to capture error messages, pass back an error return instead of calling exit(), do included units files with "!include", give error on nested "!locale" statements. 2003-05-09 Adrian Mariano * units.c: (readunits): Added error checking for function and prefix names. 2002-05-06 Adrian Mariano * units.c (reduceunit): The last change to reduceunit was screwed up. Corrected it. 2001-11-26 Adrian Mariano * units.c (readunits): Added locale checks to support the '!locale' syntax in units.dat. * configure.in: Added --enable-path-search option which replaces the use of an empty datadir for specifying path searching. 2001-08-30 Adrian Mariano * units.c (reduceunit): Separated two calls to reduceproduct(). This fixes a bug where "Unit reduction error" occurs instead of "Unknown unit". 2001-08-17 Adrian Mariano * units.c (tryallunits): Added signal() calls to ignore the SIGPIPE signal and hopefully prevent premature termination. 2000-05-28 Adrian Mariano * units.c (addtolist): Modified tryallunits() to search function definitions and produce a sorted list, piped through the pager. Modified ishelpquery to invoke ishelpquery to produce a list. 2000-04-18 Adrian Mariano * units.c (fgetscont): Added fix for backslash at the end of the buffer. 2000-04-13 Adrian Mariano * units.c (readunits): Set "userfile" when a path search is performed so that "help" can find the data file. (ishelpquery): Modified to find functions and prefixes. 2000-04-12 Adrian Mariano * units.c (ishelpquery): Wrote new function to print help messages by invoking a pager on units.dat. This required new field in unitlist structure, and code in main() to check for the "help" command. 2000-04-10 Adrian Mariano * parse.y: rewrote parser rules for correct unary '-'. * units.c (showdefinition): Substantially simplified and made correct for expressions that start with an operator (/ or -). 2000-04-09 Adrian Mariano * units.c (isfunction): Fixed call to removepadding() 2000-02-12 Adrian Mariano * units.c (fgetscont): Fixed buffer full test 1999-04-27 Adrian Mariano * units.c (addsubunit,addsubunitlist): Changed overflow test. Mon Aug 17 13:12:01 1998 Adrian Mariano * units.c (addunit): Added declaration for handlesum() so that it isn't called before being declared. Moved handlesum down the code past completereduce() so that handlesum doesn't call completereduce() before its definition. Sun Mar 8 10:08:56 1998 Adrian Mariano * units.c (main): Set rl_basic_word_break_characters to delimit words properly for unit completion. Mon Jun 9 19:12:08 1997 Adrian Mariano * units.c (lookupunit): Switched order of prefix and plural handling so that plurals are handled first. (This fixes the problem of "pints" being interpreted as p- plus ints.) Sun Apr 6 01:01:24 1997 Adrian Mariano * units.c (removepadding): Added check for zero length strings. This caused units to hang when invoked with arguments that consisted only of whitespace. Mon Mar 10 19:23:21 1997 Adrian Mariano * units.c: Changed 2 strdup() calls into dupstr() calls. Sun Mar 2 18:02:16 1997 Adrian Mariano * units.c: replaced sscanf with strtod affecting numlength() and addnumber(). This circumvents a bug in NeXT's C library and yields simpler code. Wed Feb 12 22:28:42 1997 Adrian Mariano * units.c (showanswer): Fixed to give slightly better display when verbose mode is active. Tue Jan 21 18:51:58 1997 Adrian Mariano * units.c: Changed showanswer() to convert reciprocal units. Added -s,--strict option to disable this conversion. Mon Jan 13 20:37:26 1997 Adrian Mariano * units.c: Added addnumber() because recursive call to addunit() was causing problems with strtok. Tue Dec 31 00:57:42 1996 Adrian Mariano * units.c (prefixhash): Changed to AND with 127 because signed chars seem to be causing segmentation faults with 8 bit characters. Changed size of the table to 128 to correspond. Thu Dec 26 13:54:59 1996 Adrian Mariano * units.c (completeunits): Added 1 to mymalloc() call so there is enough space. (This fixes the tab bug.) Mon Dec 9 23:46:27 1996 Adrian Mariano * unit.c (addunit): Changed logic for calling handlesum() to check that the character immediately before the '+' is not an 'e' since this would probably be an exponent. Mon Dec 7 10:47:43 1996 Adrian Mariano * units.c (lookupunit): Added tempbuf variable to prevent problems when the output from one call to lookupunit is used as input to a later call to lookupunit. * units.c: Changed main() and processargs() to allow invoking units with just one unit specified on the command line. Tue Dec 3 14:19:33 1996 Adrian Mariano * units.c: added verbose option, changed showanswer() to give verbose display, removed first argument from showunit(), added new function removepadding() to trim whitespace. * New file: texi2man, a perl script for converting the texinfo documentation into the man page format. Makefile.in changed to generate units.man from units.texinfo. Mon Dec 2 14:10:56 1996 Adrian Mariano * units.c: New functions handlesum(), addsubunitlist(), and productoverflow(). (addunit): Call handlesum() if there are '+' characters in the string to be added. This handles sums of conformable units. Added free() calls to free savescr when returning with an error. Sun Dec 1 17:30:52 1996 Adrian Mariano * units.c: Added isblank() and showdefinition(). Changed main() to call showdefinition if the second unit entered is blank. Also changed the loop to re-prompt the user for the first unit until something nonblank is entered. Changed showunit() to take two arguments. Wed Nov 27 23:08:33 1996 Adrian Mariano * units.c: Added function completeunits() for doing completion when readline is in use. * makefile.in: added support for LDFLAGS. * units.c (lookupunits): Added tests to avoid trying plurals on one character long base units. Fri Nov 22 19:25:23 1996 Kaveh R. Ghazi * Makefile.in, configure.in, units.c: add ansi2knr support. * New files: aclocal.m4, ansi2knr.1 and ansi2knr.c. Fri Nov 22 10:33:43 1996 Adrian Mariano * units.c: Added removespaces() function called from addunits() to remove spaces around '^' characters so the user doesn't have to be so careful. Thu Nov 21 23:39:09 1996 Adrian Mariano * units.c (lookupunit): Added check to return the input if it is a number. This was made necessary by the change in the handling of numbers which broke the '^' operator on numbers. Thu Nov 21 15:22:40 1996 Adrian Mariano * units.c (numlength): Changed test for sscanf to require a return value of exactly 1. For some reason, sscanf sometimes returns -1 instead of 0 when no fields were read. Thu Nov 21 09:17:26 1996 Adrian Mariano * Makefile.in: Added ALL_CFLAGS so that CFLAGS can be used by the user. * configure.in: Added fix to look for ncurses library to go with readline. (Required by some linux version.) Wed Nov 20 14:03:22 1996 Adrian Mariano * configure.in: Added check for const support. * Makefile.in: added VPATH, fixed a few places where $(srcdir) was needed, fixed the install targets to create directories if necessary by calling mkinstalldirs. Fixed man pages install target. Sun Nov 17 00:05:12 1996 Adrian Mariano * units.c: Added numlength() to handle "numbers" with multiple 'e' or '.' characters. Changed number evaluation in addunit() to do something reasonable when multiple '|' characters appear. Now number evaluation is done by sscanf() instead of atof(). Removed handling of numbers with no trailing space from lookupunit() and added it to addunit() with a recursive call. Thu Nov 1 16:18:08 1996 Adrian Mariano * units.c: Fixed up portability for string.h, stdlib.h. Added declarations for string functions and atof(). * units.c: Removed calls to tolower() since they turned out to be unportable. Sun Sep 8 10:19:43 1996 Adrian Mariano * units.c: Added long options, made option flag variables global. * units.c: Added freeunit() function to free units (which was never done), and uncommented two free() calls in cancelunit(). * units.c: Added processargs() function to tidy things up. Thu Sep 5 01:18:52 1996 Adrian Mariano * units.c: Removed all the static char * buffers and added support for readline(). Added growbuffer() and fgetslong() and getuser(). * units.c (readunits): Rewrote parsing to be cleaner and to remove trailing white space in units. Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc units-2.12/install-sh0000775000175000017500000003325512320330320014060 0ustar adrianadrian#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: units-2.12/units.man0000664000175000017500000032431512607015443013731 0ustar adrianadrian.\"Do not edit this file. It was created from units.texinfo .\"using texi2man version 1.01s on Mon Oct 12 16:42:11 EDT 2015 .\"This manual is for GNU Units (version 2.12), .\"which performs units conversions and units calculations. .\" .\"Copyright \(co 1996, 1997, 1999, 2000, 2001, 2002, 2004, 2005, 2007, .\"2011\-2015 Free Software Foundation, Inc. .\" .\"Permission is granted to copy, distribute and/or modify this document .\"under the terms of the GNU Free Documentation License, Version 1.3 or .\"any later version published by the Free Software Foundation; with no .\"Invariant Sections, with no Front-Cover Texts, and with no Back-Cover .\"Texts. .TH UNITS 1 "19 March 2014" .\" .\" ensure that ASCII circumflex U+005E (^) is not remapped with groff .if \n(.g .tr ^\(ha .\" ellipsis: space periods with troff but not with nroff .if n .ds El \&... .if t .ds El \&.\ .\ . .\" .\" Extensions to man macros .\" .\" Constant-width font .de CW .hy 0 .if n \{\ .ie \\n(.$>2 \&\\$1'\\$2'\\$3 .el \&'\\$1'\\$2 .\} .if t \{\ .ie \\n(.$>2 \&\\$1\f(CW\\$2\fR\\$3 .el \&\f(CW\\$1\fR\\$2 .\} .hy 14 .. .\" Constant-width oblique font .de CI .hy 0 .if n \{\ .ie \\n(.$>2 \&\\$1'\fI\\$2\fR'\\$3 .el \&'\fI\\$1\fR'\\$2 .\} .if t \{\ .ie \\n(.$>2 \&\\$1\f(CI\\$2\fR\\$3 .el \&\f(CI\\$1\fR\\$2 .\} .hy 14 .. .\" Constant-width font with quotes .de CQ .hy 0 .if n \{\ .ie \\n(.$>2 \&\\$1'\\$2'\\$3 .el \&'\\$1'\\$2 .\} .if t \{\ .ie \\n(.$>2 \&\\$1`\f(CW\\$2\fR'\\$3 .el \&`\f(CW\\$1\fR'\\$2 .\} .hy 14 .. .\" Display start .de DS .hy 0 .if t .in +4n .if n .in +3n .nf .. .\" Display end .de DE .fi .in .hy 14 .. .\" Example start .de ES .DS .if t \{\ .if '\\$1'S' \{\ .nr Ex 1 .ps -1 .\} .el .nr Ex 0 .nr mE \\n(.f .ft CW .\} .. .\" Example end .de EE .if t \{\ .ft \\n(mE .if \\n(Ex=1 .ps .\} .DE .. .SH NAME units \(em unit conversion and calculation program .PP .SH SYNOPSIS .PP .CW units .RI [ options ] .RI [ from-unit .RI [ to-unit ]] .PP .SH DESCRIPTION The .CW "units" program converts quantities expressed in various systems of measurement to their equivalents in other systems of measurement. Like many similar programs, it can handle multiplicative scale changes. It can also handle nonlinear conversions such as Fahrenheit to Celsius; see \fITemperature Conversions\fP. The program can also perform conversions from and to sums of units, such as converting between meters and feet plus inches. .PP Basic operation is simple: you enter the units that you want to convert \fIfrom\fP and the units that you want to convert \fIto\fP. You can use the program interactively with prompts, or you can use it from the command line. .PP Beyond simple unit conversions, .CW "units" can be used as a general-purpose scientific calculator that keeps track of units in its calculations. You can form arbitrary complex mathematical expressions of dimensions including sums, products, quotients, powers, and even roots of dimensions. Thus you can ensure accuracy and dimensional consistency when working with long expressions that involve many different units that may combine in complex ways; for an illustration, see \fIComplicated Unit Expressions\fP. .PP The units are defined in an external data file. You can use the extensive data file that comes with this program, or you can provide your own data file to suit your needs. You can also use your own data file to supplement the standard data file. .PP You can change the default behavior of .CW "units" with various options given on the command line. See \fIInvoking Units\fP for a description of the available options. .PP .SH INTERACTING WITH \f(BIUNITS\fP To invoke units for interactive use, type .CI "units" at your shell prompt. The program will print something like this: .PP .ES Currency exchange rates from www.timegenie.com on 2014-03-05 2860 units, 109 prefixes, 85 nonlinear units You have: .EE .PP At the .CQ "You\ have:" prompt, type the quantity and units that you are converting \fIfrom\fP. For example, if you want to convert ten meters to feet, type .CI "10 meters" . Next, .CW "units" will print .CQ "You\ want:" . You should type the units you want to convert \fIto\fP. To convert to feet, you would type .CI "feet" . If the .CW "readline" library was compiled in then \fItab\fP will complete unit names. See \fIReadline Support\fP for more information about .CW "readline" . To quit the program under Unix, press \fICtrl-C\fP or \fICtrl-D\fP. Under Windows, press \fICtrl-C\fP or \fICtrl-Z\fP; with the latter, you may also need to press \fIEnter\fP. .PP The result will be displayed in two ways. The first line of output, which is marked with a .CQ "*" to indicate multiplication, gives the result of the conversion you have asked for. The second line of output, which is marked with a .CQ "/" to indicate division, gives the inverse of the conversion factor. If you convert 10 meters to feet, .CW "units" will print .PP .ES * 32.808399 / 0.03048 .EE .PP which tells you that 10 meters equals about 32.8 feet. The second number gives the conversion in the opposite direction. In this case, it tells you that 1 foot is equal to about 0.03 dekameters since the dekameter is 10 meters. It also tells you that 1/32.8 is about 0.03. .PP The .CW "units" program prints the inverse because sometimes it is a more convenient number. In the example above, for example, the inverse value is an exact conversion: a foot is exactly 0.03048 dekameters. But the number given the other direction is inexact. .PP If you convert grains to pounds, you will see the following: .PP .ES You have: grains You want: pounds * 0.00014285714 / 7000 .EE .PP From the second line of the output you can immediately see that a grain is equal to a seven thousandth of a pound. This is not so obvious from the first line of the output. If you find the output format confusing, try using the .CQ "--verbose" option: .PP .ES You have: grain You want: aeginamina grain = 0.00010416667 aeginamina grain = (1 / 9600) aeginamina .EE .PP If you request a conversion between units that measure reciprocal dimensions, then .CW "units" will display the conversion results with an extra note indicating that reciprocal conversion has been done: .PP .ES You have: 6 ohms You want: siemens reciprocal conversion * 0.16666667 / 6 .EE .PP Reciprocal conversion can be suppressed by using the .CQ "--strict" option. As usual, use the .CQ "--verbose" option to get more comprehensible output: .PP .ES You have: tex You want: typp reciprocal conversion 1 / tex = 496.05465 typp 1 / tex = (1 / 0.0020159069) typp You have: 20 mph You want: sec/mile reciprocal conversion 1 / 20 mph = 180 sec/mile 1 / 20 mph = (1 / 0.0055555556) sec/mile .EE .PP If you enter incompatible unit types, the .CW "units" program will print a message indicating that the units are not conformable and it will display the reduced form for each unit: .PP .ES You have: ergs/hour You want: fathoms kg^2 / day conformability error 2.7777778e-11 kg m^2 / sec^3 2.1166667e-05 kg^2 m / sec .EE .PP If you only want to find the reduced form or definition of a unit, simply press \fIEnter\fP at the .CQ "You\ want:" prompt. Here is an example: .PP .ES You have: jansky You want: Definition: fluxunit = 1e-26 W/m^2 Hz = 1e-26 kg / s^2 .EE .PP The output from .CW "units" indicates that the jansky is defined to be equal to a fluxunit which in turn is defined to be a certain combination of watts, meters, and hertz. The fully reduced (and in this case somewhat more cryptic) form appears on the far right. .PP Some named units are treated as dimensionless in some situations. These units include the radian and steradian. These units will be treated as equal to 1 in units conversions. Power is equal to torque times angular velocity. This conversion can only be performed if the radian is dimensionless. .PP .ES You have: (14 ft lbf) (12 radians/sec) You want: watts * 227.77742 / 0.0043902509 .EE .PP It is also possible to compute roots and other non-integer powers of dimensionless units; this allows computations such as the altitude of geosynchronous orbit: .PP .ES You have: cuberoot(G earthmass / (circle/siderealday)^2) - earthradius You want: miles * 22243.267 / 4.4957425e-05 .EE .PP Named dimensionless units are not treated as dimensionless in other contexts. They cannot be used as exponents so for example, .CQ "meter^radian" is forbidden. .PP If you want a list of options you can type .CI "?" at the .CQ "You\ want:" prompt. The program will display a list of named units that are conformable with the unit that you entered at the .CQ "You\ have:" prompt above. Conformable unit \fIcombinations\fP will not appear on this list. .PP Typing .CI "help" at either prompt displays a short help message. You can also type .CI "help" followed by a unit name. This will invoke a pager on the units data base at the point where that unit is defined. You can read the definition and comments that may give more details or historical information about the unit. (You can generally quit out of the page by pressing .CQ "q" .) .PP Typing .CI "search" \fItext\fP will display a list of all of the units whose names contain \fItext\fP as a substring along with their definitions. This may help in the case where you aren't sure of the right unit name. .PP .SH USING \f(BIUNITS\fP NON-INTERACTIVELY The .CW "units" program can perform units conversions non-interactively from the command line. To do this, type the command, type the original unit expression, and type the new units you want. If a units expression contains non-alphanumeric characters, you may need to protect it from interpretation by the shell using single or double quote characters. .PP If you type .PP .ES units "2 liters" quarts .EE .PP then .CW "units" will print .PP .ES * 2.1133764 / 0.47317647 .EE .PP and then exit. The output tells you that 2 liters is about 2.1 quarts, or alternatively that a quart is about 0.47 times 2 liters. .PP If the conversion is successful, then .CW "units" will return success (zero) to the calling environment. If you enter non-conformable units then .CW "units" will print a message giving the reduced form of each unit and it will return failure (nonzero) to the calling environment. .PP When you invoke .CW "units" with only one argument, it will print out the definition of the specified unit. It will return failure if the unit is not defined and success if the unit is defined. .PP .SH UNIT DEFINITIONS The conversion information is read from a units data file that is called .CQ "definitions.units" and is usually located in the .CQ "/usr/share/units" directory. If you invoke .CW "units" with the .CQ "-V" option, it will print the location of this file. The default file includes definitions for all familiar units, abbreviations and metric prefixes. It also includes many obscure or archaic units. .PP Many constants of nature are defined, including these: .PP .ES pi \fRratio of circumference to diameter\fP c \fRspeed of light\fP e \fRcharge on an electron\fP force \fRacceleration of gravity\fP mole \fRAvogadro's number\fP water \fRpressure per unit height of water\fP Hg \fRpressure per unit height of mercury\fP au \fRastronomical unit\fP k \fRBoltzman's constant\fP mu0 \fRpermeability of vacuum\fP epsilon0 \fRpermittivity of vacuum\fP G \fRGravitational constant\fP mach \fRspeed of sound\fP .EE .PP The standard data file includes atomic masses for all of the elements and numerous other constants. Also included are the densities of various ingredients used in baking so that .CQ "2\ cups flour_sifted" can be converted to .CQ "grams" . This is not an exhaustive list. Consult the units data file to see the complete list, or to see the definitions that are used. .PP The .CQ "pound" is a unit of mass. To get force, multiply by the force conversion unit .CQ "force" or use the shorthand .CQ "lbf" . (Note that .CQ "g" is already taken as the standard abbreviation for the gram.) The unit .CQ "ounce" is also a unit of mass. The fluid ounce is .CQ "fluidounce" or .CQ "floz" . When British capacity units differ from their US counterparts, such as the British Imperial gallon, the unit is defined both ways with .CQ "br" and .CQ "us" prefixes. Your locale settings will determine the value of the unprefixed unit. Currency is prefixed with its country name: .CQ "belgiumfranc" , .CQ "britainpound" . .PP When searching for a unit, if the specified string does not appear exactly as a unit name, then the .CW "units" program will try to remove a trailing .CQ "s" , .CQ "es" . Next units will replace a trailing .CQ "ies" with .CQ "y" . If that fails, .CW "units" will check for a prefix. The database includes all of the standard metric prefixes. Only one prefix is permitted per unit, so .CQ "micromicrofarad" will fail. However, prefixes can appear alone with no unit following them, so .CQ "micro*microfarad" will work, as will .CQ "micro microfarad" . .PP To find out which units and prefixes are available, read the standard units data file, which is extensively annotated. .PP .SS English Customary Units English customary units differ in various ways in different regions. In Britain a complex system of volume measurements featured different gallons for different materials such as a wine gallon and ale gallon that different by twenty percent. This complexity was swept away in 1824 by a reform that created an entirely new gallon, the British Imperial gallon defined as the volume occupied by ten pounds of water. Meanwhile in the USA the gallon is derived from the 1707 Winchester wine gallon, which is 231 cubic inches. These gallons differ by about twenty percent. By default if .CW "units" runs in the .CQ "en_GB" locale you will get the British volume measures. If it runs in the .CQ "en_US" locale you will get the US volume measures. In other locales the default values are the US definitions. If you wish to force different definitions then set the environment variable .CW "UNITS_ENGLISH" to either .CQ "US" or .CQ "GB" to set the desired definitions independent of the locale. .PP Before 1959, the value of a yard (and other units of measure defined in terms of it) differed slightly among English-speaking countries. In 1959, Australia, Canada, New Zealand, the United Kingdom, the United States, and South Africa adopted the Canadian value of 1\ yard = 0.9144\ m (exactly), which was approximately halfway between the values used by the UK and the US; it had the additional advantage of making 1\ inch = 2.54\ cm (exactly). This new standard was termed the \fIInternational Yard\fP. Australia, Canada, and the UK then defined all customary lengths in terms of the International Yard (Australia did not define the furlong or rod); because many US land surveys were in terms of the pre-1959 units, the US continued to define customary surveyors' units (furlong, chain, rod, and link) in terms of the previous value for the foot, which was termed the \fIUS survey foot\fP. The US defined a \fIUS survey mile\fP as 5280 US survey feet, and defined a \fIstatute mile\fP as a US survey mile. The US values for these units differ from the international values by about 2\ ppm. .PP The .CW "units" program uses the international values for these units; the US values can be obtained by using either the .CQ "US" or the .CQ "survey" prefix. In either case, the simple familiar relationships among the units are maintained, e.g., 1 .CQ "furlong" = 660 .CQ "ft" , and 1 .CQ "USfurlong" = 660 .CQ "USft" , though the metric equivalents differ slightly between the two cases. The .CQ "US" prefix or the .CQ "survey" prefix can also be used to obtain the US survey mile and the value of the US yard prior to 1959, e.g., .CQ "USmile" or .CQ "surveymile" (but \fInot\fP .CQ "USsurveymile" ). To get the US value of the statute mile, use either .CQ "USstatutemile" or .CQ "USmile" . .PP Except for distances that extend over hundreds of miles (such as in the US State Plane Coordinate System), the differences in the miles are usually insignificant: .PP .ES You have: 100 surveymile - 100 mile You want: inch * 12.672025 / 0.078913984 .EE .PP The pre-1959 UK values for these units can be obtained with the prefix .CQ "UK" . .PP In the US, the acre is officially defined in terms of the US survey foot, but .CW "units" uses a definition based on the international foot. If you want the official US acre use .CQ "USacre" and similarly use .CQ "USacrefoot" for the official US version of that unit. The difference between these units is about 4 parts per million. .PP .SH UNIT EXPRESSIONS .SS Operators You can enter more complicated units by combining units with operations such as multiplication, division, powers, addition, subtraction, and parentheses for grouping. You can use the customary symbols for these operators when .CW "units" is invoked with its default options. Additionally, .CW "units" supports some extensions, including high priority multiplication using a space, and a high priority numerical division operator .CQ ( "|" ) that can simplify some expressions. .PP You multiply units using a space or an asterisk .CQ ( "*" ). The next example shows both forms: .PP .ES You have: arabicfoot * arabictradepound * force You want: ft lbf * 0.7296 / 1.370614 .EE .PP You can divide units using the slash .CQ ( "/" ) or with .CQ "per" : .PP .ES You have: furlongs per fortnight You want: m/s * 0.00016630986 / 6012.8727 .EE .PP You can use parentheses for grouping: .PP .ES You have: (1/2) kg / (kg/meter) You want: league * 0.00010356166 / 9656.0833 .EE .PP Multiplication using a space has a higher precedence than division using a slash and is evaluated left to right; in effect, the first .CQ "/" character marks the beginning of the denominator of a unit expression. This makes it simple to enter a quotient with several terms in the denominator: .CQ "J\ /\ mol\ K" . The .CQ "*" and .CQ "/" operators have the same precedence, and are evaluated left to right; if you multiply with .CQ "*" , you must group the terms in the denominator with parentheses: .CQ "J\ /\ (mol\ *\ K)" . .PP The higher precedence of the space operator may not always be advantageous. For example, .CQ "m/s\ s/day" is equivalent to .CQ "m\ /\ s\ s\ day" and has dimensions of length per time cubed. Similarly, .CQ "1/2\ meter" refers to a unit of reciprocal length equivalent to 0.5/meter, perhaps not what you would intend if you entered that expression. The get a half meter you would need to use parentheses: .CQ "(1/2)\ meter" . The .CQ "*" operator is convenient for multiplying a sequence of quotients. For example, .CQ "m/s\ *\ s/day" is equivalent to .CQ "m/day" . Similarly, you could write .CQ "1/2\ *\ meter" to get half a meter. .PP The .CW "units" program supports another option for numerical fractions: you can indicate division of \fInumbers\fP with the vertical bar .CQ ( "|" ), so if you wanted half a meter you could write .CQ "1|2\ meter" . You cannot use the vertical bar to indicate division of non-numerical units (e.g., .CQ "m|s" results in an error message). .PP Powers of units can be specified using the .CQ "^" character, as shown in the following example, or by simple concatenation of a unit and its exponent: .CQ "cm3" is equivalent to .CQ "cm^3" ; if the exponent is more than one digit, the .CQ "^" is required. You can also use .CQ "**" as an exponent operator. .PP .ES You have: cm^3 You want: gallons * 0.00026417205 / 3785.4118 .EE .PP Concatenation only works with a single unit name: if you write .CQ "(m/s)2" , .CW "units" will treat it as multiplication by 2. When a unit includes a prefix, exponent operators apply to the combination, so .CQ "centimeter3" gives cubic centimeters. If you separate the prefix from the unit with any multiplication operator (e.g., .CQ "centi meter^3" ), the prefix is treated as a separate unit, so the exponent applies only to the unit without the prefix. The second example is equivalent to .CQ "centi * (meter^3)" , and gives a hundredth of a cubic meter, not a cubic centimeter. The .CW "units" program is limited internally to products of 99 units; accordingly, expressions like .CQ "meter^100" or .CQ "joule^34" (represented internally as .CQ "kg^34\ m^68\ /\ s^68" ) will fail. .PP The .CQ "|" operator has the highest precedence, so you can write the square root of two thirds as .CQ "2|3^1|2" . The .CQ "^" operator has the second highest precedence, and is evaluated right to left, as usual: .PP .ES You have: 5 * 2^3^2 You want: Definition: 2560 .EE .PP With a dimensionless base unit, any dimensionless exponent is meaningful (e.g., .CQ "pi^exp(2.371)" ). Even though angle is sometimes treated as dimensionless, exponents cannot have dimensions of angle: .PP .ES You have: 2^radian ^ Exponent not dimensionless .EE .PP If the base unit is not dimensionless, the exponent must be a rational number \fIp\fP/\fIq\fP, and the dimension of the unit must be a power of \fIq\fP, so .CQ "gallon^2|3" works but .CQ "acre^2|3" fails. An exponent using the slash .CQ ( "/" ) operator (e.g., .CQ "gallon^(2/3)" ) is also acceptable; the parentheses are needed because the precedence of .CQ "^" is higher than that of .CQ "/" . Since .CW "units" cannot represent dimensions with exponents greater than 99, a fully reduced exponent must have \fIq\fP\ <\ 100. When raising a non-dimensionless unit to a power, .CW "units" attempts to convert a decimal exponent to a rational number with \fIq\fP\ <\ 100. If this is not possible .CW "units" displays an error message: .PP .ES You have: ft^1.234 Base unit not dimensionless; rational exponent required .EE .PP A decimal exponent must match its rational representation to machine precision, so .CQ "acre^1.5" works but .CQ "gallon^0.666" does not. .PP .SS Sums and Differences of Units You may sometimes want to add values of different units that are outside the SI. You may also wish to use .CW "units" as a calculator that keeps track of units. Sums of conformable units are written with the .CQ "+" character, and differences with the .CQ "-" character. .PP .ES You have: 2 hours + 23 minutes + 32 seconds You want: seconds * 8612 / 0.00011611705 You have: 12 ft + 3 in You want: cm * 373.38 / 0.0026782366 You have: 2 btu + 450 ft lbf You want: btu * 2.5782804 / 0.38785542 .EE .PP The expressions that are added or subtracted must reduce to identical expressions in primitive units, or an error message will be displayed: .PP .ES You have: 12 printerspoint - 4 heredium ^ Illegal sum of non-conformable units .EE .PP As usual, the precedence for .CQ "+" and .CQ "-" is lower than that of the other operators. A fractional quantity such as 2\ 1/2 cups can be given as .CQ "(2+1|2) cups" ; the parentheses are necessary because multiplication has higher precedence than addition. If you omit the parentheses, .CW "units" attempts to add .CQ "2" and .CQ "1|2 cups" , and you get an error message: .PP .ES You have: 2+1|2 cups ^ Illegal sum or difference of non-conformable units .EE .PP The expression could also be correctly written as .CQ "(2+1/2) cups" . If you write .CQ "2\ 1|2 cups" the space is interpreted as \fImultiplication\fP so the result is the same as .CQ "1 cup" . .PP The .CQ "+" and .CQ "-" characters sometimes appears in exponents like .CQ "3.43e+8" . This leads to an ambiguity in an expression like .CQ "3e+2 yC" . The unit .CQ "e" is a small unit of charge, so this can be regarded as equivalent to .CQ "(3e+2) yC" or .CQ "(3 e)+(2 yC)" . This ambiguity is resolved by always interpreting .CQ "+" and .CQ "-" as part of an exponent if possible. .PP .SS Numbers as Units For .CW "units" , numbers are just another kind of unit. They can appear as many times as you like and in any order in a unit expression. For example, to find the volume of a box that is 2 ft by 3 ft by 12 ft in steres, you could do the following: .PP .ES You have: 2 ft 3 ft 12 ft You want: stere * 2.038813 / 0.49048148 You have: $ 5 / yard You want: cents / inch * 13.888889 / 0.072 .EE .PP And the second example shows how the dollar sign in the units conversion can precede the five. Be careful: .CW "units" will interpret .CQ "$5" with no space as equivalent to .CQ "dollar^5" . .PP .SS Built-in Functions Several built-in functions are provided: .CQ "sin" , .CQ "cos" , .CQ "tan" , .CQ "ln" , .CQ "log" , .CQ "log2" , .CQ "exp" , .CQ "acos" , .CQ "atan" and .CQ "asin" . The .CQ "sin" , .CQ "cos" , and .CQ "tan" functions require either a dimensionless argument or an argument with dimensions of angle. .PP .ES You have: sin(30 degrees) You want: Definition: 0.5 You have: sin(pi/2) You want: Definition: 1 You have: sin(3 kg) ^ Unit not dimensionless .EE .PP The other functions on the list require dimensionless arguments. The inverse trigonometric functions return arguments with dimensions of angle. .PP If you wish to take roots of units, you may use the .CQ "sqrt" or .CQ "cuberoot" functions. These functions require that the argument have the appropriate root. You can obtain higher roots by using fractional exponents: .PP .ES You have: sqrt(acre) You want: feet * 208.71074 / 0.0047913202 You have: (400 W/m^2 / stefanboltzmann)^(1/4) You have: Definition: 289.80882 K You have: cuberoot(hectare) ^ Unit not a root .EE .PP .SS Previous Result You can insert the result of the previous conversion using the underscore .CQ ( "_" ). It is useful when you want to convert the same input to several different units, for example .PP .ES You have: 2.3 tonrefrigeration You want: btu/hr * 27600 / 3.6231884e-005 You have: _ You want: kW * 8.0887615 / 0.12362832 .EE .PP Suppose you want to do some deep frying that requires an oil depth of 2\ inches. You have 1/2 gallon of oil, and want to know the largest-diameter pan that will maintain the required depth. The nonlinear unit .CQ "circlearea" gives the \fIradius\fP of the circle (see \fIOther Nonlinear Units\fP, for a more detailed description) in SI units; you want the \fIdiameter\fP in \fIinches\fP: .PP .ES You have: 1|2 gallon / 2 in You want: circlearea 0.10890173 m You have: 2 _ You want: in * 8.5749393 / 0.1166189 .EE .PP In most cases, surrounding white space is optional, so the previous example could have used .CQ "2_" . If .CQ "_" follows a non-numerical unit symbol, however, the space is required: .PP .ES You have: m_ ^ Parse error .EE .PP When .CQ "_" is followed by a digit, the operation is multiplication rather than exponentiation, so that .CQ "_2" , is equivalent to .CQ "_\ *\ 2" rather than .CQ "_^2" . .PP You can use the .CQ "_" symbol any number of times; for example, .PP .ES You have: m You want: Definition: 1 m You have: _ _ You want: Definition: 1 m^2 .EE .PP Using .CQ "_" before a conversion has been performed (e.g., immediately after invocation) generates an error: .PP .if \n(.g .tr '\(aq .ES You have: _ ^ No previous result; '_' not set .EE .if \n(.g .tr '' .PP Accordingly, .CQ "_" serves no purpose when .CW "units" is invoked non-interactively. .PP If .CW "units" is invoked with the .CQ "--verbose" option (see \fIInvoking Units\fP), the value of .CQ "_" is not expanded: .PP .ES You have: mile You want: ft mile = 5280 ft mile = (1 / 0.00018939394) ft You have: _ You want: m _ = 1609.344 m _ = (1 / 0.00062137119) m .EE .PP You can give .CQ "_" at the .CQ "You\ want:" prompt, but it usually is not very useful. .PP .SS Complicated Unit Expressions The .CW "units" program is especially helpful in ensuring accuracy and dimensional consistency when converting lengthy unit expressions. .if t .ig ++ For example, one form of the Darcy-Weisbach fluid-flow equation is .RS 5n .PP Delta \fIP\fP = (8 / pi)^2 (rho \fIfLQ\fP^2) / \fId\fP^5, .RE .PP where Delta \fIP\fP is the pressure drop, rho is the mass density, \fIf\fP is the (dimensionless) friction factor, \fIL\fP is the length of the pipe, \fIQ\fP is the volumetric flow rate, and \fId\fP is the pipe diameter. It might be desired to have the equation in the form .RS 5n .PP Delta \fIP\fP = A1 rho \fIfLQ\fP^2 / \fId\fP^5 .RE .PP .++ .if n .ig ++ .EQ delim $$ .EN For example, one form of the Darcy\-Weisbach fluid-flow equation is .RS 5n .PP .EQ DELTA P = 8 over pi sup 2 rho fL Q sup 2 over d sup 5 , .EN .RE .PP where $DELTA P$ is the pressure drop, $rho$ is the mass density, $f$ is the (dimensionless) friction factor, $L$ is the length of the pipe, $Q$ is the volumetric flow rate, and $d$ is the pipe diameter. It might be desired to have the equation in the form .RS 5n .PP .EQ DELTA P = A sub 1 rho fL Q sup 2 over d sup 5 .EN .RE .PP .EQ delim off .EN .++ .PP that accepted the user's normal units; for typical units used in the US, the required conversion could be something like .PP .ES You have: (8/pi^2)(lbm/ft^3)ft(ft^3/s)^2(1/in^5) You want: psi * 43.533969 / 0.022970568 .EE .PP The parentheses allow individual terms in the expression to be entered naturally, as they might be read from the formula. Alternatively, the multiplication could be done with the .CQ "*" rather than a space; then parentheses are needed only around .CQ "ft^3/s" because of its exponent: .PP .ES You have: 8/pi^2 * lbm/ft^3 * ft * (ft^3/s)^2 /in^5 You want: psi * 43.533969 / 0.022970568 .EE .PP Without parentheses, and using spaces for multiplication, the previous conversion would need to be entered as .PP .ES You have: 8 lb ft ft^3 ft^3 / pi^2 ft^3 s^2 in^5 You want: psi * 43.533969 / 0.022970568 .EE .PP .SS Backwards Compatibility: .CQ "*" and .CQ "-" The original .CW "units" assigned multiplication a higher precedence than division using the slash. This differs from the usual precedence rules, which give multiplication and division equal precedence, and can be confusing for people who think of units as a calculator. .PP The star operator .CQ ( "*" ) included in this .CW "units" program has, by default, the same precedence as division, and hence follows the usual precedence rules. For backwards compatibility you can invoke .CW "units" with the .CQ "--oldstar" option. Then .CQ "*" has a higher precedence than division, and the same precedence as multiplication using the space. .PP Historically, the hyphen .CQ ( "-" ) has been used in technical publications to indicate products of units, and the original .CW "units" program treated it as a multiplication operator. Because .CW "units" provides several other ways to obtain unit products, and because .CQ "-" is a subtraction operator in general algebraic expressions, .CW "units" treats the binary .CQ "-" as a subtraction operator by default. For backwards compatibility use the .CQ "--product" option, which causes .CW "units" to treat the binary .CQ "-" operator as a product operator. When .CQ "-" is a multiplication operator it has the same precedence as multiplication with a space, giving it a higher precedence than division. .PP When .CQ "-" is used as a unary operator it negates its operand. Regardless of the .CW "units" options, if .CQ "-" appears after .CQ "(" or after .CQ "+" then it will act as a negation operator. So you can always compute 20 degrees minus 12 minutes by entering .CQ "20\ degrees + -12\ arcmin" . You must use this construction when you define new units because you cannot know what options will be in force when your definition is processed. .PP .SH NONLINEAR UNIT CONVERSIONS Nonlinear units are represented using functional notation. They make possible nonlinear unit conversions such as temperature. .PP .SS Temperature Conversions Conversions between temperatures are different from linear conversions between temperature \fIincrements\fP\(emsee the example below. The absolute temperature conversions are handled by units starting with .CQ "temp" , and you must use functional notation. The temperature-increment conversions are done using units starting with .CQ "deg" and they do not require functional notation. .PP .ES You have: tempF(45) You want: tempC 7.2222222 You have: 45 degF You want: degC * 25 / 0.04 .EE .PP Think of .CQ "tempF(\fIx\fP)" not as a function but as a notation that indicates that \fIx\fP should have units of .CQ "tempF" attached to it. See \fIDefining Nonlinear Units\fP. The first conversion shows that if it's 45 degrees Fahrenheit outside, it's 7.2 degrees Celsius. The second conversion indicates that a change of 45 degrees Fahrenheit corresponds to a change of 25 degrees Celsius. The conversion from .CQ "tempF(\fIx\fP)" is to absolute temperature, so that .PP .ES You have: tempF(45) You want: degR * 504.67 / 0.0019814929 .EE .PP gives the same result as .PP .ES You have: tempF(45) You want: tempR * 504.67 / 0.0019814929 .EE .PP But if you convert .CQ "tempF(\fIx\fP)" to .CQ "degC" , the output is probably not what you expect: .PP .ES You have: tempF(45) You want: degC * 280.37222 / 0.0035666871 .EE .PP The result is the temperature in K, because .CQ "degC" is defined as .CQ "K" , the Kelvin. For consistent results, use the .CQ "temp\fIX\fP" units when converting to a temperature rather than converting a temperature increment. .PP The .CQ "tempC()" and .CQ "tempF()" definitions are limited to positive absolute temperatures, and giving a value that would result in a negative absolute temperature generates an error message: .PP .ES You have: tempC(-275) ^ Argument of function outside domain ^ .EE .PP .SS Other Nonlinear Units Some other examples of nonlinear units are numerous different ring sizes and wire gauges, the grit sizes used for abrasives, the decibel scale, shoe size, scales for the density of sugar (e.g., baume). The standard data file also supplies units for computing the area of a circle and the volume of a sphere. See the standard units data file for more details. Wire gauges with multiple zeroes are signified using negative numbers where two zeroes is .CQ "-1" . Alternatively, you can use the synonyms .CQ "g00" , .CQ "g000" , and so on that are defined in the standard units data file. .PP .ES You have: wiregauge(11) You want: inches * 0.090742002 / 11.020255 You have: brwiregauge(g00) You want: inches * 0.348 / 2.8735632 You have: 1 mm You want: wiregauge 18.201919 You have: grit_P(600) You want: grit_ansicoated 342.76923 .EE .PP The last example shows the conversion from P graded sand paper, which is the European standard and may be marked ``P600'' on the back, to the USA standard. .PP You can compute the area of a circle using the nonlinear unit, .CQ "circlearea" . You can also do this using the circularinch or circleinch. The next example shows two ways to compute the area of a circle with a five inch radius and one way to compute the volume of a sphere with a radius of one meter. .PP .ES You have: circlearea(5 in) You want: in2 * 78.539816 / 0.012732395 You have: 10^2 circleinch You want: in2 * 78.539816 / 0.012732395 You have: spherevol(meter) You want: ft3 * 147.92573 / 0.0067601492 .EE .PP The inverse of a nonlinear conversion is indicated by prefixing a tilde .CQ ( "~" ) to the nonlinear unit name: .PP .ES You have: ~wiregauge(0.090742002 inches) You want: Definition: 11 .EE .PP You can give a nonlinear unit definition without an argument or parentheses, and press \fIEnter\fP at the .CQ "You\ want:" prompt to get the definition of a nonlinear unit; if the definition is not valid for all real numbers, the range of validity is also given. If the definition requires specific units this information is also displayed: .PP .ES You have: tempC Definition: tempC(x) = x K + stdtemp defined for x >= -273.15 You have: ~tempC Definition: ~tempC(tempC) = (tempC +(-stdtemp))/K defined for tempC >= 0 K You have: circlearea Definition: circlearea(r) = pi r^2 r has units m .EE .PP To see the definition of the inverse use the .CQ "~" notation. In this case the parameter in the functional definition will usually be the name of the unit. Note that the inverse for .CQ "tempC" shows that it requires units of .CQ "K" in the specification of the allowed range of values. Nonlinear unit conversions are described in more detail in \fIDefining Nonlinear Units\fP. .PP .SH UNIT LISTS: CONVERSION TO SUMS OF UNITS Outside of the SI, it is sometimes desirable to convert a single unit to a sum of units\(emfor example, feet to feet plus inches. The conversion \fIfrom\fP sums of units was described in \fISums and Differences of Units\fP, and is a simple matter of adding the units with the .CQ "+" sign: .PP .ES You have: 12 ft + 3 in + 3|8 in You want: ft * 12.28125 / 0.081424936 .EE .PP Although you can similarly write a sum of units to convert \fIto\fP, the result will not be the conversion to the units in the sum, but rather the conversion to the particular sum that you have entered: .PP .ES You have: 12.28125 ft You want: ft + in + 1|8 in * 11.228571 / 0.089058524 .EE .PP The unit expression given at the .CQ "You\ want:" prompt is equivalent to asking for conversion to multiples of .CQ "1\ ft + 1\ in + 1|8\ in" , which is 1.09375 ft, so the conversion in the previous example is equivalent to .PP .ES You have: 12.28125 ft You want: 1.09375 ft * 11.228571 / 0.089058524 .EE .PP In converting to a sum of units like miles, feet and inches, you typically want the largest integral value for the first unit, followed by the largest integral value for the next, and the remainder converted to the last unit. You can do this conversion easily with .CW "units" using a special syntax for lists of units. You must list the desired units in order from largest to smallest, separated by the semicolon .CQ ( ";" ) character: .PP .ES You have: 12.28125 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in .EE .PP The conversion always gives integer coefficients on the units in the list, except possibly the last unit when the conversion is not exact: .PP .ES You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3.00096 * 1|8 in .EE .PP The order in which you list the units is important: .PP .ES You have: 3 kg You want: oz;lb 105 oz + 0.051367866 lb You have: 3 kg You want: lb;oz 6 lb + 9.8218858 oz .EE .PP Listing ounces before pounds produces a technically correct result, but not a very useful one. You must list the units in descending order of size in order to get the most useful result. .PP Ending a unit list with the separator .CQ ";" has the same effect as repeating the last unit on the list, so .CQ "ft;in;1|8 in;" is equivalent to .CQ "ft;in;1|8 in;1|8 in" . With the example above, this gives .PP .ES You have: 12.28126 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in + 0.00096 * 1|8 in .EE .PP in effect separating the integer and fractional parts of the coefficient for the last unit. If you instead prefer to round the last coefficient to an integer you can do this with the .CQ "--round" .CQ ( "-r" ) option. With the previous example, the result is .PP .ES You have: 12.28126 ft You want: ft;in;1|8 in 12 ft + 3 in + 3|8 in (rounded down to nearest 1|8 in) .EE .PP When you use the .CQ "-r" option, repeating the last unit on the list has no effect (e.g., .CQ "ft;in;1|8 in;1|8 in" is equivalent to .CQ "ft;in;1|8 in" ), and hence neither does ending a list with a .CQ ";" . With a single unit and the .CQ "-r" option, a terminal .CQ ";" \fIdoes\fP have an effect: it causes .CW "units" to treat the single unit as a list and produce a rounded value for the single unit. Without the extra .CQ ";" , the .CQ "-r" option has no effect on single unit conversions. This example shows the output using the .CQ "-r" option: .PP .ES You have: 12.28126 ft You want: in * 147.37512 / 0.0067854058 You have: 12.28126 ft You want: in; 147 in (rounded down to nearest in) .EE .PP Each unit that appears in the list must be conformable with the first unit on the list, and of course the listed units must also be conformable with the unit that you enter at the .CQ "You\ have:" prompt. .PP .ES You have: meter You want: ft;kg ^ conformability error ft = 0.3048 m kg = 1 kg You have: meter You want: lb;oz conformability error 1 m 0.45359237 kg .EE .PP In the first case, .CW "units" reports the disagreement between units appearing on the list. In the second case, .CW "units" reports disagreement between the unit you entered and the desired conversion. This conformability error is based on the first unit on the unit list. .PP Other common candidates for conversion to sums of units are angles and time: .PP .ES You have: 23.437754 deg You want; deg;arcmin;arcsec 23 deg + 26 arcmin + 15.9144 arcsec You have: 7.2319 hr You want: hr;min;sec 7 hr + 13 min + 54.84 sec .EE .PP In North America, recipes for cooking typically measure ingredients by volume, and use units that are not always convenient multiples of each other. Suppose that you have a recipe for 6 and you wish to make a portion for 1. If the recipe calls for 2\ 1/2 cups of an ingredient, you might wish to know the measurements in terms of measuring devices you have available, you could use .CW "units" and enter .PP .ES You have: (2+1|2) cup / 6 You want: cup;1|2 cup;1|3 cup;1|4 cup;tbsp;tsp;1|2 tsp;1|4 tsp 1|3 cup + 1 tbsp + 1 tsp .EE .PP By default, if a unit in a list begins with fraction of the form 1|\fIx\fP and its multiplier is an integer, the fraction is given as the product of the multiplier and the numerator; for example, .PP .ES You have: 12.28125 ft You want: ft;in;1|8 in; 12 ft + 3 in + 3|8 in .EE .PP In many cases, such as the example above, this is what is wanted, but sometimes it is not. For example, a cooking recipe for 6 might call for 5\ 1/4 cup of an ingredient, but you want a portion for 2, and your 1-cup measure is not available; you might try .PP .ES You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3|2 cup + 1|4 cup .EE .PP This result might be fine for a baker who has a 1\ 1/2-cup measure (and recognizes the equivalence), but it may not be as useful to someone with more limited set of measures, who does want to do additional calculations, and only wants to know ``How many 1/2-cup measures to I need to add?'' After all, that's what was actually asked. With the .CQ "--show-factor" option, the factor will not be combined with a unity numerator, so that you get .PP .ES You have: (5+1|4) cup / 3 You want: 1|2 cup;1|3 cup;1|4 cup 3 * 1|2 cup + 1|4 cup .EE .PP A user-specified fractional unit with a numerator other than 1 is never overridden, however\(emif a unit list specifies .CQ "3|4 cup;1|2 cup" , a result equivalent to 1\ 1/2 cups will always be shown as .CQ "2 * 3|4\ cup" whether or not the .CQ "--show-factor" option is given. .PP Some applications for unit lists may be less obvious. Suppose that you have a postal scale and wish to ensure that it's accurate at 1\ oz, but have only metric calibration weights. You might try .PP .ES You have: 1 oz You want: 100 g;50 g; 20 g;10 g;5 g;2 g;1 g; 20 g + 5 g + 2 g + 1 g + 0.34952312 * 1 g .EE .PP You might then place one each of the 20\ g, 5\ g, 2\ g, and 1\ g weights on the scale and hope that it indicates close to .PP .ES You have: 20 g + 5 g + 2 g + 1 g You want: oz; 0.98767093 oz .EE .PP Appending .CQ ";" to .CQ "oz" forces a one-line display that includes the unit; here the integer part of the result is zero, so it is not displayed. .PP A unit list such as .PP .ES cup;1|2\ cup;1|3\ cup;1|4\ cup;tbsp;tsp;1|2\ tsp;1|4\ tsp .EE .PP can be tedious to enter. The .CW "units" program provides shorthand names for some common combinations: .PP .ES hms \fRhours, minutes, seconds\fP dms \fRangle: degrees, minutes, seconds\fP time \fRyears, days, hours, minutes and seconds\fP usvol \fRUS cooking volume: cups and smaller\fP .EE .PP Using these shorthands, or \fIunit list aliases\fP, you can do the following conversions: .PP .ES You have: anomalisticyear You want: time 1 year + 25 min + 3.4653216 sec You have: 1|6 cup You want: usvol 2 tbsp + 2 tsp .EE .PP You cannot combine a unit list alias with other units: it must appear alone at the .CQ "You\ want:" prompt. .PP You can display the definition of a unit list alias by entering it at the .CQ "You\ have:" prompt: .PP .ES You have: dms Definition: unit list, deg;arcmin;arcsec .EE .PP When you specify compact output with .CQ "--compact" , .CQ "--terse" or .CQ "-t" and perform conversion to a unit list, .CW "units" lists the conversion factors for each unit in the list, separated by semicolons. .PP .ES You have: year You want: day;min;sec 365;348;45.974678 .EE .PP Unlike the case of regular output, zeros \fIare\fP included in this output list: .PP .ES You have: liter You want: cup;1|2 cup;1|4 cup;tbsp 4;0;0;3.6280454 .EE .PP .SH LOGGING CALCULATIONS The .CQ "--log" option allows you to save the results of calculations in a file; this can be useful if you need a permanent record of your work. For example, the fluid-flow conversion in \fIComplicated Unit Expressions\fP, is lengthy, and if you were to use it in designing a piping system, you might want a record of it for the project file. If the interactive session .PP .ES # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 You have: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units You want: psi * 43.533969 / 0.022970568 .EE .PP were logged, the log file would contain .PP .ES ### Log started Fri Oct 02 15:55:35 2015 # Conversion factor A1 for pressure drop # dP = A1 rho f L Q^2/d^5 From: (8/pi^2) (lbm/ft^3)ft(ft^3/s)^2(1/in^5) # Input units To: psi * 43.533969 / 0.022970568 .EE .PP The time is written to the log file when the file is opened. .PP The use of comments can help clarify the meaning of calculations for the log. The log includes conformability errors between the units at the .CQ "You\ have:" and .CQ "You\ want:" prompts, but not other errors, including lack of conformability of items in sums or differences or among items in a unit list. For example, a conversion between zenith angle and elevation angle could involve .PP .ES You have: 90 deg - (5 deg + 22 min + 9 sec) ^ Illegal sum or difference of non-conformable units You have: 90 deg - (5 deg + 22 arcmin + 9 arcsec) You want: dms 84 deg + 37 arcmin + 51 arcsec You have: _ You want: deg * 84.630833 / 0.011816024 You have: .EE .PP The log file would contain .PP .ES From: 90 deg - (5 deg + 22 arcmin + 9 arcsec) To: deg;arcmin;arcsec 84 deg + 37 arcmin + 51 arcsec From: _ To: deg * 84.630833 / 0.011816024 .EE .PP The initial entry error (forgetting that minutes have dimension of time, and that arcminutes must be used for dimensions of angle) does not appear in the output. When converting to a unit list alias, .CW "units" expands the alias in the log file. .PP The .CQ "From:" and .CQ "To:" tags are written to the log file even if the .CQ "--quiet" option is given. If the log file exists when .CW "units" is invoked, the new results are appended to the log file. The time is written to the log file each time the file is opened. The .CQ "--log" option is ignored when .CW "units" is used non-interactively. .PP .SH INVOKING \f(BIUNITS\fP You invoke .CW "units" like this: .PP .ES units [\fIoptions\fP] [\fIfrom-unit\fP [\fIto-unit\fP]] .EE .PP If the \fIfrom-unit\fP and \fIto-unit\fP are omitted, the program will use interactive prompts to determine which conversions to perform. See \fIInteractive Use\fP. If both \fIfrom-unit\fP and \fIto-unit\fP are given, .CW "units" will print the result of that single conversion and then exit. If only \fIfrom-unit\fP appears on the command line, .CW "units" will display the definition of that unit and exit. Units specified on the command line may need to be quoted to protect them from shell interpretation and to group them into two arguments. See \fICommand Line Use\fP. .PP The default behavior of .CW "units" can be changed by various options given on the command line. In most cases, the options may be given in either short form (a single .CQ "-" followed by a single character) or long form .CQ ( "--" "" followed by a word or hyphen-separated words). Short-form options are cryptic but require less typing; long-form options require more typing but are more explanatory and may be more mnemonic. With long-form options you need only enter sufficient characters to uniquely identify the option to the program. For example, .CQ "--out\ %f" works, but .CQ "--o\ %f" fails because .CW "units" has other long options beginning with .CQ "o" . However, .CQ "--q" works because .CQ "--quiet" is the only long option beginning with .CQ "q" . .PP Some options require arguments to specify a value (e.g., .CQ "-d\ 12" or .CQ "--digits\ 12" ). Short-form options that do not take arguments may be concatenated (e.g., .CQ "-erS" is equivalent to .CQ "-e\ -r\ -S" ); the last option in such a list may be one that takes an argument (e.g., .CQ "-ed\ 12" ). With short-form options, the space between an option and its argument is optional (e.g., .CQ "-d12" is equivalent to .CQ "-d\ 12" ). Long-form options may not be concatenated, and the space between a long-form option and its argument is required. Short-form and long-form options may be intermixed on the command line. Options may be given in any order, but when incompatible options (e.g., .CQ "--output-format" and .CQ "--exponential" ) are given in combination, behavior is controlled by the last option given. For example, .CQ "-o%.12f\ -e" gives exponential format with the default eight significant digits). .PP The following options are available: .PP .TP .BR "-\^c" ", " "-\^-\^check" Check that all units and prefixes defined in the units data file reduce to primitive units. Print a list of all units that cannot be reduced. Also display some other diagnostics about suspicious definitions in the units data file. Only definitions active in the current locale are checked. You should always run .CW "units" with this option after modifying a units data file. .PP .TP .BR "-\^-\^check-verbose" ", " "-\^-\^verbose-check" Like the .CQ "--check" option, this option prints a list of units that cannot be reduced. But to help find unit definitions that cause endless loops, it lists the units as they are checked. If .CW "units" hangs, then the last unit to be printed has a bad definition. Only definitions active in the current locale are checked. .PP .TP .BR "-\^d \fIndigits\fP" ", " "-\^-\^digits \fIndigits\fP" Set the number of significant digits in the output to the value specified (which must be greater than zero). For example, .CQ "-d\ 12" sets the number of significant digits to 12. With exponential output .CW "units" displays one digit to the left of the decimal point and eleven digits to the right of the decimal point. On most systems, the maximum number of internally meaningful digits is 15; if you specify a greater number than your system's maximum, .CW "units" will print a warning and set the number to the largest meaningful value. To directly set the maximum value, give an argument of .CW "max" (e.g., .CQ "-d\ max" ). Be aware, of course, that ``significant'' here refers only to the \fIdisplay\fP of numbers; if results depend on physical constants not known to this precision, the physically meaningful precision may be less than that shown. The .CQ "--digits" option conflicts with the .CQ "--output-format" option. .PP .TP .BR "-\^e" ", " "-\^-\^exponential" Set the numeric output format to exponential (i.e., scientific notation), like that used in the Unix .CW "units" program. The default precision is eight significant digits (seven digits to the right of the decimal point); this can be changed with the .CQ "--digits" option. The .CQ "--exponential" option conflicts with the .CQ "--output-format" option. .PP .TP .BR "-\^o \fIformat\fP" ", " "-\^-\^output-format \fIformat\fP" This option affords complete control over the numeric output format using the specified \fIformat\fP. The format is a single floating point numeric format for the .CW "printf()" function in the C programming language. All compilers support the format types .CQ "g" and .CQ "G" to specify significant digits, .CQ "e" and .CQ "E" for scientific notation, and .CQ "f" for fixed-point decimal. The ISO C99 standard introduced the .CQ "F" type for fixed-point decimal and the .CQ "a" and .CQ "A" types for hexadecimal floating point; these types are allowed with compilers that support them. The default format is .CQ "%.8g" ; for greater precision, you could specify .CQ "-o\ %.15g" . See \fINumeric Output Format\fP and the documentation for .CW "printf()" for more detailed descriptions of the format specification. The .CQ "--output-format" option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the .CW "printf()" format syntax. If you don't want to bother with the .CW "printf()" syntax, you can specify greater precision more simply with the .CQ "--digits" option or select exponential format with .CQ "--exponential" . The .CQ "--output-format" option is incompatible with the .CQ "--exponential" and .CQ "--digits" options. .PP .TP .BR "-\^f \fIfilename\fP" ", " "-\^-\^file \fIfilename\fP" Instruct .CW "units" to load the units file \fIfilename\fP. You can specify up to 25 units files on the command line. When you use this option, .CW "units" will load \fIonly\fP the files you list on the command line; it will not load the standard file or your personal units file unless you explicitly list them. If \fIfilename\fP is the empty string .CQ ( "-f\ """"" ), the default units file (or that specified by .CW "UNITSFILE" ) will be loaded in addition to any others specified with .CQ "-f" . .PP .TP .BR "-\^L \fIlogfile\fP" ", " "-\^-\^log \fIlogfile\fP" Save the results of calculations in the file \fIlogfile\fP; this can be useful if it is important to have a record of unit conversions or other calculations that are to be used extensively or in a critical activity such as a program or design project. If \fIlogfile\fP exits, the new results are appended to the file. This option is ignored when .CW "units" is used non-interactively. See \fILogging Calculations\fP for a more detailed description and some examples. .PP .TP .BR "-\^H \fIfilename\fP" ", " "-\^-\^history \fIfilename\fP" Instruct .CW "units" to save history to \fIfilename\fP, so that a record of your commands is available for retrieval across different .CW "units" invocations. To prevent the history from being saved set \fIfilename\fP to the emptry string .CQ ( "-f\ """"" ). This option has no effect if readline is not available. .PP .TP .BR "-\^h" ", " "-\^-\^help" Print out a summary of the options for .CW "units" . .PP .TP .BR "-\^m" ", " "-\^-\^minus" Causes .CQ "-" to be interpreted as a subtraction operator. This is the default behavior. .PP .TP .BR "-\^p" ", " "-\^-\^product" Causes .CQ "-" to be interpreted as a multiplication operator when it has two operands. It will act as a negation operator when it has only one operand: .CQ "(-3)" . By default .CQ "-" is treated as a subtraction operator. .PP .TP .BR "-\^-\^oldstar" Causes .CQ "*" to have the old-style precedence, higher than the precedence of division so that .CQ "1/2*3" will equal .CQ "1/6" . .PP .TP .BR "-\^-\^newstar" Forces .CQ "*" to have the new (default) precedence that follows the usual rules of algebra: the precedence of .CQ "*" is the same as the precedence of .CQ "/" , so that .CQ "1/2*3" will equal .CQ "3/2" . .PP .TP .BR "-\^-\^compact" Give compact output featuring only the conversion factor. This turns off the .CQ "--verbose" option. .PP .TP .BR "-\^q" ", " "-\^-\^quiet" ", " "-\^-\^silent" Suppress prompting of the user for units and the display of statistics about the number of units loaded. .PP .TP .BR "-\^n" ", " "-\^-\^nolists" Disable conversion to unit lists. .PP .TP .BR "-\^r" ", " "-\^-\^round" When converting to a combination of units given by a unit list, round the value of the last unit in the list to the nearest integer. .PP .TP .BR "-\^S" ", " "-\^-\^show-factor" When converting to a combination of units specified in a list, always show a non-unity factor before a unit that begins with a fraction with a unity denominator. By default, if the unit in a list begins with fraction of the form 1|\fIx\fP and its multiplier is an integer other than 1, the fraction is given as the product of the multiplier and the numerator (e.g., .CQ "3|8\ in" rather than .CQ "3 * 1|8\ in" ). In some cases, this is not what is wanted; for example, the results for a cooking recipe might show .CQ "3 * 1|2\ cup" as .CQ "3|2\ cup" . With the .CQ "--show-factor" option, a result equivalent to 1.5 cups will display as .CQ "3 * 1|2\ cup" rather than .CQ "3|2\ cup" . A user-specified fractional unit with a numerator other than 1 is never overridden, however\(emif a unit list specifies .CQ "3|4 cup;1|2 cup" , a result equivalent to 1\ 1/2 cups will always be shown as .CQ "2 * 3|4\ cup" whether or not the .CQ "--show-factor" option is given. .PP .TP .BR "-\^s" ", " "-\^-\^strict" Suppress conversion of units to their reciprocal units. For example, .CW "units" will normally convert hertz to seconds because these units are reciprocals of each other. The strict option requires that units be strictly conformable to perform a conversion, and will give an error if you attempt to convert hertz to seconds. .PP .TP .BR "-\^1" ", " "-\^-\^one-line" Give only one line of output (the forward conversion). Do not print the reverse conversion. If a reciprocal conversion is performed then .CW "units" will still print the ``reciprocal conversion'' line. .PP .TP .BR "-\^t" ", " "-\^-\^terse" Give terse output when converting units. This option can be used when calling .CW "units" from another program so that the output is easy to parse. This option has the combined effect of these options: .CQ "--strict" .CQ "--quiet" .CQ "--one-line" .CQ "--compact" . When combined with .CQ "--version" it produces a display showing only the program name and version number. .PP .TP .BR "-\^v" ", " "-\^-\^verbose" Give slightly more verbose output when converting units. When combined with the .CQ "-c" option this gives the same effect as .CQ "--check-verbose" . When combined with .CQ "--version" produces a more detailed output, equivalent to the .CQ "--info" option. .PP .TP .BR "-\^V" ", " "-\^-\^version" Print the program version number, tell whether the .CW "readline" library has been included, tell whether UTF-8 support has been included; give the locale, the location of the default units data file, and the location of the personal units data file; indicate if the personal units data file does not exist. .PP When given in combination with the .CQ "--terse" option, the program prints only the version number and exits. .PP When given in combination with the .CQ "--verbose" option, the program, the .CQ "--version" option has the same effect as the .CQ "--info" option below. .PP .TP .BR "-\^I" ", " "-\^-\^info" Print the information given with the .CQ "--version" option, show the pathname of the units program, show the status of the .CW "UNITSFILE" and .CW "MYUNITSFILE" environment variables, and additional information about how .CW "units" locates the related files. On systems running Microsoft Windows, the status of the .CW "UNITSLOCALE" environment variable and information about the related locale map are also given. This option is usually of interest only to developers and administrators, but it can sometimes be useful for troubleshooting. .PP Combining the .CQ "--version" and .CQ "--verbose" options has the same effect as giving .CQ "--info" . .PP .TP .BR "-\^U" ", " "-\^-\^unitsfile" Print the location of the default units data file and exit; if the file cannot be found, print ``Units data file not found''. .PP .TP .BR "-\^l \fIlocale\fP" ", " "-\^-\^locale \fIlocale\fP" Print the information given with the .CQ "--version" option, show the Force a specified locale such as .CQ "en_GB" to get British definitions by default. This overrides the locale determined from system settings or environment variables. See \fILocale\fP for a description of locale format. .PP .SH ADDING YOUR OWN DEFINITIONS .SS Units Data Files The units and prefixes that .CW "units" can convert are defined in the units data file, typically .CQ "/usr/share/units/definitions.units" . If you can't find this file, run .CW "units\ --version" to get information on the file locations for your installation. Although you can extend or modify this data file if you have appropriate user privileges, it's usually better to put extensions in separate files so that the definitions will be preserved if you update .CW "units" . .PP You can include additional data files in the units database using the .CQ "!include" command in the standard units data file. For example .PP .ES !include /usr/local/share/units/local.units .EE .PP might be appropriate for a site-wide supplemental data file. The location of the .CQ "!include" statement in the standard units data file is important; later definitions replace earlier ones, so any definitions in an included file will override definitions before the .CQ "!include" statement in the standard units data file. With normal invocation, no warning is given about redefinitions; to ensure that you don't have an unintended redefinition, run .CW "units\ -c" after making changes to any units data file. .PP If you want to add your own units in addition to or in place of standard or site-wide supplemental units data files, you can include them in the .CQ ".units" file in your home directory. If this file exists it is read after the standard units data file, so that any definitions in this file will replace definitions of the same units in the standard data file or in files included from the standard data file. This file will not be read if any units files are specified on the command line. (Under Windows the personal units file is named .CQ "unitdef.units" .) Running .CW "units\ -V" will display the location and name of your personal units file. .PP The .CW "units" program first tries to determine your home directory from the .CW "HOME" environment variable. On systems running Microsoft Windows, if .CW "HOME" does not exist, .CW "units" attempts to find your home directory from .CW "HOMEDRIVE" , .CW "HOMEPATH" and .CW "USERPROFILE" . You can specify an arbitrary file as your personal units data file with the .CW "MYUNITSFILE" environment variable; if this variable exists, its value is used without searching your home directory. The default units data files are described in more detail in \fIData Files\fP. .PP .SS Defining New Units and Prefixes A unit is specified on a single line by giving its name and an equivalence. Comments start with a .CQ "#" character, which can appear anywhere in a line. The backslash character .CQ ( "\e" ) acts as a continuation character if it appears as the last character on a line, making it possible to spread definitions out over several lines if desired. A file can be included by giving the command .CQ "!include" followed by the file's name. The .CQ "!" must be the first character on the line. The file will be sought in the same directory as the parent file unless you give a full path. The name of the file to be included cannot contain the comment character .CQ "#" . .PP Unit names must not contain any of the operator characters .CQ "+" , .CQ "-" , .CQ "*" , .CQ "/" , .CQ "|" , .CQ "^" , .CQ ";" , .CQ "~" , the comment character .CQ "#" , or parentheses. They cannot begin or end with an underscore .CQ ( "_" ), a comma .CQ ( "," ) or a decimal point .CQ ( "." ). The figure dash (U+2012), typographical minus (`\-'; U+2212), and en dash (`\-'; U+2013) are converted to the operator .CQ "-" , so none of these characters can appear in unit names. Names cannot begin with a digit, and if a name ends in a digit other than zero, the digit must be preceded by a string beginning with an underscore, and afterwards consisting only of digits, decimal points, or commas. For example, .CQ "foo_2" , .CQ "foo_2,1" , or .CQ "foo_3.14" are valid names but .CQ "foo2" or .CQ "foo_a2" are invalid. You could define nitrous oxide as .PP .ES N2O nitrogen 2 + oxygen .EE .PP but would need to define nitrogen dioxide as .PP .ES NO_2 nitrogen + oxygen 2 .EE .PP Be careful to define new units in terms of old ones so that a reduction leads to the primitive units, which are marked with .CQ "!" characters. Dimensionless units are indicated by using the string .CQ "!dimensionless" for the unit definition. .PP When adding new units, be sure to use the .CQ "-c" option to check that the new units reduce properly. If you create a loop in the units definitions, then .CW "units" will hang when invoked with the .CQ "-c" option. You will need to use the .CQ "--check-verbose" option, which prints out each unit as it is checked. The program will still hang, but the last unit printed will be the unit that caused the infinite loop. .PP If you define any units that contain .CQ "+" characters, carefully check them because the .CQ "-c" option will not catch non-conformable sums. Be careful with the .CQ "-" operator as well. When used as a binary operator, the .CQ "-" character can perform addition or multiplication depending on the options used to invoke .CW "units" . To ensure consistent behavior use .CQ "-" only as a unary negation operator when writing units definitions. To multiply two units leave a space or use the .CQ "*" operator with care, recalling that it has two possible precedence values and may require parentheses to ensure consistent behavior. To compute the difference of .CQ "foo" and .CQ "bar" write .CQ "foo+(-bar)" or even .CQ "foo+-bar" . .PP Here is an example of a short data file that defines some basic units: .PP .ES m ! # The meter is a primitive unit sec ! # The second is a primitive unit rad !dimensionless # A dimensionless primitive unit micro- 1e-6 # Define a prefix minute 60 sec # A minute is 60 seconds hour 60 min # An hour is 60 minutes inch 0.0254 m # Inch defined in terms of meters ft 12 inches # The foot defined in terms of inches mile 5280 ft # And the mile .EE .PP A unit that ends with a .CQ "-" character is a prefix. If a prefix definition contains any .CQ "/" characters, be sure they are protected by parentheses. If you define .CQ "half- 1/2" then .CQ "halfmeter" would be equivalent to .CQ "1 / (2\ meter)" . .PP .SS Defining Nonlinear Units Some unit conversions of interest are nonlinear; for example, temperature conversions between the Fahrenheit and Celsius scales cannot be done by simply multiplying by conversion factors. .PP When you give a linear unit definition such as .CQ "inch 2.54\ cm" you are providing information that .CW "units" uses to convert values in inches into primitive units of meters. For nonlinear units, you give a functional definition that provides the same information. .PP Nonlinear units are represented using a functional notation. It is best to regard this notation not as a function call but as a way of adding units to a number, much the same way that writing a linear unit name after a number adds units to that number. Internally, nonlinear units are defined by a pair of functions that convert to and from linear units in the database, so that an eventual conversion to primitive units is possible. .PP Here is an example nonlinear unit definition: .PP .ES tempF(x) units=[1;K] domain=[-459.67,) range=[0,) \e (x+(-32)) degF + stdtemp ; (tempF+(-stdtemp))/degF + 32 .EE .PP A nonlinear unit definition comprises a unit name, a formal parameter name, two functions, and optional specifications for units, the domain, and the range (the domain of the inverse function). The functions tell .CW "units" how to convert to and from the new unit. To produce valid results, the arguments of these functions need to have the correct dimensions and be within the domains for which the functions are defined. .PP The definition begins with the unit name followed immediately (with no spaces) by a .CQ "(" character. In the parentheses is the name of the formal parameter. Next is an optional specification of the units required by the functions in the definition. In the example above, the .CQ "units=[1;K]" specification indicates that the .CQ "tempF" function requires an input argument conformable with .CQ "1" (i.e., the argument is dimensionless), and that the inverse function requires an input argument conformable with .CQ "K" . For normal nonlinear units definition, the forward function will always take a dimensionless argument; in general, the inverse function will need units that match the quantity measured by your nonlinear unit. Specifying the units enables .CW "units" to perform error checking on function arguments, and also to assign units to domain and range specifications, which are described later. .PP Next the function definitions appear. In the example above, the .CQ "tempF" function is defined by .PP .ES tempF(x) = (x+(-32)) degF + stdtemp .EE .PP This gives a rule for converting .CQ "x" in the units .CQ "tempF" to linear units of absolute temperature, which makes it possible to convert from tempF to other units. .PP To enable conversions to Fahrenheit, you must give a rule for the inverse conversions. The inverse will be .CQ "x(tempF)" and its definition appears after a .CQ ";" character. In our example, the inverse is .PP .ES x(tempF) = (tempF+(-stdtemp))/degF + 32 .EE .PP This inverse definition takes an absolute temperature as its argument and converts it to the Fahrenheit temperature. The inverse can be omitted by leaving out the .CQ ";" character and the inverse definition, but then conversions \fIto\fP the unit will not be possible. If the inverse definition is omitted, the .CQ "--check" option will display a warning. It is up to you to calculate and enter the correct inverse function to obtain proper conversions; the .CQ "--check" option tests the inverse at one point and prints an error if it is not valid there, but this is not a guarantee that your inverse is correct. .PP With some definitions, the units may vary. For example, the definition .PP .ES square(x) x^2 .EE .PP can have any arbitrary units, and can also take dimensionless arguments. In such a case, you should \fInot\fP specify units. If a definition takes a root of its arguments, the definition is valid only for units that yield such a root. For example, .PP .ES squirt(x) sqrt(x) .EE .PP is valid for a dimensionless argument, and for arguments with even powers of units. .PP Some definitions may not be valid for all real numbers. In such cases, .CW "units" can handle errors better if you specify an appropriate domain and range. You specify the domain and range as shown below: .PP .ES baume(d) units=[1;g/cm^3] domain=[0,130.5] range=[1,10] \e (145/(145-d)) g/cm^3 ; (baume+-g/cm^3) 145 / baume .EE .PP In this example the domain is specified after .CQ "domain=" with the endpoints given in brackets. In accord with mathematical convention, square brackets indicate a closed interval (one that includes its endpoints), and parentheses indicate an open interval (one that does not include its endpoints). An interval can be open or closed on one or both ends; an interval that is unbounded on either end is indicated by omitting the limit on that end. For example, a quantity to which decibel (dB) is applied may have any value greater than zero, so the range is indicated by .CQ "(0,)" : .PP .ES decibel(x) units=[1;1] range=(0,) 10^(x/10); 10 log(decibel) .EE .PP If the domain or range is given, the second endpoint must be greater than the first. .PP The domain and range specifications can appear independently and in any order along with the units specification. The values for the domain and range endpoints are attached to the units given in the units specification, and if necessary, the parameter value is adjusted for comparison with the endpoints. For example, if a definition includes .CQ "units=[1;ft]" and .CQ "range=[3,)" , the range will be taken as 3\ ft to infinity. If the function is passed a parameter of .CQ "900\ mm" , that value will be adjusted to 2.9527559\ ft, which is outside the specified range. If you omit the units specification from the previous example, .CW "units" can not tell whether you intend the lower endpoint to be 3\ ft or 3\ microfurlongs, and can not adjust the parameter value of 900\ mm for comparison. Without units, numerical values other than zero or plus or minus infinity for domain or range endpoints are meaningless, and accordingly they are not allowed. If you give other values without units then the definition will be ignored and you will get an error message. .PP Although the units, domain, and range specifications are optional, it's best to give them when they are applicable; doing so allows .CW "units" to perform better error checking and give more helpful error messages. Giving the domain and range also enables the .CQ "--check" option to find a point in the domain to use for its point check of your inverse definition. .PP You can make synonyms for nonlinear units by providing both the forward and inverse functions; inverse functions can be obtained using the .CQ "~" operator. So to create a synonym for .CQ "tempF" you could write .PP .ES fahrenheit(x) units=[1;K] tempF(x); ~tempF(fahrenheit) .EE .PP This is useful for creating a nonlinear unit definition that differs slightly from an existing definition without having to repeat the original functions. For example, .PP .ES dBW(x) units=[1;W] range=[0,) dB(x) W ; ~dB(dBW/W) .EE .PP If you wish a synonym to refer to an existing nonlinear unit without modification, you can do so more simply by adding the synonym with appended parentheses as a new unit, with the existing nonlinear unit\(emwithout parentheses\(emas the definition. So to create a synonym for .CQ "tempF" you could write .PP .ES fahrenheit() tempF .EE .PP The definition must be a nonlinear unit; for example, the synonym .PP .ES fahrenheit() meter .EE .PP will result in an error message when .CW "units" starts. .PP You may occasionally wish to define a function that operates on units. This can be done using a nonlinear unit definition. For example, the definition below provides conversion between radius and the area of a circle. This definition requires a length as input and produces an area as output, as indicated by the .CQ "units=" specification. Specifying the range as the nonnegative numbers can prevent cryptic error messages. .PP .ES circlearea(r) units=[m;m^2] range=[0,) pi r^2 ; sqrt(circlearea/pi) .EE .PP .SS Defining Piecewise Linear Units Sometimes you may be interested in a piecewise linear unit such as many wire gauges. Piecewise linear units can be defined by specifying conversions to linear units on a list of points. Conversion at other points will be done by linear interpolation. A partial definition of zinc gauge is .PP .ES zincgauge[in] 1 0.002, 10 0.02, 15 0.04, 19 0.06, 23 0.1 .EE .PP In this example, .CQ "zincgauge" is the name of the piecewise linear unit. The definition of such a unit is indicated by the embedded .CQ "[" character. After the bracket, you should indicate the units to be attached to the numbers in the table. No spaces can appear before the .CQ "]" character, so a definition like .CQ "foo[kg meters]" is invalid; instead write .CQ "foo[kg*meters]" . The definition of the unit consists of a list of pairs optionally separated by commas. This list defines a function for converting from the piecewise linear unit to linear units. The first item in each pair is the function argument; the second item is the value of the function at that argument (in the units specified in brackets). In this example, we define .CQ "zincgauge" at five points. For example, we set .CQ "zincgauge(1)" equal to .CQ "0.002\ in" . Definitions like this may be more readable if written using continuation characters as .PP .ES zincgauge[in] \e 1 0.002 \e 10 0.02 \e 15 0.04 \e 19 0.06 \e 23 0.1 .EE .PP With the preceding definition, the following conversion can be performed: .PP .ES You have: zincgauge(10) You want: in * 0.02 / 50 You have: .01 inch You want: zincgauge 5 .EE .PP If you define a piecewise linear unit that is not strictly monotonic, then the inverse will not be well defined. If the inverse is requested for such a unit, .CW "units" will return the smallest inverse. .PP After adding nonlinear units definitions, you should normally run .CW "units\ --check" to check for errors. If the .CQ "units" keyword is not given, the .CQ "--check" option checks a nonlinear unit definition using a dimensionless argument, and then checks using an arbitrary combination of units, as well as the square and cube of that combination; a warning is given if any of these tests fail. For example, .PP .ES Warning: function 'squirt(x)' defined as 'sqrt(x)' failed for some test inputs: squirt(7(kg K)^1): Unit not a root squirt(7(kg K)^3): Unit not a root .EE .PP Running .CW "units\ --check" will print a warning if a non-monotonic piecewise linear unit is encountered. For example, the relationship between ANSI coated abrasive designation and mean particle size is non-monotonic in the vicinity of 800 grit: .PP .ES ansicoated[micron] \e . . . 600 10.55 \e 800 11.5 \e 1000 9.5 \e .EE .PP Running .CW "units\ --check" would give the error message .PP .ES Table 'ansicoated' lacks unique inverse around entry 800 .EE .PP Although the inverse is not well defined in this region, it's not really an error. Viewing such error messages can be tedious, and if there are enough of them, they can distract from true errors. Error checking for nonlinear unit definitions can be suppressed by giving the .CQ "noerror" keyword; for the examples above, this could be done as .PP .ES squirt(x) noerror domain=[0,) range=[0,) sqrt(x); squirt^2 ansicoated[micron] noerror \e . . . .EE .PP Use the .CQ "noerror" keyword with caution. The safest approach after adding a nonlinear unit definition is to run .CW "units\ --check" and confirm that there are no actual errors before adding the .CQ "noerror" keyword. .PP .SS Defining Unit List Aliases Unit list aliases are treated differently from unit definitions, because they are a data entry shorthand rather than a true definition for a new unit. A unit list alias definition begins with .CQ "!unitlist" and includes the alias and the definition; for example, the aliases included in the standard units data file are .PP .ES !unitlist hms hr;min;sec !unitlist time year;day;hr;min;sec !unitlist dms deg;arcmin;arcsec !unitlist ftin ft;in;1|8 in !unitlist usvol cup;3|4 cup;2|3 cup;1|2 cup;1|3 cup;1|4 cup;\e tbsp;tsp;1|2 tsp;1|4 tsp;1|8 tsp .EE .PP Unit list aliases are only for unit lists, so the definition must include a .CQ ";" . Unit list aliases can never be combined with units or other unit list aliases, so the definition of .CQ "time" shown above could \fInot\fP have been shortened to .CQ "year;day;hms" . .PP As usual, be sure to run .CW "units\ --check" to ensure that the units listed in unit list aliases are conformable. .PP .SH NUMERIC OUTPUT FORMAT By default, .CW "units" shows results to eight significant digits. You can change this with the .CQ "--exponential" , .CQ "--digits" , and .CQ "--output-format" options. The first sets an exponential format (i.e., scientific notation) like that used in the original Unix .CW "units" program, the second allows you to specify a different number of significant digits, and the last allows you to control the output appearance using the format for the .CW "printf()" function in the C programming language. If you only want to change the number of significant digits or specify exponential format type, use the .CQ "--digits" and .CQ "--exponential" options. The .CQ "--output-format" option affords the greatest control of the output appearance, but requires at least rudimentary knowledge of the .CW "printf()" format syntax. See \fIInvoking Units\fP for descriptions of these options. .PP .SS Format Specification The format specification recognized with the .CQ "--output-format" option is a subset of that for .CW "printf()" . The format specification has the form .\".CW "%\fR[\fP\fIflags\fP\fR][\fP\fIwidth\fP\fR][\fP.\fIprecision\fP\fR]\fP\fItype\fP" ; .CW "%" [\fIflags\fP][\fIwidth\fP][\c .CW "." \fIprecision\fP]\fItype\fP; it must begin with .CQ "%" , and must end with a floating-point type specifier: .CQ "g" or .CQ "G" to specify the number of significant digits, .CQ "e" or .CQ "E" for scientific notation, and .CQ "f" for fixed-point decimal. The ISO C99 standard added the .CQ "F" type for fixed-point decimal and the .CQ "a" and .CQ "A" types for hexadecimal floating point; these types are allowed with compilers that support them. Type length modifiers (e.g., .CQ "L" to indicate a long double) are inapplicable and are not allowed. .PP The default format for .CW "units" is .CQ "%.8g" ; for greater precision, you could specify .CQ "-o\ %.15g" . The .CQ "g" and .CQ "G" format types use exponential format whenever the exponent would be less than \-4, so the value 0.000013 displays as .CQ "1.3e-005" . These types also use exponential notation when the exponent is greater than or equal to the precision, so with the default format, the value .if t .ig ++ 5e7 .++ .if n .ig ++ .EQ 5 times 10 sup 7 .EN .++ displays as .CQ "50000000" and the value .if t .ig ++ 5e8 .++ .if n .ig ++ .EQ 5 times 10 sup 8 .EN .++ displays as .CQ "5e+008" . If you prefer fixed-point display, you might specify .CQ "-o\ %.8f" ; however, small numbers will display very few significant digits, and values less than .if t .ig ++ 0.5e\-8 .++ .if n .ig ++ .EQ 0.5 times 10 sup -8 .EN .++ will show nothing but zeros. .PP The format specification may include one or more optional flags: .CQ "+" , .CQ "\ " (space), .CQ "#" , .CQ "-" , or .CQ "0" (the digit zero). The digit-grouping flag .ie \n(.g .CQ "\(aq" .el .CQ "'" is allowed with compilers that support it. Flags are followed by an optional value for the minimum field width, and an optional precision specification that begins with a period (e.g., .CQ ".6" ). The field width includes the digits, decimal point, the exponent, thousands separators (with the digit-grouping flag), and the sign if any of these are shown. .PP .SS Flags The .CQ "+" flag causes the output to have a sign .CQ ( "+" "" or .CQ "-" ). The space flag .CQ "\ " is similar to the .CQ "+" flag, except that when the value is positive, it is prefixed with a space rather than a plus sign; this flag is ignored if the .CQ "+" flag is also given. The .CQ "+" or .CQ "\ " flag could be useful if conversions might include positive and negative results, and you wanted to align the decimal points in exponential notation. The .CQ "#" flag causes the output value to contain a decimal point in all cases; by default, the output contains a decimal point only if there are digits (which can be trailing zeros) to the right of the point. With the .CQ "g" or .CQ "G" types, the .CQ "#" flag also prevents the suppression of trailing zeros. The digit-grouping flag .ie \n(.g .CQ "\(aq" .el .CQ "'" shows a thousands separator in digits to the left of the decimal point. This can be useful when displaying large numbers in fixed-point decimal; for example, with the format .CQ "%f" , .PP .ES You have: mile You want: microfurlong * 8000000.000000 / 0.000000 .EE .PP the magnitude of the first result may not be immediately obvious without counting the digits to the left of the decimal point. If the thousands separator is the comma .CQ ( "," ), the output with the format .ie \n(.g .CQ "%\(aqf" .el .CQ "%'f" might be .PP .ES You have: mile You want: microfurlong * 8,000,000.000000 / 0.000000 .EE .PP making the magnitude readily apparent. Unfortunately, few compilers support the digit-grouping flag. .PP With the .CQ "-" flag, the output value is left aligned within the specified field width. If a field width greater than needed to show the output value is specified, the .CQ "0" (zero) flag causes the output value to be left padded with zeros until the specified field width is reached; for example, with the format .CQ "%011.6f" , .PP .ES You have: troypound You want: grain * 5760.000000 / 0000.000174 .EE .PP The .CQ "0" flag has no effect if the .CQ "-" (left align) flag is given. .PP .SS Field Width By default, the output value is left aligned and shown with the minimum width necessary for the specified (or default) precision. If a field width greater than this is specified, the value shown is right aligned, and padded on the left with enough spaces to provide the specified field width. A width specification is typically used with fixed-point decimal to have columns of numbers align at the decimal point; this arguably is less useful with .CW "units" than with long columnar output, but it may nonetheless assist in quickly assessing the relative magnitudes of results. For example, with the format .CQ "%12.6f" , .PP .ES You have: km You want: in * 39370.078740 / 0.000025 You have: km You want: rod * 198.838782 / 0.005029 You have: km You want: furlong * 4.970970 / 0.201168 .EE .PP .SS Precision The meaning of ``precision'' depends on the format type. With .CQ "g" or .CQ "G" , it specifies the number of significant digits (like the .CQ "--digits" option); with .CQ "e" , .CQ "E" , .CQ "f" , or .CQ "F" , it specifies the maximum number of digits to be shown after the decimal point. .PP With the .CQ "g" and .CQ "G" format types, trailing zeros are suppressed, so the results may sometimes have fewer digits than the specified precision (as indicated above, the .CQ "#" flag causes trailing zeros to be displayed). .PP The default precision is 6, so .CQ "%g" is equivalent to .CQ "%.6g" , and would show the output to six significant digits. Similarly, .CQ "%e" or .CQ "%f" would show the output with six digits after the decimal point. .PP The C .CW "printf()" function allows a precision of arbitrary size, whether or not all of the digits are meaningful. With most compilers, the maximum internal precision with .CW "units" is 15 decimal digits (or 13 hexadecimal digits). With the .CQ "--digits" option, you are limited to the maximum internal precision; with the .CQ "--output-format" option, you may specify a precision greater than this, but it may not be meaningful. In some cases, specifying excess precision can result in rounding artifacts. For example, a pound is exactly 7000 grains, but with the format .CQ "%.18g" , the output might be .PP .ES You have: pound You want: grain * 6999.9999999999991 / 0.00014285714285714287 .EE .PP With the format .CQ "%.25g" you might get the following: .PP .ES You have: 1/3 You want: Definition: 0.333333333333333314829616256247 .EE .PP In this case the displayed value includes a series of digits that represent the underlying binary floating-point approximation to 1/3 but are not meaningful for the desired computation. In general, the result with excess precision is system dependent. The precision affects only the \fIdisplay\fP of numbers; if a result relies on physical constants that are not known to the specified precision, the number of physically meaningful digits may be less than the number of digits shown. .PP See the documentation for .CW "printf()" for more detailed descriptions of the format specification. .PP The .CQ "--output-format" option is incompatible with the .CQ "--exponential" or .CQ "--digits" options; if the former is given in combination with either of the latter, the format is controlled by the last option given. .PP .SH LOCALIZATION Some units have different values in different locations. The localization feature accommodates this by allowing a units data file to specify definitions that depend on the user's locale. .PP .SS Locale A locale is a subset of a user's environment that indicates the user's language and country, and some attendant preferences, such as the formatting of dates. The .CW "units" program attempts to determine the locale from the POSIX setlocale function; if this cannot be done, .CW "units" examines the environment variables .CW "LC_CTYPE" and .CW "LANG" . On POSIX systems, a locale is of the form .CW \fIlanguage\fP "_" \fIcountry\fP, where \fIlanguage\fP is the two-character code from ISO 639-1 and \fIcountry\fP is the two-character code from ISO 3166-1; \fIlanguage\fP is lower case and \fIcountry\fP is upper case. For example, the POSIX locale for the United Kingdom is .CW "en_GB" . .PP On systems running Microsoft Windows, the value returned by setlocale() is different from that on POSIX systems; .CW "units" attempts to map the Windows value to a POSIX value by means of a table in the file .CQ "locale_map.txt" in the same directory as the other data files. The file includes entries for many combinations of language and country, and can be extended to include other combinations. The .CQ "locale_map.txt" file comprises two tab-separated columns; each entry is of the form .PP .DS \fIWindows-locale\fP \fIPOSIX-locale\fP .DE .PP where \fIPOSIX-locale\fP is as described above, and \fIWindows-locale\fP typically spells out both the language and country. For example, the entry for the United States is .PP .ES English_United States en_US .EE .PP You can force .CW "units" to run in a desired locale by using the .CQ "-l" option. .PP In order to create unit definitions for a particular locale you begin a block of definitions in a unit datafile with .CQ "!locale" followed by a locale name. The .CQ "!" must be the first character on the line. The .CW "units" program reads the following definitions only if the current locale matches. You end the block of localized units with .CQ "!endlocale" . Here is an example, which defines the British gallon. .PP .ES !locale en_GB gallon 4.54609 liter !endlocale .EE .PP .SS Additional Localization Sometimes the locale isn't sufficient to determine unit preferences. There could be regional preferences, or a company could have specific preferences. Though probably uncommon, such differences could arise with the choice of English customary units outside of English-speaking countries. To address this, .CW "units" allows specifying definitions that depend on environment variable settings. The environment variables can be controled based on the current locale, or the user can set them to force a particular group of definitions. .PP A conditional block of definitions in a units data file begins with either .CQ "!var" or .CQ "!varnot" following by an environment variable name and then a space separated list of values. The leading .CQ "!" must appear in the first column of a units data file, and the conditional block is terminated by .CQ "!endvar" . Definitions in blocks beginning with .CQ "!var" are executed only if the environment variable is exactly equal to one of the listed values. Definitions in blocks beginning with .CQ "!varnot" are executed only if the environment variable does \fInot\fP equal any of the list values. .PP The inch has long been a customary measure of length in many places. The word comes from the latin \fIuncia\fP meaning ``one twelfth,'' referring to its relationship with the foot. By the 20th century, the inch was officially defined in English-speaking countries relative to the yard, but until 1959, the yard differed slightly among those countries. In France the customary inch, which was displaced in 1799 by the meter, had a different length based on a french foot. These customary definitions could be accommodated as follows: .PP .ES !var INCH_UNIT usa yard 3600|3937 m !endvar !var INCH_UNIT canada yard 0.9144 meter !endvar !var INCH_UNIT uk yard 0.91439841 meter !endvar !var INCH_UNIT canada uk usa foot 1|3 yard inch 1|12 foot !endvar !var INCH_UNIT france foot 144|443.296 m inch 1|12 foot line 1|12 inch !endvar !varnot INCH_UNIT usa uk france canada !message Unknown value for INCH_UNIT !endvar .EE .PP When .CW "units" reads the above definitions it will check the environment variable .CW "INCH_UNIT" and load only the definitions for the appropriate section. If .CW "INCH_UNIT" is unset or is not set to one of the four values listed then .CW "units" will run the last block. In this case that block uses the .CQ "!message" command to display a warning message. Alternatively that block could set default values. .PP In order to create default values that are overridden by user settings the data file can use the .CQ "!set" command, which sets an environment variable \fIonly if it is not already set\fP; these settings are only for the current .CW "units" invocation and do not persist. So if the example above were preceded by .CQ "!set INCH_UNIT france" then this would make .CQ "france" the default value for .CW "INCH_UNIT" . If the user had set the variable in the environment before invoking .CW "units" , then .CW "units" would use the user's value. .PP To link these settings to the user's locale you combine the .CQ "!set" command with the .CQ "!locale" command. If you wanted to combine the above example with suitable locales you could do by \fIpreceding\fP the above definition with the following: .PP .ES !locale en_US !set INCH_UNIT usa !endlocale !locale en_GB !set INCH_UNIT uk !endlocale !locale en_CA !set INCH_UNIT canada !endlocale !locale fr_FR !set INCH_UNIT france !endlocale !set INCH_UNIT france .EE .PP These definitions set the overall default for .CW "INCH_UNIT" to .CQ "france" and set default values for four locales appropriately. The overall default setting comes last so that it only applies when .CW "INCH_UNIT" was not set by one of the other commands or by the user. .PP If the variable given after .CQ "!var" or .CQ "!varnot" is undefined then .CW "units" prints an error message and ignores the definitions that follow. Use .CQ "!set" to create defaults to prevent this situation from arising. The .CQ "-c" option only checks the definitions that are active for the current environment and locale, so when adding new definitions take care to check that all cases give rise to a well defined set of definitions. .PP .SH ENVIRONMENT VARIABLES The .CW "units" program uses the following environment variables: .PP .TP .BR "HOME" Specifies the location of your home directory; it is used by .CW "units" to find a personal units data file .CQ ".units" . On systems running Microsoft Windows, the file is .CQ "unitdef.units" , and if .CW "HOME" does not exist, .CW "units" tries to determine your home directory from the .CW "HOMEDRIVE" and .CW "HOMEPATH" environment variables; if these variables do not exist, units finally tries .CW "USERPROFILE" \(emtypically .CQ "C:\eUsers\e\fIusername\fP" (Windows Vista and Windows\ 7) or .CQ "C:\eDocuments\ and\ Settings\e\fIusername\fP" (Windows\ XP). .PP .TP .BR "LC_CTYPE, LANG" Checked to determine the locale if .CW "units" cannot obtain it from the operating system. Sections of the standard units data file are specific to certain locales. .PP .TP .BR "MYUNITSFILE" Specifies your personal units data file. If this variable exists, .CW "units" uses its value rather than searching your home directory for .CQ ".units" . The personal units file will not be loaded if any data files are given using the .CQ "-f" option. .PP .TP .BR "PAGER" Specifies the pager to use for help and for displaying the conformable units. The help function browses the units database and calls the pager using the .CQ "+n" \fIn\fP syntax for specifying a line number. The default pager is .CW "more" ; .CW "PAGER" can be used to specify alternatives such as .CW "less" , .CW "pg" , .CW "emacs" , or .CW "vi" . .PP .TP .BR "UNITS_ENGLISH" Set to either .CQ "US" or .CQ "GB" to choose United States or British volume definitions, overriding the default from your locale. .PP .TP .BR "UNITSFILE" Specifies the units data file to use (instead of the default). You can only specify a single units data file using this environment variable. If units data files are given using the .CQ "-f" option, the file specified by .CW "UNITSFILE" will be not be loaded unless the .CQ "-f" option is given with the empty string .CQ ( "units\ -f\ """"" ). .PP .TP .BR "UNITSLOCALEMAP" Windows only; this variable has no effect on Unix-like systems. Specifies the units locale map file to use (instead of the default). This variable seldom needs to be set, but you can use it to ensure that the locale map file will be found if you specify a location for the units data file using either the .CQ "-f" option or the .CW "UNITSFILE" environment variable, and that location does not also contain the locale map file. .PP .SH DATA FILES The .CW "units" program uses two default data files: .CQ "definitions.units" and .CQ "currency.units" . The program can also use an optional personal units data file .CQ ".units" .CQ ( "unitdef.units" "" under Windows) located in the user's home directory. The personal units data file is described in more detail in \fIUnits Data Files\fP. .PP On Unix-like systems, the data files are typically located in .CQ "/usr/share/units" if .CW "units" is provided with the operating system, or in .CQ "/usr/local/share/units" if .CW "units" is compiled from the source distribution. .PP On systems running Microsoft Windows, the files may be in the same locations if Unix-like commands are available, a Unix-like file structure is present (e.g., .CQ "C:/usr/local" ), and .CW "units" is compiled from the source distribution. If Unix-like commands are not available, a more common location is .CQ "C:\eProgram\ Files\ (x86)\eGNU\eunits" (for 64-bit Windows installations) or .CQ "C:\eProgram\ Files\eGNU\eunits" (for 32-bit installations). .PP If .CW "units" is obtained from the GNU Win32 Project (\fRhttp://gnuwin32.sourceforge.net/\fP), the files are commonly in .CQ "C:\eProgram\ Files\eGnuWin32\eshare\eunits" . .PP If the default units data file is not an absolute pathname, .CW "units" will look for the file in the directory that contains the .CW "units" program; if the file is not found there, .CW "units" will look in a directory .CW "../share/units" relative to the directory with the .CW "units" program. .PP You can determine the location of the files by running .CW "units\ --version" . Running .CW "units\ --info" will give you additional information about the files, how .CW "units" will attempt to find them, and the status of the related environment variables. .PP .SH UNICODE SUPPORT The standard units data file is in Unicode, using UTF-8 encoding. Most definitions use only ASCII characters (i.e., code points U+0000 through U+007F); definitions using non-ASCII characters appear in blocks beginning with .CQ "!utf8" and ending with .CQ "!endutf8" . .PP When .CW "units" starts, it checks the locale to determine the character set. If .CW "units" is compiled with Unicode support and definitions; otherwise these definitions are ignored. When Unicode support is active, .CW "units" will check every line of all of the units data files for invalid or non-printing UTF-8 sequences; if such sequences occur, .CW "units" ignores the entire line. In addition to checking validity, .CW "units" determines the display width of non-ASCII characters to ensure proper positioning of the pointer in some error messages and to align columns for the .CQ "search" and .CQ "?" commands. .PP At present, .CW "units" does not support Unicode under Microsoft Windows. The UTF-16 and UTF-32 encodings are not supported on any systems. .PP If definitions that contain non-ASCII characters are added to a units data file, those definitions should be enclosed within .CQ "!utf8" \*(El .CQ "!endutf8" to ensure that they are only loaded when Unicode support is available. As usual, the .CQ "!" must appear as the first character on the line. As discussed in \fIUnits Data Files\fP, it's usually best to put such definitions in supplemental data files linked by an .CQ "!include" command or in a personal units data file. .PP When Unicode support is not active, .CW "units" makes no assumptions about character encoding, except that characters in the range 00\-7F hexadecimal correspond to ASCII encoding. Non-ASCII characters are simply sequences of bytes, and have no special meanings; for definitions in supplementary units data files, you can use any encoding consistent with this assumption. For example, if you wish to use non-ASCII characters in definitions when running .CW "units" under Windows, you can use a character set such as Windows ``ANSI'' (code page 1252 in the US and Western Europe). You can even use UTF-8, though some messages may be improperly aligned, and .CW "units" will not detect invalid UTF-8 sequences. If you use UTF-8 encoding when Unicode support is not active, you should place any definitions with non-ASCII characters \fIoutside\fP .CQ "!utf8" \*(El .CQ "!endutf8" blocks\(emotherwise, they will be ignored. .PP Typeset material other than code examples usually uses the Unicode minus (U+2212) rather than the ASCII hyphen-minus operator (U+002D) used in .CW "units" ; the figure dash (U+2012) and en dash (U+2013) are also occasionally used. To allow such material to be copied and pasted for interactive use or in units data files, .CW "units" converts these characters to U+002D before further processing. Because of this, none of these characters can appear in unit names. .PP .SH READLINE SUPPORT If the .CW "readline" package has been compiled in, then when .CW "units" is used interactively, numerous command line editing features are available. To check if your version of .CW "units" includes .CW "readline" , invoke the program with the .CQ "--version" option. .PP For complete information about .CW "readline" , consult the documentation for the .CW "readline" package. Without any configuration, .CW "units" will allow editing in the style of emacs. Of particular use with .CW "units" are the completion commands. .PP If you type a few characters and then hit \fIESC\fP followed by .CI "?" then .CW "units" will display a list of all the units that start with the characters typed. For example, if you type .CI "metr" and then request completion, you will see something like this: .PP .ES You have: metr metre metriccup metrichorsepower metrictenth metretes metricfifth metricounce metricton metriccarat metricgrain metricquart metricyarncount You have: metr .EE .PP If there is a unique way to complete a unitname, you can hit the \fITAB\fP key and .CW "units" will provide the rest of the unit name. If .CW "units" beeps, it means that there is no unique completion. Pressing the \fITAB\fP key a second time will print the list of all completions. .PP The readline library also keeps a history of the values you enter. You can move through this history using the up and down arrows. The history is saved to the file .CQ ".units_history" in your home directory so that it will persist across multiple .CW "units" invocations. If you wish to keep work for a certain project separate you can change the history filename using the .CQ "--history" option. You could, for example, make an alias for .CW "units" to .CW "units --history .units_history" so that .CW "units" would save separate history in the current directory. The length of each history file is limited to 5000 lines. Note also that if you run several concurrent copies of .CW "units" each one will save its new history to the history file upon exit. .PP .SH UPDATING CURRENCY EXCHANGE RATES The units program includes currency exchange rates and prices for some precious metals in the database. Of course, these values change over time, sometimes very rapidly, and .CW "units" cannot provide real time values. To update the exchange rates run the .CW "units_cur" , which rewrites the files containing the currency rates, typically .CQ "/usr/share/units/currency.units" . This program requires .CW "python" and the .CW "unidecode" package, and must be run with suitable permissions to write the file. To keep the rates updated automatically, run it using a cron job on a Unix-like system, or a similar scheduling program on a different system. Currency exchange rates are taken from Time Genie (\fRhttp://www.timegenie.com\fP) and precious metals pricing from Packetizer (\fRwww.packetizer.com\fP). These sites update once per day, so there is no benefit in running the update script more often than daily. You can run .CW "units_cur" with a filename specified on the command line and it will write the data to that file. If you give .CQ "-" for the file it will write to standard output. .PP .SH DATABASE COMMAND SYNTAX .TP .BR "\fIunit\fP \fIdefinition\fP" Define a regular unit. .PP .TP .BR "\fIprefix\fP- \fIdefinition\fP" Define a prefix. .PP .TP .BR "\fIfuncname\fP(\fIvar\fP) noerror units=[\fIin-\^units\fP,\fIout-units\fP] domain=[\fIx1\fP,\fIx2\fP] range=[\fIy1\fP,\fIy2\fP] \fIdefinition(var)\fP ; \fIinverse(funcname)\fP" Define a nonlinear unit or unit function. The four optional keywords .CW "noerror" , .CW "units=" , .CW "range=" and .CW "domain=" can appear in any order. The definition of the inverse is optional. .PP .TP .BR "\fItabname\fP[\fIout-\^units\fP] noerror \fIpair-list\fP" Define a piecewise linear unit. The pair list gives the points on the table listed in ascending order. The .CW "noerror" keyword is optional. .PP .TP .BR "!endlocale" End a block of definitions beginning with .CQ "!locale" .PP .TP .BR "!endutf8" End a block of definitions begun with .CQ "!utf8" .PP .TP .BR "!endvar" End a block of definitions begun with .CQ "!var" or .CQ "!varnot" .PP .TP .BR "!include \fIfile\fP" Include the specified file. .PP .TP .BR "!locale \fIvalue\fP" Load the following definitions only of the locale is set to \fIvalue\fP. .PP .TP .BR "!message \fItext\fP" Display \fItext\fP when the database is read unless the quiet option .CQ ( "-q" ) is enabled. .PP .TP .BR "!set \fIvariable\fP \fIvalue\fP" Sets the environment variable, \fIvariable\fP, to the specified value \fIonly if\fP it is not already set. .PP .TP .BR "!unitlist \fIalias\fP \fIdefinition\fP" Define a unit list alias. .PP .TP .BR "!utf8" Load the following definitions only if .CW "units" is running with UTF-8 enabled. .PP .TP .BR "!var \fIenvar\fP \fIvalue-\^list\fP" Load the block of definitions that follows only if the environment variable \fIenvar\fP is set to one of the values listed in the space-separated value list. If \fIenvar\fP is not set, .CW "units" prints an error message and ignores the block of definitions. .PP .TP .BR "!varnot \fIenvar\fP \fIvalue-\^list\fP" Load the block of definitions that follows only if the environment variable \fIenvar\fP is set to value that is \fInot\fP listed in the space-separated value list. If \fIenvar\fP is not set, .CW "units" prints an error message and ignores the block of definitions. .PP .SH GNU FREE DOCUMENTATION LICENSE .SH FILES @DATAFILE@ \(em the standard units data file .SH AUTHOR units-2.12/units.pdf0000664000175000017500000131016112607541443013726 0ustar adrianadrian%PDF-1.5 %адХи 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xкmTMЂ@Нѓ+z&ЮСБ?tBL$ёАуd4›Н*Д.‰<јяЗ_•шЬf’WЏ_wеЋюr№уc;Šђъ`GцUŠOлVз&ГЃјчОіƒЄЪЎ[vяжц6яWл7ёбTйжvbЏ“uYt/NМ.Гѓ5ЗНъџЂЅ=хS‚> stream xкmTMЂ@Нѓ+z&ЮСБ?tBL0ёАуd4›Н*Д.‰<ЬПп~UЂЮf’WЏ_uНЊюv№уc;ZфеСŽЬЋŸЖ­ЎMfGёЯ}э I•]/Жьо­ЭmоЏЖoтЃЉВ­эФ0^'ыВш^œx]fчkn{еџEK{*Ъ‡uФpg6;Ео$4ЛЂ;ЛЕgZ8, ’ќВM[Tх›PЏRJGЄeWxmНё­žїŽE™7ЗЂт žв"/Вюб7ЛИІ‘М§j;{Y—ЧЪ‹"1ўt‹mз|‘ЃoМirлхI Щ‘cЖзК>[Tв›ЯEnn#злћўbХјЙ‘ћвюЋЖBSЌиEVхЖ­ї™mіхЩz‘”s…ЋЙgЫќŸЕ)gŽЯRЉ№133wФ xAФbъэ;ЌвaGL6K& 0+‡}&і"?‘сА(вІвa/ Ёcь,•!ЃНЅ‰ю-fі3Єй*IУx {aЊљ№”sIC%в№hSєЂЈ7хЃХ}­HЯ=ХЄIYƒЙ(юƒъjХЇ џZѓщрќ4{жиSOис5˜‡сZ фЎekxvKКЗЧЌќї…м@2aТ> stream xкmSСnт0Нч+М$z иЈ"Є€ФaKUЂе^C<аHрDN8№їѕЬŠV{Hєќцч=ќњиS`ОJё m}u%ŒвпE Y]^/`ЛwІЖoтУех:1LЗйжVн‹omyОшUџ­рTй жУўŽvЙЪѓ‘DM^ug{І…Ч‚А ЩpmUл7Ё^Ѕ”žX[“жєку{=1ю+kмНЈ8 …@iaЊВЛЏш_^|г˜МПЕ\ЖіXq,ЦŸ>иvюFŽ^‚ёЮp•=‰!9ђЬўк4gРъBЫЅ0pєљоо‹ ˆёs#P~k@hZ+vQжкІ(СіA,хRФбf€5џФІœq8>KЅТ_И—žX NˆHцžад3$ЄЧž˜{<н0Š*Ђ5cе~џPїѕЪЏТљн5WТ42^!ž0^#žrq‰x֘œE„3xЮќ ё Њz“)cвgl1BЬювАѕ•?ŸXqћ!ђŠNA‡ЈWšЛA*d§1љд)iШЇЮАХч“аžѓ т9ч’†NVfЄЁ–kєЏVфaŠžUJќ†єь?%Эš5иЛbџTWЃ=ᘎБЎ–ОŒПЩ5ыё2щfш&p2pjГV^ѓcHЃMc†VYxLS7˜E=›ў1тjЗ ОgШШ endstream endobj 6 0 obj << /Length 272 /Filter /FlateDecode >> stream xкНNФ0„{?…ЫЄ№тнџJ@(а ŠЙ $"w№ќЌcr:$„ oЂљЦƒкЪAЌЬšЈ_о”]ўЮЏК їз Пї&Йџ\1yЧр?ЬŒPM ХяЂUgWСiВр]tКэs&чBŒКэєSѕ0‡}m8ИъrkЦъГfЊvѓ~ЯчіFmZѕ~tЯrЧё˜"“Xт>яtЏю д9’M˜Ёьh!К†€\(фM72У0sE€XІ~š3V,ќЉEˆр}оЂ§XR—ЕŸ$ZзыШыSV ™Д‚ pу)Ыф§ Bю™Н/њѓnЖciчv›чщзJаŠљД„”x­ф 'uF endstream endobj 14 0 obj << /Length 718 /Filter /FlateDecode >> stream xк}TMoл0 НчW;Щ@эъЫ_иimзЂУ0 ›ЛЫКƒk;Е0Ч.leYА??RTуЄш†L‘љєpј‰ рAІT\ш<Ј7+юМгc@Ц—›•№8­$|џ ‰)ƒшЈкEЙ:ПN’@№Ир…Ъ5^' Ћ< Ъ&јЮЪЮЬaЄвŒmЊ!”9лV=Ÿ§ыq"уцгwƒБ>xЯў гкi6у@N qЧ,aЛЮдЁЬXGбЇ0‚C;AнЏВ] жЃытWш0XгЊЁy‡‚!ўGљЦŽ„ŠE"hšКъыm_YL‹€4Њ Рхј„хї“yьаА”Ј8z€щq5њЯЏS}Ь]ЄbЎ‚шvЯEBШS–ЁЇˆЯС—GЏ#žžёЕЗpŠSŠ™ЁюЗЃ–У ф%ъј‰ŠzMл^Б{Ё4§—Тa‘žЎ^JЙZ yyНq‹Иz_Ўўў?’ endstream endobj 50 0 obj << /Length 2131 /Filter /FlateDecode >> stream xкэ›[oл6Чпћ)ќ6{€9о%э­З ŠЖhS У6`ЊЃЅТЛэІ§і#Х‹Žd’JдІЗтФЯ9сџчCžC–ЬАњGfžeŒЁ‚чГеХ=мОлœЯЬ7/~ЙGьsKѕр<љрєоO'BЬF.Шьєп™ 9*2oюєlічМ^ќ}њлНЧЇоŽ єŠѕ“G3х1C”Ў=Њ˜dЮaмx;]|^О^W‹%ЫФ|ћЏy}Ин,™я+ѓВг1S1.Љ6Ѕў:–#™Sc‰,–„P1іNЉšwuuщЖУ ‡ЂУШ•™vјaS;7cј rТHцžћYЙ‘™y‘НŸЎўцдq7ѕц@pЮ *иLrИ ­цHЈ_!\Ј/„ЖтїписK0оƒаЭъР‰•p‰rУˆЃЇŸёЈбгšsfМQ ЬЏЕІ\эыЭЙaцВоП RУн4Л5вШBj>+J$ьќMFЂŸ@ŠF„1†DвЃBBфхЬzc‰W; B@~Y < хŒС_B-ˆ{ьщvГьAf2дњCBЅЪЯфЫ‘–оЭгTщСјИє=1xHzЦˆєiZzA о›•^ijRРЃъ/LИњБоnТŸqЂ>фRх›oѕC~э7#hиyœŒF7>F_Ќ Œ14ћЛ"‚ЙкС№™`смnTTQГ€1ž?оœЏын cѓ‡‡н~{Q6є\бГ sŸ$ы™хj$фWЛ‘Иy Ўžr8\xЎ–П:нДВˆ Z 1Д.ГЮ–дyfЧяп6еnЯ9jSШќфœHВБг79йtуЩj$ƒD€0Цˆx '^`$Љƒа'›goKšЋrІмo›`ZЩИЪ*SЫ“/ј™џЦRдЕ–E“WœЄ“г0H_=r‚АТ@F`MЛєАfтsАR ыЫУХЮ,‹хцЬ,ˆjЕ‰bUSmV•§][уЋзW›иB™a”єлЊИo"сY}эdOЧЈ3Тjš1Œa”tщ1’*ѓRГ==\,TЮ{m3ŸCjчЖX1lE’‰Л§UvsЭ 6ХЮ@ EШED2†bвЅGQU$sЛ2Ф-ŠѕzПЌ7С“EЮTбПсA†ˆЗ.s}N­Pгь Є„<„Œ!˜tщd9Т”8…E№ySНЋЗ›_TЛУzdSФ0НСЯђPuV =йNЈk#hЧ/‚7ІŠƒ ‚HЦLњє RŽђЬ!(-‚ЗoзѕЊмWgнжЭЌЦЊ\]yЃїvdО‹цХлЖЃ‹‘cІw:8~|Š ! іЯAcдЄzhAнв™ЙЅГ\щ]м—њkйœйэ›fЉмзЏыЕBH§цƒš3•tчџn„ьyIь[f?кgњg˜ЪЗ/”AЋЌ§ж YЦŒцбвт#њ/ЯnŒOЃфt>§јŸBƒ|vaŒёйwxдlc9CВШ]mlšmOЗ›uНЉЪЦtмКо›=uЖШ;нЪЕсЈњ`0ќхЯїŽ„d(—ФџнзWвŒ_Ё6йРMBKЩˆ˜CŸсlУЄnЃVRп(;е{ѓъBЗЫВyЅWЃFщWюMхЯFч›w STF—*^ ьЎKŸLN‚ЩyH$Šžв„щ‘Œб•єщщьщr­gћ7Ucж˜=’],&>тоШmиЧшВLЇЋ3Ђ *M‚'Š0’1К>W"*ЮЅq—ћ<ЉwћšбnЗн2DmІ2ЯьЗцеЖYСuЉWёk(„ЂltЃ[ElЬгW‘Ю@jSC‚p0’1%’>•Др(ЫЄkt%žlЯЯ§хŸ‡хzuX—‰ƒџŒ#ЮщwsЛЧ сffВоР@Bяž$и\‘ŒшіЉѕ– q™ЙVМєеюєЖџE.ћбB\щЊWAnя%ЇЊцщ№tR№@5iА+#ƒ'щSУУ(""ѓMCЯ§Г3Ÿ,ўа7XЗ[L<Лм\ѕіхaіYС‰IgџШщвuRвСЙЄС<#“nр3МŸЃD•ђФU(и— fХlwpЪ}iJ„“z]EњњЩœмВвEЧьУœB“З{Р@bЛз!ˆd ОЄOІHШ>WMИмаІ]RД7е§й&la1нџзOП™zbО+0c ийœJg  яSРHЦ@Iњt h9ёЋŒ? ?хЊЕЇ ˆцђю2“›ѓЩ8 œzвв,„ŒdЇДOS&•вуФ#8=ЏЋUuYяl‡ьЩ•аЪ9њ†пmмlNЅ3ŠFƒUŒd ”ЄOŠкўв"" Иѓ>жі) -їзuЙ‹,JB BА[оCсdч|:NNPZ<„‘Œс4№yT'щn'.˜?uД'-‡‹ЊЉWЖ4:ьпlЛыЄ-šš‹r.pІ&B~5uЄˆr30ЙˆEToЂ#К‚HЦtјŒЄ ’Ћœ/œИОˆjяCлф№в^V^щKŸ|е6аТ­qrї?!>fEВzLO!T ВГрщŒd ЕЄO*~юQs%гЩК<Ў5"G”“ЛюWnŒY+ьtf;)f!?fA$cЬ&}:f Š˜шuХлI]­m џ{}цў;qŸо‚ YШЛ3Т›2б*6™Хn|Eˆ ž^ƒ0F@L:tfЂиoС|еїМQ ђ.ВЋ2!/и€_УВnѕ›Le7>A%„$L%уˆЪџ3:ѓ endstream endobj 87 0 obj << /Length 865 /Filter /FlateDecode >> stream xкх˜Moг0€я§9Ж‡zўŽЭ і%аФat\‡Ќ #R›NY‡6~=vь4Nы8%Ѓ06MкZ7іћц}žјu‡"Ј~P$a$б|9‚еhy™—ч#dЏ›Њ ЇЮ•яfЃЃ3Ц"„EГoC H"7ыЭвшЫ8Я'_gFЇГЭJ у=Cъ+wbЦ*&„rЌcъєU Ф&Т“)B˜/V“)AуyВШ&ы|Uш4ŽЮ„юt„ъ. ™§FMцБљУ[я1xј}ƒ[dЈ*ЕрhSQM0ѕ€R§BИТдqyеѓЇЮfлaЊвК“ ƒ­LК=бWюФlЛ‰ UбˆK˜”Е,ЉR@+]АаКdFNмщœЂF†iђŸ™єМгнQVЭЈцњћЪšљSg>лaЪК™є(ŽЙQV@@ыэT)‹­Вoг4з[ВP;!ŽТ­Џ-2Ђ ‚_‡Щ{FшRЪж}ИRЭ!Ѕ\М„y•r2щSj+цNЗф ТъnIlЗ<-&ЊYўШЫUБЬЊзk%UЬЦŸ'’Ž“2OЎйП…JBoЁtг0 ЈЎХр>ч,шs­’“иKиЩЄp0І&ЌЯ4qнтЈ%|’Ќƒє,яD 9 „=k”mшrЦVwИ3Э!g\ˆDxq2щs&S9УмУЌ1WE>7‡ш43ц|КПН­Vхк/c€‰—хO‡Іbƒ-иL8р@ёафаУ?Mгg`ѕ]Ы№ч–џe–Є‹Ми›=WїM_ЪцбEнVj8їfy‘^іN&}єƒ15Œ€ Фђычп№NеYВИ1п—eVЬЭЛг‡Й>)|OŠ+ЩeВюh-XЈгNќ9К€ид‡iq+DЁˆ“I`L„ЊjQЮ,сД№ыфЮжњxЕ\&EjŸЮGshKќе'Pќ7цzѕ}Іч, з*ЇŸž›IНpLMХŠКJKяќу•=щ#u™YŒ'іџTїѕЙл|uЋ>ЛШчYq—u> stream xкЕX[oгH~ЯЏ˜GX‰Щ\ЮмB Ћ•X@аJЫВ<„д-ЉЇ-џ~Пуq mьРnЉŠЧž3пwnsЮLP‚DRB[ЁНку‚ $Ќ1ј"МѕB(ЂУ#‰фН0XЃ‚Ÿ-ДŽx‡ИIxˆT†„vXbъM†qH ф@фI№p„Х”Žab5 ѓBka- j!ъ­ј3‚€^&:Ш*ШE@DШс“NN€ЪZ&„)‚ЮdАр",u$z8ШЅ€їˆЅ* ˜DЦСpВЪPi5Њф`lРЛ‡Rђ Ў‹phђXЏ…Sј‰аЩ ЈцЌr"‚Šрб…s&NЂУг[‘‚p~бJa€…Z!Р“ZaI,w!№,ŽmЎDр\L<O2jЂ5„ЌжˆЂcЫ4Мр•Ц+НтРТЏ^y0E#<ёУ be5|ц G ёХD#ˆ(Oq~ ЦNGlGЦ‡сeЮ S шf ;пІ‡№h˜э=бD; ћл‘g>АˆА€Ш „Џ|Дœœ@މ@Nlф|ђј‚| ŽдRь€Љ}ПРовX`BˆўбQ0œЏ0;` Eh7Ђ, C9d1”q “G&гуo_ 1}3;/&гguеUГ[ыэdњЖXеыхМXaŸЕў,NЫйгњZ|PјрЁJHцуЫ—X‡(ЕbЗШ/€&=гlЯ`=тfшEj‡ŸОYжѓwE#>@—Ѓbz\\7туЊWIMЗЕ„>wQsKЗ6ФwQЮЉЦџЂмєIUеРљР…Œѕайƒ:kЈГчŒЪ&?l~P~d3LF1Хd“QlFБХf›QlFБХf›QlFБ…2 eЪ(”Q(ЃPFЙхЙжвЩєнњSгОП,Ћ/“щгzyZ,Г“дGvф@“‰ЗЇ“Јd„ЦкAфIЦwbњ{}\‹щ‘ИЇяsќюЬІЕD§Эl†$jйй\TRQfC5”!ѕГб8lNKnQ-›з}р0l$ТяЌ‘ЩwtdЄїНlnлI:2Є2§ЖљqlЃЅS™ŽR”шIЅ ARgЂ†œIНtq$:Oвv‰BAK4ь^К4ђ’;`KчЂ t:›ЄJ|ВBМјФФt(.8tєoq5ŸСЦЦIЕхУž ъпZФЇlъјt’8эіѓ™ЛђY=Ÿh­є8ё0ŸMvhŸп.›gН“кvtdадЯgGтsмВ;-ЊІ|4’;—ŠOѕЬg§р^зn>“P@q€lљPEƒрK#ёy%}Ш|Ји’L?ŸQ#ё™$­яја†pНшчsуф‹б9™ѓг‹эG‡хSŠKJцгJтJгЯчЧсУeƒKJЫ‡›БLi€/ŒФ‡=Ўл.б^}d$гЯ7R{Р 6Qц ШеЄ{љЌ'?q_•иw™эH9 ОЮ>эЅГjБіTЏЕВ-"ѓi‹кvP:œЂ­ЫжЅ$г@qБ#5‡€ікЃ—оХ_`;Тђ|šўѕўoўЇџЁZ/їоSЗnжи~Юtуі1vs—ХI˜FКsЧpћZнџЛжRОJRV?фЗаНeѓBV5ц‹eЬۘmŒйКHwОQv[. L*›[|п3'C8 endstream endobj 267 0 obj << /Length 3554 /Filter /FlateDecode >> stream xкНZ[лЦ~їЏа[Јжb83фLа‡ФM EŠ&Љc \idІD™—Нќћžл№"qНk( /‡Ус™3чњ#ЊUџд*VЉ1agЋэёUDГЭ‡~љл+%ы6Аp3Yљ§ЭЋЏL’•ŠТ<Ъеъf?%uГ[Н ~;•]Лоc‚7ѕi­грn­ГР5m ЗЃ’Ьj§ўцЇW?м %ZП#\yХR ,ЅЁVI,,й,•‰™%Ео$VџXo0c40sWК{`&M‚zМ|§cnЇ$”†q†›…žEыцЇпј……<Ѓх7'‹эtБVЁNГgi*m§ВsShŠуzЃAŠ[”h†Mс(gœ§д4н•]щdЮ=œзЖn‡ЗyPžxњnи hЪК—uэcлЙcЫЋ@4ytEл7юш˜,?ьj~и\й пЈ‹0Žb‚ UЂ˜_їЉ/y—Ъ‘њЩ@чШ^k ар07Їљ=_qsдTПVAуpфљз™ряхGВ(ІqфГ?ђЫmy,ЋBШ‹шкзp›ƒ :žоТЩЁ8э*в{vˆ#’ьЋЎ3ulџўfB`!о\nCьќъЖ…<Ў онЌГ8pЧ3.JДшz4(ЩЕЈпƒ™ФЉ Ю –тƒЌSцђ˜qЄУ$Ÿђщ`%‹Ÿ9вI:иSšŠ$ФШ№†Ќ+Ž5[ЙЂQМгдŠ§Йїu/šШ>aa№`пдВЌ”h=xmћЃ,"…+E.t*ЅІІ‰/З—ћPœ*Oxў8‚™чя‰ wт'GзC,ьы–мѓ\ѕ’bЪoя(d„ДXХ0*!Эo|_ДхнFѕhœ‘r”-?ƒ№qЎм7œ/‘rнѓ AЙрЖ;8є’ю€Hw(:žœНy‡-|$Ѕ—k~a;Ыx^6Ы‰Д2фŒ}ГNTЊZpR niƒe(œВ…ф tуI„№мыШsЏђ ї0MZЙЧ…5_чЖДШНŠѓPYp!п}ЦDяFЋS+ЖШ ѕФГ ќz kрqь Œбa Ш2u:8*пє#ђo˜)јіƒ;ЈЋЭЙoиЉъVnIXЅxMљGЄт-?ьЙa‰ыШ†&IgЙэЋЂЋбЩ”Lвœ№нЙ• _œљШЗ—ръ­YxѕА-б.AM 3Д3“MэLЂ* ^ТЊ#пЭm ћ5ВЈF­<№ЭБш›Ѕхр ‡ œz,&б&ˆaИюJ€6“yˆfUПуh ЗyбJГ m–МыЗŸћдзtТ,шa9ЉЏУlуŸА1"SlBЇ%іeГšfТЏ#П(?pЅ›%Z–Žо‚kIš8 oPкХЩbЛэAwr‡Мр’.JŒ^†-JР†'^ Ї8И?ЂѓдЭЧЭр$'ЮžfAUћЙ+-ˆyСЂrєЉКА,9ŠЫ Р$•-з апяЪБЉЅй@Бщ№&Ђ;B•ЗМЖ‡dR ŠршKDОqœ!я€hт#QYA6ь8›Нц)J†зMC­’Љl[Fб—#4џўfB`Ю\n3GhШ_Z>ЬЛ7xv„иNbфoщ`єУЈЏїrЎ3с2|Q]Uq …Xjf‡ћ 0“еЯх’Јф(ЮЇЉЮчAœ№šБб‹,Т{™л9Œƒ':ЊXџp%EТ:ї‰‹\€]С#|Љ‚Фх–ХˆsФ‚'cFВ>;кH’  ЧХ&б‚1йђЬй/чDŸІ&К>:Т;Ц;YŽК”9ЩЦЅ#tSžр!fy-Й]ЙsГeђ=М—ЕТ)ŒNqпšЏmOFsEтфмŽ*3Ё~СЫЖо•ЄXћвћ„ L<™'3с S->иŸСЋЧчФAлAь+šн2ЁЇ1ТЏ4сk’IЪh|АsћЊXžНeи{(XшЈ\ућ№!3€†є‹zyь—БEрfwы$ћ (ЙsЧ‘їќPњфУЯфТw< &† :33BR€cˆ+з…Ј‰C "^ gјтBTопL,ЂлgoХ™‹аf.Aюэ$Н|ф%‘N"[<xЃЃЫ#™(НЬьHO7Пњ™\ЅHЄ•,b˜;зn›ђ<†p‚0S“fГЂЦOYЗоDя!ЯМOЗ0jТЬЗ4V_&xЛЦРe”GѓœЦЖБЅŽ…J Њчч;vВ;vVт69˜”NghРwšb„9вq ‰g\;+8ј…тŒЩ”ТЅ№dЎЌžхЬH$^з Јj,ђ:оl RxGЁўрaЕЦџt.|АГ‰фFVШi. `@!žž˜єЂіnЪiHk!р6T’‰mЧр C‹ЮpzјfБ!š…™8ЁўІoF}‰N m%Ќс@L=8фvŽюяяУр#”"Ѕ З~ЭЏ зx™M”,~йˆзљ–ŽU”ѓ№ЧО|p~>KјЪЭ;‡]ЛсUOŠp ѕп1PуŠCqчОYДХ‰ФџОdы› рџYžIA9Ц›ТяОJ}r3ЈХуdе_1e6‰зВпЬJщЙА Ї=fi’jТŒm3ДA`єˆPƒљђ(Ш\u=аfZ:ЯCЃв5>T˜eЩЌƒcs4j{Р"ЁЪ.КcюЁ@м-m€rЯm‚/n~PƒK:iT ЭЌЩиЫЂНє ЂЭпAW*bе йgu+M”ŸџН~ТrbѕЂж€*…щИјР88сІv– — 6ŒЎЭѕО8u/1WDqЉPхA{ЈћjЧу лЅЉƒ |рŽ&Н-М™Ћ—^Љљњ‚ЮœŽгаšјЙо–ž(0$ПЫдˆІ,ˆНHxO=t…фŽŽ‘-д‰"ŒX=o`IІб`ОЭz]Шсpr€дкрэž­Ћ[ў+6`[CПВqХcхѕ$ ­ Ђ*oЙЩ‚ДЙeкђ –Чeхv|Wžфˆn]\з8 s;ЊЅИ}"dфй…iћН*з9оƒКn,t8–є\шЇтшИ‘ЄahlУ83+…}WуУPy3!АC/Ж™УP ВxM‚wПxmаєЏP p›Їщ†FОРЦЇ&ПТ €”VГѓ|ƒЪъgИП$:`аH0(ђrЌсЊ<сoвИЧ3\ед}Зh &‡˜Ѓ^b`6йhЗRт6 ѓyƒвћЏ ћ‰ЫNqš„СиN№w’•0Аџ€ЧВ–xhжЖ‹LчŠ~КVоtMЕyГŸ3€ŒЫœыЎ%ZЅgДўКH+5WOV(џџ*O;.~лсю ўuъьyіЁ:Сz/Ÿ<†Бs‘ќћљc|+)†ћгЖ|UtрЏg%>/[vГ~vЬJ}џфљБЈ1cMќУ q)epz{aq:Е`‡fЉЉРЖЄr‹ЯЧкі|Г+лs%gРйР›гzpЖ2“cШaoиЛMлё њХdЯ3рtчž1MмЪс‡@мЏх5ЧЂљ8ђЁ‡ъэЂЗ$ЪЧb3I—бƒвЁ?žјгbF гЏ|ХДH] j;j3В91СL~пЏБEF†m†цD+иЕгQј‰4№ЇЏ–сљбЖрFZ/О2J0ЧвIЈЌ$зKќ$ WQ2 A­лђD6ѓZБdг‰VА>б Ќ!­РuІИБiР>Ё ‹™Fќѕ‹T4IИћЈ‹єЛВ•–5p:•КЭ|sжšЙŽg TЪ1šќєЖ№ѕЖ6 T'9c™№vЯў=џЁя мУфŸѕњЋ-‰ЬЦ Вф%P[ЇњjS™@mLЦŸ† ›УŸH…ЉЅЏ оНV;˜‡"‚OЖКЇUG@ˆЊеЏЏўЩщwњѕG9ЯІЋ [jfŸш$>kљkЊ0JSќј#ѓљљћБj’`‘•LО@Ё9ТЏp•NјІЄЋ ИnFX›QмЭ‹'˜йёԘеЎ…X[ЫЬwBМ)NэˆзlТ+~ rМЙ> Ш/ JaЯ—ѓФШўš,@,cѓЯЕЁM-џ%бka2Vtз$R‡‰?_ПŸC‘;А№x§~ КT№˜дЙІD_ЅD§& cЋ>{*ћП* ѕˆё™+ќ†lс|В8}FЦ_ТЭ2š3Р^šБі?cФ#ЪЊхЩНG$гR№œ1ХџџDюЖ PY:шОX nЁѓYывjрїіš~n9ћHВеˆK_К%‰а?+EиЕY`іCNŸъŽgиїBрў Е§œ3 endstream endobj 275 0 obj << /Length 1721 /Filter /FlateDecode >> stream xк­XKsл6ОћWшHeBš С—gzh:M'=fœCЇщІ S‘TљАуп}Q"e*vЮ8\‹}сл]РjТ?Е*ТUЧAЁѓUYн„4люVL|ўхF ŸŒў„ѓУ§ЭэЧ$YЉ0(ТB­юЗSQї›еяо—кѕнкуићЉЉзQц=ЎЃмГmч`шЧ*ЩS/ZџqџыЭЯї'EIНб"ф|iR:5IidaОJsЈXГ]яжА5ёт(ШУ<. Д$њ*TТ,ЗЬaъ.ѕ–ьЋ,(т˜З=э]‰.юСЛ,їz{8tL>ЃћЭ ѓ{г3ЅBўVЖ‡А0mџЬИЭ<Ќ}з Т63ЕЕЖРЪЌ№юї–ч:[6ѕ†щэ*ќŸeи–vŽOaэ+ЏэАнŸECБ_чІ<'_о Ds<ВЅыejуZ[іАЬдqц}їЌ•ЗwJгЁ!і=сСsН№Hф€|^SF}F8Ж Ћ•йQ,ХЩаыžš…ЦxЖ 'ПБЎ“д3m%Ђ wЎ.-“ь{Ќ'[z 2Ќ‘АDч c>_ „NМO=OТ)7"Jм…gwIЙ‹‚nсшјœ‡NЬ™9ct* Џ”†Даsx"PЪГ$‰T  Ь*b(kЋ2HИŽmГkMкuGpУlЧ1E žб#“Чв уLз@|\ee;‚ в9‰cУŸЊi…Пl&rkgЉЖШ&ЂчИч€јidY26b2JЕXœ&ž§fЊуСђьнГ2€i„ЩзД3v™)zц7ЁgMЙFXТѕGТЫaЅф(ъk@jйѓвЬUJР;Рк0ыџ$‰‰iex^€јXе1оDРЫео‡A`'Џ”X r’С1Ь’"‹іЬљFa- „B ЉŠLPьj2і:p?m™q’њ"4b0€5д’MН$˜ЇЁоtяD=ЙУAђл^fїЖ9OЎон-х„6‡™™ХПЁhl!{ѓhя˜DлъnЉОžИŸLн ї‘Ќ%nЙЪfgјюд ТPщ(O2Ѕ—$K#Ы€mБ‹e:HIєФіы<ік“ЛA]œЛ в82Іšэж"хA8<5>”„p \Uй3PїžGсv”cdЇсE I)EеT`ЇЭŒПЃŒ“кА€ў~п Љ7=6щ(&тHуvќ R2B хBE“`IQ–šК TОQФб`^иRєbЯW8ІЖ“>ЄXћ7œzˆщVŒћhкDœУТaŸ“„~1скjl$p†лКиNђ oŸ™ Щ1ыЉэ-ЕŠ0 Ž]Рїmћаtv [IЈќдVšcOХkAЈAo+Ђьєж2vчjSСяЕ$h!ѓг| ЕJг4[sЁјЅˆЏa*&%љŠ4 aV-Щ{SB ’pД–•P7ˆЕа-xYJvOeŒЉ^УL$ЙІ'ЇыьЈЌщьЗЌЊtа№IHIї*˜м@УЎQUд„ ^/Џ†+IœъWяўШ8="ЉЬ•›шˆƒСК‚а…eмЯЂџ0пкn8“Р§ф(ѕaкШВ§жЗ†!ЗE–Ћ7Ў4=')ЁиД1™„cYѕ\іFZžœШи67Mms#ЪƒќѕМHљгьЋnЁт-%Gч,пЫЬCХGrљСНЧыnКц ЅЮѕV”Оћˆ7|~ Лф ФSn-Ш ‘хA7pјнŒ‹QNЈz,x@іW.Ц)аq~Ўv]п:И™-8 ‹ -тyБУчмд~ьF}№&С\I!э:ћ]Эјr вXЭ#јЫ­”јFюFV^ |“FЊl*ˆЯљс nW*uФЙzН§іF іЯ№rќP8ЏКhТД.ы" Bш]Щ…оЙ‰п—ёВЖcУˆB•aZœkќIИ?z… Ѓы‹BўVЧ§[ћмЧn+wАзКл одœiT.(џWЂ–c™№OzŽхTг›ЪvK­ŠѓЭ–Јј$бQХ‘еP и–xКф3П,67М‰]ЋЁtНўvŽƒHE/ЯЈ˜;*>=ЃyС№,<‹;ГГЃнв” юaQœAщб—7Aг_МcР6идЫУШŒ€/ГX АЕ6(x‹зХS90є%|Ѕ ујX‚‡ыŽиˆЙЄN_­н %]zAЕOгЛ kJ<Н\=!lwупџЂq9 endstream endobj 279 0 obj << /Length 2265 /Filter /FlateDecode >> stream xкЅkф8ёћўŠљviД‰G'‹pм‚AшФБТvwТІуо8йоЙ_OНœ~lіf3вЄR)—Ыѕ.zHрW=TЩУ&Mу*+ъу›„АУсП~їF нзW”П{zѓјЧ<PI\%•zxк_Гzк=ќ3њ{пŽ~ЕNг4њНыWz}Zщ2ВƒoсuЊМ,ЂtѕЏЇ?Нљіiо(зњ•!х—"з")UЦхCQfБJ3–ъG7­`i5ц“}Ч ўБqг€ТѓЕJc•пбŸM? §оŒ;z~љpxЏzфЧЮ<п№QЬЈv§о GГmЛv|Ž7ЭђИT›л:оаOiзJ…ЭјyМлглњ}К НŽ•*рgcзI~/яёž2ИЗъz“ХJІUœkцњУЭWFЯhOдОИО{fшŒhгуп‘1ЃучO‰Ъњр‹Р&рЉЂнJES- сQ[ТzрчЮƒv‚/"‰с%|{  V‘oЇ аiАоЫсnќ#нРЁJаыл~ДУ’RPc’23^€_gIƒн(ўп‹лХIИ_alА_-ьšUq–ЯЛ~УдЇСOcМZgY}oQwˆn%а ъ%Э"ћйРёэЛ%)жZФНВшRTќЧєўУѓЫ!ё5ї§ƒнЗlЋ6нє-ФoПс‡Вk]0јЧй­ПџљkD!‚зТŠ—МVU,аS№87Ї‰ЌXD{Pш’–Ъ4ЮєЌ§‰rйВk $dmПkk3ZЯћŒ‘]fgЅВ2qk+~ЯСRDлег%#эЧЩtТЫ1J|жцAЏјљмД5†^УЮЉTШoMг‚›шŠЦieСч•,Dрј9Ы‚/†ЕF8е E иЖНсшD$F'>9!ŒЃ‹lRL<*ВlazйЏž?ЃwыŒЭ…Ш§дa$#8ин‰Ђ&ЛЅ4ћS’'ФŽТBТa„5 ЧHеЦKдxwДgЖр.DS=<ŸЦЖVŠ’Š€ШœN(IdЭ ь( ›‰ЭР_†іаPŒIP•AЅЪn]ђo g*ъЭqN~№:IёаX™ŽЦС‚o ёŒмЕGлcEэ0Чб':5<=ђ›7№э8‘m<ъЗЈPПооэІaqнM˜Œ%ЙЉЏuLG…Ќ fзbЪA˜”ž%YфСА„‡}Š< ћ ьƒрЙэ:ІпВBљe>#БZq~б!‘NёkлСИvTy>aУСН†’и_ЈvсŸ3SТёѓ*jWЄ7CШH!GЯсуdХ ЅщSGVЯУЦ;*DІЦbYfQŒYKJZYњЅДЬ…y‘в ф—œ/т‰z'ЙЪП_ Šй7ƒСа=УQМqЂx)jlЄn\wЉd`№ЉLВНфљnЛч@š $ЧГ,ў"X{Љљ:c"љjбљiНСц)г –—Ъ‘ФI’ЅUЂѓЄzuу3ЂU”-ГrZчcиЮSЬЁfЗх/ЃP@†„ЂcyсрШn Œ8x*Р4шŠˆы]ПnЙ‹ЂЬpNМV|—:jYМg‚Лœ€Ÿ(@~Н Б™{‡ЎžkqŒT„цД!9s’ъТщап%?гgvVrуžБыќsЯ зЛI–ЙaлŽя~йп~ЁCЉЇ­œбЋО“Žк cs4опt HPЗCнйGпю k2tщшuяѕХ9зW,а9'џЪyри‚Ђ_vIЅБ.6KŽ.rfqVхрЕ9ЕыЏэkўl(ќБоYQ’ЉЬb%A w#sКЅЯD–-1Ё2OqO%sіѓH`ШєЯђбєИЧТI/ ь?y+•кјаИŠwї–йЗsќ}Ёх†›&ї-S,vм кИєвtБщx/IpAНEoєцЎх}УН+уЮі\Q “оФIYмšƒІЃR_MG№r7Ц№ЃkН œЌsЇnїLjJнpA9‰*щ …О ŸЄˆ‹tn_Лtи*.ЋлЁ9S А<РБVъџa€ѓ<ТфU"=9cƒ9В^ЁЏ…‰§.ŽИcHKЬoўд.Њ€ЈX—хЌЫJtYRWЕc0є8№•кA#Єм^С< w‚8‡\>6ВЎБ^ 3Ÿ+KQ$6оНB§.х^ŒЧЊ\V6јT–~9/rў{В‘3+›aГНОŠСИхы™ЫЩ‘’ЮЧ[”7сTqО™eЊW96˜Ёщ_`E чMЎmˆ[p BЉNтЧи@!‚І‡Њ”Ъ„к5D\ …!U7Ѕс‰ЃЁэKЁ–БЊf‘л–Ф„~AСКыhяД-ч;„ƒ&Оr@ЯУпИAќv"$є‰оЈ†cKЌВшGьЩ №™ЃyP7а‹ёB}мTњЅSaщЇљєкыіn.єШ“•B^†ўГwEЉ Qьхa‘Џ„ж‘С–T‚KЙ+nц/|N†ZфЬЖMƒч_Њ€;3Ъ‚-MhФaМЃ—ъа†LJ‚4xВиі’!Е ЋyаMЕО Кt—’ IR6 БI4Ю›fЧєћZн_BiХЭ-sЧЃЅ›NЪ4Z]Ip4Ђ`|9Дђ‰O &ъЮ/‹ž. ca ikM ™нSшЪа !Ъё‚пYu_ŽQЁждЭ>ˆпшРH}А=Lo> stream xкЕYKsфЖОяЏ˜ђ%œд’"H№•›Ф›MUrpiCœ†ƒ™A-IШ|H+џњtЃŽL­hЇR:š§ќњ‘иХ№'vUМ+в4ЊdЙЋлwБлэЯ;Zќ№с`КУхwїяюОЯВˆЃ*ЎФюўДduм§;јд™qи‡išЖн>)‚Ч}RК М†ЉШЪ<ћџмџ§н_яgAY’lд)ЅR*Q"2Щ*хЅŒD*IЅtfy|LwFСwпWљ’ОкМіŽzr8В[ЖYr&ћЇэТн>СЈ{UцqŸ&nžщг['…"‘Q%Ъ]˜ЦQœ‡ћ‹fк|I›ЄQ‘‰mnY‚rOєалsЏк}(Г,ЈUG‹‡}шВ=3ЂТи”Ыи№Avw6л…$`—;>ѕ–™ >Гj[еQIOЅ }(вHРгЉз˜NGћ0IpП/гР Ъ*8тГŠ‘оЋ8 F”ѕЬŠ•ƒd,fЅэЭйtЊЁm4šVњЫCЏДе1‘jMŸ~…[ЇŸœiё­Q“Чy<узvТ—2xТEŒаAy№ёDtŠѓ—хB#:тЈŒЪtЬУЁš‡ qœZн›šО­qуЂ0FРїДЙPЅZ…щїЬŒД>оиAfŒ–r 4ъ•ЪР9 6)иИšњŽjd…eppŽ#ђ,†‹n:Ÿ\Юб.ЌІА=эt№{?O -oM‹œкHJа=Š’3ˆ›.­–/bЙ’``} ;Фщ6šY’п$єl џ†^~žTПž‡ &*oеGtЋ™-ЃŠж›™DI‘zВ'CОФqжx‡Y$EzkдIї$Ы5пMЩ"@SЌк˜‰Јˆ_XIЩ“•dЎ[щ/1Ÿ%Б+nnЯNуУ42%рqU‹9Š):mі"pюЇW3аЉ:ИЈZЯ,Ѓ…s Я\Hн‡N-+и,ьз‰ < gЗБЉ№ŽОbФ›VDœац ФV™Џ.љJ&'Ю‡ЉЎЁBœІk–ˆ_—(yБ]е„Œ.y=ѕ,…юC€`кј)Ют_toс)иKњБ!иvš†r^tR;H ›Ao<§hzлЕz.‘Y,Ш/YВ„4S_tшK!И л™ЂЊ›О˜ТђеДЫ Ё*БХ3В(^xј^ѓЮН*z@фuf-Юц‘l'5иv˜AŠММЭЗ^ЇZЙОКЮŒ№Б\ЩДЂкGoмКRпЉА3}Y8ШЎШ'ešЉчBŠqЗ-B‡ЈЕ\(}НО†5 <Ю1*0FЏСљ_”њtзРх9w ‡iћyџZ.‹HФе–Аф0ѓЭa/œцЫhg;M[Њ?OXX іаАП€hNќиЅuюSG§S,$ЈCЩˆЂND;‡FЫ(‡щp ы[Nm№s Б”4}Ц‹ 0>вЉ‚+ŸsИžу†/цDOАUnЬŠƒ cl˜–|v–7Xi/жс\?^ВеWэf†+нaц­ Ф@œf@\БФ1; >y=г" ўВ№хjtc‰Хu&“j9Ÿs]Ф}ƒљZЌOPлaIGЙѓIт*™:вŠц\)zpЕРхQМ‰6,–:QТ8сКF“гKќІ‚t.G}2lhє*˜Cџб›)ЛЋ’Ћ>Фe˜@ь3m6жЋVЃіd=Чѕ„Р;—^БЛiшяЇєнЋzUYT•s‰<šfAл?уДŽ“{ZqчrfA‰NŠlHt!ЊЅ>_mMхЫLнL8ЎА/Г0ќqГ€о˜Ь#•}щ‚ „œ „М-rЮA\_CСЕ+З'sёƒ‚іЖ4чQv!jjлtF˜ЎnІЃ<й2gмжЩЭ4№ ‚+YtЃ“jMc”k—1Й„+š:z§hл #qЭ„Ÿрbшe#]+` >ŠџЂМН@Z}щ@5ƒЅеB]ќXuўšoі0дд~№ЅgA˜Б5R]Шyэ6Евgјјt§yізƒаeН\ЁQЄƒџсСwSўИBѕ=qЎiя§е­™ћ€mаzѓоР №СЌС-/Ѓ"™oч=ЂeЉ˜ jгзS{вНюjНьЪ žQ˜yжЯŒ—€ЏпVРw&?vxї4ц|qn{[ЧAП-ЬпнЮьwК)І!š/(-0\l– иЏ7ШUачнЯwгЋГЯНЂ‘†n†[лкfƒиoЉјеБЗ`ј9,N-ј7˜Эж>ЉkьП"ж§l0yў—ž—SуEЛS)[ў TуoPыoчџЗN­Ц\ІB œvњЭБRг€ ;лšZ5 ЅЖzрѓлОГЭј ”C˜a†‘+гf9эop5;Зеъ%\GњЧ}–CRL€УNдƒilї[Ф›nзџГxЖќУл‚?ЬЉьђмђї9Zе—п_;;љŸ<Ћ"Ъ’П'нћЫъuT§‘[Л:qџкўqІѕЈoі<@з­Дnе0ј}žЄ›”љ#БЪRBб$Уc5| ›LДѓД№iПж™gп"МЩРTџ­Єœ'wйHЉЧт6_0Айv 2z }{Ђm@ожŒа~сflєЌ.ROƒgl:к9ЈЯЎQуžWСџžƒџNј/ЌŸis endstream endobj 288 0 obj << /Length 3763 /Filter /FlateDecode >> stream xкkуЖё{~Х~‹ЖШ*ЂHŠRƒ|Ш—єšі єіЄM‘rmйN– IОНэЏяМЈ‡WО[,А&‡фp8/Ю ЅnјS7ErуДŽ “пlŽ_%эі7мјчЯ_)™wяf3_нѕэOжоЈ$.’BнмяцЈюЗ7џŽо7еапоi­Ѓлц6uбЧл4ЪЎЏ {Ї•ЭГШоўчўЏ_НО7ВiњBŠpц—IЪr+m˜Єџтn0)›OвqЂ#MHo­6ч“PОЋлsїG_э†r+‹;Ј$‹]š…ѕ_поЅ™Ž6ОСF=Р™;›!‡–­Їая;ьзШHѓ8гёэIUtЈzоƒuдД˜@•ŸўмХАњVб „(AљѕчzРoюRЃт\я•Ž•х‡CЩќ:Ё›hыЯРпej™€ЇХ_Т_`XОiЇКJЦPW§№ Дн|Й‰њgKЗ%nлƒv УС<шЛ@__nc:‡2 8NLљїˆ,Э“uYЄ&Ю]˜|jЯЭіВ`„$€\EžЛШ&Д;†}пЗ]t›УМ/eо8 Ђ q x’*:ЂЬ@,еЉ~тйyтC8 Ќм” # Ь—vИ$gнB4HмGb„/89Љ‹hсD[‘4’7XŠашmbЮRїŠM˜X+іЉvЋ–щb•Ї “•ј=БЩлvЗ%ЙЖQцbЃFћЕ],(›ЩqЁЌёзз]щЗOВ•џ@\GЯ—˜Шї—раО“sћ‡‡ЎќXљ]%@PўФOUрrўмќRmЩAФpFЇUJєр"``РŽ&q2 4ћe&мЄк€йз}ЫЯ€АЉe%HPr•NЄек3zœ­ЬЅЭ˜зi.ВXžqWŸЋэUК­‹SЇ/шF%МŠ=ХцЄёuћПU~ЄаЬg:&oуBK•џѕDџЊеИГё'П6й?1$xPhn+`Ž.;юэКіШ-wE@Н'xрьЈ_Cй|7єш6Uѕч B<йїуњRоO|[u•Џщ$Щђ{_зmƒ˜ѓ ИN‹”Е3ЌїnєФxПa—яРv8pї ђфЈz^їX…Б+Ђ(тЩкКUcWБШЬ{‘khСЇMЮќм_Хj.Аž::оЇ5йf6њэ67 ЕзфИAЎЕ№]xуЁj@Щїу‘ыZnгLЧЙНP–-\нБjJД‘6>оZb}–.šеbќмŒдmЄЃ" 5Ы]єуЙыЪfѓФc(/ќН\Уђ ƒLеЋ“Е?вЙўМP”FYeНЏЮЧ]ч›ЭпГ|сU%Xїщ|ъшГЏšЋWѓbБWЅѓ8Эм2`{5Yє[Qеь„Ю˜žЫ@ЅMРэФ2СхbU4fCШA'ўб‰"2tљхrуЉdпpуЋђAš 0с­=qрЈШ мFЛv1бсЋ јoч;ПъsЛe`s“K6–Є чы‹ўBLзxљё–HъЬтjфх”cƒ=™O†$ЪАн6аBnЕмф [Л‚к-…ф FQŒА#рЃмНЄˆЋ\1.†9 ОќщѓŒ)дEЬ‹{ˆ–Т.Ф‡Жћ ›ћўrТ*рШ.ЄУЫО Ѓ"ЖЦ^^_:qq&——p#dFч”|c dtQЪРЧCCь7г}˜Л&є)…І;p RЌjџPуХb2єэ^–Вё@cf<:Ÿv)Є6€-Ў |s§ъš‘ŠьЌ@I$Н/\6Н”.ацH мŸ~,џлŸœEGЏM–"Сp ‡qYСИMЌаsЄбk4ыf_ƒ]*кЩY–њЁ=zМТАћўšџBc„5•ВзkBƒŒ…Ќm3с0лcЂCLX„ї8Еjј—cМЎjЯ=BРь(`žO JŽЭkWюБ‚Ÿ… ^ІОтШˆЇx!ŽŠ-Ÿжzcф2;]lбІВУr*гРЏ0 ­.єДУz§EЋиNIpр§Л—q И,‡РžODї™;Т˜Guю-)WЖ =Зx)˜$БКЈ—ШUD'VŠ.=Xs"=…цŒŽž!М4HЯ€kЄjа‹,2‘пІ9“F+gOaяM’†Ю#‹ qДќ;жаЏ™зtO*3лCd—}ш kLУb/џXumsœ.QЅ%pO лЊД-ˆqJьпП}sџюзoўл›wY“Кsq>•VщxИ}%ЌWзт№,ЮГ1нXWЈчE=%AзАІ)ЄЫЃ Ўъ%жчГЃшР[mц/M}ХqЭњГSq…Arћ7лIœšыv‹ЗЋ™v^œz…ї5UЦсb/lЏ@6МѓшD$KХA0YЉЙ'\ŒOX)Ч>ƒPјƒ1lJˆNPY/ЖХHхДсx‚§ўbбђbu5№kЖGео^іћКкˆUi@Rя-•H )Ёѕ](ЉљUš ”пišc_faмёФуЏ+/§}уЗмQб[Ši`СПJ_wdŽ”Щ. ѓzТЕyє аБm1MˆСѓ)я0)щi†сШ“ pYИљУЎЋ6žл~лžЦ•#:"ЖЂ—[›nŠe‘к‚y#ŠF‰?ВОG2lFЁŒa’Ž BХ2# щЭн<УIcxŠШэ;Jа?U гS$€1|ђѕю]Я’ЮвkXФ,dF'†#|Ng№Э–G$ЦХЖL‡Фь—еИŠџyЋr йОc]„№{№—SќvK†La* ј-;PП—idП0| m%И›1)оїD{„@›IЏТЗfќ‘]m§хїTzžxыёk€yY­8Ж•mТ%JевyЪ§”NЇуч?’ZMуќeЯ†Yёќй0ЃшI3МggЋ'B№<@РО<ЧŽŒ#lHРwјќ7ОХтМ Ш&†*Hp.[цу'|bіЋЈtЯКlЊBћмѓл%LЂа_5$JюЬTРдѕзШЬЦfтЬ 3"DзО?$\6уPwЫеW?mbщ‹-fяlЙуќС!ЫУн7ž?t ‡*ˆБQ_9‚{|sБЛ|лyАŸŠо‡TueMяеЉчo%РQљоazЗРсN`G/ZC‚Т0Ф€т},MХгжпЬk7}T$Wї ›LO‘дзŒђ{І$Ы’Яla№ы­Q„ЛсbТ=г€ЫўiЕ%Š endstream endobj 291 0 obj << /Length 2120 /Filter /FlateDecode >> stream xкЅYKуИОЯЏ№mхј-J$%-CВи›=lщ9,В"лВ-Œ,9ztќј|ХЂ^ЙЧР "KЅbёЋЗ[Ў|ќЩUтЏЂ0‰ŠWЛѓ;пRыуŠџќл;щј6`мL8џђќющЏZЏЄ/?‘ЋчУTдѓ~ѕ/яS™ЗЭz†ЁїSUЎƒШ{YБ—еMŽэ&”:6žYџћљяя~~вA№ FФљm•LЌ„ Ћ$qЌNМџаЁр5S^х‡ЭЪПд9aG Є(‘dЂ8œђЁ‹8 ЛŒ– L,TЄGѓYя!:‹RБц—Eу ЮmuOКŽD…7вџ№ЕПЬ]`ёL!ђЛ џЄЌЃpЃЄAДFs#,ЊŠiцx[]€б .•ˆХоѓ:,аы#Та.и‚XX т9Е4ЖжвSОІMлЎuR‚вGœO2-ЫС[ѓњЎ]?ž\ˆEоЛQЄn"дъUГ#+Љ…МI`ј + > SiaРчR§Я_vйЅхђsАО†Х>ЧUЪ]цЪR{JGіЅЭlL…d юKSlšьЪ}эн—uЊ?.КN,тЙ~Џ:xw НSњ’§ШKщћМ˜DŠнonої^{Я‚pњš–­š—Л“хUZФ2šїоЩEѕјzIцѓјТтD†IЌ“œнXщ“;>ї†E•иPeа>§Ъд!bІюK4юЫЎo–Ђ %Хzœ- ™ѓбWФ0sЗ“Г]…Ђнrˆ)$l=&ь_ЈЗ.ТB—4}Œ…ќђлЦѕЙG&pь7”tg= ЄМaJ-Э.wО…{Ћ7_ яѓ^hVŸћO_У„IеДєƒ ’ЮKšЗ*Р m„іeM†)пШ^#[“9•R—нќPhHžy’ЛPоrŸыKo›к† єЏ'ё]@Ш9œВaв‚Щі*Ў‚т `ч_LПкцЋc!ЏЖšГ€БЬLЗˆььещs,{LŠHЩ1/ляišьaHЉІXH_Эajr„wZsїЉ]}ТbЙS„лХjЎЧЁZ.мЖ!fэЙvAЇѕа}бz Ж$<чs ёњomС m!ІЪэ'.€KГАЊsUKЙШOыžѓb†ы–M№ю $tjШH7@Bі 5&g ‹T&О•pŠœв Э(vV&p0Ю g: B’ŒРћœъBaEвЖЊ‹Вo"dр†ХпmяCn'g@,В>6x{ЎЌѓGuОљ…Т*VН=оmщГыРJЛm^ц˜ц,Љ‡6)~aKе6 ныIA]A‡x+А+к|ГTHX1Ш оYF№‰—МщЗБ3Q5 R№3טюїy;26н–ђXюPZŽяь |ŸlŸййКwk5х(zg]іŽuе]p{xЋQfФš˜ы…K бшF?уэКІ­ЮiэТЕЙ2Ќь‘EУL(Сf_ІјБ%wАДзТW-„жH9$f-‡„“;Ёљј;CѕйЂЛwЇБЁ›žb5;Є0bЏсЦЕ’qŒЈМ™МЌGиDœxvVВ @~XКDЂE>V]І#щхтš<Ћ#љ@uvхгvЈ6ma“дянž}ЮsЪэoф`4дхm  ў:ИfŸb4нz–К†E*ДєМц’юьЁ”<ЧwЇЗЋрі`PlјvчЌЦБиG3T}Т"Ч`ѕбЫЕШ7bРъ‹‰“U<›ЌјL—Ж!œ3 H(>урєД0sŸƒ‘’вЬќй˜ЙњѓI34FULП2eLPvЧ(г2х‡E™—6lщMщžhђыМљЬЛЛјh|U2L–яCˆ~ЇQОћтK8ЏВ/)0rфцdЧЂWЇП ћіф‚хYšdŽвЯЙљŽ)!­гmОГEоюпOЩmюГKе‘?N^тЬн|bИ?0œмb{јznГССl‰ycj"Œ|#nН… јаёSpь'“ииєa9#›"mмpз)dŒ52НЩŸю9Et6Ёћ…ТћaуЮTЁ1zhЗ.YН8UDBЦCBќaб-0Ц'"ЭЗ]У§6л№ŽŽь­п–ШƒэЃ3уљЉљЦШˆqаGhB?‰пrу#qФРё;=€ы.ur\иc.ЃЭь‡ …ŠN…жѕяˆ0ђљАХ‰№љШЯЇё§чуг9CўБLТZdщБЫBхЧо7Хдi„‡aџŸ‚џ о/ endstream endobj 294 0 obj << /Length 3205 /Filter /FlateDecode >> stream xкZыoмИџžПТп*Б,Š”HхОѕzWєŠŠжХсаЋQEЋнUЃ•ієˆc |чЅзЎ”ФE€,9ЄШсpц7Zн№Oн$СекOŒЛЩNoЂ6‡nќ§Яo”ЬЛ‡‰їГ™||ѓ№cнЈРO‚Dн<ючK=юnўх§Г*Кіі^kэ}_WЗЁѕ>о†ЮЫ›Ж€юНV‘‹={ћяЧŸоќ№8n…с7r„3ПЮRьŒЏДa–~юЫЎ8—E–vФCєmQАiН”кsšхUке Iш^ЙШOТDЅ˜ќЬЈe?=­йq'џ—итUљЗїБKМЧ# ‡NщвVщ_ДХщ\цмFqг* O6ndМпћК+rвћŽ)ЯEw”Ur1…Д”Ѕђц4ьT Ž9Пw9Юьая`bЌп” ќюEЎс'6Уќ1оЉ.ЙџзЕћ3‘Z=^ Ц„ ƒZoш…Ž|­“с›Л-ЕА3ЕРЕXуЗ _л№ЋКvЙh}fѕiPD-гŽ)Š›eЮ”n8O›žЄ5й3иGhэФ^кШДШxДШ{•(?IєЊaFС`˜&aУЪТ0#ч{ІП БюЙsТе SXqpЁuЋL@Iє ё#DfmлЖуоЁЉћГ0Oі4QRlЂ ‰Ц`в•-Lј„аsх•ƒ€ъAІl6ЧМЭ ZTgcж˜ОмК:џDСЈвwЂй@Tkrˆc?HfЪЭїhрƒ bŠy4оXC˜˜ALЂ‰[Н€~œBcEЋ .„ЦP­ш#“NЄŽ/мЉъŽ?NЫg$Їˆ/-г yfКcѕcЙЅ‡Мю[0OGоЗ4€A.б,%ŸJИ№т­Z—БI|•ФƒlNтЛл‡]њВ ‰o"3GzА„O/џН/ФXфžyœ,!оИeg}Žz|ZмђР џlА?жёKdЦšP@˜лЇМBдoy€ІвzA…'B2CRЙуn!ЎЕњx №гrqєПЙЬъdэфТС [5Ю9фВ}Ъ3бФгR–хщ}Ч} \ьŒWуBЏЪѓP`”‘ ‚v#Hвцxж„[‘–ѕѕtгˆq „j_ж›nюО] ˜ЙЭLшЛјuюзZxZ>9EO0”еефqЋYcћбE$БяечІ4w~љqиŒ7е‚N2ц"‘Јcœїов-[„CƒpШъ1BŸ 6 /Œ_і ћю{Ж 0rОS‹`WТwкw Q;kžЗЪК‰‘CЗ:ёc&„јW_ФПWXчšЬ:™˜єЙ)КœЉыZ 1™ŠТ+М9m*%ЩiЎ>јЩОbKдˆЯdаJgы >кj?чpхЃзЎ38f)=хЁ+\щТІa€сЁIбч80ЮўЬ^Лn(…R ШEЉvъ3чкЄЮDЄ;юOyS0 iњ0ѕH/`KьVм(ЊfЄт` rmtєO ЅPѓљ4n!cˆЗ&W§щ§mЄ0л^ѕ#кзfDЫpi‹Ё!љIЧgAЪћДсbбКvБbџќuA8{+9wЭ‹#Руя()ьp\$(1Й'МЦ )гXџЎП ЇЅHУ%B…p#YТЯzvу“‹ўќJM‰eь§Jˆдs"7ЯQŸвт#”ЄПиXŠ)$zœЬЇ™4†z“vрЮw1ЎЌю/TЩЃ5`Х7ю"NФЫЭ§ƒџі ( ,G‰œ>Џj˜сК№ТфСЖЗlн”C БЫoо4dJZŠрЗ!ЦE{ŒZ"РпшžёПч[ŠВqqpxфрЗ—"TЂХо€6еиiХ‰eVA(‚РЯИfƒMNq’­$U)€ЅQЅŸОХwтЊr{ЄњGJERрЁ,…ˆГ#ŸKИ&q%Cљ#A?Z–oщd|fTВьЄ7•LЭEЋФџт~KџKёвЩяЈ-џљj ВггъОш`fAжw_pПhxJ6o]‹Ч)r‚пSнШDЎ'" І2iW Ќо™8œ\зЫ0№•2ЏвЫ‰,ЄзPBcЃp_0'јJK„mœЮ(Жu™ ‚R7Ѕ–wЋ&в2ЕЁ„и‘! ј(Yf_+E YDЇўЊŒ *YЂЩЏxФ(ŒР2?цяИ9шРe*0Ю}NЋNцR0ЩŠсеDѓ,ОЙуiAeУ Z)ю>№4mA!зtkт‚дœ­]ђџ}]ebЃd u‡ЊHатtЅЁr+vЅЈ“эЉJЃmW2cЇb)vА22ЃхЦ gc02…5ИЎФfЫВсЂ#уц™ Флѓсjf|Hйg•ЋЕъяь7…{˜И1OY2—]“CКШъ…сwrсщќ6`\Ж‹њмј€єCЁ‚нDєџrЬe4хŸх;ЌXTYйяђv1VєDŸЈT“Ќj7ЬЊJT”і‘›a3­$ы6иЊ%g5х}С C>!ЄP }У:>*№§Ѓ%gy…•№]Ћ0ыХ;@рŠCQ]Ћы&EЦ#™œŽWУ<Ю˜РћЫžG'ƒN›C:MСЎ!Џ“м˜Мoъг‡Гп+cˆїEЕ–ю[žэЇP“ЮJю;kwŽ_]ЄР8uAA‚ЛЮЈЌV 1ЮТЪuЇcCА}<'т[фIJd0Н#YVpŠ›#ъќ)Š4ш< \xm"яаqќHлjŽйЖ7kКŠdTШ"oЙCСDљ"_^Ў0м‡žпGнwг†sву„“Ч  ЗyVѓ+š–X‚мoU§‹vQъŠWK][Ew›јБ‹Vn№nV•цЫмЊE'zНH'иvn,SEоњjОyxJ{)wЋТš>шh]ЎМСИ,Фг$ЗЦав2–‰pG[љ6ЈЬ }1нVзщЖ•ЂБ5^Yœ ~=AтPеЋРЉО0ёЬHхвzЛ>ыф[LIю‹ыjёЅ%ЉfYнь PЦ:ˆё†ЂЅ2XИЈ”%У–Є,>ШУ‘еЖ2„cВУзЎ‚`5шBя]р"…с[ СІфў ЙlўЄЭЦгнE™жDElreаx’+‡туЖQZћnМчф‚Aы)vЌѕRЅGТšЦЋљыЫ`9ŠE/‹JyдйЇEЩ9рјДqѕPЃЖДизaђŠЂ„dбЕMШœщљ€В№aCњk€V^wЯ‡F3<тРT3цдŸП•0iЖРзя==5"QjѓЕЌЮY=Ь•T“^н…дКcбьш]Cn3оzюq?Ž‚ ?ы'ЌmЌiUА|2Ѓи”ыш[kkыGЏЫ=н ™#щ8н|ŒOЃƒќБCђGЬп %і1mЅl7rR˜[ˆ€†ПАрG[yЧP~b—X8>л. —јО+u’T Ц}лЇхЛџ?йˆјGђ„№I?…п{lЅЪї 1@™,Fq№ЭЩФ/” XGŽХ:5=›•€<ђ>Х%.РЧ†1rкјh%LР™… ŸђД ої%гЇ€ъ:SњjНю\<СvИDOVmЙb8џ<љфЂгНХћAо0аІ FјG ’”'!™ГцLА,н1№ТЇВn)Ъхc‘ˆ$":kЏ+tCё+цђЪB™=ŒЮŸ6Е> stream xкЕYYлШ~їЏалRёˆюƒч:/оdxГГй ТЁ(‰0EЪ<<Р?>u‘"5­™1‚@ьГКЎЎњЊЅW ~z•ЊUl­ŸЩ*?ОQ4кюWмјЧппhYЗ…›йЪŸnпМћ[ЎДђS•ъеэnNъvЛњ—ї[]інzc­ѕўвдk{_ж&ёŠЖ+ЁЛБ:L"/Yџћі—7?пN…ЦМ’#\љ”ЅhЮ’ж‰ŸЌЂ$№Е ˜Ћп›a [Cя})~фІЙkГm™еШЫ*}em}ђž;šи,f4O§ќѕддEн3ЁК‘ЦЖ<5ЪY]‡Л/•Е1ШйјKуˆI}мRTьѕ‡‚їY'­TЩ­Ву/dUтmзкƒУжэеаьАњеюumЮd‹ЏЇ5я!пhЁ|ФіаIяž–ШŽŒ?mжхЌаЂэ’Х­šЮЕБі#“€ЩHШ“K‘oS3ЎxчЂњAŒ+>Лi(­Ч"rVoЯ*%к$ѕƒ$\XwВЌM•зьјЫњ‚†(ZGЙ“оYEаЩј#šEЅ<АГODRљQ Ÿ•+єу0™ЩЈРыЄЊНџШ†…Я›$ŒЦћЌЊšњЮ|ГNтБoтIѓ?0ЏФxг~ъј{pЅЁцРШјaDВМ-Ў„~Ђу‹уvYYu>›'P@Ыъхћ† Дvљ-]YяЙI&УFWeн›ЈP9йжЁ"WИpЛKх›3П@J3бц$ŸѕM{>Ї№ї>šШ*ЗІ’nћ…epŸyg‰ЖЫ­“+,` РoVЁ7P+Я‹SŸнWХ{еЬыЕA‚KЕžВVєx(: & =уF]лbЫmtty6t2KŠЦЦЉ-rXXчвЧЫƒп+žЉ|NП{YуLЌцхўЮHБЎХЁЈ-,e§œ‡РЭƒ(cОУъ>дxПbœE9D-ФrkЧх=WЬ”… ,эg5sИˆ^[€BЛ‚BЋ MбЉуўCйАeх>Фrp…œкЗEжcьСЂ#NгєлЃЮь†ЊzфЉЖи9Ц7 ‡9ќIІ'пR‹PzШp9ЇygРƒиdвЫxЗаe qŠ^vЉ1%Ъ ­ШяŸ‡ХŒ0O•А“ёЇnъЭ2)Уp‚ЖZk’:}Ги"кEЁ%–п8Н:ta^ЖОеўйїГО/ŽЇОу“ЦƒѓІ§Сuk{ЙМ6ѕЕО€dРдлyyФ„ŒЇеR&_йrNтиЃ…Iœ&ШЭ\DФFџF„€ˆх]yh_Й!щ˜`ЛЎ„8чМррcб9=gŽhЪЋлВ;UфЛh= |Ћь…жk†ГEлbиЗ6№ŽрJй€ЄЫ3ž@<јмѕwк76p\ЇŸт"Ц з!ц{;{Х›ЖХчЁ„kўJ4њvAvž<,L‡ЯШ‘zYŸуР P €у3оА‘nŒхPЃМ –‰1­В.xN‰RC$‹ТЁа\ob(gш‡Рo(.фU”’ЬQ ˜ќяЄ€"шо"‚†)?z’шa,Š^‘т™юЖсы(че}оУ^pЭ 4œŽ‚pk&З }ЪŠ g G쇂„ЁёзђЅmбbЪ–9М№§экUAхB 2Rз§ОNЌ‡ŽlСc†Šyфх…цXєрšHмЄ9ГЉЮ0№›mЗМыЫь˜UУИ…јёэФЊЄCЄЈDB”ё‰Ђк:є]Й-x)x§ѕЃЯ%чШ,пy— 1ЎТ*тЁD,I%”Œ r˜LЁь+"eSЬ:ЉUј“gU>T +Йj#!Ёѕ‰rPq’ѕ}ЫWуwIiШžJ%Э?›…Гkк#bФйrŽxXTpћчˆ‹юп–БjŽy Ap˜U|эh€;иIпОя!Бэ}Ш@Рs.БуХИpряс ыЧг6пЫЯ16AŸЂѕ]l Ј8}9шi†Жуц[™Аќ=–ѕаЫ9+ЛКьИэ\^;ѕе§O—KЖиѓ'^–Dк8rа;žпPP`GZЧ*”bMh(п•Й.Ћ6cЂ[JУŸВvъ#?О$^'.ЕЬ„œ•Ы‘јB§ЂНюћa!TYKйЊћнkЭ‚Д^Ša`6QСsvБIœ„a`œy=0DФgўxK—D+NОв1ѓS—87Ц%1ыЫ-U„8Цб 6 ї=]SŸН!i-5…аkx Ђ3'ƒ2Ї‡$dу+=гйXfёФЉ-—:ЫО”ƒю?–$ЧnИЫаЬ>ƒж$І•U%й|zЩ53,Hglџl7К>HRCашNM9ТБxь€Ж-vqЃc?Вы r9%ъјXUХ~}ЁЦ|ŒѕfїG<љкwЩˆС|hВ Ш0•€@/ ПCUcУmE§ЎŒ€Ф(њ_ЅŠ,Ÿп7Џ%ZŠ\еђЙ‡ЄdцVЯ-zV Ц­4z-‹'!ЪР:@mхэ№Ž0јхTGРёХ{ЬчA` }r>rЭnС4ЙДРAУ§Nљp’™|єњ™O[o/їЅ^’qkS‡О UzžzЋП~yšsси\sЊћ~x‘’ŸМ7'#РЈСрnЖтч‰ігd FD"y†ВхјAЂъЫS…e<хf)"pњ@r&”0Л'SawюГиgkуq%юїБиљE† ќмiŽєLћ„'ЂiЯљTpЦžCˆГgйѓ[щГс0Х№љš;Џ@ЬЕ+qYхЪКђvfЉ9•эпЬѓўиХЅЛЙ8‚Ђ+)ДшчA;8mЛ(БёŸЂџ21ЅЛ endstream endobj 301 0 obj << /Length 1974 /Filter /FlateDecode >> stream xк­YYsл6~ЯЏаCfBеB\<ќжЄM'}шCы>tкfJSЬ†"U>fњуЛРМ9vЧёLрюbo?PtТ]Ѕс*цœЄ"Yх‡WЁyкьW8јљ‡WдЎлРТЭdхћЋWя>JЙЂ!IУ”ЎЎvSQWлеяСЏUбЕы ч<јPWkЗk–Њi Инp*“(Hз^§јъћЋA‘dь‰щ•Ї&ES“(MHВŠA(hеouП†Wep“нЊKВ њ/Уaо[mHWiМкPNЈФw?›™Э|ŠтмЇВTћЌD)mРAнрu[ьvЊQUЎьѓ^ЋКкфuЕЋ›Cv]кЩо8T-=Мaz;иST{u/БмzlT‹Ўeqфu_nq*+лGзpЅnEгЈМ+pюЎ)КNUі•зќeݘy•q ћgcТЁ Сƒя (ЦлyqЙ("м‹oШz#X|кЁВ#:<њF›cЗц5"ІBj%йр™(>І_JB“С№7N^MбьД[ЕЄі˜хf(‚Т&sQщ4юTяд'3Ї/™хˆl0ѓа—]q,‹|-iu:V>'ЅDpъобЁгZ­E"€(ƒkJ˘lГƒ5{XDЄ“ Џq!сqьЩFNЯhe’АQа…7@$fЩ#+ЋЖх!Љ{csNfМ™ыоdM–C[FрщƒъŠƒj­куЋ%kь“ЂТ+”š™Љ+…Љ`чЫтЫЫыМ xL|Р!въ"ёY-Тi„LЉ№\8e*лкaWлШ”Db†XYeГс -Л.і}бщбƒMi7mЏSбї“С?• ]>јЖck№сƒo[<™mI›3`LПІ п#i ћуCЌе“b=)’ЬVєzCƒCV–xл[•м`В)›{ѕжО1”`НP‰‘TŠ9fфЦ‹”(Ы)…rнgЭжРL™Њ„ЋњЇ/nз2lЖ9„ЯЛЏ~WУўS6У]эюv§.€'RЬ €™ЦtVcDІ356=ДЊ ƒїЅ‡FЙФФ4 }у!}™7!сБ›†,ЌKЄ [ыђ`ˆвЙЫЏ‡\†№–wКdц‘Њ‹jџ$RF’I.žš]ˆNќ<:С№y№4яcж,’+еaPМНЦlд{Нwofж"‹šсЌ3й.БГ‰;­d~~ŠZрйннМ‡ЕPцЊ}kЩXл[@G*Ќ‡лч~ЗЋЫВж‹я.Н`8pnњШ /кd}хѓ[:NŸ:bw—Ugіbж yzдјЦъ$!OЪg2э’wИDsЃP$T$6§Ќ4 t<|d;Џё"ёb…=@ѓщђm W•fE“З‹*П9нбlC№$бџвGwЦЬ{6Љш‚~kв˜ЙxУ 5G.;ЁюГУБt“7˜ КrЕC№n!a c@@ПPь+\kВpКЌЗЇ_цЕЉс[]Ущ—9|lЎЖ %u7лЪч]—иMeЫрНMт0oз—оєMТщ‘ч,ШrF€дИew…ЃGЎƒjЏ5Ё‘>вяЂdкD_KŸ*J—|ємАo#ЗЊ'ЏБzY\g ЊŒ5њ0|ŸН–™дLц'“ОЩSIв(]єM}ѓ}_”нЦ$єШыTЬ\Ÿєžв+Qі IfМНwЇБ ќ?HCט^ Щел˜ц%ђjП3RNb>№ВЖ№ž@i 93ž=оЂП@Fтбeyнž•Чž.o C]VН„МСОВzBB>C\Нбэ‚Г3йО иš D^Щ‚‘шIU4ѓВЄч0 zWЪž]EZоW<Ыч•n{7"–оhьmЌKTtкDчЗ@|+нкJрžіФЦRТ">џбьAŽиЭ‘˜ъhюSФb…Z•ДЫCб~8хœЗ8MчЄРGx „цœкЯЕjп(еКУэWЯРj’љВядЎ€~ і^:ђ"'<,љ:Гf ћqѕmЁџЫKlПьshХЛЈёс;љdjќMР}љюмЇёEцјОzŸП…2p';NRжЬTxэмвВ0B йЌoцРЃh–„­љv!G…csцаЉ№Ў) ;яыЊ>ЎдiВTфОˆэц=Uп,“?мO'чВ_xВ_џŽђh> stream xкXYл6~п_сЗШEХх%‘Jпzb[ ’-‚ WЕ6m ‘%GGœ-њу;УЁlйб)X ‡œс 9ЧG‹‡?1ЫјЬ(Х2mg‹эїмf=#тХo"Ќ‹aaVТдЦŸ"ЮЩbхЛ˜вдЛІШЛРѓЗgбyѓLєznнH.ђŠˆњІЫ‹@oŠѕЦ5СМуЃG<И"Ш—›pŸа}[Tk$uДjrяb^в”ћВ#-:bЃЎ}:y#–YаŸ2c щv&2Ÿ?ЛЇDbМх ЯƒЏ˜Вы ЗЯЋ.Ш­œѓЗ;\чјNОЃ%’[f7zJч%­сŒsm2Ё$—tЩƒ>™2ХХн†ЃбšsМКмО—DХmчVyuS—н?лМЊаЕї(".ѕƒnв._9–§ьVЄ$\HАDкŒYnm0рoѓcH4nу]>КЁ-\чйўяIџщмБ ’жЊDNŸc2HFЭ •$ILQ‚џIJ–€L*Ѓч˜ћ\д=VYЃЃY-$E_Nц6žhЦ„Ь‚ПCr(-)9(ЊжAйZQЎ!Гq-ъє4V>ќ†IэŽV ЂК:ІьPыѕ1eŽ’Šч–,ъ&hТSžЌ_*хLђCYњ0х]ТŒ<.М%,FDWС›"XХxе—ЁhЅ Ы 1ŒяiПqхђ-V"B0иЃG9х4Ѕ>v œ9uy˜єNТl›oUTЛўLДuAŠЪ‡Ž–p}Х[.”Ѓћ=юЇНщж{p_ђэЎtџПЦHІˆшъЊqЋІXƒ5˜@-67]ЙiюЬШЁо˜”ѓ•'ЅFБT*a­v1чЩi’оS<љсБ–~|ѕ@QД *…IEroQRЅв*9…Бб,ѕЪGЧўВп…ІањPAЅВЏ"+ сaЃeјЖѕУ!/лЕjnC#ЪB?EnhГ-ё}bЗ.ЪA|зmhЮч2А$ ‹jF@OЧдI9–}0ѓЄOœИ”жyYbкq’СнJЪЋ%БnSЗ?@/}DИQуФ>L АЉˆрк.^UoмРнхеА.ЊіEY@Ќ ЃЅž?жj9х?%#8Ђ€ѓЈъЊ,*—уОIц’&&Ћ–Р4GиU4‹d]>YО “FށЈ]tм- бpЕ'˜-ѓЁD›yрhYєэд6JВФ&УZ;щЊ€ ‰Цjм:wаЕœЧSЈ.ŠЉФxЮ˜cˆI!9> stream xкЕXmoу6ўž_ЁoUŠ˜IQwбНОЖ(Зз,ŠbЛйSlйNЖМzI6И?9”,;Д“рPˆ)r43ŸyF<ˆ№ЧЉ”LЧY0п\DvЖY4јзп/И“›Ap6‘ќлЭХѕЯJ†GјтУ9ДЧc€ЎHБнд_њђўR%a^9зhОsxЭfЫbН?+љ-НшѕAФ>а cЈŒ9 е)ƒIЪДмМѕo4e<ЃFСШ ­ЂЋX’ЅДјЧe†уэЩт|0нЗХрMqnї’™бЋrКкЧЙqwH„4Ќ+В”o‡\„„їЉ!:ѕвeCЙ)кЗ4^жnБјšovUqхsu–bѓ‰8кМйИ*\чїХnlАЂƒхђmїЦ ФŠe|ШTNb?ЫИ‚tvКјTхЬїŠЯƒЯУЯдў2OžqФŸ.&6‰U1‰Э‡ЖмЎзјФ…Дeќ•g]ю8/g<\^ђАn šЯщg^лЃ?cЬЏѓvџ>–,RЦ2p 9АБ ‘?#lХЬ§Ž“Ам`(STЮдВГщ„aЙЗV[M`аРI`UlgtzR3%ГУг0xXИ2BWIи4uѓЦ1Ќp1NЮО1ЇR&Rqhэ–ё-§ЃІ—wMq_ж}KOMб—пвУŸWŸЭ?zмж кЂѓцФФ[—пЯчuГ@V Ћs(…ЃЯВзCбм›;?Фtы wз7ЎjДŽL­єцB0=Њэm•ї—ТЦа‰•Ю\Й'ѕЦ2i§иЮ(U9љМ+ЩK‡8ае%уђ№€п-НNFLDЩѓNrІвЉ"б;њhЪnM#ƒйЋеoжГй}бм™xњЮE*ЏоQQ7КЭнj‹т˜Щ'тAœr–(тFLa ѕџИА$щpfЪ–†їgЦtlЦКїУ:пй mќгєѓён4LШЬДe}ŸЎL*‰p—Џ šбžЧc›žг§œсzNњя•Zя д фG85г›=`PjвЛЧЁњЏŸ`Pіъы70!‹ fd-п.Š…Ю "JИљ|E-ЋтЕЬ—нЉšfЕX™яшG‰,:xщH§“LюКBxM?HЦ(т•д1ўDп+ іГ”aТ|Z?8Ъ“Ёc!ёОpbg‰р2х\яwЖyОќ'чxсЊЄЪ|†ˆƒ fЉ~uю фў<сŒ ЦŽРєЧрпH†Ž-ХкУЖwMНййіюzАgЛьілчUѕxтR8nђ8aЪФeњŠ‘)|ˆq€ ›&М<‰S‘€ЛDЈq$‰@ћЙЁЦЩ›TYЂбO_QЯ[C‚МѕСЄ„’:$ЙёУ> bЌхK*ЂŒЧъ€­š|c8Pф" Q•лš—.иeз>ЬdІMƒJг†ZвШb.~)G1ј1oцџ§н\•ЂlяђЙ1ЛінWCМњr13ПЎ '„§в-ГI@{4hпJйуд  тtn‰<ЈъгьŸ'К^ЕoQП# Š)!ƒ”I—<йPПŒeMhшMqТЄLLQћј) XФі˜дY№`E7ЦDdя|ќvёžjпЁ›Ѓ2™ c“aOвэ)p5Rу `LB'|лF€р’I1ъ8eсЏv‹"b).т~‹яŸšЪX‚2)™Vzbы0 А€CxYL;Ÿ ށз‡aX˜‡Eб–Эас љжЙ+*NLю ЩTo–m™ єNXpВх^ђПОŸ„"|Œпї>œ3ŸgШ5щ0Чы КОDЉПTa%OA+ФГџSArАfІ§Lч15cЉNmёM‡ъы>>Ѓk™)vФе№DЇh`ѓMKу-2СršŒпzk.HъОSf†n"Нw }SЉQ‘гm3ljуУoWG3љfн€zZК e F3OCrјIMšOm}хВџnМ_ц#LыЕvьM†UIŸžљЂuІџ3š]яЪ[aАд> stream xкЅYYoфИ~Ÿ_сЗ•wЇiёа5yЪйyШУЦС`‘Щ ДZн-ŒZъшpЧџ>UЌЂЎQяиXАШтQEВъЋЃх]ђ. я­EfвЛќќ.tдіxG_ўђNђМLмЭf~||ї№sнЩPda&яѓ­їwџ ўY—}wПгZjъ{•Яї* ŠЖ+ЁЛг2Lу@Њћ?ўэнŸGN‘RЏ g~_І85BjC2=ž рœЪрbлТЩдпЫрT€œ2Рџ8fЋЊAIЏиUA 3ъ}љ\ю[Љ/к3O.kњіДГ Šџ]кЂу3т@CпЇћžž:ЬЛh‹=jл-0~ЙOM№h™ l7n§‚ЗЇоI-dDg9—ЧŠйУЌ8эgA[и=‘msІIˆЄІ=#ћЁВт~™,јcЂ€%НJЁI2-;уиPѕхЅ*s˜ыєМЊ=БE/УОЉyхЕьO“ ѓ“H:ЪoЯпN‹PУD7сGžАxмH$*ё3~ ;k-АhЉнŸ,Š˜E%BwБyё‡ћQJR•UС з9РЛo ZZХо=›n†‡›ЁfъЖ№2)XКCџE?t[‡аFшXЏNСo™лЁ+˜ѕФA“Т мщ(Y/яtЯ­„›Ї}и’MЅ"…u™ˆcEы~mPИ•“}.>P3}И”_ЕЄOѕt~Р“,ˆ‡~б§F!Zвo№Pж_Ђ­—9_mн3чKWКЉЎP& g&F‹Hы,ЮЖЖ| 9Ё•Ъ’0Šг­{п%FФnїй=|Em†5$\ы˜ƒ1*Ајь8F‹сMœM9mё\6ЏЭЧяWz˜DњЉЮЪ6Ž‹ J(ыF›™B‡РHГlї;tТыСђщ'˜Zќ “MC'§nЅЏаŠпVŠ”,арЉgJNEВ”ЕБ >кќ^ЫрыџлvH‘DрлЮxлЇВ*{yљ@гВxЮ@)pFQВ‚ЕЅ‰72`тД›ЛТDVюnm:C™-ƒPр(H•ЮІ2aаДхБЌСn(O”‰4L§юCЭ ѕ дIЁЂёd|фБF­ФэЗœ в-}NhEG‡ьиГЩ–ыœ…#ЄЧњщn\Э6ЊtF&‡ДЎВнIˆfR„+}<•Юэиъs(5и!vЕwЄЉёЎоРіш…D8д•ƒ PЧрz*s<ŽьeЉЗщUN/;O'Brёпо`Ѕпџїlцn=@юœ PІ:5Оь:дТйТŽцR1~\O ЃЫЉЌПRг9#ј>ТуXйђіЖЪ1Єрй*л7-]8(df уŒž‡d Yзл–Z yБЂХ•DBЗВщhГHО!N@ЗD{–u^ фм]О=*РЃ4ZЉя+ЙJŽ~џв6Чжžiч“uЁ0N‚K~!ъО8XxщЧлАgnЙЇн‘Т*‹и,}тhЪН‚23‘ХЉX’:р”г4ћаИ@7 ЎиF”Wll.MM“bCиhЄ ~Ц`ЕiiрЩ:%џъœС#ЎЯч№#/[€џBcԘЅї†0і•Lfу]’Hш0zЭЛФ“јˆ4іщzWƒа9юКл5еощч–zњъqjsAvqЕBнvg‰ЖƒФD )Элb\љфŒ –і>•„ŒHZр;м&ЉР{щхХ{EY‚†f5Лf5д+„›Yќ&€!8xtё€ 4(m@‡-;0xиЅ3{шŽLрв—‹ЛTьпЉР 'ЅиНgDбˆ—ž„т{j•5Mш‹­чTЃФDК Oў:šŒA-кƒ5т С1иЙщЅQ"]ЧєlEš§žrLиbuЂг=K:Œy‰dЩЗа…| ЁьRЏВ'ЂгќyS`xцhG9Зйvё‘€›X`мm™!KŒчpы ЃмЛp<ŒƒЎрЂОЪБyХзГNЇx6>–›єд[|el#kj-^ #yХnЧ [œЖ!u;7T‘PJОA;iГ’ЅД|ДсЉomЮžAЧF„в,u‡УЗ•KRЩCЧЂІыСŽ­ŽХSk!`q튘оJ”wї*е‚HдOsкдв`h<њЖ/доМЖbия_Z:K<ѓБєсKsCїfReйЪцжЗЁЫNЫ6БwйшS9yA깂Hўж КM)Н77НJ шHгЩ  ЂінpCZъЅBИ0) ‰ @ЋгЯЭAZ$Ё|ЕэЉdt_ЮvАА‚;жXЈспл눆sdo3 иlѕPHВщ37к5№† dиŸœOЙ)ž c!ГєЭт•sYтBzУ ‰ЂmУMHZ–<ˆзШ„`О_Љƒ;mh-œ6ш™Ÿ:'. Op C™„L&!Їš…˜ЛWŸёЗД5G!бн2rаО.ЇЭ~м >q™Nо€RˆўгЗ!)юхRМLБOGŠЛќђcPжX€Ы{њжХМ"яUb%™лгšzЫ4јцЖ{ˆ™єд-Ы‡‹`§~Кž@ Рў5~ѕйр€Сo Ћ8йОA€ ЉЃЗн ьe/|DыђcЄz Bo0Jb‘MP†Ёлky5эŠCКЭСd"›j+?Нv{ЎЧЌбЎ^]UЬ2яЙсOIїђcмлшс€9ќЃЁ1ŸкP€—eВБМRКЃ№g‡e@‚4єCяAЈˆћтиNэ€xІ,iрR-ЩЄžJNў Чš йВКa\*я“КьБ†6Б[ў‰ y'ЙЄgлYo\НT‰ˆЬш.~р РЃШєЪџўŠбПЫЕџнЁыЉG.Ssž­$p•—ьКŸqал!ї™КП‚[SžЉ1ёў SЭлеХ•јЂFК.УЏ7€—Ћ›ždјZS&э9к~ й.щъXЫжлВK20§ŒчпOPNIWЩх˜ К r|9@NБSQ%2ј$!Т‡Ш|Ѕ3Ци\oъЊЌ WŒIŒћЯW:k,p>у?*OoBьЊгЉО3лЮ„Ўг ОЃžћ™mІWЬ=Ях{‡Ёv/Ja<@oг[NДcАЖGќ‰Ь œ-— \іЉ*hЇz”gу(ичйЊЯЯж c1o–їХyђCKI.ўЌљga†r endstream endobj 318 0 obj << /Length 1819 /Filter /FlateDecode >> stream xкХXYoлF~їЏа[ЈТкpO’ykмК@є!QIŠЎЅЕET"]v фЧwfg)‘eЛIƒк€іšнљvNђY џ|–ХГDJ–ЉtЖкХ~ЖК™QчэOg<а-€pбЃ|Н<{yЉѕŒЧ,‹3>[^їZЎgяЃ_‹МЉч )etQs‘Dws‘FЎЊs.$Sq9џИќљьЧхў&-Ф3YBЪ#žрI1ЉŒ<™T1.ёdŸ/ДбržЩШэn‘`Щ6mх ŸhЯ+ЬнЭЅˆ`ŠGеœGШrœŽ…TxЦИ2{AгО ˆ€IЂЋљЇ\ИїЋ10&j<žоs6XЯЌЏѓ1—Ўrўф†VЏЇЊмб`›ЮVDНк3є0'H:о.PF/”d\“L=э‹.уqФž*/Vе\–;W4“PiЮ83аЎ(А їЩюnЗaјн–ža6_(ЎЃeGjЏъrл6н #iv5ѕ~sGББХzыж^fP$–ЂByЩ91y…{рn%Ђ–дY)е­šМИЁ…ћМйPяЯ Жщ‹ЭЙf)7мžз tЭ,N;ЊчpbGЖ€‡^г­ШLйвU;ДuCKmэhњК-V HjЗ4.ЪЦт№KNјс†!bЈL^ещљ‚”%B БРЦЧ ZЈLL'#„qС#ŒuY„^[`и HBЗ‡$Œ’а›DRЄ KеЩЕЛ™’'ŒЇbd`ЈXS”эЁcZ€ˆ:•ћЛЭIеg kƒU шЃ‹nэ€ю$З ЗЇL№А§w|<-4шн{E]|ˆЫБŽ•†_>0ПёЖ{[4НmžXЁv%У єGВt$Т0?Т‹вдА—Яeh'ј њяˆDшЉУ^вbЬb5ѕŠ‹D1уЯCэYnђт/€^ЉЈМІvRQTЪ8ч}‹ѓ)†Љ„XadGњiъ4 ЖАwsн#9З>б тЭkvlZj:5ЂбUыЉф˜ЊS.5Ы‹uОВЋ{ ФP6PП„3I64•˜ Г7•zSЖл5КБз "ЉўC–:Ѓї8eИJ2Љ№rвІЬHгЖMcWшe6nM3MImо0д!НsnœD#Ф&pЁ,ŒѓІa‰Хќ€>aB1œщgaћЂЗ"с]тЙ~чКЇV,яpХUс].§RћА CŸ+}<ЇP}koM‹d,˜ЪS)Hv:CъЈŸd|Ј—$€‹!ƒМHЮъ[1 Ua&›И4Šхƒ8†_“UЦ…ќ:ДЭ‹А†.gР­TЮе4ИœЇ`Ш€6.[ЫЖЉѓЕ;Ч ЦїdшњшЄС n[чmYDOЄ‘GЊ:&23- ЬїŒ‡A”LЃбњ}Ив |@ЃY`ыхЪt+˜Йф@. X••OyD9pднURkЁЗ гqЪц­И^hесZŸŒРP!ЅТщ)‘qя5х™@1”БЏў__ Мх5qыŒ "ŽЦ т9Mзeиt№ЁnB$,гЃ(є†qx—З'ЃxŸp&3ЩФ#"hЬГ”ЋLdЯŽЄ79Нs‡ZЇЕн…haЛmhйжO$8_ˆЬуљЭ— УПšАїЕЧЈRз$§>я>В_6G5OŸoълGє|к€!ˆЩ^N}qВ:Щње‰?—дFЁ7ОХ*"шK<ЭmU^йЋэУ>[Іх{ЪeЄBы>]LY#зЦ‡ЇohOцВ)„єЄЫЌOkЄ;ЦЄ џЉ-B %юоюxРцg˜СЁс№еHђ‚(оœг8”Я+ыKC\9сНAэВфYЯŸіЕ ЏЌщр5Ѕ6>=ƒi[?r$‡кьЭгњыЅI;tєЦmяrЌf•L)~–]†Yчu(`%‚ ˜$Њ:йlw*jб оћ"œŠ№ы<эЗгa4јIњ0€GРОЦЏp™RSZnNЅк›wн 4тSžNaюЮћJ ћB_šпb$дDњИ0|є†бAлѓІћД&КOu2кцЛМёv`‚г…6фq5ьшЂ†gє ˜cdA/щ1Д`J’n’QŒтTPŸbs7запЖŽ†Ёl„о=ЙкmиКw3Тя8QИлуUєПЖљ3ЕyqŽ}F[Т™ЎЊРBƒўЮе5”9ЏО.Б№њ№м<Егjєщъц`–ОЏnZќbIgbоŒэЁBїГTk„ Qю,іј]XБ§ЄЮs endstream endobj 321 0 obj << /Length 1457 /Filter /FlateDecode >> stream xкXKлF ОяЏ0zЉ\D“yHЉЗДH єаƒЂhњ˜ЕfmЁz’œЭцз—RZ{WЛ‰ Фсp8CV+ ?Е*фЪ#Š$_m›+И§nEФЏ?^)–‹A0>‘ќnsѕђ‡4])) YЈеццTеІ\§НkЋqXЧ֘шћЎ]k}Xы<ђ§PС26JцYЄ’ѕŸ›ŸЎ^oц›R­ПJ>ТdS"L’iЦ”х‰P&!L™аы8ЭtєЫ:VбИї=БIєsзжUы‘щж* м”-|M_ЈB(Э–Оэ8j’<ъXeb#џб5‡кМqCп/‚ZяzтйM@Когйр­#ˆ5ˆШїв,TVяЅ2Ої-zs$f_Е;Ђ†ънi#з–ФЛ­zЦЗsЧ^ MС#TJ6p1бЎЏ‚RЊhRЇЃурKЙщz"мuя†ŠТ Z—о+*§ЖК^ЧИWgиКкГиАяhяќЎi%‡ГлєЉцvpњŽф]ИрИЗžЇШКї2•^ьЈOM]ЛcуЇФ:.LmPsR€їFpšыKZ•ntDЫ“še\=t,}<ъ qтЉd€ŒФЖkЧБj!|;тŒгUlVŽшg љЖъЗxГЩ ˆq ™МпеЧ†зС(LŸсщкmЂЗ>MЎФэй`\MЙd;2'л‘ІXбt=Ћ*§шЊzр~УT[0ƒЮоV€ŸД іc=V‡щ‚Oь”,Lo‘VЛS?ёи’ШжямШyШœ№‚‚~ЮС~К§СnФэлрП'nЏјћWьД $Ph’<Sƒ‰БZ*J‰$M&™ЏEpNœшTІ8{ЏъбїэlG}ЗЮM ›ш ђЬ*'вF[з"‘у‹$‚’ ˆсЎэB]Иkт,"з2Ya&T;)Ё[Ёr=CPьВB0У&Щ‰ОE…Z#љPЁУзQ2ўŽО];цFЂB QzL‚жѓ‰ЊНwAp­Ns‘Be>KП“47їi$ЇЙI8ЭХЂЛr‘‡Š/%ыћc‘ъ4кЛў["БЪ†4ЧbЃ–—…:;ŸМuэШ'ЋvЛїЁбЌ’TфЪžƒџ†ЄЄ…Д‰–R/НА—$љ&ЕдiЪ‰Цњt&ЬsрЏћ3јСGјех<РшфZфжЄ™б—!Wєiš/;њЄУU.ДT…*.C‚ѓя7шОь2ї…ƒzкЖs#$і~„(lVhГєЖb O:8Iг •yеnРІžЉi,!66axЗ-ЧI|‹н˜ ЩљЬ{7}зЊ7ФиѕЎЄš ЙEЉшр\wБЅgpЩОкЂЎ=IReUїwО>іŠАрЙѓ7Lб84сŽзѓLvњњ’_8Œo 4_бv0ШFћз.ќїѓЛћяоО"Ю„„Š9tj8ž#ŒuЃlЌЄZmЌтIР—T—†ЄBл†-^ЮmXSЃГ“З€звР†HрcECиЖXЎЯFцGby:T„ЫR)ЕB[}вВт4Э›о†ЩЅШьƒjЫRVDeјbuЦx#‡A’КчXЛ>ЬI[ чžŽ…1ŠjU&$ЪSХCьЖўуHдœмxј$Й„АрfТvЁY26ˆјв6GN3f$8r@…ШUa9GhžtPœ>иdц1ж“IД‚‡T>ђбЖ“24РMSЏ.(Au2ёНРyqž‡„vСFЧ‰}рсВБ3mЮш`3иоаєж< /Я6ЯЇыц}6bэLЇ–rYвŸkŸЦSф*[hЪ/чЋД5кKнS?гƒф_њдь‡_мћџ'ruєgš…ќCWЃяC/ёћЭh>гѕUbEЁSkž/3›Сл(єєwР/z1+ endstream endobj 326 0 obj << /Length 2148 /Filter /FlateDecode >> stream xкЅ]мЖёнПbпЂ­НДHJЂ”Ђк8-._'Eщ•v—ЈVкŠвнќл;У!Е’N‡;#8мr4Ю93œ!пФ№Ч7EМQRВ"Щ7ћѓ‹иaЛу†€Ÿўљ‚{Кю&”ПyёњiКс1+т‚onSV7хцcєsczЛнI)Ѓякf+TtЛyTuжРчNђ8Я"žnЛљсХї7ЃЄTˆgЊ„”Oы”х у2!nNH"2[ЭtrxЕšзєйДMmšJw„нЃљТфf‰м4ЅйыО*щѓ јL№ЅЋ~yroš#!4-эM]zйПЦiќмА"›Z!eСdšƒеЮˆ/žffiЪ”Pт`Х‰iпz9Їjipйьd’В8O7;.Oiљ'GзшsѕэšJ"g9ЌЩX§в[8’4:щ[XуР/wІЋŽz8Vh[Ьт"V‰ˆcAгІйŸ*ыtE]т™#П;нєN‡ ЈšsхЉ8‘НЉд…Ѓ№29_лžJ@UЕPy›ЫХ$2ŽіК!рhnём*њв4L!‘мяN”юXIТм™ўд~š˜ТiwЧс\9яё3­guбЧУ^Tі`гж•D~cэк ЬwыћІЏК5УЅ`2O‚ch<з$YрџСы.—2ЉЦeю,аЦГXŠI –Є#§7Фљв”іМн•й-ЧЪ!ЄwMРЬїЇ\8ТŒІЯi8vР 6§ŸёЋˆЬсЁm3ŽЮп9WLp1w"Œ_QРП'рv›f‘ЎMIŸ<,t]аUкCюь†3ў~ŒK pˆ2ЮР`ЁmnnŽDЃМ…U юDЙ'cƒ@лмВaш"zыЙєAТ|їHЩџ €v]оd{!eїWэщx‡kЪюO.ЉЩЂЬ?k(0e< щ†$ЅБ—Zу|vЉБ|*g$чŒО:_О{~И;rЬ.ї”ѓїюixGУKl_т' Ы]вœ (Q&p$vч>aѕWЯy'. •А4IцlVГс#І=bй—бДЬЭgМ}јНѓц!1ўП~ї•†NcуА_gэоtћBЕвЯЖјКmщX|14vџšеE,оЅ<Џ^ <‘L:ƒ&7УЛ0‘­*\Є!АШљiюBzFbBЁ |qШС.9­ц^!8ƒјzђКЯ'щ™AіrQ "‡‹ўm„aР"Дз€лЎxМ;‚кю”…P,ЮјьИh ”—wї( “ Ђ;вяLэч;@кќLhŸ"iЦsфЎЬ ”лH,[‚0{Ї\Hх§$УgWс…ш)Н{"HзBОЎO%ЫдЈнЛЇK@bfš Qх5ч}n‹Ћќ‘NЌr^\rМЧЎ ќe9T–љQp№žlОуя'w7WЁЦшaQmiBуN!PVvпя:X[ѓЬ†sчіJеkSL~М}EWгуhiД-ЄFsЎlHrжtњSэљ V8^§sНgЁ=8л@я{†qЅ‰ zœiц’Тя+=‘ЛІЅ‚ђі^eu]Ё;фъ*WQ+пєЉ)цR–pаtЁК'Œж] 9Ÿzbх ™wщДГљ,џЅŠeщ˜gн6uEўZЊЬ˜З№”жŸž№ЇЧЧrPw(T[Т?ˆwЇівУЁЗ/О:˜ чукѕ‡ƒ@Аa№К” >ЬЈaCмLЌВ‚Іn_­yЋ о< С шќAЎ’ŠёLЭЬ{v)РB=н€pџ:qшgƒ osьяљˆ_)3яcнЭŸ‚Lф\Є+рЕЏЩYœѓD$…Ьž§кёЗп%ŽИїEFškысУН}ШBс›ZwX­!ўЎ3Xr!ЈipЙ чАТїр–О\тA†Г;Н_Э#…`Y6fXЙbHСD РЭУ;ˆ€ОvЈ{ЏЇ+6rxеНЋСЪuIіHЌcѓЋ э/)ћѓЋ+ŒXЙt…еhœ1žѓq ђT‘w'CщfМŽа’pOбЧЁїФжEM{мП•шtЌš18Х­iылU@Э/ч~ˆ•нЁуЫY2;ЏёЌdт“ –џѕ ^} endstream endobj 196 0 obj << /Type /ObjStm /N 100 /First 850 /Length 1665 /Filter /FlateDecode >> stream xкХY[г:~ЯЏ№#МЄО_$„ДА,Bтк]ЮУChDt“*Mбr~§љЦЭВmннvЄѓdзgОљьЛ"Ц™Ž)Я$чЬ[4‚ A­fТrД†‰8!б&%_їAЋ˜t2“˜Ѓ8ЦД e”vhSуRcšk˜ а%=гѓe`кA^IfhžRЬh‘Ie™qјЎ3A0Љ9Г ыjСЌЁпšй8n˜#ДgNc˜#{dkIЃ˜7.“ЦВлЄq,ип‚Чw‹ё€љ–ќVPc…Д$Ё˜а…ОР]a=ЭcТ › ј+’_\@žˆЅ#Шє;шцŽF@)ЩG№`}щЩo, ЅЖŠЩDNˆ"гЉуШf€„жш$g]€†Yя#t 6‚bРЪ$ 8й • C@% gŒ*%MEЧ{ Žzš #H@ˆ У2e0T=ЂrpP zЪ 2#–`]Ф[9гмвlЧ4б ˆk…А „X+G"œ "СmmИЮXЇ-жFPР’@AqƒLS€дь"LИ ƒХ ђ†“ƒ‚ИЅЈƒ J)3% ЃА.Bk4p ‰1qi№Ю І 6бAl<иФ#tАˆёф)–7&*)… йЃгђsUWѕ—ИцяыЊЃіuЕŒэЩМ*–хђqіф ›\АЩЫцВa“SішЭъЊlЋ)ЩМ]u‹U”>kкЋЂ{Ьž>ЭюHД­ЧIтbQNЋЯеДшЊІ^kКыcЊe^|Yіsb7•ЈЪљŒ4§QЭКЏНшіX2ч]‹E—?­Й§™HОnІХМњwУє­‘§ђх†d™ЪœЬfЭ.ц1,Щ ї|OtНЈПWmS_•uDѓїЂэбJ?TХЇљОАŸ]Yбч8y{(™FM›YУЗZ,šЖчЧžёdюyYЬцUNої!™§|еЖe=§бЏЗ˜–5ЫoОPџХѕєkQ‰ЊЮ‹ю.Ї?aФе~д]q}ыљЭјѓцъЊЈg"‰š—oоGœк2Ю8mІ+B<kНчІeНьљpЌpВЪЋzVіі­ЛШ&—?%›М+О”йфySwPЕФ™ьKЯГЩyЙlVэД\ЦЌ‡~+gUёЌЙf8,N#фŠTЙчєZьЄЎhњsFb*ZЗЊoul?fАшж’8/›\Ќ>uёїыЊў–Mž5эЌlзKђdзДc„ 9ЅI+TюqFk.sCЧЋЩЙ‡д лХрВМZ”mб­к>6ѕїВЅ=ЛІь`KЄt9e mUNЕ€s9хJœђЙ№aЏ)рХbN'V9л<__\/кrљ LJчрЈ rЌ‘Л№[EДS{mzUoОmјcMа6I7HР@)p }Ѓ–Шy{MИkgїFœkЄ1"ЮфЯПўf(r[НšЯ?Ž”AвЮ-Њ“-Й3l‰hуrА_ЫŸЁТp}U„‘}ŸŠВО‹ЦоHSco>PёшxџƒњЂя{*ЄИЦЇG~z”醈Ўя‡ и•Сн8'wЩсnœ;щўGі+nwЁЂw…‡@u[‰гЃйBo#+o­lш]Чѓœž*$НТ ЮTћkнЗнзВЅŠюMSSqWДПЈТЄW"ыPЯzгЫ=UQ>W~”‘ цVmЫ вEЕы†g•бg‹"eKЬ?–%JЛ\`ГkыsœМFшИ­мпС”{o К8bЛяШ()rzи"ИN ћС1JђНш <ќ„:mэLЎ‘AЩ ž$‡Ђv[ FЪЇHйЁlf,›%'Ні‚Ь\Ѓ л=>рцСиНlо|@=|цwD0‡TБћ™{n;Ѓы[lЙ4vƒSМ> stream xкЕYKoфЦОяЏа-œdЇЭ~№eн8ƒœ†0Хщбц ЩY­Œќјд‹=фˆЃ•Œ5t˜юbuuu=ОЊnщ›ўєMпdжЊТх7еёCLдўс†џќл-|[`мЮ8џ|їс›П&ЩŽUњцn?uЗЛљwєЏЖ‡ЭжZ§Ѕk7&‹>mLљ~ЈaКЕ:ЮгHЇ›џм§§УwwaЇФ˜7Њ„œ/uJч:iЋќ&ЭвжБZ?vЇ ,MЂCљЩЫCm”ЩЕIxЖQ'иcЋ­вЩХВЇВЇe*.lЖ\х•ыL–j^ћGaзژ<ЩєBМ№|У<БŠѓ"NђФ8фКДё6s*%ёЉrV §=Z3wQЕйъ-O–ыіПў&QЩгсtфyЗgТIœЄІў…VѓьX7~ју"‹іоЬ^Ж;ў\З2Я3:mEЛтЗчЧК*›ц™‚ИВ/йзжcвNўтрuе5ф) џ'ёЯkюбyЂДб“нoз\“ЈЬфЧ@”fЁЦУЕ!P'›єпЎэhdTьŠ%,НhѕuЄнЗu{Ћџ—ѓ<№kyБ6A4§ў‰lXЗ .хНЖopGŽ0њ"A%w€^6 qhУgŒG5ЇиР,Э(vH„{Ц&мJЋк3‹,`йБDбЎY§†oжWЦFўsхG&sFuУPпSjгђыK,PБ *xOп.bё |Н–ВпvВж.Ћq5t жч…_ ›єѕљ QЃKиЈ8Ž QfЊэП9”РN]Я(–ЊХ„O‡š +OЯU&‚[sT˜ ћзGqz?JХ§’^I]БХ/oЭйюзлцўjžЦЩФЕА-є?‰Жi–Їb_Бd˜TY('яTѓК–Э§-Јp-.ЮJЬ•,Tntž'y8Т[[Е€ыЈ's1И§дV 8ОчzUЭ3A)  MНzPЂФЯы˜ЋЌШ_V0.4№Ѓћт m^тж,с Xхfuжd• ќ]ЋГH;ў]ЏГ–\x­ЮЎ)‘ІPZгХЋЂˆ‹3|m„Ц™wm=Є(5Lvj“Цэ.€w2 QЦ)w~Г:”чІhВ +>u;gгh2[UЌУ-`IžОщБ2>ПiЪлорвi—щ4і€ Я2С›@oЂЕхЅІфЉ\@nвќnwіp Дв#уŽчѓїf3Н7Ÿ5ˆgшаOȘтЎ;Эд•Кќax| endstream endobj 336 0 obj << /Length 1575 /Filter /FlateDecode >> stream xкЕXKoуF ОчWјVЙЯjz­бC[l‹іаmz(К-ЊXуXˆez$›Ђ?Оф#KŽМЩŠб ‡ќ†фŽх"„?ЙШТEЂЕШLКиTWЁЃ6w ќђ§•dО0ЎFœпм\Н§.Š2Y˜ЩХЭv uS,ў~;”]Л\i­ƒoыУR%СУRЅmкІ+-У4dВќѓцЧЋї7УN‘RЏT 9_ж)NкNіcзфАwуЦРљЕ)т;ц5sL#‘ЈФs|q XYt;;‡І2‘ФЪ3Џš9<‰8J=O}ьШ9 р.Gя5ь‡PjЛщhFlqа–‡ЛН%Z.Їб=žЂЧіx+–Ћ8 ƒ›]ЩИіc^їKXFке(ѓШЫнЮ-Ю‹UЊD%‹•дBFЌjпћŽЮЗG%hxСЉ8zЩ#rХЛ9АUœ ТсЫTЈ$!ўпы~ !~{Аяh(•PЉT1ЭЖ3&d3ф™мc~шXЎ<8NA4$Sі/й$B'‘Tso‰'a'idТ(%7z@ ЪџCяѕsХ‰lsпa6u(lA„Ђ~фЅЎІяСцm;/rюмV‰БлƒГџ}ОС`кAT˜дІI >ђŽhљтыИ\aMШ›–ˆЈБY"ьЫ–%+Фы[–О%AZ‚hпжM•пюYъБьvg@<ІёX'}\™дѓ%nCLыHљЁ˜xžsЛ\ТІ}гZsЎИ1 OqмS ФсI}œхћœltv2„0G†  A>Ї ЧєЛЂ/qё ѓ'жлЮ64Эn;GѓuP„к'Ђ 4Lm а™0™0‘Š"q›К:vb6•P–_ЮпЪЂЏ ўmЗОПsЬ&вS‰П('KД2јМм—нaйІЉ›‹5`Ы)ё•Яsš”5žгдѓKњАВЏ. ŸхŒ§эКўg&x?пXљ УBtf”)ŒMњt}руўѓ. 9я29ЪO nђж^_ИG’pИ.)НfЖдJЄYфйKeІn\C2оЕ(лќЎБЖВюОфэ9';wК+дВКœа8ЬCёЂлhЎš,уS1Р‹WЦhБ;o)c‡gсIZ•ŽЉ љeOРѕr2ёSžPБОр РŸq$я™RvпяNK(Œ†тƒ†Б-H ї–АЄ л–ИЬоPBCtЄмМјvQ` ‹|я“8FО'ЄŽeЧтYoСƒ­жS#є(шА‹a‹fјќ’цEеЅЦгLoНŸAЂёVс8ФCQygYЅm=0ЗiМqMпЖЏZVi{в„QрrІЕ;Рvтn€(+;л=ЃS МX|ЁH$‘сіРоНX|жы:o6Д#№iэЦ *ш!УщA+}Тvƒ7М5w>2Y‚&1“Ц ы}хс]U—ЭJ„в2cr3S"чЪщЎYЃ5ГІА#’rЂ.[xnFdDЪF0шГЊIWъžUM2?Aяhјue›r“_c†$р, %І9„TK<.оpАЉ)§я]ХB %Яіћ'"U6o{Œ-ук>ЈEЩiЭxЗœq8vYZяћЪ:RŠ@Ѓ 4;Г ЧаeО‘‹ejOйЛТ“Л­˜’.‡’z.јЪ…,дfэЛђшRIдАA_4ДЄŽŠЉ u%r§kЯЕМnэЙfOЮОž&ЛќT˜XЭ9сЪуа Ц†1}(Ka0 уфБlw4rљп*П_žPrњ %œЪХ^‚A‘†ЛfЫ8;}Іžw{&­ф-6§‘Yъ­з{&aІ!тžФ#ЗсSВ*яvўv)л™вK)їzzњ—'ПH9ЋSє!Еф—/\2Ў:тcx; ыІ…}(7–ХМF3ч5=VWR‰ХA^юБП&њЩ,WНћ}с_РГЯ^iЄˆ’јUЗt2ќR0дp™b7ГД„– šЯ—Ћ9>їдљЏrЏ8G‚уЅПWуз6— ИЄёD'ц4щn[јзŽјib†ЩхЦs:­Љ, аГtТФп”ўJУŽ endstream endobj 340 0 obj << /Length 2178 /Filter /FlateDecode >> stream xкн]oуИё}…б—•їbE$%Kк<{EЏw}ьЅ(нU$к&V]QJ.A~|чƒ’%Џв5Ў}*„УсЬh8œ/вbСŸXхб*U*ЬуlUпE„mї+ўђЇwТгm€p3ЁќўўнэIВQ˜GЙXняІЂюЋепƒП6ІsыR*јƒmж2 з2 tы L7JDй6йњї~їЧћёK‰”WЊ„”пжi›ХЁP1ыє§ѓzЧqPщ]бзн ЬR˜c zPœ!грЈ†…к8П№АорVіІqŒx2нЁ]ЛAQЎ7"ш €ЖaМѕщккіШ@€ълЉъJЄa"и*iўъiђ)MІ2(~ѕ3ЊD$ESљu^я# XТœjЃ[ПшPв N.“}.#зЉЕdгЊ/;ЦСІ$Gє!дЌ:Ј ’ySSBв­?ъЖшl{ИmŽжІ]E~;‚їЃ-ŽЇZп,€ЬТ ЈЗс6I™њлЏСэ’рP<ъ ЪLШ„gЛnщ+#пSбtЪ;гм‰зŒЇgœ„™HчьBŽТiќŽ5pЮБg‰KБIуpK˜ьы'ŒG.ШtЯ8K‚Вpкн№ŠыKДўg…у‘,Ž€7#ѓi`Я!3Ч$Ц x:C#Й я]•g|ш;цsіЈ;sдžиܘ“ Б]Иdџж™ Р щЄч#п(ah#ВДЌѓгьгъвœ8ЬБly8š§дєŠКО LxЗБ'щOlЩЕQ4<ТG[]ЭліšёІaѕБшA8™кgiЋg\жмЖˆˆa­РXђ†7xљ~YlXMX8ъТѕ­цЩp@`cЯlымдХC QЉ1ынЭЄzIdЋ4№Ќ]ћќлюs”DЩwт5@0Š4FрvˆŒ+ƒPМЪQФЂšNтГьЗSMиgAxЩ}UоSxФ*пsч0ЏFS7УЅ‡С%qэs$т†эŽS:b$*xўP|сŠЫиЇƒeќЁpg:ЃХ­фГGмxіќ$т4KЪ•vп˜эx“РRf§W)?йE­›RуaaЅŠ;Ž п8ТДƒОёЬђ/\=я&Є1ЌіNяњšqх“‚m<Ё/Ф(еЖW›ЃdтЉЕ—OѕщxЇюfiоfа1pyтM'†й†„щ&„дLT•Сш+j^‡ќPіu(G}‡<—cлдО1™†З/б,8 О4бOŒ§ =Э”b=тœЛ‘ЯrЖояVŽ›Ц™тOі'MЦš,Рf~џЛѕ&S"јДыШЁ`2ю$ЧЬ^tяН0ЮщШХFђhh zьŒjк*"{gВрПёЩсWйЃ.гУХбl6ю`Ÿ6;ЬЕ§2Шв,ЬеањиZž<0ї‚g8ЯСŽЛ g„IiЉy0 Y‡8HcAUъН+Ѓœiт?э0EZ^GЋqЋХЊЮЖ7ЫŸ{ЪЌнџGвd’_ ћяSш'80ln7ЮWяв`šФ3УЅЁ;ХА$Rjітг”шВŒ˜Ѓ,xŽс№†saђ&6§8d]9oƒкжT•F'”q|8уЪ#щіuщ№vЂrA•V!ЌИЦБc" .vь˜ьŸK^—Џ0MЗCt(46:ŸЂфRџ†х3зŽt`}у34m(]ЯJРPўAOЬ*И.ќp+€яy9iз5gЪm~uK ‘GaЉYšsоЖЭД]UЫ–ˆѓщ5K2хfTп№СbOŒАїЬћtаь%(›.uюšоШm"ŠТh<ŽkRBГм6oгЦћ7ФамŠ0‰}ДјњЯP8ё№р€N'pІк”\ŸЩэ­П oРŽ‘“Ђ}QЋkMNщщьѕ‰Ці§v+‚Ÿћ“oOчшИdРЦЌ‡“ƒo1б[ЪГ@?АwХьq˜Чё рР›к4ўбЇ2ю„=ШPИМўб”u_ ќK‘ЂZт_ Hъ‹UУm>+њwŒЂѕ-r-r~‘т)rЮќёЙћ+Ё ^tk‡W,;ѕн…7 кїУн?>–—yЋ9ь‡…№ы0тшБ,уЧ2Мч,|f€™љЩи|}ГЙОыќszžФуdб;ПО,”є=кXТU‚'PaСцr/@њч)нBODмПбЪФ2blNzњ`A%CPu ;ЕvпGў">cзlЊсQЩЋmQ‹wХгІрЇРdxtCjjЖЃm|ƒ€qЉЖsїЁ]†7:n{>^wП:їГ…р=кСі­ЛŠ4_%КѓsЊ.mS-:ЦЦЫ™iZ]ѓЩЂйз˜8Щ‘ѕОеуч.PS№Ч—s‚~! endstream endobj 345 0 obj << /Length 1776 /Filter /FlateDecode >> stream xкXYsф4~п_1U<рХ:|‘т–Ѓ–тиЄЈ­…Ž­™ыБ\–j<нjyЎ8$5’к­VЋћыCУ1ќјЂˆ™”ЌPљЂкНŠ=Еп,hђлЏxр[уъˆѓлЋW?$Щ‚ЧЌˆ ОИZ‹КЊЂыж nЙ’RFolЛYtЗyЄ{g`Й’<ЮгˆЫ?Џ~zѕ§еўЄDˆЊ„œuJuтqч~з}йaз„С…JXЮГРЯi'/ЮЯОЄA$4"оŽщ’Љ4‘‚ЇДД‘+чdЯ] ;/дбй ˆpЩ[з^ а]7чъUІXŠЂNLОЬЅwu’rtukœ №ф=ykZM„’ТЮ_ИЯу‹ˆїfивЬNњУРЄ8MЛНєб…Uйu>ШШ%^Єнxw­їзМ$‹х„щїЩМ3†QS‰šј?'юЎЗЛn`фi AЋž0œPХNjуК†2|Ај/њ˜+0„ЯЭHБkKША8#УњOdXœо е>ШнћИCЪДЕЮŽ7,M“G"ЬОФB(š,4о2)˜Hхѓс]ям“0џNЏ lŠ ТЬаDЏƒНЙ,ћ ‚‡œџ§PЈ~пjLmqAХШ[.@Б2ыЄф> wяЫ gбэ8tу@Л<№gLС ЮxО/*ЋыЪj˜г2сГфŒgФЅрypГХVaвšјі…уT3ˆ’т иЌF\Б\ьOU .,дЏС"ЖпБzмƒP№€Э“Tњv€bЂ2…рW™ žEyvF](Bœ”Йй‚&БЎˆ‰ Ѕ9ьCЯz\ЃˆОЏи>pЏСfžЊСуРИ=зг„]AЌкCpсtWіх kњBзƒЧф&~j ЇwІВё›ЛЙРыЙs‘єЈ:ђЇЫK]>\bРLЅьl‹L“KЉђKЪ"Si–Я†д‘ZSг6цЃwџYЇP•.0щ!Ѕз›БСdя‰>ŽBѓёЏюэфйќ<’2БяU`s­з,j @і>JL[5c­CCfкI7уH•}‡žщ‰†% pѕЌ3шћ‚KўI/дaсыћŒ$uУRИШcHЫЄ.ј€gLpHгч(А˜’Д+Ч**ЃŸэfCэ ѓMйTрLБГСЫ‚$рjЋgб)X"‹CJjьf6.“‡4h;ЊƒRawКHGыC2†ц ]b–РЅB<уЄзnl†АйуKaзzt3џХLЧб€еИб—И(&0ЈЉлUДЋУYЃгы‘њБUЂX!’S8Uљ Њ+H­і•šV%qL™sWЖЁŠН_"–НВ}иaO…іДКїЋў#[Ў Ђ|ОщЪ]зh$ЁA™ Шpеd45œАТЉХ|vOgЬфlO7эљЋŸ‚sІтЬ?Yd†ЯЦ…=žRЮ_ЖG{ч_ЖƒЗч;]>”ЪЃ„Ѕ4љ№JgcЊYrMщfпџгќƒуOМ§IЙбє‘ѓѓлHБa||ЅЇпСї3З8:=ЉPФЊвшv‚w+xЮMЉАтg$u $х]Ž•*\ЦWN…Н3ЕУ+‘эŽКbџ,R=ŒЕvfгRм‰ vІ Є4rnа;䇋Ѓ„/;ГйЄтвАl(AZЏ Л8їaˆчjhN‹ЧїsRє7x›(”эTŠшэzт_†<žЭдCх6ћм€Og‚Т3Х4иъ3ЪИol{7…ЎЉ љ7сЩИžl#КФ—гоЮ&ъ Йў…ЦЏO…ѕ[Єв№3 Поˆ‹њ&љП‡тQЙљ#††уЂ37fќ@knwысF"u= Wзž7цІНIЛ‚Вo[_ ЇvлНД”uЮ<йШA,а“&{„QЎХ%eгБЉўО€зSyШџ] №8 endstream endobj 350 0 obj << /Length 1724 /Filter /FlateDecode >> stream xкХX[oыD~яЏˆtpЛ{ёЕˆ@!qQBzp'Yе—`ЏлS~=3;Л‰КЇAЁJѕ^fgggП™љ6|Ср/2ЖHЄ В0]ѕ3ЃнvAŸОЙрVЮA$љхътђ:ŠœЫјbЕЋZ­Пy?7JїK_Jщ}е6K‘xK‘zeз+шњ’Г4і[ўОњітыеaЇHˆ3MBЩч6Хc›8OƒtЇaРeHfНyѓf K#яЛvK^ч.здЙю5О/45˜ /ЎЂшJFдŒGh:˜т‹8Œ[ѕ4 '~p'Хў&/tлQћ nЧмРО+ћ~шJъ­Лvя4s№hЊy§}?Ÿ*ыv­еjOGŸoХхњ6šш#uз][_‘а[БєrЏnДјqЌКЋ/7њVтшFуі.{ьYЦ/Usб*%‘3ђІйж}ƒСЬyVэ•]Дя•Ѓ хЩTъcвЪ ’2‹Г™“\к{ ˜YТЂ8EЁSxњIФF{ c Ћ]IеЊ6­аSГвКlьtK“кЩWlМe<ЌьвЧнAоЩЇfИ^Ё)з9ТЁЕLŽ, С9CoэПЁWДu ŽƒѕNb8[ф MяЪjo‡ЊМS›'ъhЇЏ.ѓF5[&ИК*†*з€WЋЯ€sД0Ф#K?3cкэ ]˜ёL2O5E5ЌЫžzEл€Ъ:ПS•вhј—]зvVцќ’xЅЦ\ёhrњgШhšL3€…2;Ю§aЏ}’DЉH2ЦК_л.a—?”Ws8 Г ŒB'џ‘нЋY`HABFЯЖxЬ}жЦ—ЁHƒ,™{!Кз§Їр–ˆ{wQB2ЏiMƒ{­о-†ŽІШ›v]€ЙkœЋђ}zoзnhtю^pœцA‰.ыž†TCC§рFZЛэZЮeй•MQЮЦКL/Џ[cd~ЇFbЪЉ‹wL•ъ5`.™wНLЅU{хћМоW%ž3;,+Z“"ƒуѓЈB5Q)p"x’ lЖЎд„ё5ЕЫЊ|XFАFШмэ:МіЂЊЕјЃEmE†Эb‹д$њ †0ЉLM3cЖ”ЖnљЧLL}b‹”-]Еj&у™-|eaR7žG0 гSн4Їs4uSUх6ЏЌЂЁІ†ЋhkЕйьИ­JMлјФUх+т_іBо/8fЦОxЩ hкЃюŸ—,OУy3dђЂЎш’6ЬУ9‡М;лdАч“m‘šK–J9ЇђXeTё˜‰№l;чЊёsЬЏNjk8*ž’"зE–Є`O<ЋцМˆбџBGЎš?#-Ÿn{Ю‰џŽžљтнЋжОЦЬцAѓ!ЬœЯЬD,!‡*s і-эщžl+6…Й?Ш,лRk*z11Є 8[S242œкхЧrA#k -а5%V"7ФR“$Фܘе+н58еЯP›ЙФeШ]5Ђp;Ф3№ CЗАqАЁ'4B†ˆЖk‰CZ)C Œио’ЫмъC„HЧ ŒТAяСƒ)Ќqь§BЄ•(šѕи‘ЭвvЖтQ RБЦhХbMcyЅr !3q™Є№R’Žљџ)"ЄDr+пяСя§„Y‡Д ЉSж}’AˆeћYH3IЙРц ›и',МТbї&|і4@у#rа„9пs№}zŠ›уŽ№н6m$аDi:IГ/]?g˜FчЅ1Й~Ьn” !“ s%0шВЫ ­(€Њ'|—Є1‰0d‡З–5sw Z„юч!d P4nрТ›%МЅ№_{ЙжЈШтБŠ KœНjЛoхРQLcЫСЬƒi8dШУCфоФпœЋЂ8`1џ‡ЎЊдН-Ёє œ НЧН+їЫопч endstream endobj 353 0 obj << /Length 3425 /Filter /FlateDecode >> stream xкZ[лЦ~їЏи—Р\ d8rШіЉ1š6E€ѕEс(-Qa‰”IЪыэЏяЙ 9дRё&иЭgЮœ9ч;—Yu—ТŸК+г;gLRктnsz•вhППуЦПўіJЩКЦСЪя^}їC–нЉ4)гRн=ьBRлЛwб/m3їБ1&zгЕїкEŸяuе§а@76*-ђHЋћїџxѕз‡iЇLыВ„+Ÿѓ”‡<)U$Х]^иDЫl]˜­Lgб;мћЛr~bг$-aZмG`vрuKв‹uяƒ r‰*Д_ЙыЛSŒ<ЌбЬ\ЂнДt•Z–8эќŠБЛIŠиSяeЭтЦb­ЫDg Eрб*а;ИWDуЁ–Ъ№#“&ЙsЗŽГ oЫ$Г™_ZЕл5zZ%.еы'ZP3.vЪEoыњк8Lj“Тdwyf’,/Щ@’ цHЅЩR–#ЁЩјяу€РŠ)_oCЧ{sЈЮpDfWѓЯЛщXГ]$чџeЈпУXыЂsЕ—СgЦn‡.чЙm№~ѕWИП&Jм‹LQЙ‘“$юn<ЌЉdl й(МоЏЉКKЭзUНШЪ—ЉКL[ЈziЂН(jћэ*x(Ры?b˜[Ѓ­“RMLˆeёsп№]bW‹!Сx_—уШэnч'+šv”•ЯuœЧE Эї6"V‘ТЁЦe)(Ю—f„[В&g‚ЁЎ=>­ №ћеqА|х<зDŸ"4АnD$r†дI]X0Ž]E`„QЕ)фчІыy,cЭ`†‰њ%ыЬdз›Њ]ьХіыUЛGнцY6 lОЯ2аŸІЛ Т„д™\цфwєDЃCХ†}UфQ3‡ˆ Cна\а ,uє#)ѓшд (™влC=рхІž4LЯ|рк Е§‰;ѓс rЄ!^7@Јчіpшzй Ѓќ5ЭвJцХ'р‚џЎ]†Щ@fXŒз.bчОfТЛюxь&[%щћ"}иЎCШ iVh“ЇRо ƒШ т– Jр ”*.ŒЭС!{чШIЭЌ2FY‰B`tг?Сј†;.#OїѕЇKу—ыaржHzvйџtŠIяcП‹ w1K2ЇŽ[–šШЬлЎ8ц)_š‚Ѓі/ш'ŽU[]џФ+ЫРЁAMBиДкњдЕЭ†\A§Œ'P?ќQ ЫGЭю?б}]И#Ю—IX3БЯмз>–Ц‹№ЯљІЉ}X†ƒ‚=ЄЖУрЅ№  іщRiшЅQГ­9Хi€Ÿн“,E4Р†p|ŸЮ“’;aШl\єУ="•0UЉNч#Eзв_Зѕd‹уИCuСLљ›нjД–йЁuиТ+§GBДL‰ЪСФъ~ЙMДБСŽПЕŸБ @Хе~ЛЊ9RЈф<2n*LW6siЂ‹ќ%!ЗемЊ7ъRq#СœЌaопДmу<6œД€ЛЭ ЂШчtЗРv;j9DlяP}HњЕФє0Ќ šfЦєјг*ќ-j!Џ™œ ЈщЧƒ“…мooYЈdŽСaЧKSЏ'‹ZˆькШ^№УVI-Й c&3ёLЙ№2`ьQрƒЊ\(єЇЏ;: ƒLi“мЈeєЖ;ЁКrVыŠ2qfЙђ™7ќЮq?Ё#Џ‚ВфQuМ єouВOрВ3•­LERSi'оВ•)НvBїђ9Іz-Gш™‡uђ9qлf?эжї@GVNкїš§‰вBж—nДьЗцltа)0ЙГэјЗэd`Ќ>њb‘ЮЎХCГ?Юœq hОЙџ #ЈЮo/-ГГaе§лU!ƒвt§FxB љћ$!ƒф*ЌŽГ—м!•Б7Ђ7щљrjО–И—пЗ7н-ЎтЬЧЇИзБdїЩ7YŽ?­ЭбЁ‚ƒЛW>tЃЩJОlќ—“ьэ žBГ•ЦtЛдСЫ›„žlо* ­2K‘…wWоаcШ&RЅfQ§І™\9# й щѓёF‘qшэЗР NCКKl”‚fИђ\mЄ)‚№YЎФDTvйJ~'ЈЃБ-7ИhUЯ(ќ4”Lž%Ц-SNв:ч3ŽŠ*ЏK]/nЈЈІžkСёіž Њ—ЁЊУf~STu`•гАYЋqŠ‹Й7Ь rбм§!<“‹ЪœŽ~ ТAТŠЫ\€У‰ r/\/д™ЕЖ€џWЦJBЎи—;ŒЏзAУ_<4Ÿ_<]:~Ц?‹№Uо. ,8zi<%3тЖ8шКЃ#ak\И9vgŸfBC6Ё!7•њSѓЅJШ:РКЙvEћpЊьРЩ§ќВ=цјyŽ€d4Ъg‚y)GXYІ№TЋш‘+›ЋMРаЙ›”€j:Х–—ž %ЋGmuтЪrIŸ/,хj5ш)JаœђyE:ПЊHЇEBе_Ю€”эи€еЎаt6Ь^)]ы—+٘Е&,) z0ЄcЙј„Уš–ЪwјXрвЕЊ.nўXjЬc)3]?е=шяNЬфN8ПСvВ§Ф ъ„ГAz_qЖˆ)Ž№љƒ™NїMЂєN\bНї-оњ$(нЫŠМ›Тu№;E+vзšТŒм;ЧЯ„БьT(#*Эў0Y­†fпRщwSЭЦ ŸPŒN€ьtЇСлрƒп (Y€PО>$žU–IB ~џХ@Г9V`ZaЌlRZ№&Ј—V‹,7+fЧ›CНљxCА“FПEШхGЃёеrќ`9ђŒГ„8vюЉџЅИ/5y*8С::­'X_‘ееXё,~u”—M-_u~ŸцдLЏ+zFTVЭЂ–WKФ . iўр= реЪЁ!\aS  з.бЌ угBXмЪ~9/+рg DФhŸТЎpОmЊ}л cГ‘TЖ’7Nо]4\†sГс2)іУw"ЈЕўmў8Иœ„Œ-22 ёЪЯœУ=Ѓї\Тg_ШсЙа ПRŠЭЃЭЅяk/n8v”n*КвТБrгR*ЪxMCš$D]FџЙ/ €po—у–ле‘2KuрБўвЎтJŠ/юіEЅыЬЭoM |Ђfа ”U†/I“гЋиё“шш‰OЛ…dБёйpХS—љ;ф хЏaЭЊЩ"c&24пјsнш†Uн§фW,}ёбOЯЮlЊ‚џ`X&06IГ ЛМIк<[ў/К)UАPi“)[Iеќ†*sџH‚‚‹wќ+"d&+™є†‰эЉ‰О–pВюL =і&›Cјљ§…О–”~ѕёЬ-2†-ЗљЅ[WFGŸ ;e$еlJдЏЂэБІLL‹ItgL?Pп=a<ёD№6ДЁъ@˜>Wbžd„нFvЫВl‰OФkS€ш—TфР‚чŠ\ЛЇЪdў=zvІ™„и’7Vp™Їы'ymyЫ}\lwрдLy$Бѕ|ЈdЕПIышАЌЭЎЈ }lј,†у+Ÿ‚’q}‹Иf$[ИiЮЎЏф§B“оЎўѓS–оZ)фЌК~^y…сWџЇU†Бш’ђ2N”Н‚‰З5IByIJ{с€Tў‡'ШЇšt=jR‘ЏLa›Х.ђт7ыЎцƒТvWц gѓ?=wdФѓ…žў 7уvі}] ГрЧL§Џю;џ 6;Р87еїщimН8—ЊььжўШ’}ŒУТуКѕ;РxИ`КЊё3щ\‰РfsЮ^Ч!ћi;ўUёвцRWСЁѕ@›ѓ,ДЦѕњnšЈљ!ѓ6м@n0W,‚xЪћVžиХf:qЫ z‘z7{yЇџ?^Ч‚* endstream endobj 361 0 obj << /Length 3352 /Filter /FlateDecode >> stream xкЕZыл6џžПТPD Ф*Ÿzр>ЕASфphq—-‡ЖР)6эjЫЎ$'йџўцARЫXЃРa5EŽШrц7JЎќЩU)VЙжiiŠецјJPoЛ_qу_?О’žn „ыхїЏО}oэJŠДЅ\=юЦS=nWП&П4uп=ЌЕжЩЛSѓ ђфѓƒ*зv5<ЎЕE–(ѕ№ћуп_§№WВJнЩRОР“4yš­ВТЄRfЋrk“ЩжmъcuР‡<9?ЌЗSн ‹=ђєэ{ГЪв2зNTdЉЭь жВ%ЯЃ˜hЖ@UЎж#ВЊйђ АЊLŽї сОmНЇ=BvњїEўкzџФмPџiчщ"џ’'Н)FњА.Lžќм Ћp„эТZъTZцюxъpz-“юЙынБ{ OжњEДHŽезњˆ“]ŽLзјјџ‰s-№†_лЕMu8<ѓибUMньw—гDЙaЌюИOкПA#/“zGь ЯЈdNŸqжгєFщЄc9сwЯмSсIі­ЋzфћYХўЉj˜оЯъћyоtќфEЯaŠЗўЌГёYЋЂLu™ЃФр…д}A'ДJeІй—њpрљЯmа6bЅтCвJІ”g"ќЄЋZмC$ЯXЋАбЙžtbиX”š(N3ЪCею]чп>~ААЬст@‰ŒВЩуCЁ?УЖnнІЧУНba|r^ХЦЄЅФ™-ЭќŸmВЏ?у.;Ѕ“Спv9КИA’lсd6Їmи^Xmщ ”HmžЂп„.нЇФ@–ќwi^-R)Ъ№ЦЖлТ.м˜^›Tg:Пљ%n›Ю“яƒX(Ш”Гjƒрh18Жьм[>•™дzzў АИ p"ПwѕОЉвl*оŸз<іфZЧ­жэfЙ}j№ А… @П|N D1йЩ2ыѓЖюЮ‡ъyQм<А „$†]TМLZ,еЛРWw9єžБ­ѓV КЬЂУ6™™ŠŽЎТ Е>wѕ!№z7ЇІы§.tмеœбР ўhNДщ~ТWшюŸjOy-Ўб!шoгЕ<„СkС>tСDЎеВ ћŠdыMпqЧ—ИЂVПМьZй№LNOiН>]њѓЅ_яNэБъ—˜ДДЦN™HW@Ї-t-Ы,pKNaНv_ЯЇЦ5}]–ЕшўЧЧєб‘;-7ъежЕЈY8Т’№ ‡п8q,Щ^Жё№TГї- Wъд!ЎXЁ’nS ВV&§ЌPv OxЈџ Ј`IDoњ"K.лrЋnј—dа"ЧPыы"8 ›*“НьЂ$:‘ьмžіmu$ѕГЄ~ДHŒ7а*Аcю)>ёжёЏЂ|МТ,6y PЂ0Œ‹ЂˆiKЛ!hBИЄс/1 Qа„bуx њ№a-с ^ЩТc’lи‰С†Љ_€ bO'ѓ“й\ƒТ ’EЊJy—хIцsЃ@*oСXgiє0ї ’чЉ-е4Х Š EqS,Kф#Dђ˜•жNњ6\@и}T”–ь{„'Іƒ€kЬ™MХАс“EgаУ„у3\„Жщєmfqњ‰LkД33spЌkJХн‡0Љ`яѕЉнњЁЭщx>Ио…'жиіt№oтЃЯЎИ‡x#ZoИJ€7ьПt]†— hˆКбнж‹XN"ЁВ|y+`' TкZуЁ&_аІнпŠЫ’оJ{0%ОѓЙ=sпTўймацЦ-g—g€Ÿљt0nяwLˆ7ќэ(>к]š?XmЛЕЯААу?{а=В0аxЙT{ŠПM‘|GiЂ*дя€ЌЛœНиm?ЬLчй+sєgxѕЁј3э8жX …3Po­gПшgг\Eп№ќœљBc9ОжЉ<гїNJN%]ЬCH=W†^`lЅДіFЄ/qŸTдEїџя‡[“ГII#)Ї8З>wG0žŠ<-gyBˆ-( 5žCuуXsрАДє.Бa.цШЫWЗ]Я­ЧМ›нЭС]>†РњУЧŸБ!“weЩ=Нc`QЕžеš*EmtОлЫЦљь /вBšyp„FTŠeСсaљ§=т\Лр.Œx*JqSlЂ x нзEљ—Врs"dVїВЇ_V?!tДйяў’ьž$‡…žмз*HшsU9rщ!ЗaВQ3LЦјЪPnбсž}Н"МSЕ~’Щс„A% З€€CЄЃЁQ!Z†‹ЙЧE\щЩQL›Ы;Эмжэ8Ў5f№иІŒбмАt№ўYЗњ›ДXDHPЦrЈ'МСZWiН11Ўp™IbšCэ 7ЇЫaЫЭiь&ƒJ`L8Ф›'Ўe|‚/Вj,XкLЉЧ›ЌHЕžІ>:7ЏпJЄCе жr ќЧ ЕўIEХмiЯИЊо_&XЊьЮ–!vо=UgоEˆ&Єфп_ŠйЕЩЯ!Лƒ‘їTгjAЧŽTTшЁѕ;юyў\/Si9брZgo—Љѕ Э'%ˆ™фБ. LmOtє›X##мїfiUju6wќЫеГ4“jHќ^ŠlЌH!№…wРЬ“у -[[зW`л№дmкšТZД ШЌЈJ,C•бЬ = 07•ЯvВ2Л•эЌ3p‚Х_(F@^U\g=“И[>ŒЦў}ыЂŠP‹ъІ…œЦтј Jˆўе!рІщ}АцЊЖj6ЁцЧмLdјD!К0IыўМд-!ЃАIх{ЎъСe[G%hŸ™.дОр$іŽщ(іVЈЋŒNѓммЏ 5Щ!I‹Q5Ќд=ГЏОR С$v^1KAЉ&Š9`›а еЭ›ž›\ђŽ1…№<ј§ФАrДž”М‘мHLѓ јоЅцJFР$ypwПЂ9*1х™*蘨1єьл -„эМJЇRЭ3ŠЁ„—­ [] iп3{_яѓЪ›ЩŠД&5ЙОЇЌђ‰|Ўў8upѕ;№еRЯЯЫ5/xй„Dx“†вШ•ТYШ‹ћ  œ5у„БДЗP‚{U…И €щЋэмЅм|Dн`œxє‰ROёЇQЎто(•bjьЌœ№’ E:Јjеl—kП Ÿї–~GлЦВuЫЕ%ВTлY9ewG9№ОЉŽюх‚JФg|eiтžL'Кў2u§ŒšЎo/›ХšŽQЉPіž[Кl‰ъŠЙ‚иГТ3DшКјkэœ3  ШД "…Jѓсв oЩЃёqЂк™HўѓКEїАW!ѓ!эхk_Кќо.g \+ыћƒАpИ2K‹\ЭCuрŠB[Эї,%cƒJN5 п[<д ж#ђ\'џ~rўQtЊБHцс 9”Е–ЏPСЊэ эЗGЇ&ЫІWЈФЯТU–ЩвLЧУЄАХr f&ВЅœRъa{№с=‡Фm ч+yз№7О„ЛЦ™™фэТŒ\Fэ_№зПвпSыи0‹сЌ˜RтП`љс‹ы…4цnпN ЂДЪtPZl†йTf’ mу/Є23œ$вLъMЭзМYЩB"yќ‡н’іc,ЁГћ”ЬГШЃйзžIž`-w<їс&-УrA‹™%Ћt‘ЅJ3•ЖbЙи‘Њ‘kмёg)Џ_/fjйјЂъПЇСZ[ЌйХD @3žЕ­ гЂ+O|UCЅоO,т"вЫЂ*џђг‡Чя?ќcЙž$ЧŒSlCГ{ЃuBQ Œ wЁИЂ)љ˜UWИT Yјv[‡&‡aј:ЧfЯмIбX71Ÿ‹ш&аоЈ‚˜1ЎЫQR‚3ГгФѓВ?cВUТ?ЉRЅJЬВ~§]ЌЖаBБЦЂ:Ў$ыЋЏўЩ™ијKŸВп,‡euZ†o†ќЗ>jz–ўвGф9~щSˆr\ШHЛNЮА[Ч[y$с1 нчЧЊvLы%o_ѓн Ѕ8Œ@Ÿ^&‡“лmGќ)ќ€!акVлpEЈ&TiЁ"QчЮ—є.№ШŠшјIЯž?%1сѓькŠjл‘ћЊРU4Oр-Gп ”’Šљ№3‹ЈœVВм%—гFп•ЄЙ†ЖX7‘–UГTЩЁщiнё ЎњƒkO%•J|rV; Ѓ*Аf уМ)дЄH/0ІЎoˆйˆ-р[†=д*OMЁџ}ЕЫ`ТCИ…RЪђJхх‘ў{,lq~УЦ‰ХМЂœю$ЫV’lИШЧ€У­§sKdЧŠGn‰€ЪЊX|{бњўуХ#_ endstream endobj 367 0 obj << /Length 2125 /Filter /FlateDecode >> stream xкЅYн“лИ Я_сЙ—ho"ЎHъѓњvisMч:ЭіщюfЪ•e[YrD)ЩўїH–Мtь›ЮЮ,?‚ ќаrСŸмб&гZqО)o"7ля7дљз/o$г…@.(~zѓј!I62ETШЭгnЩъiЛљ-јw[і!дZяЛіAeС—•Uok†ZFy(§№Чг?оќэiо)QъN‘ђЕLщ…Li Љc’)ќЗ{ќЊ%•Lі"ЂiК§Ўn*"\Г ™2”ZШ„Y†АРЧU+Ё2хчКRœJ„V93•DўЩ ЎHaaœЅСpp$ш+;6ЈYt;њZšІ3<ШДkiВn‰h^њ{$уY†b%ƒ”Ђ(т…Д+кЕМЙˆ‹‰ђ/aЃt5KTš–v~сЮYњбVЛБ!ŠzЧэР­Х]6ЁŠ#чёZѕё|ђ ы` XЄ#иАЃіАRЮjњЊьњ-ѕQKиŽmЭЫЫЎхu[Єeвž[Pw'нž‰†ƒa>ІЏfy№бЪ6žшў/P Ž*Ђ њ6T­­Iшц…&qc$УKУБЁaйзC №d9д_р А№…ОлБФ3hdьjёЉяіН9Ў7иVЖоѓ&'А—4™ЄСЋrЋ3№ |мљ ЛRпe/рgЪъ Т;„…˜ьёЁ­ОвЬlл8 нbчt"[jЗЈBЗД›XР ˜Œ$`T`OЮ ‘ywp€Єfж €Ў^Ююb-ЂXЏ§ѕPЕ>P…ˆуйЉGqО#kЁРЅ™ЬЙ†’lиkЛ6ЌЩœЋо]ъd ЙрY”Ÿшdјя"u’ •ЋM%Bi‡’"O€M№O*—ы™%nNЫУѓzœ_lтђў`NКž!ЇцЗ_Л§Оnї4zП№•?оБ_зї[xЦЩьљюeqy<™ЄЇё&)”ˆn‰8.ешZšш(Б†ќќL3‡Й'Nуѓ`jЙvШ!ўэ фfœ2Ѕ"Wв—ыr>^#ЫF6ЉљфW3$ЏлsЌy­шхц“ЖбНЎi;=‰ЋкЮкF^Јmlgmур•Жqв№ю†š#’€КъSSЂвќJщ4хRMbQКЊe;•/-tJWЧ`Ц-!већЙЖ†œЋ]1ЭˆУЖjKOХћ*пн †Р~QБйYѓvЎ ЭwAA€ž5#ењvј`‹ Яr)џчб4пй%)–ЉМ|L}{Шl™“ПНЃЄњЩ+kкљnkљрВЙОt j~ПХdЂ8'.wY ђr)Й|‰ОYќфЪ|ь —ГЗ:Ww“Ы{w нѕaoз5Mч аNŸ˜fДNћиэG(Мц‚С~“hE9_ГЏž{ѓгєlUбД{ЉШL'лƒщi•?4NevSSЫ ‚ЬœфёyskŽм3—ŸVЮpS ,Z>т=оО:єШ‚* кжp€з:QšўIєўОeџŸMЋѕЃКъCъ†Щ*3]\њ”q'sgЊёK=CažгJd˜уžFюя TŒ\Sр',q_mЖx‚\<ŠСјЙ„,цg, n.!Š‹ž=xŸ^%S_ЊўЙГо*i§ @™їэI%2 ]kяГ?}ћ<жTТ]М‰†ЁХ7‡сV§i<ё[лОdBЕFъŒИ`ˆІZ:{њDя98ХП?@—žjруLП­эЉ1ќŽКфX:@%[—гRJ§Ј|с=чuW9КЌsХ~]кŒч_CšЮlЋэнщqыUbл5 ІНaВ,н_kK/И}щћ1ц.1љ‘dv;ˆщyю†I endstream endobj 372 0 obj << /Length 2511 /Filter /FlateDecode >> stream xк­ЫŽуИё>_бШeх`Є%ъ•9e“Ьbs ВН™C&@и6нV–Ižž цуS/ъеtO/ј@КX$‹ѕЎ’К‹сЇюЊјЎHгЈвхнўќ&&hџxЧ“ПџјF ^ˆсѓ‡ћ7пПЯВ;GU\ЉЛћуђЈћУн?ƒ_кzvašІСŸКv—СЇ]RЖjјІ*.ѓ бЛнџѕЭ_юЇ›В$y%IˆљœІ|CS^ъHЅši {МЖ‡*T&РАяЎэWЖoЪŠ(lBћpВ@vRVСŸSКчŒuћШ№Буб8Д3b<д­щЩьŽ<^™;8}Ќw +wСюћВ:ь 8А…џ4ѕ0О…iUL:_В<љДЫђР4WЛzЌтg (ТNS4ftЅ pVЗ[Єк!с#WK­5Нц@њhm CW ‰ЃЁ*Ђl’ЩЯ>2Уp8uOсбьЧЎП)šеŽKЏ€t\эИnкF@ˆƒќСE‚† ђ5АћњcЌД=0B-ф0‘‰NѕOxЎ!)М ЏСПOŽ€чjиvmH`йЇ€&Џ‡y:A4ЛођЂсA„†Џ;™‘a‚ћXЗ/=еуiЕыиУбl‡ИМ U€ZИСкsАmwЎCŸИ€ƒH<дiќ€шЊєЃЙ6Ш”4у eНQс"mS|ЋЊœЎЉэ;`IоЁV€ніp`г™AЪЇ†ЉV‘R‰3эЏ‚S­,*’Тa|іЉ`Ueц0 {Л0ЭђЈLєš?т ѓ€4ИR_šкЂhг,ЈeЭДђ2"”‹ u№Жžё@а‚Љо:ˆхЩ‚-‹ƒk6›aГывƒьЩy‡ы~d №єЙ’ђэy‡ЮˆД8aбCЎgлжc@њgБ#Є\WСП}тQUХ™rЌMП–;№іФRЅyъПу›сЦ“ЃKјPяmyЅzв…”йяйЙЉ—ЏЮ€ЮjКžІаJќдŠ2ш2*ѕЦQ нљSІСо v@NTH%‰ЋLXlАкv#OžиВKь`DOяиЋ‰Ч€e?›ѓЅБгСrИi˜\"Ш)Y’‚ђїї+zK…їрўФтm*8з'Кџ&+ЇќŒЎ2`tq‹б 3zНx9 |TХBШx‹јnяm‰ŽВ"›uшхѓuМ”$H1зe№м о€<єЉŽŠВВtлОГ xD:Љuw ЧЈЂr˜•Ёc8‰3PЅDz<ЗџС|Ќ:ƒхЦЖ"\Ђј #P†“<0шЉnžъсвчк+ц$"ћ9‰jž§ПGoqж W’u2”ŠЪbу9Н=щo’ЌZŠЖўx бс:и>Єј^Ќт;,9WjAЅxЅЇ(„3УeЗГ›CИkMA нІXD1НWУ3Е ЄVВd8сEомзˆРЈ* œЕсŠЌЅ[Ќ0Й А0“ˆ ГM*30є†§d м 6k–;Аљ ЅƒчЅZЯя„fЁK™EžQЊVšК]Kk‰БH:ˆ—В+%Уї УEП$њэЩРірœnšНЄе 2‚чgFZFЊšjdeФšo™@Й4$іdХ`#љbЂЧ'О$U€жКqУ Љ2*~›š=]wqйB*й‚žГЏ2щЂм$ёУ$~ьы§ј­въчыхZ1pz2gяХ\-btфёъ Kб ЪdРRЖTKКDсЊч˜ЖЧ4уi7Fщ,оя №uВc š>“dPDN ЭјR‘$JЊЩdHХУ‘N7–)ЊirРхцб#A?Цџђ”н:дєJР>Р‹Щ|+Їй{sХUТ>Y7uм<г3—p>ѓю6ЭРШФb­й#5'OHŽ љЇupЯ dˆ˜I}–*еЃ1їN6ƒЋЭЂррЛ`>‚#ж УщZLчЭCcз%ЈјВž’}њЁПIєІ8А’— |0œу˜uŸџQк#ј^ЖPЭe Œ_­Л о8кѓ…ќ”PчЎœїШ@'Q˜:МСЂ4‡W—ЫЪoi]kУІnэыjхчwЦ В–xƒ1ДЂЃtЄыxЙŽ У$žгJXіГЗэМњм€]f В§sЧЛ8ЙьK_Oљ РхXдw€ѕЈсsЁbЮuцOЄТl’ g{дВŽIнymяkKU’dУИд/Ь 6b“С UЙz‡ЈдкCаЙУ8Mg†Аяˆ‹чYбш,яЃJѕЦ–'Ћй<юwМ€’}ЕВ~eT^ђъKƒ4ЖадiR~ш‰š6ѕ5m>9l §žk$§ўFНЫЎ endstream endobj 377 0 obj << /Length 2607 /Filter /FlateDecode >> stream xкYmoм8ўо_1w_ъЕbЩ–,c?ЕНэЂ‡юіpMQЛ‹;gЦ“1Юcќв4џўH‘ђЫФг‹™І%ŠЄ>Tф&‚r“E›4ŽE–иЭіј"rвіnCƒџђBВ^ŠсLѓЭЭ‹ыwZod$В(“››§|Њ›нцїрs]інUЧq№ЖЉЏT|ЛR6(кЎ„Ч0–‘5вWоќѓХЯ7уJZЉgš„šOи$“T˜Б‰qBf}9Иzw%Ф%џn›#{{%A”їd,ШяЫў@ЃўP еА˜Y,–fB) ЦЙ…ТА‡НzЭ…YI,FЕц„KМТ™•›й-qj›Л6?њ‡Œq.tQSW8ѓ&T*ЌЪXHMsв4рјoјЭшqдИусˆџп^….є"Џw8H‚т;„MИЙ!фвˆ8•sЯщXžЛ б,'*љзy&]Їarplр@—М—Iae—Мa"‘X=yЃЌїЭš=Б]Г…c[5‹{БКѕXJЁŒ­gBgу№§ytˆ|jyч‹ јW[Кє‚&1’0QY€пЖGN|3;xјž–џdЭp~MІЉq1>FЈX>JD'Aw wаЊd,zЪћC‘Ђу”Р\Ъ,ЂйCEМ# m8œЅœпi‰…~зч§РЬ'[й+'ЮлџљЗї7ŸоНџ№ѓКяНоеЙD4љтзЏ?œЭхCЩeф бoeлдЧbŒnjYДђЖЬo+8к :t‚”%Ј“яv%њ?Џ№YŸ%*Pž6Oz€Љ„ЌћЕэФ‘‘ѓ‚Аv$]еш8ИЦ6я‹ŽB'RdR/7Jщ˜ -*PХ$:€c›TРa˜ˆ|ЌIЅ{шњтиБўPзe}GњП–лЖщš}OяО”ѕŽ}“ЄЩДŒO ќ SeR"Z$Ѓ т‡o_Џ‡бЄ"‹Gh\ŸЦТ  ‡ вŠЃІеY”№Э #‘0‰}^aЦљЮ*RGЦтйЮЛЩp7  Љ,#UЩž$^ђwМZН#%В,}nБŠ›‘aЌWE`!ш,‹тчEbјeэЫЊИXvЭЪclSf @'€Ђ$‡w.Ÿ­ё:)$э>ЊžЄ\}œ<яsR‘”И‘Ы§ЧS&2Ш§bхtіСЎ6Э'эЪiи7CНуCpšmВћ иРљaž“Ÿ­еq%Є  рцњћzи}vwEzF-˜8ЁоЃЯЃљXё,Qц,'Z”auтE˜­ЩтьI‡ŸA+Ъц-H4ЖбZ #dіьГm'˜кŒШMС*Њ,›,|weу iЗЩs’vŒ“л0”(Z6%˜*AКЈNа [мхž№\уяW7и;еЏџќђfmsЪ 3бЄ—4#B<ўо= оДР?:^w‡$<ЉKЦ$нЂYўЕ;bP|Ќд\|Pюъ7їQьЉ2GgЂ-wєЅe‡Ъ3Oр›]Х ъ К іmsЄ7Ф)x\єX:вq…BкѕZŽ/цЕЉJХѓSQœ7жд ЧаР€]k-4МsџIхzьЅdоlгзсьѓ‹эЖзqnљx>Ж%R IgџїtЭŸЏHvЪя"тфмxe!рF.ЬП|3рЕŸ0ї|Rg№ЋE}NF0юЖ-g-–Уhј]ЦиСq†ЕL…’€%†2oX"вŒ+ЛŒ€7›8x tK{ <ёыUK hчї5 ўБШсqЈk рqE`З‰Щќдшpmдxƒ“,УшЏU 9ь•ŠЏrn\B;–“q‘йЉuF}wйo0ћѓ~ѕhЧ@f"ѕ4}WТLаKФ Ін6ѕь$і$$iЌ?мю\™ŒюrŒ?‰sУ­ЏJ хЊ’я^0ю)`ˆƒ„SЙuьrЕ”+2}њзCз^wАчк-u pRrœФХ­”‹Tщ‰‘@ ƒї{К zИrЌ›Р/{Кюќ…‘#Ф,­ w”`SВ ЭЅI—!Ев?Ў$0ЅPPЫ;&Ж™лѓ6ў—ћ…ld8^АžŽdюЬс€wоњ‰ЁYЊ*Ї‰№ЌT№КъЭpwXЈгƒKпћbвЛeЂ88эЪ§ Ш›IЄ8IP6 вrOВiAђщn“$љщд6РŽ 9"} ў-Нщ78tw…kА‚ўeч•ИЃA=ОРщ{џЁs7h†~mKnГЙвѕ%5QWœђжй1бАЮw*ўК*яЇЛ(ЛEЉD­ћВЊwKžА7к<_ zІ У)ƒAu БCkжКћ,œŒŸ„WљЭ‚Фoа3  ]Уd"іЩWGg`u`,”8(ыm5ьтФjМЁРоЄ"E5Go)ОпD!Е.0рУу?ЙхіЦЁ‰{пQŸ6}Ѓж)O HkдИёПyзю5P:;c=ngЭёш{W я‘ˆэ5)ыE|М|ЈwyЛуРLѕчŒ]аУ$№БјžOы4bc9ъl7ЁjG0щиє,ф2L†ч=–pј=Щ–Гœ„‡ХёCеr|C?]йс}ЙsЏЁ N'ˆ^…єK2Эъ1P—=Щ™GР TAZ1СOGb/‰Dвsky!єЃЄўJш)эС1cћKo№^Љ˜ёУˆ‹a4ђќŒТљъ2>`шї;Ёuё­ NuЄCмД0…[т'fКЙC*7УxРчmqЊђ-Џ^фmUzхІF$\4‡NVДЬ5ЉчS[M›#=~v.мбгМУeЉЇєxљгR€єбфЦ7Т?ХЂ!зТЉ•Pъ/…гMъbЧ=F L1JЮnЯІАZ†x™‚ƒйЉЖtЊ!Ц=љ‹5ЅБЮT№…NзXЛ+—г_ыцUЙE–€&Myяѓ–ЎЃмg§КІ6ЅІж.ЎпЂДХТэ˜MJв]taPвчzs™’fVU@МkˆС Б 1J\RHwc2ў 8u_њlёWдM] NБц(‹зЈгv5Р™Pzdvљ—ЊLиФžп‹ўмШЛE39жЄ;КWgєnќ_ъќ‰Р+Хa7їPџщё­ endstream endobj 381 0 obj << /Length 3682 /Filter /FlateDecode >> stream xк­й’лЦё]_БЎ<›ˆ0цРU~В-+V*–\ђЪ.—э8X\ЂD jЕI*пžОfpдЎ\*>`.іtїє=Ѓ."јЉ‹<КH s›]Ќ"mo.ИёъЏ”Ќ[СТеhхWW>Ч* ѓ(WWл1ЈЋЭХ/СыКъЛЫ•1&јКЉ/uМНдYPЖ]н•QQ–:ЙќэъoОЙђ;ХZ?%\yN*В0k/’Ь†ЪXFьљіre#м!:Э‰;Зи)ЭžGњ†ПХf3YпrЏСоmЭгŠЭЊіЋzЂt ЌiЇЋŽћb]Ъ” еѕEН)кЭє]е—ЋлjS"П.VŠщZ)Њ˜ЩъNЧуО<”5"жћЫ•ж fкш`Sєў)Л/Л'а‹5в•pбx@kЊzН?m.UPrПп•7УKa‘ž'cžы4 JрŒ­1р…“У1I˜ЛUŒбўРoн5‡RшЈкrн7энef‚љaЂ4дА)3D ml ˆV(ˆжњmpД|Wu$ аЎzљЪКЖ,6вќЋФе5АšЦЁTGЃ)qž”<nЋ§[ˆИH `5g!У)І`\ХAzŽ–\і‡!Y9Ё†…д<ž ‚вŠГќg7зЙA”Јr3Ё†‰йЖЭME.лAcДєd;h1ШД"бСŸЌF–EŽ0Z7=7ЎAtВ@@ЫщBЋкђw8ш8&xЈƒ-Z‡к‘Ё­+œ/5Ё`сМжЭсС?“(иW5‘ #и"Ž^з2чСOUНaгвёRb6dгЖkjRn:БаШJЏCаЎdЌ†Ѓн,iЉAЫhbЇHѓІмžWжд†6Ж^ЉkХјП:еuUп,эБ2iš,Ÿ2т4ј…еK[й44‰q[ЙУ4 їЗ?('š0Гoˆ7ы‚ .ЋБQГp‘}ь Ž"[г­84А{NриЮша*$lW*ŽюъŒ4ЁеvЬрe+hBjЗьи67mq@жВіД]ЯО­PЉй№wS‚m:€(qwфŸ Чі’–y{I]ж5‚ГŒИ‰ђ0ЭМh|ћђЛo–зi[ПŠнЮлjХ|ВQ š|лдЮ;]Ђh@<' UUqM g*xYѓTwзѕхO Э‚VDŒfОЋжmг5[1вДЖy„:НH” Гф!DEVЙU–+2АŠE#ћ’їxВДiJvяЙ‹ Шљд‡=P}$ЩKљœёKVХ9ЕЮYЗмуCЦ5ЃCЦ.ђ’PB;б6<}ѕќЧE^Фj|РЫД†рšЧРОџђълEЮЁ™К•Јœ‹Ш…ЩpDЏјцеїЏ^>{ўїEь Ђ“фСЯ@#ђaaЯL0Ц6&ЪF|{Ч#nІhЏЋО-Zі^Ї:ўŽNzsѓџ1yЯ5v[ѕ;nSB„™і’јнЯЏ_<Пњс,3%5зEP8QG“2=eЧ Œє”1vЪјВG“wФ)ŽŸd‘зX)1~xWЩIєTІЮ+yИћ“ЌwNњMl!+š“`бМЂxkфѓŽєgFб є$„жB48-ЎШf˜ЫmgГяЙяBудzУфёљЏнК­$ˆи№$…Љ0whhB)ћЂкѓ(ЬЮ‡Є-%8ЁЭsJnТцТТрPiЪrІ#уtЧ§5АђЬЗ!|Н+ŽЧ"šЪ2ŠП<ѕT?C‡GdЋр7&хy/ОяHбl’uаcШw |l85Уг9œБфtHЃаСS zй_ФС‹ђ–.Mc  ё}KЋп•‹&хіа‚Э—.: l‰–тA+ё $‚МИŒі‰ьЩgcыzЮмTokhћi_$ЂБlЋр[ўыTБBюЫzMёЄM з>8ХvшѕEл/(л дЁ‚?џ\4DqЈН7ћгЂŸSэMћcЕFvE[ЌAьШ$шрv‡RЦj-Ћ(йDћpЂппюЪжŽz‚Ћ‹ U& cзгэ‹nЧ€y7СƒWaР}†RАЂБw+П*cя'—aBlЭŽžO”ЭЂr ќY7|F}N.rХ™1ыxˆвќRњ˜Œйх ЪWrд4єgсёV‰Уy‰СS ЦЌxУ2шwK%ёhКЎBЋПкPœ’€ˆ%Г‚і<їLа7їв їФХ љg)]ђЁ0€(Щпˆx‚иЉп ЗНј’НO…6Лwh Щ^b†ЌSІDп эѕ-1я%mѓœ-зЫкkˆо}Шђ™lЖХaІВБšЬmГпsєzщ< Œ:$БЭщ4˜вЧїа, ј›HФџ‚*1aћ:ЫgR`v БDbŒ„Ѓ#”дŸрЈш5:o”4є$-/Cisџ#§а dxщ,-…ŽcЁШ$Ѓˆ Т;ЩattМЪ5Ї›TэАO•‡$E€џul@Ё…Х, (Ni0ФИу RžёŽрј}Ђ’p™>ер*х?Оx†ЈK‡ZNкƒл О 5ЧЂп‘ЭЖB0˜jgэOV{7хyƒ GU‰ УrP)~okŠЊž]ЮB–Nэ%-лЪмє#>Р/И:ƒ|7ЩІєkqЉ11 уц 4бHcFЬИ–f›Ћoс€ а‹žŠS&žDйl‘HC*ЇМCјЫ§D>љ4ЅУдzE\}J`ў”Р>џРМћя9`йіO ь‹‡Щю\ЧanfцjY+ТШKЫџФЦЁТg5k#Z'Ÿ—Y=wп8t†:ѓ1‘šlпдСшэJNУ: АШ<н 2bUА}ЭŠuCєœ’&4$О„V!KNXчьж˜0ё-†С$WO|юй№,OыЙћћУ"3‰<)fLйп&q›t^єx@˜2\„šBМВЎTЉS)4еqЇчq [+“ѕ!A‡•Лh8uNыцдЪРFЂbољѕђЮ ТЩНЯK™Ž”ёЙ'K,ётM[wеš9‡Š.зNЛА1aЊВљ†чHbЯž§ЏQ-a–=ву/шŠ1X&3 §pГЎЕЇвD’=ъ<У: |=cѓŒ јЯ‡ї=Э†ёЛGЪˆх™”$ !~PтцОœ04 /i);РЬ;@œ[Кд†У­ннpЃ“ ыІv;n= (:ЄaœлY9nц‡Е•гŒаЪ­ 5’~Ѓ5с`i0S/8v0bЇ|фэ”3K†етНТMе“1TrЖ–ГŽбо [`о:бBXWpтI@Йй#Znі;Юxm№oސвчІџ…раBpш@ЂЕ.7\A‹‡|3iўt}+•3;b@-cБЯ§уРЅрƒm~В qёЏШё>”/Ы[dށ(vUзs2Ѕё&l/С5vЖМˆЃНЮлˆ3b/Ф6К%­p0кtФРђgTу•™ђ]q8ђ%+Ќ?ІBІ1јфmгќЎЫўY˜˜фг8~кф‰ZЬБВЇЦdХ[Ц—cа,Œ‡ы!„ Ии%˜“Ь……ˆH Eе†Лgу’kLЫЯюЏіLXf Ццls&ь\pCŽ +!;О œ“U‰т@L ФѓWДvнœі1C@Œ6jz RЉ, ЌKлœЄrFЉљ;|tСwŠн™šЅ3/єKД&:fh7ш'bшiPyp`ѓЉлМЛУЉЅЛЁL)>в)!З\пKžW—хfšŽщБ# ј ѕ’єgЅUЭhšв"dоC’РќŠŠыСiB’Ьђ_Y<Ђ{5qБсjіY,ѕwјGйdˆ<~‘;д *Ж:Ыo0АU№Ї-7Ї5WпАЛ/‹M7E…ms†VЗ:TНЫёl?aG~ЮiWБƒCg;П VНhп Хo‰ѓsI‹…43YП™'ЙT*вСг В}|~Хѕ \ч:FБЊ7ЗѕУkŒлюdyЧ.$‡rŽŠЃPЯ”ЪљŸѓ;2™Ÿm&ˆ-Хvби =fРлІ=jѓуњЃ”ђœ,ЮDкqЧяЕi,nю= шЄтtjхiT.‚‚ЋЛrТšїд*‚фТдjНDЈВa2˜Хц(’™[йХlIŸ7n?jїZч}ИIЂюjp&&ŽNKR­їw—™ЅЋUШ)ш!Uœ /цАCuДЖ,А懧‚?ђa—Њ4БЋ­AУ=џ€цЄFŒ\Nˆ€zй$aЊ˜оџœB‡Б?‰QHЁuKG.Иq 1ЋгIёyhfѕ{ЙБ/`ŠšžњЬщ‚ЊoјtЧ‰љ,мТ=шŠ}—ѓ7Є‚хёРŠo2млЏVk–7ЋЗe{нt‹ЅщѕзLБТиR˜‘У-СWKјоыд;Žй0ЮВIЬXўЏЪЋІ2\n…Џыг5ФяSСІу Л%7<Ид?СŽ0 Z{К&ž3Š’JХe*Wю„†\ŠLАё$Ÿ'`‡ђЊ2чžu G^їQяАOюNм;шЏдŠмOŸ/5G6TўmчШNб›U;в@kг‘Ф)_Х)ї еf‚—uwNЉ”Nq`йуd6ЬЌ§ˆЊ'я3ѕ8(?iт|ћ^атђВЗ]–oЌ @иН.HТenё]R5{нq^уД™лS“+ЏczxзƒзE?МТЌvlOsр7ИІ;аЃ&*ЃзљчЉPюёЄ:у5ф щЧфм l–вущnMzГп‡юЦўџMч|ь endstream endobj 384 0 obj << /Length 2881 /Filter /FlateDecode >> stream xкйrлШён_ЁTЬŠ0fp з>$›8qRЕ‰Зђ`oU b$N…И8,щягзр РXNщ=WwOOп”К‰рOнб‰уАHђ›C§&Ђйюс†ќх’}{иИ_ьќуЧ7oпЇщŠТ"*дЭЧћ%ЊеЭЇрчЦ §nЧq№cльД ОьtиЎw0мЧ*ЪГ@›н/џіцЯ'JЉжЏd w~Ї,OB'ЬгПŽIŒН­*{љђчЮ5eїЬp{оэ‰хrhЛ[˜Ыu0-/ў9‚й’ Ъг0‰EЂЗ—=+Іваhуw|ЧШ(šc镇Сv2UЋq€L`тОэjaЕЊмРRD.х@2Oƒ;Ÿv*p‡н^хр†РЧЭ^*T: UЪ TV.йTЎyL: 3 уЛаž‰œ z‹єpKЫGмќТэш7ХSЄaa2љ‘TdCD:ГxкюіIЂƒЛ<Z&k›~ь,“>ДMяњСЯнёŽ%ВђХ‘ˆ˜o^п~<“„&KОэёP:Эщ™œDiЈЂXЌx)X‘‚Сg§АБЅМ#ŒVкЦSЌЏuјІ?aыŠр?G*iH#z’U<Ы жk”ы…аpцХеОРvВ,3~Ca/­oеŸЫ SPk/]o#њŠф:ЬrэeјЛзIYПVpPqT№сШ{egбNu М,ЎЪгЩЁю>xцЪ!'п#Н.‰\rV30ЩЖяннIЎtюьСVЖё—џВKГ <ЖgШspХЪФЪ%7AMЂ}цAgщ0 ЮРxƒ‹ КоіvŽ.xГ Г([pќ§ч(і@ОjS MЈЭ%ЖЭ$Аl" ЯnRLЬђ.HqхBIц*Ÿ(…ЌK:QaiЏВ0SУўjI€Іы™“RxАOe}>Щ"<$/ђА?ЖнР`U%ЏЁп№ћХ,p§‰ь}[Ы–ЛВЧЈ‚ 9Œпo:б8ЬafХ2†­ЬЄСov{“УїЗ;о ŸЈ†д–Ђ‚x'ќ–ќ9wЎЧіE6"й•~Š/ВР–Юєu АЃEЕћ?Hˆ teхiTЎ“o{В=рR EžрјsБуШдюаЕ{AЊь>SŽЃ џŸьНkьџ0їД!•к5dё„*‹&ApЩБпМат ЏпbїиŽ№pZE3РtAЧВw‹п$рšУQDaЄгDN@˜гГX>а.’< ШПДPэЊ…$šХЄr›яб J_{,‡#CЖЁX`дУЗQt[я…ЖHWMu.ЂAnЃгY˜Ba˜ŒmИˆ aОЖCxk*ж=‚ишВјР=:ŒІ•ќйЮ•TГ ~UЎ„Ш.]œrDX{r Яшž0“Q&јpПbЦЏђh™њў–#cщЙOйHаНzЅaЊЇЄ§эЗпeЯў:†ќКHЭZŸPЯ0'‰r д†ВЊHг#|ћЬPйЩтЙk "ЊxўЮч KЊ€йЙOq c@i_FiсљgJbF>с:ЖEP@•ЄЇдїXžюїьще[НАŠ0I“ehф‹4L;ChHЬ’;ў-qЋ0Mв=gз б…Yй 'kуЉ’Х™hШЏ$;›г%ŒtэџHPЏѓdŠйŠМѕё2єТ\ЫLДЪBоc`OЦIІЩ<БTT uhЇYd„^Ц@ грщYЕ)сЧѓ№/eЧУŸЏ•NшS @\0Тrє6оъcБЌЪёž(g€­ŽХ‰F?№ +&gуц‹јПŽЯ’">F–5Bg€N4Gu3жЂЌЕЏgЫaєXХj/9RўAїюrNж-с% 5ЋNѓр=fПхŒхhйпхœz"№Ѓ=ѕnьyаC‰`†ЊЛiF5i.Tm#анфOрЈЋЉЊBxYgбГ]n~yЫЭјЎБэzNбЫ& 71’taхIЮзl ;Sœє*ƒSЌ­н&Ює#;3>…ѕЮnЛŠ8гЙХСD‡>:ъ-ЭЬрёТІ§Œ\AГ–!юkюIр”kМ“еф2kЛкWвX8aXл`ъћ<6_э>ФRи)_дcыw”" 8Fdэ@Кђ4Б > МтИН… ~/+јXˆВГe'”†Ѓ“‚КТB!IcCA€њ ёЩфФObŸ‚ЁЛqkП8ЛЉ…ЄИ^IярЎ!”‰žЭHZ#9*Й#Е5чхЅ‡€rУQ­й‰гI3*ХЅU%hPSвЋeъУЌ7“Ђ”їм§ŒSЏŽ ЫжЊъ'Dи’‘ю3/ыж(ЈIЉЅs рФ!\мnФ™Ѕ9eщdžrPЬВ)СЊx~Ъж2ОьРpXКŽќlщєў‚NXh e’Ÿ2•і якš^сЯmЦ—Щ@Б%=5ЬЈЮПДoю+,:(­б{†УVSJЏтЎ ѓONОЋлuŸ№ЪІЧЪѕ%оu№`щЩ^нЙl}~iпхzSщоџ№IНћћ/RљЕ5”?|‚8U„™ЙЗveѓ`ј-І>Ћ8Ёkf9”йJеˆwЅbGцc•}xЯаїR”2Чƒw‚NЧŒCЖxDo_рˆ7Sћ}a Ъ^–ސv.ŒCЉ$MrY‰™”:ŽЃр‰Уr}"%ГПХзЯќEёУPх”вZm6ы&-ѓftЛЅюl.јЃЦyŠk0ъЅ›|Рhr(НТЇДL‘S{o“ќиЗмљфs-†0=:oІYŸfюљ;-К•1mњ[O|Kє` 8jCФIОr%рй БdKХЈ/Lќš (бSЋєиВШ‰™wВ•-Y.ˆJМaЊБ uК‡™;е‰ЁЌŸІV"ЌбЁ)ж=u)ьбQš{ШМщБ’игŠРC?ŒЕTЫ=O‘фХvWТУ_eЈžЈxФWRСq§Гc`раvы<˜Z‚MD1•2›‘дA:1ЅWт,+ЬT8erўЇ7LаZЩыn зЫМkytтн] “[]їЗЄX‰Щ/KSј&Ц5Xp‚FИyрS…/5`Šƒ;BїэщDљ"зlЯККЖ•+AaŸљ(šЬŒБiy–~mъйтМ„иЋ іFЃшJ‰гўhіЙЏiј КВя›W КE‚­G\mРM/~ЪСUъxТЂьR"œЂОрwƒ8IyCG{U0§Щ> kФхє/D Е2•йёщ,кt|М‚Œр—+ш,Zdо8ъˆ‡_a ЖЊxђ%ђьЯБ†щ L ЗMzˆЋЎЙРОдЌкЙ$ЫемЗќ:лS;[%Ц‡BфЈѓ+Ÿ&ЁQыPBљVХ/;~љUсхxНЪјЂ]>5Vѓш+ьЈ4 =еšМПўƒИp3зH’~Oм‘+ф‰rbэ<ўп,ў ЊPЖ  endstream endobj 388 0 obj << /Length 2925 /Filter /FlateDecode >> stream xк•йnмШён_ЁЗЅАŠЭn^ќ тРY YA`ЏjШ™!Ь!e++_ŸККy eЫ0 6Ћ‹еUеuеUџдU\%Zћ™IЏіч7AЛу/ўљЗ7J№v€И›aўrџці]]ЉРЯ‚L]нцЄю‹ЋоПšjшЏwZkя/ms&озaъ•]_СыNЋ Н0Нў§ўяoўzяNŠТ№•,!цїyŠSу+m˜ЇМ;ŽчВA>`!UоОmmwЮъїT 'оњ/Ву9EЅ3?ЩBр€*СYœљI˜XŒŸ˜иЧ *Пєoр5 НсT2ќ’ЃЊgFŠ рЈЋКь{ј\бЇкЫ›‚†S.Ÿ8jВz.‘ЙЋ2‘Љ кWsu›§@ї`рГЎќ2V]йѓ[.аЊy—зЪ;_я”ч˜5kѕ!€еg^R_˜$РKj•ѓыїеч_яв4ёо]Їкk;&нр‘Е]7uе”Йldu$w˜j?4‘Ш­˜^Q~ ”$iбžЩ<ф eЫЛBNKјіTе5Џђњ э9GфчžaCў™д.ќXм!ž,.ќA оaЫІьђzЦЪ,X_1|/Ѓ‘з”eСЋQМХnxЮ‡=:ёЋ("іОŒ93X $Ђ`—y?vL0іf;ЯИnЧŽwА”щR‚‡ћ aX–пЏw(ЧО:єўD)'TоБbХЪ+1И–nЄм€Й€і‹„>Ая|;eF”dЌjПО*e†ŠУb(ї‹ы с Щ%Nќ,г?~гHм sak~^рЕQЩCпжу ‘’9zф;I:QьЇЫ\;@аМa[X8 јћйщvЋСH3ёкЭЎЏjv@м$VўЩ д?]{–XAЂ/ОhA‹н,ЈlјВ5ЪДЛb КМžЮL%_Ф#К-u–№€N ;?]cuHˆr*ЋV…˜2@Ф‘qЯHsь~ГVШєrŠТŠ0‹Х.`QЭ•бoБK5ЇШМsBOWtO!jЊ‹ьjЈ$Ќk^=аЭxлиэуL§8А^НY,Bq–NбOLšЛ„Bˆyх­Yќœќ0”,g›ХTљAфђрнkќiВхц]О‡cЈ,гВa“?GDћШПˆˆЧХ јоР6/Kt‚ўuЁrЅйuЈЄ— mЬМН—:ќЁHІйŠu*‹ycК'Њ‚ˆjђsФС›ž.˜рл<˜`Ш{р`?^4 LЎрХ**Л/…~+ЯU]ЩЂ‰ЛveƒN W_rwE!; ю_о_V‚всЎдќвžЋa ŒH;R:z]R§ЇФэщ'ЁИж#эЧъ‡l‰R!‡A‰Э˜УэИ2MG™ЏѕЪ‚™™XoШwщ@зі‰ђX2ј†WAI8Oжы$šWЊт{Љ™ъЫ Fw^IЋІаьNДОm)†юМя§СБ<Щ›Ќ;Ъ04~˜—;+Єœxь,БНќt†икпETR„e—–wЛ=”нŸ7#&ДuSФlЇYb<ВЈњЧ:;У­\0ИПkРм@bfоћaЩьјШяь.‰эmxгїyНЁ4Жv zˆWњр:gЕЦfl4”ШЛЎмcэМcVGK€ЈэУ@]ТЛжКЉ%њbІІ дпaа6/н„Ц&Щ^sfžЛф&H#&P~œ%Ы:ЈьЙ™KЌoЧцEЛдžТfл@,ЕrcDТ‚Ђ§NЖzЗGOзШСAUBЛTvyˆbшЦЊТqШUм6;2љГЯѓ­^§8B˜‘лЗ)єf}Гжe ЇCЉјШP^nСўЭs+ьлГЖшК–йwб[žs<є™_Xн3&єcІс юЯ“Й™Ш-мГIїS€,ђiџTЮњ'‘їѕгwѓБШЬЙ>9х“1„еўЬЗ•wеаЁLДG’гнЦвBаб’Ž>›tОžхнYЛЂў{!гЎвGL{HŠлАeД <Еc]l%†(ђrYoЋП |ИvЋŸЭX|hы(CŽїЫљфe ЧYщ‚9CЛ–=rрWъŽŒіdФ^ЮAІщb xЯxф8эыG–б"|Ь#`S‹СкюrZrr>V•ЕtтГ+С9‹ŒNЌ(пДѕo—Є“9WнА6чўЫі:УЖ^2GNц™ЄЙјїЪ$iІ3iўf1%2ГЯчз#Ѓ!>Jv#1=NC—'‰LвPОнMŠ$Пq0RбвЖИ]T…іSxсh зgсЫќтс•ЅPЈ,o”3Џ…5’дNJЉг‘Ѕы”§R-ќRБCі›з ВљqПfЈФ.YrQ‘ДѓZ*~œЎE”žDџТю0и.ж”#јeхЬhХ<Б ш*Ъ.хzTh&# Q!йzь§‡l}\-mзЈ­ mАй2‘ Œ‘й4vFфkўщu]оC†ŠоSL]]ХлъюxЛ?вПЫŒx|ћ!ИQ:№#[€{Ѓ|Tк‘ђ#ГЊй№$eЂ[yюŠх фѕндk“?яxwТМИхЁm0НvДз06RsрЪMC, {7ИƘЫ0Ж]•ё.З›QЁŸMctQшfнјA6ыЌ$keS,+7aЯx,зђ|€–ŒцьДiƒЪ.„NяbЂ@к^4пCa„ђEкrаs<РŸj!‹жX~л F-ŒS.ПŒд–L‹yI/ ­šHRУQЮ$вuл—…EрbЏ“˜ХPДЊe2гця:ћz,hD‡вюУтR‡ђS`8ЋCьцђЮцUF<•НЃ6ё o4~€Їэ‹4ё1яx…wZœ5эИ™IБ1`рдG/HD§gц§ЙaЄKf*Г…y~€—™єк Вм Сь^S.‘˜PKЙyУцHЫЏ /s2•ёˆвo]шиLiЈ›‚xЩцže%#й,ём„”pRЮџYт.N>uƒ@ЁІКТoŽ qhтее™КœйYReЈЅTkаж‚]Qo”оnf.ФДЪ i:ŸlуkБЧ|†Pџ…Ѓ#ОЃˆF'˜ИъЊ,шЊ|YѕqE=Оˆ‹Вw„*€ЧŸШе‰~Ф†еџЪЎEЉ0*ЖvsЫ>g Ќъэ|rвўєC­_˜§Ц@Ю§п”8ИyЉъ !игмw3юTјсЊi"е–ѕъW"—е"ѓЭxрœ|ЂoU€Р; хgнщšм Џ­WпVЃнљЏ”ЖъмаАЫыбp_BФН_ iZЇ Іњ‰Зœ-H+аЌЈcVьznІёџžќ8$Ю endstream endobj 392 0 obj << /Length 2891 /Filter /FlateDecode >> stream xкЭЫnфИё>_слЊЗFѕ„Б‡$ГШуdСь,Т‘иmeєш•діxБ˜oOНHIm9ыcрƒШbБXЌЋЊ^№^СUІ”_ФљUйО :Џx№п„‚ЗФ§ѓнэ›Зя“ф* ќ"(ТЋлУ’дmuѕбћgWOуnЏ”ђўаwЛ(ѓvQю™aЌaКWaЇ^Tь>нўхЭŸnнIIН’%ФќžТ †еј*Эc?T13v{oрј$їЊОе5В’džю*К;†Їн9.ыŸ‚0.ѕŒŒUjЛя$Hzр z•hW™o=5OМ,чdŒ\—е~ЈЬ „›О;ЂpЎі!_b*?Lјѕt'о„ЗСС™хCј„r­™їwћ`ЗvЫУ.Iр Г‘}‡~И jE„cb"Ђ(ё‚|N_ѓ=G†ыAшiв%Ўмй=ѕtЋ@юђ…шD‡і8<ж ЪДг12мкАЅАk\ŠDюHтРпЮ”fѕ№ДЫcдLѓЄнš‰t#IJrrœЎўs'ИзЦ}H”qxeпЕzD›ƒT4‡+t‚жBЬМ nI*}ЅiрНпхЪГєЬWнžsЊŒщ6еLЉ2xqHЭЧ%`fesЎPС8ћ7В N’.DЅХ n@œ“<ПџоІO‚ОђЉ4їГ(ГипБ‰ЦQюйЪDIтqo%~ЁBѕ§Gu§S„[‡&™e‘;єš Y$N cЃФйcн4<њЬіР“IЁдёTќUќ9L‚еѓЗюD”ьž вFю§љ ˆі№УЙ+­Р32„žє8‘€f!х‘ЏЂ|m' K‹уТыќн”YР>'љ"8КЖэ–ФTєLb2­ёžq>ћ>(2ƒбgŽФЙ ЏѕУ мжхаЮОVу5 L[ј•„^d#HВuЁ/GР.KЧKЇ€щ"ќт”|$ й@_ŽЙА2Ч\0š, М;К`…МJšA‹1М§Й5C]ъцтДq‹х^Є_ЄшKxН"ѓ~5CЯ0’@NЭ™ƒ8Nzйаrx_Ќ\Т:X.=YаЮžЉqdlz}Ё5КЋЛc/нѕъ6ЫA(KДыЩWИс сxEѓ$HAd“iаА21Ќ $ƒю):ТЊ3MмsЌ9ѕу™ˆБlВŽ52јбЉ аq‘}Y8ъЩ’ ­Ÿ@Œкp4лЕ9bІжtpХlЙ0˜= 0gG3YDўвf”к@фГ ŒVШ›ЫмR?%/ўЁСЫ1}+rgі8Ж†ЉрЅfхЫ„3/TПd^€ќBrŠXœ|NBЈn„L=}'"є=bЂчя"сb<qЛ‘ƒŠЈIJeb'8bгS”7рTŸsƒ€n†Хk{Сk$>›iBњiіЊ ЊТиЂMB[D4€KЕ ‘‹OœкР ЂЙЬ“4ЕФћqМŠIdГ“<"Ќ;рь•@кž%™цt878 эы1WЁїc§@счм€юrю"ВšfЭЌ{!мЁ|ЧyџжГ”ф№ЬКьnП/сŠ_Жd+Шœ йvфmB-Иє.\ YyфnПfаГЗ`Еx ?K€ыТ…жy”E‚ИЭж[4IUЄБмћТ |€8№рrWZ‘тew§%п b[іС •\’gуSзsзŽ aўa MнquчsБ‚ЙЉФ|Ÿђ‡КbЛ‹mъкcБ€S)Mˆ2E\=T Ъ&Ÿ/™ё%_є[›АŽш™aВ’ŽgфЂx$TŸЇ,Ьс&§ч дIЬЮ#_$H…slзiшЪ™чЗЭф Ž|.8ј8ылzъђІФћаЫ‰є‡ŒžфpЭŸ…ІФгдЯвpѕ,:улф8,–ѕЯdкгћ-ІЁ ТtnС5?+™<+`Н§Й‘чцqЈЇMянУiIЊФ$ сOпІЛ7ѕхR№•jІ}%sщізO юв П9шŠаfн2іѓЕCмоз’л/x-Х:•I $|6L љГємШO;O.nЪЧЕ]УGNUKBпд№~КЖ ы’x-›ЭзzЄѓ_™#HЦ“{Mн*ъф9Vи5иЦŽž.ТY?дє|vК‘fНЦчTгUё”7и*~Ы%ž‰МzwЗаt”.U}'Њ–:ИžЭЁzwawќ;aСћЦ@§энk @Ь*0аœ#aXЉ001`щi Тw0z| в†-Ћ3"„ћCЯй &ъЮ^0aЈ)wb­СМэЉТЋ.z?QБfд\ыLИ’ŒaЄo./9AjPд“ЭшкœT•ЫФмЅ3ОДЪЄл#љk JF5ŠtяЭhF>Y‚ЯŸŽ"ђ#OPщзŒF„_ъЃEPСЬВФйТёpŠ„~s65/”‹џ†ЌрšЃЙ~1ЁdЭ)цF ЋQlЬХБцЯeЬнъ”§?Fл|+кВ3‘ћМШЬ†ЯpЯЮО =P0P :NЯJХ6€E*˜љ8‚њЛaœУГТKъ _(рїуЭ‹WцЂќuяФ\5 f<7“T]нEeѓoФЩь0?=a}БeYъiјšЂ`б'=LЃ/iQЁ|•k%ЙT/ЪЁtж’ŸсЄ'­”ЅЉžjЬAGdўyuЄTВЈeŒV†сšбцV!mЂїшЯй їт$Ht;jмђє"”r08{СIеwџ#э“œ,ц<?‹Ј‹UёшТбГ8[4Ёa}б„N щ„^lcˆАg[P”ІЭЩ.ЕЅЋьWљЙ­;ж!к–ns3‹: и—Ўjlжс˜[‰<Ьс _ѓŒšG‰ВгВЪ[‹y‹x|q<УќrЎ‡eŸb&в˜юHM}ЩRнЈ!,mФ=оЈ:—ЄѓŒ~ ‚o,kЩ Фi w•^р€uWA…MнYФЕŽ9dg/5пЃТTДюјozPьЋ4^„UЄ=ОќЫв‡]шЙОФс‰ŸŸ%;\ЦJц­ќЄH/:‚уEZ&к™#œaЫ\•Ў†wщVSfЈlЧЫХС> stream xкkoу6ђћў Ћ\ЌU’Ђ^{ŸzzњЁ—Ђ8dїPF’bmЩ'ЪIг_3œЁ,)Ъ&-Dфp4œїC–rSŠMž$qЉ‹Muz'<Д?lhёг?пIЦлтn‚љз›wп|—І)тR”rsГŸ’КЉ7ЗбЯ­мv—$IєЗЎнЊ6@T–~eR3й ЙUЬХZЛ5•qЊг€њ]AW%poC€жœuћРЮЖЉЖ;5ж1шhлЦє„wSЧлV:К дъцЃМЕЇTнЅBGИGNA`@-s\Ф2•ФЂџ`КДBf§Г­me†ІЦmн!Ё':ђЬтЂ9!єU5uMИz]‰ДXfEPЭэЊіт\х!1’РєІšDOГ<њvы/Р ` ъgяњи3)4p ба]знw—c=USфqVfsещTyх VR Xfк˜a ЛяНBhђJЂХуЫ ЙСWs N:Б-ПPsюylPV!ЂљFw6UУяT†_2ч3QCџ˜№Еяњ@ }зЋvб*‰•НћгьтUІ!ОЪрLt23@%‘Cі•№~šИ‘К,Ќƒзтйб’эhЗюDrP&+ћЎЛ§| ЬwjрRЗЪ~^ФЂœКїnŽOo™‡mšEцhыП 4,ВцЯЉA›Ъ2zьэ№Eо@‘ЙШчМ}§Ж Ш\Х(ЫWqаk—I9wХrŽrыСXЧчP8”aUu­ГЮЛn&FDC#œЬ)œ%Їа/0Чуэ]sГR2€эњёSИфt2U)рєŠbˆ9џt™*‹ zВ*=3н_кŠгС{ \ul_ЭлЁяN„Ay@˜7CЮј˜3Ы н­Ÿ"ћ:ібо0x†ЌіРљT"\8HtNёЋ?NE]ђЙЃsВЎВтЮє‡ЫЉёbш|iz YxЫ5 ƒš)ёгЬЏ4СS№пЫѕEoд)ЪєкRжš™†{ƒ>ЁЫ[љ(RdeЂх˜aщЮ”z*‹Zѓžа№eч_рвwT”K2дХp,јгIйrDбИ5ѕд§ЊЉGГL‹йћй д€уБCУ<2К^T7БVщvХ_8%ѕPPNM§с“2ћџСveО7ЭZЮCO„и[˜`|ѓбДПIГQ n\иіы‰iWTџ Ї‚œcFсeNc!УХе§й5&gr•зєuы‡! cQdиyдyУf’ДagшJЖw 3ЎЙ—%XљЯЖc€z[ ОMнЉƒƒЎЕz“єэwH№ v63№бWТ+JЛzUЎ8ћ7`DЋ§l"Hў<єѓЙ;LjњабГ‡Ьм8žВu>И'7П3є@М_wт,.ЧДMEyХ^‰‚!G4к31\њvСЖ;Aћзpѓƒ pœi=зŠХcC Ќдqщ'!Хѓš†бЭдџ:+@йm08q3Ыifp8я yu(|5ŒrˆмBtSЋŠЛўвЎіЊŒ‹2ŸыШ'‰нЎКoЊЯЋƒєй8Aхфю@Х‰HVFŸ†{hгаХІ ›ОыC‹‰ю@n\г*П„+dљЊEЙФL>7E*ЕO~єэkњo№є‘ƒ‹ƒ%УљЬ+(ѓЎN5y\ЃО ,h ц"MtеL9Ь‡ ь`7S0Œ.r'­–г†"uХ'?БhлB‹eмиёЩЄ­EЙuŠ…CF5sО€w—,#,4А4m wg‡оєOќVGDьn-‰ДЁчШЙ=Яйч§ЗŠ{6Э/ХхРз‡^ЮЗA№КёГЋЫ$E]ЩsцD„РqЃ†4•‡Mп’|9№„Сћ•Њgк№i(Ё/OXЋ[ЧExhhшои#Цž4Шˆ26Шo*аПЇ\ЛЎsoО„LAAЖАRџ†…AtX7{№Еš6ЈзыK|г‹”‡ >Рqс:ќœ‡+”5”пѓepжќрЪ_Žџ№Оё^ў_пзГh?{ЧЧ•ZЯ5=њЎ[›JПH9љC”ŸењBФЩ2ЏџtiНЯЌ}VJу$+џ`К…*–/ъ“VаЦѕ6LЂ{‘S„Юœ8LЮ!ЕьЦ†€ ]?рv,>Jq’ёdФ4Џ“ЙэšЖъ.ФLгћšЏЕDgжфЬ@i2КЊ№}RI(ВGyюоž Т;ј.зЗ>Юрфлџ§=Ћ:ўъPCДГу72Ь‡ЮЦД‚(V<юд„іјlњСVanrіwв0{-”ц‡Ћvбš?иЪЂЖBдkŽњ$*„ ХБo›  Єh’ђіdЋО{гsГ/O™сW†8M„чБSŒЈі/`ŽCYР-—ЈјћЪџїQ•, endstream endobj 400 0 obj << /Length 2625 /Filter /FlateDecode >> stream xк­YYлШ~їЏPžЬ† ћр!^g7и`‘›йэ mВ%ІH™‡ЧќуSGѓвpтY `X}UWUW}UнЛўФ. w‰RAІг]~~Ro{м1ёы_^ 7Я‡‰ўbцЏўјSэDda&v‡%Ћ‡bїЮћ­.ћюЮWJyo›њN&о—;™zЖэJhњJ„iь)qїссЏЏ~|˜vŠЄ|ЁH8ѓћ2ХЉ„в,гЏC]—ѕї„ЉёrЊжЪ4pІ‰У,Мяч'›rkVь“(ШВl\ѓˆъ5CU№Кcљ•ЖмъOŽАmлДHjяlЛЮэ–4~&‚(S;_Є #орС|Ќ€K$#я}("Sweо˜оитўЪфŸ:&A…Яƒ›^ж_РюЎaкfЈ ІmнЗW&г0мвб—i:9b–уMеŸšсxКѓЕ”Ќe`Ѕi3ъьј[7=4^Uм*,ШЎk[L,Яq]kр.їаа Fџњ–]kMU]™6n5™8Иѓ!М–іб8œ“/T "СjtCŽƒ2KЦs‘Y:žKЧ9ВEт#|RŒк~BcаьУ8\7uUжжДмЎЯ”;œВЧ€^ЧН$“=Аб —K vУ“фAЛ2‘ Мict˜ујЯVЈ Tc|е Ÿб†“ъ0@ЪM|Э‘іщŽХо•CГ-і<ТЊЯQЉ=ћеœ/•u!oXЕЦљ3pЙчi§ щИ‘ЯБ>›ES;Ъt›Б-jЄXЧTїy(лў}…_сŸр5ІFбœMYџщ]x?OhM}ДыЎюѓ‚Э~ьCцџ–[fŸQфнЙЬлІўАБї{@PZ `ЋxхO™>[%Іe CˆiЦ‡€ФІhЄђЅ.А№dШ0>w>–§‰Љм шк ЙVЁї0Šб™ƒэzІ xuc&œРžCo[G95бќЁXсpТ '4ŸŠ kуЏ"Ь—1;~ћ†ПэPoY%Э‚8N~wЖ’b †,и!ojЂ=ЛOІ)Ц0 ЭHдN,0 ФU?€ЊІТ.‡КNzŒ<ˆ3ЫƒІ€™ХФОˆu&щкSŠмє ~ вџ#8OM`1ФЃŽ%yj,бRЛЋ€9ІWPуЯюМЪ’ˆjІ~);GНЉJгйnK4 Н,2›+$в6ЏЪаjДs­eЂ‡TзМBЃ(AчC…UЛ)E5LМ—>FљJХ#^At#wЪ>‹ ctiZozGYJ№X0<ЭBнЉiСuj‚ Р„оƒ4ВцŒЁ‰#vДш7–ыРYŒЮ0dИ]лGnЃN3 пЬ=<ЩY0uфЮЇМтЧВюЖРаaC’<уƒIо=КжpwкwуЈ#ЈпtДФ#`Ъ1—Ф ѓj(ЈТH€8ЮЂЏІNƒKeіXDl)sщыЕKoјЛИ= ŽРЊК0^kез*+v=ˆaZ—ф(3њ„ТBTWn:zЮ–еžГх|AШœЮ„>Nэў\жћŠ•Ї>vЛЌ/ЯЈЈCя xЛ/Ьuџ БЭЁ˜6.ьqoкзТч…Ы=šŒ8є{X*ОЅcС§љ‡юKS9:.{ѕMѓjlШojnˆorйX,жLiZЄEZпрыЧюВяЛ7nшe#›‰\hXЉo29GЁЬЦ(jr=jЄйёЪЙЬЦv‹  œlИ]ˆ›P†ž3‚б0ючМлэЧŸэŠ Š8š"sПМA"Їфњы­ўЇ–RJ'‚Zeyф\Ъ*ежн~Й9п% ‘7ЄЫЧ’юAи3ж(бtH6nmУа*'ќCŠe’#ўY4ЄЬ4RЛЭnJфwряЖЙшl2…м†ХЄЄДЙ,П"Ь Јзcэь“ХОХœЇЅіВИцвхNq8з›Ш+!џ‡гEўdn9;г[v”ИlmШaн…Г6!D„s˜AчМ™юуєЦШ 2 ƒTп^ЉщŒcЛСTttjщ# ца:Š*Cј>S ћп_ъhвkмСж‹]Й,LешIjvMEоЧОЋ(‹ŒУѓ(SЋxхЉх?ДЎ„В0тŒO‹J АˆДЋЅT 'эMЎаў†ЅгpЖm™c9ІНПSGznџtІEЦ§3šв+П­2 šƒЊў~ЫрQ€Мk{opV!:ЇЁб1И9{з „Џ-'ЊюИй•ЧЋ>˜‚u˜­<ТŽ€Q1рбПюРШЭР#|QG‚Ў/xUtаы RŒ3мїь;”LВѕљО§zKnн—PќoЙ“wšBpгj м#ЇkяГ›х<ИГHf^юЅЇиЌ4рV4Яѕ§†Юн?<{мYЈyAsЁm%|дЁІЇEЦFgё˜4Нљ№lСVЛњиBЊ’UBpВјnIxM/ Rеy9r cЦIєвeP,ОсуВЊo38Ю‰§=О`=Ѓё Ž;šь[уM Л!“}нФzp§$”пweФЩ„pA>ЖцLJЈщqЧW€~ЈВюшtфK[Б–ZNYќ0дЙ+З”p—ƒ…$oЧЊ' ВHЌœмЙФ™_G œЋ|sДXJ‰аћ+`1 чpmˆнtCŸЧ(#Ё1H&IОH"=~:fЮж1vЛm>;шЁ)[ВrЛ“оŒyРбp> {<јЋ;XєЎk~ыЗЯLФ2ањEШuD˜DЫїœgžM”žй}ЙЁd™пˆ€("ФbЈz3ѕtwЄ!Є‚hmНчё2Кбz{0> aИ7mбq“Н0Vо‘^EЈ‡n Жt 6ОOsѓхtШѓтŽ™ƒЏqц}‡[‹ЯІt‡ЦѕVжt§ЈIЛєќv( Bf! ўВЂ…є>е •-аqЕ HB>ыT˜9^Йр *œцOIvшЎNšЏxŒIц§УклпмTš‚гэ2(HлјЋ[С=ЈBвЯoыžхяpnЕ?/пј%nНIљіd.є–Šbfl—w?зSНо№o8JП%~Иwi5у§–.u1GW7Ъ№V;!у@Хz—dPoЋяќЈ8NічйкмАK“Хo ЁšwђЖМ,~C1rK~iщмЕЄЙРА 7ЇРІiЈ endstream endobj 404 0 obj << /Length 3362 /Filter /FlateDecode >> stream xкХZылЦџюПт€Т0ЏБ6ћфУўдqЂ@цŠЂH”–(‰€$Њ"хГѓзwfgvљ8вЇ Pд†­хrИ;;Яп Љю$ќUw…МЫŒ…ЭяжЧWвЯ^vw4јћЏг­€p5 ќѓУЋo?8wЇЄ(dЁюЖУЅ6w?'џ8е]{П2Ц$п5Ї{%ŸюužT—Ж†Ы•Q2OЃя}јЫЋятNNыYBЪ'ь+z~;XЋ…Е№ЄЃЕќKЕО_ЉЄйюURџVсХ†n=жнžFЌI;ЇУ5ь›УA$эМZ5зю|эVМѓ Џ…RЊ№@sюљЈ[њ-ё'MкыЧЖbц›mр‚Н[‰;8ИЪбbАщ*ZGЯ—њдm‘NТ?5ЧЁu"WY ї+k$ЩT2ЪЧѓ2Х;ћВХ[…—[|n–ЛМшАны9ŽœШ@ЗLё3SфC #Є Р‹+wэмBZ “ЦН~]*2 ѕ `n!ЉЬž,”.-$цvы|Йw`ъјпКn нj‘Q•П>'‰юЫ™Y 7Ыт оƒ}I›дЌи#F†kl­P`лšЂ'>’ъw5Zo.ƒЋРшпsТpЙа…{VЫ‘Ё7oaБB'хiCЋ1N!KўЊЂi5иЖЄд~–xк­Ш:р~јСЧ_иnijlХех#“ЯCЛBЄНПяž?эžЙ,m…ЬЃв~xжxЭЎ™ђП§Тw(Xц€]3вœЧеЫ“•ˆЬICQFъЄ­w'іш(:ИНЉw

3:љёЇПбрЛЂ AлыхeCWхfSёА ЯЬŸ(Mф“Ря‡›N„ЋNМЧ„CТ`ё&’Й<нЦcюDк‡Œђ&З.?ЛЊ‘"Яcјгя:xKКВRz3MС+“Њd_}.ћSУD—№Z&c1Н(Ѓ­ˆ~ВЃŸ+/|Г<МџшСл†&9ТhнЯѕ@/Еї FэѕŒ+fрr]ИWЩіфФшЦЊь–ЊгЗАЉIŽ_gУ1ГЅY„•и p+[иНZ+ђ> џѕрююpњДЉj0O%Гж \ёіІЙ~рQИMЄоRF4HЗЪIсђIЪ›HФРЖАh€št:pиrШІк–зC‡Ф Р­П\@k \теі'\Q2ФŽщRвR™0Н›МљnВw&АШЌPdаИђюRаљт ˜йƒPtІ\ђ%в\щцКЙ6tЦ–ЌR“Ќ9™t,зyGр˜ЈоiЌ+З[„Ќ=я€YSЇI v)Њ›‹{6“У ЎUb•АљкКZX§l2Я&ЫŒ/ЇоsзжG'еgЇй0ШјUт:yмWЇъ9дЮtAД@Ц dI0z` РQ@{$ЭЂBЕ0р…xаЖ4 †ё*ЄЩaБЃ!„ы˜K9'\и^SВ…ђЇ KW4јtяRpС+_b…”!V6u{>”^hЬRЩП с`бЙІZIщn3- њ528 дИљи'ЅQfїўЅЦ–?ЏI“кP№Ъx]в<‰Ouш)} ЗЃЛвC%?Nщ ,р?зА“‡‘§Ъfфм&гЄ dЂІZhš)8Ы>кЃипвE$*цнœб(›‹Д/‘Сjєl™мFГQlYЪЎ"39S1D’ТD•Э›ŸЬ €Ш&жŒzk2KЕMVƒ•“єчcЂ5АМPJЙЮИџ…ђп!$Ў­0МrЮDСЙE*RУƒЋО‘rvsыіјлћ`Q$?bЙхmL>Ияж›НSЫˆшмпч6A;™AOЂЅTrЌwћС“2 цы•Dозш}ъЪgы qЌPУЌ‹рpп #„3ИAЧЖ(ЁИS EѕlqчлJшО‡9є№ь~‚Г_mЋGvќQH!Ц?ъР< mП†sоf[Кцфsє96ПдŒ” ‰иE#x7ЋРQFѓо TЊŸuХА™:ƒJПъ }вz Ждb _pgєШazДAПЄЧ<ƒЊyZЄ7нžjc’зŽПU—ІХўф3иг А€Џшч›Ÿ@uŒv ZЏз ?п а c.dЭ%ЬјЦЅЯ!R‡–л;pL],Р"8•б/ОЙ­$q5я@oТNNz œЛв7n=иџZ["ЭD_GўсЯТsa#nXнВеŠ‡™д^Њ…^эВo4Щ›Њп‚фCyЄ`OЅ!ZЪ ЁБV`%ЌмБŒp…Тм]ˆ^Яd{EPэWеВˆЩo*Њ™з’ƒsл]šѓžы6Мщ 6Ÿ”К0ЩЅ.ŒњR—Ъ КЖХ xL Ёˆыпœъ_ ЎXw ‘рЯ‡іŒ§•ƒКп<ы7Чйь18ЦШ†ПН;иa, Ы\h@Ž(jћЉІVы‘|1}и‘o>П!.ЮЉОnuэПƒнс*т7Кœї}МгЁxб@ЪљH•кЎ>Еt—dьЗсu9Ÿд0Ѓ’ @Hˆ/в…шl]ЄyУЦš{c­Т^$ ›i.І­MъзЏlc&ЅO>hb:-ћЖоЃІˆЯсv P$Уцк‚NZЂlЋsy)ЛцТз( –enbkv‚Ё=[Ћн%zž1ьy!И€b€ъ0ƒšFѕ6а =}Ё‹†'C[ Ѕ>К'З:ёЋ‰ё;:`OcгГˆЏш4ПЂ;,МZ™}WЄK I(ЋžЭур–bQšја_^Aњ>xиг]и—^Фё$V0E–ь}В#@EwJКСrє[89‹\d}#њ›л‚\ЪA>[ьќлСлУчз !ШцЯхКz* AоЂšхгжЧњP^Ђ\(jІЉpжЭ•uЉZlЫ+m^& ю‚–;Дчt№™ђїЙ›і)CНЋz.1/kюm†єQw5щеЏ]ј7Y#КKХхРИYъ;ˆО5ЪR„!xяОКDžN,ЄLфуї­СЅЮ‡kK#4ЃїшчшЂ5Oр8Ь Љ _lщ—bYjYJЄъE_кК8кБа Ќ2›rЄ]dD sћb|њѓ‹‹œrЦ-Crтo$Š|l˜зЖк^=’Ю)ьe,0§˜Ё%‚a‡є>+0іы'цCг\ефЩЉк•у[—ЊНИќ)a6Ј3† \3ULрc.}РXГиFбf№ВDOГRK“ўЋ6Kэ#нПпТRйrХљy_6NX•О!гb1кРx]‚Z˜=>‰ѕ1dэУАw№ЌсGbОЌƒЇY(дЌ™њJЏ—MЏМОЎї bfЂu |ЁSJ‘­ф›UЌGb9ЫћДіŒБ5} DsБJFОцЩFsму2›ќ)'лNpLрјq_Џ‘ƒ=н^ћ:кšш#ўЂЛ”ѕ@ƒх ‘QДЅ—&žhЯд—?Р}†їхАLСвRАДКЇ›ЧyЉ:S/ъЉуb>GкЅњТ1/jЈћкВoC‡ JјМ˜s<Й”ш–fЯКЦшDRѕЎ!uhKŸ„B(QIяб2Є9ЌдЁBУŸcСz)Џ†j–TЮЕ‚"цCрџ ˆœ0В 3'Є+^\ПСкЁлP{хDюПЪ@ћŠй 12]в7$ћЯ9:фС2s|лАэhфE2Мећу2r‚Ѕšз%'ЪЭрUFnњœ’sГ§iе5шšEˆHjЧРzЁёfјtц+_Рг|‚їDЩяд1Р—ЧѓСc bЬbL_Ф&ЯRЮ†$\л_oK/;юYLТОЄP7›2"§f<ЬщћђSѕŽ†€/ЋёEвЧђдEвѕЅй^/ўэ->ТŸž,шD›SW]єЭѕi§–‡$гƒШ•;f„Л ќЫнЉю|ЬrlФпю_чгuxС№‚ @x6t,НFіƒhcxQеІ.ЛъРdЯGŸъЦуGKmK~`ЅŸ\vЬЮW*Hў‚А† YЭ%qЖД2~\иPШƒ”цf\(“дn>2єiќР’А|єыСё‘us<–4\,Д0FЇ*&‘ЗЗE>Ї§—OVjaЬј]fЬэЦ<ѕ%;№ЅЅя€TцЛУС—0VЮћS&Tџ‘ЩZrˆDMџ&uЮе”L….дџЯзо‚џМ{~ќ_Мхўз endstream endobj 408 0 obj << /Length 2187 /Filter /FlateDecode >> stream xкЅYYлШ~їЏЁ‹fŸ$ГOЛmь>› ‚ ZlI SЄТcЦ“_ПU]EŠ’ЉБŒ1†}TWзеU_ЗХ*_БЪ“UЊTœыlЕ=ОJТhЛ_QузЏгm€p3ЃќщселїЦЌDчI.VЛ9Ћ‡rѕяшЕяЛѕF)§ЕЉз2з2‹\лyшn”H2)ЕўЯУ/Џо=L;)я )П–ЩЮeVЧVЄ+›щX(M‚Н]УR%q~P€k]6)­лы”:Ÿ}Н_ot"ЂўрА‘РрєJGу­+J_=г\q:­ ЊїёzcЕЃьšЖъЂw@•щш Š,кЙ'bАmŽ'_‘ˆE7œNы ˜ V]э\њНя7(=˜c#T, ЩЙo›с$EлL„)іq lЅYЋœЈџщћь sтŒџВI.LЉ3и ‡­ТЊЭ’еLœЪtЄјёЂэAKiэy‡fшOk =uзЦDE5№Ќяш[Й•пзЎФN=ФОО’Й#3Й­‡5‘†нЕЋИѓфЫўЃНmєѓŽ_вЁ‘66‹3uaбАЬiзяZъє‡ЂІVэ\‰›*ЋЃОЁБюа`Р?ДŽЈ;*ŽЄ ИeХq +Џ”ѓЉTœY,:H)лГ‡’{<„Ь>&&љПkјŠq}Fn‹ЁsFiЋЬВiq!ЁєL/hЯѕ‚nА|?‘Zд!яbыT” d?ш>…ˆФŠеQsЈб–НЏ˜уИыз~ЧбЩяФЏzцNм"Пƒ+Р‘4‚cyq”X;їЅ8ž*ї†ЮKІ4яCАюXєд^t‹)ЖGЃПN„ˆэnЩ92R.&яМYтТхБМЬKџjЪh‡тб§…š}л<ŸšЁ.—”š<uЯ іmg ‰Е‰ГњЮёџgЂ1Љ'ЭkЖc^…ЄЉО;Е>Œц\4Ё4Б&пиjЦрЏCСЅЈnшы`VЙmOг~GЃ§‹r)c™яЪ$ˆI8кaЏЫјА]HЩс пНФЂсъ˜ЖH ІnЅ­Є0yЌrШу2‹uТU ТJрјО‡Уф)њSљЃARє^ Щ.јщBЧpW Uo ЮWА‰If<П8р0Eч*ŸЮє,cу4dI8пдГbMt|Є`О"b~G_ћ#’ Ч‘ЌщjЗu]WДЯK1ˆЧx^&ХB‚РQtЩHЪ“Kpрд5Ђ”PДГP,pМзrrС †ЭЉ4аўXЈхC1—‘ЙЄoзpr$хбL‚@A>Zфы ?ГОVщмЄZйр n§ў’& ГG7IQ—4 Щ7d^l75­$уСљ[ф'œtu3ь4к p/j˜aЄyєЅ;s[pе‚c {6.jФ;•yєуlˆš— ЖEp%Ю ЭсЯѓЩo‹*`2`еlb>2Тх_\ЙaЄхыбj№)§БЈ˜_ГЄШЁњЎЙД%P4›j8жuš}РЃGl|"џЗLœУЭžО”‹ 1‰€KБx Э!ЗћЁј„Ъbo­рРP дп Ь*` щ%*†в?&Б!рјЅL>ЮC“уоŽХrVT56УІhiœ dnЂO˜ZЦѓїЬњLЄuS;0)тЗы|7Ўрџ7јPе?WМ ˆТ™Z’@о ЦжU?“!M3АРЄЃЁ†ЋDы:ШBIm нŒЧ\‚$ЫxA-с}Ѓихц/y.(=їв И UV}0|>о‹–`‚ИР *W)@€4KuВНотe`К€ICрr‰пяДmЪ0PEŽX?K3yаL‚šDцПKалrю†6œЌФ€Ы[šРП—E•0mЖˆFф`ƒš`ƒ&и№ЗPѕ;4ѕKx!ŸA6,eGWд|/–сˆрї#мЖЇ2њ+'ьКф*ђu"Чb-Їг1M>ƒ<М ‹Б|_E‚х[0Бблпƒб‚(э LЅŽљ‡oѓфюћYЕ?—КюЌ5нЋŒўђ"PjF?№—oM-ЃАу((\јЦz…УсU Ѓ6‚А_х?4yГ–рmšЦYžM№vУМ–Ў*ylе”{š–^ФOXL6u‹цД9Иh2ЇЛeЮlnNЃ7@yœ9’ОЛЫ7w2лн-YгО Ў„д›лqЩћЛ%єьв+b%›"ˆ'Х ЙZК+, _|РDунg1І`‚ ›>т;Лšпй?iЄоЁ[ьњ‘яЊ~eQ ДРф%hYx‹ЪцoQ:e№…kйЂFХ‰UпwЦ)aоєцћ фWљЭCž]1R№Ѕ”ХюъР&7ыŠ$ѓ“FЇeё‘0EР9.щš +шq9#ЬŒ!И^+}­›Ѓы§1$aЏ*Žрs#ћЛЃпБЭNо]и%Є.ьљ–Dд˜l цсы0w?Rv›ѓ№К*L;,П8vIеdя?охf`Ц7j*жIkk.ЭУoZЗ“w0xЧЇхјЇрFPE +;чKLЗ#›8Є/›д9ЕчУТЏтА:šЕ˜№žгајrЦв*Жщd‚狇‹МбѓW iЇmРfОPКЉ’Рx0€Мс›Ь@N›Rјыи.ю+хЪ†М Ч9‡l†ŠЛГїRЩБщйd n•)@˜д\TЬЮA']WЦ4шЃЦЪ@ЛŠўюО*Z|ƒWQ@ыт†}ŽСГ“Ію>ћТ~t%ИС-“ŸНЖЛ›ыjФ6SЩмfАеєZэЩlИˆя!Щh$1KѕЩ9‹љ“ НЊсеsяљ2КœзёПr~JЪŒЏ endstream endobj 412 0 obj << /Length 2742 /Filter /FlateDecode >> stream xк•i“д6і;ПbОlХНEЫ’/ј”А"›]Ј0)6Ейb5nѕДk}tљ€™ќњ}‡$л&P`щщIzїЁWќWEt•I*П*›'Aћл+ќђњ‰Аx{@м/0И~ђьU’\‰(,ЂB\]—G]ЎўќкVуАлK)ƒ—]Л‹Грг.ЮгLїRDyHЕћЯѕOO~Мі7%qќH’ѓ4‰HСЊКJs Љ˜Аы“ы“,x‰wУ–tЙEЊP%xсžћЊПGIџ„Х_]ЁŠ0ѓшЧЉ-GfЮзuн!ЫŸ;чЯy'‚HAYYY$iа-RSНюяy:T˜Ї0LурѓЩŒ'г3МГпЖ§evхШ.в Њ+B%W{!C‘0‡ъ–•SDp!Š#/‚ЦшЖjoSюіЉPС‡j<1Nг ##•]sЎjP"Ѕ"EЗ0ŠОЋфvjPЕ8Mпъš!чоxŽсЈЯxќ†T$C™*'г‰ьhCђ{‡Шœ FЏ­X"сяюlˆœ8ОaŒJ%)"ВфяЩмщ Ј{‰RТЩ$VNО—дЧ™ soћННrлrd"fwFУAUЧipЂы&ОˆƒКjЊбXЋ2ІSЙf~ьаTЄе иLƒfІяРтP9+р9ЄW@Мr^Р<ЫY;ДђЃ" ‹\ЮœvгxžЦ§Бы=n1œaž&_2œE †њFуьž'УyЗЧАQVЧ{ІG[DY˜ƒч/эziaRЗ=0NžІGr7кЎŽАxЊаЅŒƒ›i‡ ZЉьw&6ВЇєЪ№XBY:R2xcOКЦЂ”z0|‹XqлјdsWšLdГвч’ŸœHrУT ЌЌ›кŸ PнеQ—у€dЩ4xЕЫ% @+oЮ5ХpsЭ@І БчЙы{fQёшЖзUKl ТЗШЗ6$AJXы рЗЬ*aьŒф/ЁШoЗl)ЮУTІэЛЇз -‚>Ї‘ЇMu{ЂhФh7Ќ„­ыїЙЋFЋJУ8Щјјпа2“8 Nњ“yЮУ3IjƒiќYЗЃE&aВJ :dыeЄД€H],ўˆеёŒћŒqЃ!Tœ'йќЖ%3Іt#2dsѓ‡MХ€Р8^|U?IЈђdжOœїЄQ(4зI*Ъ(kс2j‰Nh mЧ1Х_ј k5ƒаxљЈгМ„Qѕ(-œ`н2tiИE9‡эЬА5НЎŸКdaxрn\јЈц7—Ё:ЖбРУ§0š†ЧcЃ?Ш“ХbsЦЕЛцт ђ”ІэY][пo„„9?чЋкЪ я€lCї[†)Г0+|РЅъ ѓж–r№П–§•P;XЭ/š<qMі†p.ѓврL^~?T%•)Лv5KР"Г!вЉ\ŽІ6пТЁџk;4ўЯ-OЉЦЩѕm’QЦXЉsЮГ BE.љЯ‹д6дФЙкт–wгТ’ Ь…›S?уzЧТ5W9рФ 8ЉЩbpФ•юќ*ЦJJ’ѓ6‡ЧJkо‚ŸUДyo ——lж@гЁ#вJŒњ“ џж6­ƒ">КзFј1tёŸj• ВєНп)4Н#ЧŒš‹УСЫОЂ*q`ёэ"“%ŒЋ Я*пГ]ˆB†JХ_D(U.ТРJNљм nМTќЉzšмuН‹†'):аЗХИфмд†M’ƒ Ў=Pv'a, †Й;w­iЧ мkƒˆ, гE—ё€"У"ЮйГDbС’ЕёхЊX‡%д6‘Єѕ‰3t и ћXЮТиmХ­ƒ=к!‰\ђŽ•! [IСВЉИ/FhЗО)j=BэOŸЎяЇдЗИПьи№{Ј;ЬfiwулEсTыС–0NУTЮ 3рєlfЯ^e Ц —(#œ+GСчŠъ шu~Ца† C]§СœnЈіBqЅ”нћžћ и=йh‘N~˜†*Ъ%НЯ№ИУ—ЯЉ•Hхrдљ;Ж tMœЙ`‹_ѕЄгІЃбуд[]‚"›nП%кth@…J…-†ьvђFЈ^ƒТH–m„Р!šGшцшRˆ€}^ЧУu3I[ ЂruчяGЫрEŸА@ ЁиГ'ЈАО6’ђ,ГАJи5k1ЪЄГ€P\к€y@ћЃЎ Uпcь‹јЖŒ7€_A"ЪбЂ†щf њ@D§’х€@ЌяOUпЕЭЌћ8rщY`Зy€HКт{Ё?pjноNњжЎhj(>MќъЕ#фКЇ[f@Ш R"ЗЯPUшПэAћ:’ѓј­ГЄО:K†ЉФѕЏыПЌ&8ƒн}dгБiсжъDцœёC‘_& *™ѓE п"ЃХлa}_c_+ Шr!‘ГцЬ%з5ј…$hњІj)RЅОЂХqНHзэ=ќиC€фC8Р%СЛЗяпќ‹‡ љ…52Ь=TR|6>'ЎQЉ[*Рpькe&’Эг-!]hђkBЪ|џˆ/Р*y^смЊи6D\рˆеWцА™ЪВ"ЬтТџѓЫ/Џ{їу! Ѕз–цnў‹Є‡щ|кїџ|НйьЦ8tXhK‰оRЌШ&znШf!)Кw,Э|Б–оJaјТB-иrёЫŽ'$™ЖЅЉX=ЧgЁšІНKnНЗЦЁš%іqыАdъыіуœќxKПi( џzKDО]їfыdш>r‘<@цКє€Ю\yL'/‡‘’=0ь9ш^—ќьЫ% єрЄFƒЃ7япВт4 г\Ќ<4•Х^р %ј[ ўvиŽ…P”ŽPЏ˜Ш„їq[> wогoМdбŠиqФ&™и ВCHRЄщ^Ми"ЪЧ0ЭВG =]Z‘Ѓзfтm”ˆ&ŠIƒсйьLЋ‹ї|.•%љЗ$Уt­wЈЏІѓй7j8ЧwъІ“ХS'РOЫЂэˆŒ§’JИU\ѕЯO§j“Є_ДЈ9-‡\r ЁKrЮЭЌ!ТlnLћёѕп~* mEфUВnL(ЄстOњЉm9Б‰(јGUінаG^ћщкў…ПзИ \‚Hšич#:ХН”иі-Н›1—`xэ*‘јNж*KЭeщШ˜kВfЯbT‰k§qDе|]Ф‰S$Ћ^lwCpdІ“™г9дћМKїwќmєйdxАOnЫzI63œЇ њ‹_ІЛe‘ЯЭŒё)aр!xјbyV@БЄЉ5DUч№Е?ЙeЎШнKŽЙЭ;x‡њњ †унvЇЊТљЭ§‹{ЈBвЊо”cз[вѕАТ\4CЃВ?юўйRдХ endstream endobj 415 0 obj << /Length 2711 /Filter /FlateDecode >> stream xк•йnфЦё}ПBЩ‹9€†aГ›M2yђ:>6#ЋEФСІErfˆх1цБ+ўјдбЭK$C€иgUuнU#nј7ipKщЇ*ЙЩъ7­vчќ§ћ7Тž;ТСутфлЛ7ј.ŠnDрЇA*nюNKPwљЭПНM9є‡Ѓ”вћІmaь}>„‰Wt} гЃAЂ=ўsї—7поM˜Ђ0|%IxђeštЂ|!г”›СŽ*HНŸЁЊЂїG яюR,—y\6Y5цEЯГЂAъ‡Ўt ЇЖуAmhы‘gY[уьОlЬЕ‡л+гœGsЖL“ЛKЃџxH”w Ћ0УmрМі(Є/"~Cшр’ђюGф'OЇЁhђ‚рEоађЊ}OксRt<$"c$ђ <І9%Ф Р ŒдKF†ZјJЧ@ бPЕ™ЉŠЕЙњУУ`/Ќ8\RсЮЯl%мзЎь™@*Оћ ўkщБGЉДD‰}Г`ƒЙ?іХеtfР7ЂRem5жMџ'œСћM†0.МWLмЄЭвъ!JПŠ7@†ЕЅ>]=7ё‘€Ф•fўQ6yKЄіЧЊ%Ю# GDкћщoяп§sЕОУ’уSЈ_@"Х2єeš8іН МN§xО‚OV"є }…zœuЅU™œз OщYŸQ T<)œтm‰@UЈЕCёKvh‹S_в]$‘?^K8]=2™§юUeщnЧ‰Д4Ћ ‰ŽVaХ)ж…Т%ыbMYX—є@г•Rоw8F&…y0ѕЕТїЏєcЅG’M~uœSШї(Їе4`џž=Q€o›sUі—NFХP№ёУћWjгПшEЃ}4К KtЖkгˆIaFrз;ˆPшё,Л–Ёvccm <ˆоU+;Ч”•­рЁ{ы+qsьЫцl;ьЧjBљСьkк+њ3Ÿе%LДХbЭЇw~b~އє,јfРvЏƒ'Ёeƒg,x™УЃМ@_SіэИФZУ№RC™•БЫkРТ#y;”“HHПAёЯeГЫt ‚Ÿ,НЇ=шBATkŸ‰•ж?ќхфєЭф”aщK FЃџюŠиЋЩђЧўO*YИs_1ШS[UэфцЩћРЊS„‰+NсBcъЬ5QЁ бЯG>МпбЗGYфЧaМЁŒBѕиŽ"Pa28|ШІЎ\p‚ї'[d <šВе)LС{5ќІ’*сИ*| њзg‚ЌЕŸФщЫ)–†{экsgjFв&яq(јИ6ГŸЌ —–іŽjtЧ8*OйиuжZ…‹_ЇёZуVђƒ”RЃЙC™– ƒйGсv:дХ+їоњФkЈіxh†^ўЏШyyDCVa<ИЋ!aњTM*ИŸзт(ŸNЪbiџƒ5с*-NєБˆ‘М…ч:n­О„•зLњr)чTE‘1в ”њR!jŽjo;So3›3ФLын^Ž.ЮN)Ќ@$љўэN>ЩК†pY›вAЪ7ЊzyCь3/ц)Зp™@KƒШтCІ–озyNZg*Р+яЏшxC*%Ђ{т@єЉ/B[YМoыb(kb”АЪ#1Й^;кФд|5№^?uV:%ц›-oцХP8Ч_у€ђb ФљўРЛТbWœ@ šŒЮ“RKімйгkT9Cм N:КpЦhIпсъu‚нлРUf*-Ў›Zƒс№bц ‹W(Ѕ‚YVЂfeМИРAЅњUАF ьтДїцОВЦpжmsЛGo?NzKA4вТц%Ч ЬјyШvŠ#$8m™й9:јкьШ?нж†r1˜‚X€ьСЂ‚tБ/ѓ§ыЧЅwЬ1ŸШ'*ЕЬKbNKяŽМя›<яŠОчЩp)ћл§„EњQ"^ісъЉЩечЁ-јYvЇЧ‰РMъСd˜Сmк šJJX`Kc1исZrlŸЫЎmъЩ T€њХ Ш 4 р•О €ДE+W(ЧЏбѓ’­Xc—ыиежВЛ­Иl…}гѓPSХ%›nuoЖyц-ћЯMЎŽй&e{А5хЦ№КщPmнnЛL›ihxg•зЁ+юкёК.,W"тtЪЬ~љk№…ЭЗ™aЄ‚'IBајнHc‚‡[†Ї6вaъsрШ%yž• RM{ŒMЗŠвЅ*шis7ŠJШГЂ`NД>›nOЛУ‡‹d‹^ТБЊ:щЫ(^йу>2ЎSгЯІœb™й…O’\šN“F†‚д8F5&П\гћ'm†}ацhapSRоуюMH~ЌБ`љг_Mf/šxќбР Wц0!kэfЊFђCQjћS2$ђ;Ў™`ВŸ чˆп” #Ќ9Ц™Й:џиёU'‰sй0pY1MИУc2…Dб$ЁSJВRКЫlЇЉ+г—АС.Ž6Ы _ШMЕH tјДP‚5ъїРв—ћpTŒbv‰gyМЯМ(ђЁd\&‰ЯhјКЮA1ЩРћѓІ8д–q™.БЕ›“?Д™AгАlѕ%ѕsRNC_hё›эn9Ё!P4щ•!E62УTl+aE€_’воl*› €Їжq„юїќ- Lr@‹_FЃВ8aД™—ВѕюŒ3&ыqЄЭ6‚„`"–D €гq/\”ГL  Г2Ы™$jс$‘kkЪЩnэЫCGЫ.ЩKоje|’$BXмЧФƒЙŸxпšˆмПxbХyN‚Ш—Znlˆ_^Им$Yiђu0С3яБŽм!'IŒ–ЭдсQлŽЋДЗ–NŽ M}­уuЄdЧ ‘_xvСЖ& r9ѓШЪ =1Nбгr•4Тj]˜~ь,HЂ ЮTEs.=8ПNPYgЈ7Ф…ЌT3eмЛюržбЁЖ.іњ2ќЄSзbЊЁœУS ђiі$Оœc dуЅйM&СŽгЉ\…GZ?8~RЕХуzэиh= —лпуВфšІ›ЎА)/Шq+Ќy*ўрR^yЫZƒю pmЃљЃSяэЃsсЇ›”›+"іТ€њNиyуP<ŒѓO 2q–?x˜xЮ­m@Щ•k&O§1nsЧмƒЏ+ЖЙ?"_цўМФцЖ8Џ эžkaЄЖЋgК)рGАыrYёTЄQj<ЙЪГЉ’ЂyтѕU еТ w'LЭjŸЂolЉА‚sлFCeJ­N8FЭюЮPнЪзŠНŸ–жЪ‰чЈУhеИ€нI8ЩЫўZAв“Л›ќqšђhjћ†ЮРЪјЂГа/†юВхDWO:я.L!rБ€C[ыl$cлб',Iя Ф~ЁЈŠ ЙЗЮiљ~lЭlТ9џ”PйЮі\оЃгЫЈPІЅм§FЅ˜=„s*№ўјЪж FtъТМћё›>~јёнOЧоь=і‘дžдA№ЋLeЬъA/›'НчCбdђ—pУ“„RqБm=AŽ?ќў@п endstream endobj 418 0 obj << /Length 1832 /Filter /FlateDecode >> stream xкЅXK“л6 ОчW8ЇШ35+>єjOIІIЗ‡яєаvRЎEЏ5–%$яvgђу -йrжлŽ† ёјŠЯBјёYЮ)YІвйjї*Дмц~FФчЏИ“[€рb љnљъЧQ4у!ЫТŒЯ–ысVЫ|іGp[];_H)ƒїu5I№0i`šЖ€Ч…фa2žџЕќэе/KЏ)тJ“PђмІxhч)KgqЊ—ŠЬz§ ›9Ќ‚›Oя§zћщfI‡-š[/Иd<"щ'нфіuРЎ\Щ,UœфwІ3Эh wL•Ѓ’ЉW—”ЏtЅsэ ЁџVOXДЎыЮYФПI’ДVNЈ+ЊеЦЫrAТvƒ+Э~ЦъuЃЋ•™кlhЅRп”’LdБsм7•dЫЂ2gВvƒ—GЃrvžeC{ wжaД&<Е3mЋяиmЕ­ъЧŠty0§БЮмљ}УOKm!0­мŠ;щп7ІrЂЃ œeI{[Љƒ­Щ‰Ѕ`JŠ^Ќ1:ЧвUiаm њnjƒk˜ ™јЙљ3ф і…ЊvkŠŽў‹В$j… 6ЦўmO6ЛqЫЂЉЋбnљУ<Šн ™Ѕ™>]ЬBїvќyц4™†Loфe]A}‹Le­UWхRŠlDжЩ!‘eƒˆ„Rоя›zЖ‚ЩуЕf…kи|Ё$nжS‡Љ`”іA R‚йЅ\A†Љ1H阪 $in0“`АYЌ` в9дСsЌpвdœt№ьЂ”n эVЦŒІШsSџЮ9…!’ Qp|з:K6НzнiЂАшKЗ5`>ЙФьX:›XIjIr!78‹ЅЯэз-Uуi^ф /pc—? -Ќ›ТЦkCЪ`Ѓ–ФtEџг˜šЄЮ‡ˆЉPг‘rЉ QЫ^;AЁЬВ ˜c8ˆьм?*ЭR‚dшВ™GBAиrЗ№Т)Й эLц§LОUаи Gщ>EїЊ4LЅŠЂŽlВ) ЪјЮ9ЋCгє˜Ѕ,ьхЯУL™ТЛЅЈ|t№Ё;;дЂF[ОhC^Уњ{+‹pлA}Ір/5Н*ж$‹v‰Œq~BцНлл„„ъГ 9І<ђ-*$ Ф=эГ2ЙХfXуыоLІ(aЇЈ]8˜ŽАиƒпY\Б#ВW j v‡ЦН™hьуNo§.@Ћн:ёЭўВ У2VGО—Z O№’‰AsЃGЬЉ kВŒ%™ИЎisЉЈEdV!Юv{oƒУ% 68‰ Aю ъзrŠъDdКіс pЮуr ќРЄLFP6Lэ-6–щЫјйš‡Ф~шртœёјšё@$оыЖі9$ KW§ŽгМiOsЇ*,wЈхz"жЄxЭи"Ѕ< 5„ |Q{Zг+Df?Zшв­}"sщяь]fА‡šN~˜эXzD Ћ›‡SEC><н†lѕXѕ]>зЦЄ’…GЪкmjД YxU;кx+м`‚щ\я| †rжфФЃ!Hާ%zˆЗгајf’ŽябвnmьіPtT>ШЉЅїНE„рСЧžY3!sЫсъDC2&3Eћ{Ѓm+Oхи[+œwю'™@pќ>Е'яc`Ъ№ЊB’ttW|ПыВД+!—šŠє"I™ˆO.™}ШэхеT_oПLн-j]ИR_ИчSщьэ‰Ъя^Єrћџ5ОћŸ^Ўuн|§№љ%Z/ˆyFыѓ^ёэaI№(a~ёЃ;&!ІЕџ.@у=>уфvЬоFлЋЮMОЛ‰n Й`RDзЕпˆ%в_ДшТЁ.?0цё+' 9œrpEˆspх>gиы Ё.hPЩЩЧ=;d§U(?У{]йЛЗЅ—zoП7д{ћЩІ`Р/;_H Щœћ˜ƒ'ы{=ЮЗЛЛaЃDMџюЪ%м%wЇйRюp'iіxЁщC*Са{myЪG_ЛЦNї€7?­оax"š>g Б>СЈ†xЎ7ЙЯе6GTЏТЯњжџ–­фЃ endstream endobj 423 0 obj << /Length 2860 /Filter /FlateDecode >> stream xк•Z[oмИ~ЯЏpї%2ъQE‘"ЅЭSтѕ&.œФˆьMБ•5[ШŒdHš$њу{.деTЪvЯš­ox№сѕ3aї­`уjДѓеѕГќEG"№“ Gз›1ЉыѕбПМeб6Ч+)ЅwZ•ЧЁёО‡Б—зM+)‚X{вџћњŸЯЮЎћ“Ђ0<%мљO"PАЊŽtЌ|!3vОг“аkяrHр+в^ZщЭжЮмЬkЩ;гM›зМђфŽб“cЄ№…–Р№ЗoimЗMИ CvЛž3эъg„CхЫhLЖЌZeј8šR.ІМ/зљ—@Ј2_ї/]Ї%Ъ7КЇВ'§9“p aКmїuQЂЌZ{Zje–зuER8ZI т{Ќ„єEФЏэђІIoAм*0№Юк+nЫЊЮž%§рЌeПhСpžjяв–wmЊэЖBОћЧ+­•їББЏЙ%Њі2mђі UбЁ™еyкіМmв§ЖэXЎxіОЮПЁХч,Ck?0ТŠA0щіе&‘зэ>mЩ7ТD{›њXxеŽР8›ЂМ…*zз —FЁЏуžщUцʘPО6НђЊћюРШЋЪэ2d§.ЯїЏ–;RВ2SЏЁ2p”жvWšЕж…xaƒfоб!im|ЉѕTйОЎ;™­d/РoE]•ЛЩ™ @љ Y/KЗљ ЮФ^SёЪї;ђ_мМ^ƒєx\цпyАљwТУћРИП.ЖщWЫ=>et/šЗДI6$"у}ЕK$ТхЗ[Кc0Бј,mrТC№чБ0@‚zэˆ€-)?~'.€MާбviPm&ыpДВёй X€ёC)ДрJF~Ќ­Ш…<^EZzgх1˜V/i)Hв&ђ>'ЊCG' A–m˜р‚u‚GЉP.Ё‘ИTЗuКу[ю{љ1rУдрќЌ_˜Ъ9дЬ,FЪЃ‚dј*ПКИ\Eр‰g |-цтЭћЗg.^#уыŽгЋ{2У<+PШЈ lˆ1Ќ”§ зPiјћ€ќVћšŸюЊ}e]д…fmU?М8^ХБёŠ–7 oлУІ7ЁUрТ ољСu9p_ђihПпіh1‚М;Жh268U‡!кЋ…gЅP7U™ny…Ёс:mSYŸУx‹юЈЊ/v§e~!JъоДžJB@Мї%oš6пYPІћВ$sСчЗEVWMЕщ0:€–™ЂвEЙf+kN№­„ѕщ„ю—ˆL@С9їe„p‹"Чђ•ŒђU4\Щ БUnёiз1*ёУИoЩpУФaзl›ЙeS :!џQ4э‰ы”XјсОМ’*‚ŒBЭ"^]аQ"АУпuљеЎ(s~|@Y“Gр{m+ъœ\75†GЂГ9 ь]ыБ4~ћpўiЩ—елFA 0'Чє._^Пq_|-ŠУщебLЫИУ&&pt“‚i .‡Ссб6žBхс/i Vk+#Tяz0MО щС%%8Ў8YЏЮ>\~xџћљ…ShCЪћп–PчОШш aжXі6sњыШЧ!UЋ№ –_~ЄњфРП.г]юЬ~у1щ/AŒ<lля%ХЁцЬчpЦIФ_оЇ=o "†˜)ЇЌjwў? ОлoUЖ%w%ч+ЛЎђЖєYМЖPДЁ>шоЩ$н§ѓ/ф;C]Ј#NЃX‡p@T.Nџ:Нў|yvТя_М|їz1єM$sк%Œ”жрeK(›(98>rќ†ѕQђЦ+nT:ёe’Й_єЈv­ћЊvЕqVОбИGТ•ЏлGЄ‰}ХS`М|љњьУџ_ ЂЙ‘ƒћє–-&фNLэЛfе/ Њмоѓn‹ŒзжEsПMIœжМzъЁ—U%lмYGAкЈCRŠŠЁF[Aьшƒбf_f\œргMmУн!В%:?†!ъђ&mьs Lцou7GЌЮnљqЁьДШМzЃў{щдЏ€h -о’,qвHЈOt Я)Zњ•к – jyУjРЩ”ЖфpD/яwјПu‘МHвЧ-Жy„Нqр|сLЭBјЪєЖЖЋъќщже %э‡ƒ',6ѕFŒ‚Љ…Ц()Ю‚џРЄзгfЦЧ6вm‹yMз$В(аь:эЇvбюAšЇЅpт–Т3юomJN%пЅ™›Œ'z ФЉ‚3™аЌє[ёДЉ/€цЯ  ˆQЄџыьны‹ѓЋ7‡хuWмd lы ТoСqO.…*H+“A$ЏžьsІF­№pЁ€F…šО€~§ъ`Њ-хј4фЎчHwмњNA '_ЕiЫЦ8pѓЊ.кЂЙуI2зjЛпхМ8щ†žиЮ&АGѓТ*?ўRЖ9neѕX@}-NMa4t‡8Міљн“щнXх$wb)‚! ЕbYєу.’уd— аЮŠW)Ўёb%ЄЫщš'0AЦэ ЙP!€ќ| ыеž—yјEnPЧВ`ъ!І<"˜d Tƒ ЗмF“ћрж&"#іqЖЫ5шЮ…н:j)Љ5лњЮb,&e9м ŠўЦ‹ŸhЇг:wEшёЈ ьљ ФRd l4Щ)ьQjš!БЕУ@ вТY§AN;–ŒB~<4–~nzиш1Ьц•дОДЊХN2щЬ.РРЌM29y5PФЦѓм•ЂТЯ2F0ЕdЯ™fбЗёaЏ€qVћхЛћv”ќ6mн;>њ…ЛScЌ0г"†^_й6џ/П8ћё№Yюљrн/№…‰0qёўєхХйл——‚гfC"ЩA_ ЫЮyœWяRЛTVќ‹*ЩЋВЖЃФП€Э?VлЂџSЖ›‹ћBХpeЦp…{цyхЌІ!7`b—оу@NьŸBy_о-˜сЗЂІ%№IзМŠўЎпƒІвЎY"С#‰ Ÿхл5>Ќ–yОn\мs2•Œs­?Ё+№}ЫSЖмфO№Єэ~Ј '——ЭОЖkі–L: žwh`‚%“QY˜єeсŒЛMЕчЖWb;ѓ; Мš`ž%ТLЪ?Г'дЛЁшмЗn`а)ЛMŒД0ъyФ BБГнЅ0–€+нH ЄŒž†•„ Тифa™њJBŽ дє“јЯс2dэHїgб™ЗŒ>ЎГWv“№‘@ajє€]гnMЗѕвЌВхPQ?Aly›hvf7ВГйї|ьп}ќG8ЕU endstream endobj 428 0 obj << /Length 3328 /Filter /FlateDecode >> stream xк•ZYмЦ~зЏ=‰‹hZьƒMR~'2РI`­`Жs‡œF3ф˜ЧЎїпЇŽn^ЫбŽ%`Їйgu_)7!ќ—›4мФZ‹д$›нщUHНЭ§†?~џJКy[˜ИЬќлэЋwЂh#C‘†ЉммюЇ[нц›ŸƒЯUйЕ7[­u№]]нЈ8xИQIP4m [-УФ:ЙљѕіŸЏўq;œ)u%I8ѓM1а %#уhВ‰RІIš›mdU№їЌЫ€„8 >”ЧЂE–зћj)tЂxхэЁpГьt–RЎ“iROW^й vJuфЇ›њОЩN@@Ј‚О-KЁ:dЯ#ўЉЙ#П‘AqГ•СYь\7k ЅђпЏQ&c-”VўЬМи—@АОЩ”a(Ќ•~MVхЋwE—йѕMSTЛЇЫЛ&ЁЩАЉР)›­Q‰HуЭVj!#9ђxЋL82vYХьижмžЙ.7TŸёfйб-‡ŸmьbтЈЩьУГoѕŠ‰&˜wљnкŠtМл/aЎmg„2jЊ$ Ы{ЦБуЩєМhЯB#ьР4ўЉЌђšЇ…г%кU‘O pЎ+rю)+ўэХи6oPёd@Нъ*šЬЫІиuuѓt“ижГn§Ъ3э=p—6sІŽKY9ЁхИЫЧћбЂн5хя0’†З чКpЊ›‚G^tY‰iуцNн…ДЁ€Y ‹59 СˆSј#yŽyЯд…јелaљŠc›Aд}іАaЊdђ~žј<чb E.цзЗ<хœнЛ{ЉhymR;ЙЫeччч~•ђљ†SѓST |‹ЮR;]њ7^(”шЙџиЫ/шГ юjŸкЎ8Еx‰аk8 яŠЄwEм5nЙДЇsЙЫŽЧ'[ш&LbЁ>7A-’бjоѕmѓЎ=РЮя.NjDЊЧTюзЖM…є‹ўL 8fЭ\'Q‹UBю яѕPцxЇСcйxŒXƒк{ЁЌ+Ћ{юc.U з№к зSšйэ5Аё%Hы^ф‘цš˜e“xиЩн}WŸЮ Я9Ћ‘ŽS!S9gгОAg‚*ЮzZпж}Гѓі\Жј€ ˆЕQ‚мŒYбEЅМтсƒšŒХ–6ЇˆН3]тсВ]q ‘$žHфшљЯ}pa#Cйў‘XNћў_ŸёчВЇ+гЉќТ=њ$ЄЦš-Т;`pй1ЭутŽВr*AЫќњmŸMХС ЕnжюhS№ѓщKWМъFQ(ЬшнЧС&Zmяш*а.Ћy>(†‘аQ2wDW]Ј”рCхЫ>T‰x„ЪЄХрёы;@4kqшн%єГ C.ЪcРt­ИX‚ЙK№?€мубц BD)\!н˜DTќгxШ/пŽыVЬ§ФќКлЁыЮя‘шрR‡UмW§ЃЛB‚@Киі]СНчЌ;T?пЎУ; ьšЬY‹pфкcy<ђцЮ…ж_јdВsь'Iyš9ЙfшH€‚-аz^clЁ1f=Ў?ыИЕЋ9„‚бЂфM бTыi5d„Щ5žaт@\ТћЭ ЪaХHYЬwa™с#љчР} YтАІYчИ„œVЉ?I1œ“O$РfћUgl#?з0Ј„Р6ШUˆ—p-frVMоћСЧn8ЌЋg–Њgв„GFш4ѓ’рЎrчjŒЦNhƒСBі1ГИџоlЈ{аШТ=†T2•3сЎhN№бЙ~l, vе{^2Ьœ>м9,‹эІgpМfo€д#Й?qfЛ}p5ЙKlOFпВMЅ ~М| ИўxДРГгЪj_Џ–= йxnщˆсяG9УгеЧz4ѓМє…Ф­›“GU8б}нwыљVиЌѓ к‰ОF5VЉЯ:H_ЮO— Ћ”ѓŽW\ЄˆŒXZ'€2šш7@˜ЎwШ5d6HіQИн8x(›К:ЩЬb(л”e[СЗšзOБjEh­2Bи™тФ)W Щ\I§дŸЯXб˜з]YP…ќWтEЊанььЪ(Y3€+вн;я(qбч\\._њСФёырЗUћ$?ЙйыОл'Ћ(+дu˜іff•hbXЋwgš—ЮLЉ9 ‹/jЂiд{уCgƒЕПiЈљщPTыI=Ьбзр,;ТАЩІCяhвˆ2@c“O1pмXЗЌужбu _Упi ›.˜I›ЛZ*Aw`› Аn=ёв€vх5еЋй}8ЛЦЗFXЛШUЧЂР';l}ЎPІ‹ХЮ–МmClIX phf`ЄA5#ХцБl]}—кbewQZђОЊ›"3п3‘6еSНџsNz€D8tB%v–О4ЛѓИi$F d‡ёU/Дд–уі3сЎтъШФBH"Hp€Ђ’фћŽЁМьqУЄвЌц•ц}эоH0*Ѓэ3ˆ?TlŽ%йjpE€§вЙqЎз™nтNh‹п{I]NšуXПУ[žЭФ=œ)ьњfНЬ&­ˆЙRшбјYZ>ањФХіАЎs &…p-—ѕЧЊЃŠК}DLЉд€œј‰lU‘єтAzФьљGе ˜Bя….$Щ5І9y6ј‡жбBBёлЯВ=3>‘ЫœЌSБВряjxQ’Žјzx0EрЫ [ЎB`Н/нЛЖЄ–цТZТЪjМ(ЦiNЁќbЮ2“ ­On^б4Є‚АіФКеfї…‹§Q&”пяЋАƒDћTЙИчЊ\f€Ћqg|QйB<нV…c„ЖњRœћmн%OУй__D&oЦЂ V[]P“:aфƒšuЫЁUІNЕld3xU§Р{™шЊš‚ь/gs%§ •/jЈЅЇцj 9Јœ‚4'я"А1)—‚щY€~ЗЗ]ŒДюжЁ…t;™‰vРњ8‘jg„0<Ъ єрШзŸИ€IС„цТэТЏ) fžю­Nфз*+я_ьЄVD7Ч'd=FА5)ŒpЧТyвТюАC6rz‡FлжЎ‹œя'ИЅќ;eФ%zŠК-VоКxП2ЅмєЁю9ЗЧз>6œZINбБвRsИv“!CћЗuЗgрр+QЄ^ ыЂFёІзэь_В4Ѓ“ЋуЬт€tђ)vтэАЋ\д*žИХz‡Фx…Џ#гeљ'#щaнщ‘ Д€z&Zy#)љœБžНї"шр[7оЗ}vФьЩЄcЉnЪЧј1ЦРнз/І1oxГRаЗЎ––9Z9уРŽvQ'DНjќtЏн[Я'%bЙ(“9ˆ‹х_˜ .6P€oн[ЮМlw}лgек7*’tˆ #kцOWљ§њэdƒ•Ђјђ˜Х—jјђAMО|PУ—а;~љ "џхt?џђС˜P8œншrQпЯ~ўхІDП#ІьшуeXПЈtЏ†ВѕѕšШДЈзШ08SM (OSЗЪNпНHїљMH–p,|†?Ÿ ‡ofТ Ж•ˆ”БЬТ_aф<ю‹}иЮмžыЖІBeЋзeЕ;іyqЋУKj~ tЗ@zИ™yИ .рцђ!7“ Ль№.Ex]ј?Цр4Д endstream endobj 329 0 obj << /Type /ObjStm /N 100 /First 871 /Length 1674 /Filter /FlateDecode >> stream xкЭYлn7}зW№Б}ЁШс /€ ‰ыЂ@šq ДM§ ЪkCˆ,КщпїЬJnm­Щ\Ѓ.`ƒГмсrцЬ•T dœ ŒХФh(уЃЧ”рŸMˆƒ7,c0ТЃ3’ё.–€7$“$B`“ сɘ,біІˆОЯІф„g6оE,d2о'l˜А/yь( DYZI”€\ђ fуЅ`6Њ`T№3OA№•дюЯэЩѓњJ yнZиeШ„ ТGgˆ]шv$а эL‚[RЉ`…r3VофЁnЩ дО-ь№*C> #*“#№.‚§œЮ%’‰гЂ№ф5$$‹ь0,b˜…\/FСŽ^Y2x>Uw]H ЌЮ€кЦB4 LЦ" {Q”€6š2М*y С1QP“…h@1ЉЌ:™ОЮЄ3j=вРHept4~ќыІ1УзГй|5ž­џXЕЯя&ГЯƒс›љтЂY˜OСшЮУЭxe>A,ј€Ѕ5$mNъ<ХzŽ`ymŽŽЬ№Ь ПŸœ›сБљцИЙœЬ&ГЋпЛїѓйt2kF }јy6Y-П5Џ^ №W- ЯJнЩz.•lХљE9[_/uчбьB‡уЩхeГhfуІ_>(еБљЄYЧ™fјЫЏПЉU93[OЇч_сAјZM(їјNцГU+е >oјO*Ъ–„'ЅлйЌAп>`ё№t1Ÿ5Pй OOЬ№cѓeeЮя#w:КjУЗиЃ™­–@„tЙbЕœЏаВM‘эдЭХdєfўehєЄ˜Ž€Ч ЄюЎzHЖ_…`ŸjЯЁOьъУењH}jU`зU!WЋPzšu%ћ~њHGTЇшГ‰ї%vеhQYЮћх—­CN–ФЩ+Й<˜оЮЏoІ“ёhе\мFОŽп}ЙY4Ыхd>ыфц§y`‡‡ŠX‡њYk™{‘s'CдZLКШеШх<юѓ sАZškѓb[№ћ!:ˆ? ‰ŸmgкЏEњњpplГЖАтlFHpBa#эМMђpaћК-FуефЯІѕфeгЏЎrbы\лAткѓ А2=IзлЂŠЯ> кыeФNЮк*[‡~FKh*EPgмКNuЪдž<ЙчЫŸбw}БдњЂЄООчcЖAлjЉзу•scл\9~їїыыf1+о?­W7ы6…žЬзЃе.јбU€ПоNљCа›gWB#6БыƒХ™эAО›_]mлѓЗЃщx=­vK_e№[DЯ~С–ЈЙЄи(R+Cы@ёџНЉл`'ї$ИЃ\ђ/оЭЅЎGЇjNм;Ё‡г›Š`=ќ™2Ли†­ƒGќh<šv’~ŠћЛ”MxšїёQЁі \я†НКм-!ЉК„Єм;§Фh‰QЋбxЇЄcЖzкђ‡/FЋQ[4&гІђйэЗнИhљДЖУDЎђвЯ$м1IІУL’e7/фpїy˜р•hлъЈж:wЕŽеZЇПn(нь^\­>ХяЗтoЉ”џиŠЅ{Ђ/ЁZk~KНxэЈŸЄТŒX6pъ%rпЬˆЦlаEŠm[цб^KGŽtЮ?o{ЂчЙ)Х9в! ЕpфИ‘ŸЫгїnэzРЙ‡GаŽ:дЊ}|„coЪ/yoЪЎ“ОѕН.є…}Pе№р `9№0нХцБѓг?яўy+ъk[кG  §pЭ]\+ьJзtfїyФ;Д"q/‘Xzъ•]пФ‹уYяjбёћЫЭ.O@УЦ${љ(ˆMyоcюvз#{ZиKЗP€л}fѓIюqСћМйЫwЃЬWG™ё6ŒЉs]Ћ?dVъCДпО;<јЌхTъЯ{щРдЕ/=ЭОџv7Lјx;–эxчћoƒ„! endstream endobj 435 0 obj << /Length 3326 /Filter /FlateDecode >> stream xк•йŽуЦё}Пb’—pУ>xйСzу56›Р;†aФAв#ЕFЬRЄЬcЧƒфуS/‰убb€awѕU]wUKнD№Їnђш&5&ЬmvГ=ОŠк<мpућя^)™З‰›йЬoю^§щ]пЈ(ЬЃ\нмэч[нэnўќP]{Л1ЦoыъVЇСч[Оi шnŒŠВ$0љэ?яўњълЛёЄXы+QТ™/рЄ" Ѓі&ЩlЈŒeФ~уuќkФŽLGцQ˜F1 H‡ѕDžЗ@Эи0Šгaкб}"тŒ‡ЩYmлOLм=Ё[ї‚ЬW\HљЙйh“ЩЭF™PХМНЏ†{еУkdŠ ќЏ[ъ˜AнСu ]lи2ЌЈјл<7W=x^EџMп1єрu;П-ŽЎ”НъІёэ‰1ЎvВIЭ п||ћžFо :冹q՘߹сЪкъj3_ЌSs5Т\уБaƒЖ8žЪ'Жў—ˆсeNНчя=ђѓЉѓэkм5b‹‡;ГрђnШк‰яїХы"фш]hЖ_Џнc_7pOkAв~Ž”Љ`Іk˜О0„ТWњ#H'lмЙц‰СН(.vуnRОЦ&Сг- mьзЗžŽv”эDRЂЉЌTŠЖ“ƒіXt‡ХEјнТшdѓvЃ–Я[ FўXМЛЭl@Зе „Ьё=ЂЉсЂ{^:Ё S‹іР` €0оЈЮXƒ 0<Птц9ya—Gдї–4}…ќZSb…QžНЌУ*LЭLеw ƒ€Њ ~,Њ]ˆ>’DхvК2‡АA7Х†“…:ˆЈь;щє||џ{щFq4й92Љ 3c–є89Rъ, ”Ž5Ж2M€Аър‡ СЦЗ™ЛјV<у[`FпдЂpЖСHЂ4ј gзa )4<лRщ1ыёœЛw› hg#‡У*<xЈ­‚'~A7+rкТeI ЖUЄ;l?=wР04(К‚kSЪ$W•п!ывŒЎКfшSАГY|ФzœіX”%B;@.вљ-Шт’ПŒФeЧѓˆ$мЭйDМп3|2vJ…F-yЬєЃa3l.œƒHexоТE"D\dЦ.!dтˆo„ q‘Y@ŠЧ3…Ч €хŽлЇвmeпЩHAgЉЦ+ЪKц‰Щ…‘0ў€Й’-ИlЩЭР№ЇmСКqСОšЃŸўїš$˜0wњ]пэГЕ}t&fмч€'X`ŸЖzіБ@Ќе3t&љxˆЏvЯcу0Sйќ Ч}Щ<$К|jџWƒ>7`x‰?фџ§ЗX>ih ЫRš†‘в ЉП i†т@kЃ’0J OИ#†ŠrЕhУldA'ф4БG˜p‚Š[ѓ ,ВƒiЙзЗН+QSЙ3€ЩBaу,ЈУ ­^fЂ9ќa•YъdЄнзШ‡ЉЙЈЕвhр˜F6ŠAЄђ3'уф‚к дВаxѓ”џ-*?E2јСІhсfŽ<ŒдžzиЗnєь}Д5ЁIЎПNщПаu[2рPЙWTk'ЄpгфeHВ?"ђ5ь˜ф …2}#йЙ–уДa–eKz>{YЅCXўМ‹„wрIЬрЮŒ8"УhPыљпqЂОшH3;Вёв(лš[ЂЄ[‡) 9‚ e›87 R<з•ьѕЙ;Хи›Д {,YшД›bGyТэSсw­1M€%'ю]€ЧjvQ,њf2і< б› f3Љ?ФБк qЌžХБkђ›A;йСjТ‘ѓлКš‡ь*@Яч’оЕ‚цЅ‹‰#JиЅФqТЩ*ŠрмSѕe*Цл +€ž”IхСО'LЩZ`џдˆ8јЖ•ь'Юƒoќ/х0 таЗУLПŸSR@бѓb0ЏoШЄЫ6'Ъ­u@yђЛЭpвЃTЈвQŽNŽх-xd ŒёŒƒkЙqЯV˜ ”дЧSQЂŽ`ЏЈ€Б!”dТƒ\Ъ!|QЦ h‚І‚†сШ mыџZ$SЋ—dЧrєMоХd9оу(І0„#ађ;Ф(6„ЮоЛЌЕЌp GЏдž‚жЂtїЅЧР_Љ™бЪEэМа–@”ТW‚Ф†{Ыb@ˆW35єqіEn†‰‹Ік–§ЮЗЋC†”цзШЭ2т’ˆЊЌPдŸыШ‘з;N@ЗІ~hм‘ћS@ћŒ +›Ь=мfѓYЈГ&ЪqЈВб,еTA UЖЁ‰ГeЄіŽ8„gNBбVчЙWT`ЂР›рXіБЕ†elC›ъЋщ–Ющ%TŠшЫŽ"bac'ІА‹#>ћячш–Bл^ХIГЇЯѓт…%ЁN фНІЅг‚ЂЙ vр в–ыUB5Ur•о›ЩzqpNNОЛЃ‚b ГeыУЖ#ьJщЂ7 EGЗmх6л9cЦgХУ“kКbл—Ўƒпњ™ШЎ\.З YъП­'IсphЎ!"‡l0ЉcудŠ +LoГ|)ШяЩ–ЬNшtѓ<„AŽ?{џШ‹ЊвPЄѕœ CыPЌ НŽ,DЊc€ћэЧЗЋQ0т;’e_,DДфЈ{–#Zш…JgЁ™JR^; ѓ)вшžѓ8qh•О†9™9ЋZ ‚ЛЂ…œ}Шд‰’ь`pЩйYEЉ,кŽеš"(EЙesCTH0ЊBУДЖsЌЛ8_rЛррœЧ-[Of gЬJ‘JГг‰ц•S8v)(+L0Y6ŽОkV9„SХGЪGр GFОŒ.YЖ@МЌщДнЙь‹?™№œ%щ6hНh Х і#' №KЂŸЈВ6hUб~Еd‡gЮр'<&ж эюГџŠ›УMЯЊl†’LІлmф0єuгњS§ˆQ-$L‘€;_•—еlЧЃ 8v˜Н/і$I:l[їе&HWWЯэXАt‹щрx)€ Пє,sфЩ5žд­мќЗˆtсV.iLAkF2M‰o&MrмНy`™ŠЎždYЭ“&WН\йa(ŽAЈІЪsJ’ƒS(ФЧZ2š§lиœ„Щ$ФwoОYtHКГб‹qœѓФћ>S5ЕvІзFkjсў"KЙ†WХPтЋ? ЉU–іgCœЈ` ЉƒБiœ"#V :ФZздvMйбHJчO˜Y­щ]‚ŽŒщqhЌTЙnD­ф Є—?Fй?ОшХњт}!у(NыївY вЇЏyцЩтбSJR'Ђ ТЂљН&Ÿ…ЉŒёXљ„(> stream xкЭЫnфИё>_с9­˜цˆ‰R‚\В3Yl СЎїЬФЖ™QK=zИнљњTБ(ЕдfлЮ"‡Р€›*‹ѕ~Pќ&†?~“Ч7ZJ–ЋьІмП‰ДЛЛЁХO?Мсo ˆлцoпМџS’м№˜хqЮonwKRЗеЭЇш—Ц§f+ЅŒОo›абУFd‘щz [Щу,TМљ|ћч7oч“!^Щb>сIOš ž(ЯSš)ЦЅ"žИоl“TDП€UХ`›;Xъ$њ~ь:г”'zњјXnсОhю A~*г#Г—rƒbDТ„Єnя?Эгh$ёqyшкЛЎигƒmЪzЌŒUЮЇт“SAEўT„tюTЗ,šj"gЫ Иk;ZєэоLЏMiлбёŠЬqЩxТ‰ЛНŠЗЦЁпСq аFёЅш лlЙHгшЏ;‚—эиѕц<шА7<‚ <ъ§Ж‡MЬеЃёtK45by)т,jQ*o}ЈнO‘s|ь'rэДbŸИяŠƒ­ъг&SюMrЇ2IК4IЊYЬьvлШЫЩ„ёXOheб4эў‘KĘcйV†)j\)Ч9СЮ‚; нn2 ТКЗ#ИЅztЇg\Ќ­Œ4ЛЩЗ@мX0.јкlншl•;y•b™+yџž’9с,QЩ„ъLEЧ{ы­цNщЬБГфwўЬmЪушWаi=AK щЁА[c!ŽwІ|щиvњУўtАeQзЇ4лфPЫŸ№\РЊgЌЦYЊ–^Z™В­Lˆ№Vf1S[†УЁp~єu“$QqчТIj:5б:куЫБG†(ћтМба+чO=ZˆgъG б_‚“яšno{Ьж=с ­п…осAї~9‡dy‹1кЪWацpоHL>Я)‘,Ї"H1‚‡ эВ59 DHЋTF’ ŽќюђюќNњ)ЛжЃ§Ћ§B‹ р1 X=nkKМЈ?ѕƒйћs0Э.а{ЛЗuб…$щ)ИM5жT[ВфьiјрŠ_цHсOeAuв€/уО€t6Уь/+МZg„xн9š‡ ‰тЯкu­?§гзгдњƒiЌ!o§5NžeЈ,†*›$’Ѕyю 3Kр‹sјЧ…ЋаkШВTOћЗ дB\књЧк§0~О-Ђї˜L№Пвбёxt0цž0)п‘3Ќ‘/ФPД\‹qНϘАŸ2НŠЭKЂŽiP"'uшŽе”q|i†Ї ЊЈ/ШјŒuнЙ >ХpгпаSЈCЪ…bљo,ЃˆВ•Ъ3Іxў›m5эСV—Ч8БЯVqХ X$RЫДѕu’AІh,4з1ЫRаЋf_l'ьэ=`ЌKЂГБ0ж0qн›о5|ЉтвЅ$эk9кІєЋ)SвSUИтц;™eанаШ{пb=еЦНšSsc0‡ЇЁ_Шoш?ОK=ЇЯmцХ]jvеrШD(;{hНoнљ фВнрђB‚ф ПЊ K‰СгшяЎ•щe9aaК T2Ё$‹…~]’@-•* $]ае‘Іи{f{ЏргЄТŠ€XT~!Dб ѕ*“ЙŠ$ЕD—кЛbˆ‹=xй~ЖЎ§ŠъšдъL›bZ ­џН/ќЮЙц%ЉŠ~칄рwіСW|њgHwRІLхГюЖA1-В у;"ц:тЧ,й чT%•`B$k™$–^<ЉЂ~ ]EаvуРˆЉѕlD `Lћб*C=Шшvў4HјСъl‡$њљдl$ѓт‘HІ"4JёГQЈЗ•йAŸ9иpл•h–Ў|рƒ ЅЦKV`ЙБf;’f!Жž˜fyцG:Шк;ћДb2•І[гумѕmхy9WgbmЁ (РB_”@‘ни”.ЄB]hТ2>;зTP.‰&ЮащЁш‚mВf< JœŒзДІыа[ёСх†?| ‘kацМп6лegџ Яя^dМј:БѕDєй;t›Ж ѓ њzцѓ‘ufW/r8Ы№(^Іђй2dајr<ъА ГЋЈЬощ:ЗЩыѕy/Sљ|5дгh@ЗЏr> œУЄ$gЪП9Юlѓ`Ко йЩїДзЃ‡”“j~5ьDъТЮ9rƒuФх‘њє„/к'<УVT Кr№vєИэпу­ТЉГ;]ёшЊ>\)88оlЪ)Ќ29“ѓ {^ йRs&зЅ“b38иЎ] Ькчб—мёЪˆœfr9"‡њ ЮВќœ4)ƒ‚*ш/8 LМ);јІСYЪнЙсo‚Н8ЈљD@PГщ№R@Nі`EvЇMh;к;w^\Ѕ,гiк6‹+.Wљ M[§9™њЕЊчеlН цO/І•џ>ё­МъЙМw(ls?ƒ ry,“kEYP%":XSšЃэ=є^Т—h>…„nš лMШ§@ЈЎЭ‚јщщq8ЃЃДdœСПu†Sп„шtя1‘4UhЌw.„И/MSQ?&žœH)хИ ІE0№ЙС{.lх2Щв?Ї„g]ъ"ЖЯЁWkЏz |зmYдцU=дЧІZѕ_jа}ыъю ПzFvєЛ ЯЃŸkюlгx}ЩЉпzСfXФ ˜}ьэu~W№]8УХм]‹>бТ8ьВЋ:ˆџзтЭЋDчYЪ=Ÿџі“ЈLŸ—Т$БnQђsчіџ+ј…РхrB.Кчœ †в”/щт§ўoє%У\r‘Їпњo9СdЙJЎ;іт”ХЩХHіЃЇICйН/%=н@,Ч`€NhˆуЇSР*š.zФUC§€5^; ќЅ-Њ fwm]Ля'Ч9юnЭдЩ'бнŠЄaяoEэ”і@ f˜ЇUт/_Yќ~‘>ц4ARK…u(ХDЎ/дИ7}_мНТъƒy^iѕЖ?дўђ( ˜Ьё–юВ!:›§§xя.yИž?йсК:цмпDёПnU›Є#(™€пFыєЮЇЎ•РчYёщmOч€к~ЛтJ‹I€†Х%KІСЊ\]Б‹†2ёЄОЁslВN˜ЌџЮнЮUO‡MyЊVёgу:ˆ$ѓŠItDwіЖk›НЁяaєтС}“щ№Ыі.dSЎrІхкW=oЁО†уxбoeЊшЮ&бCзnЫˆ›ztn@ДГЕ-ƒнsгH™Х‘нYўїќнЪM> stream xкхYIмИОћWt|R]ВHэ““З6:№8ЦИС “ƒZЂКЋЄŠ–юєПЯлЈЅJ8Ч 0аE>>’oeuхС?u•zWБяЛi\хЧQЛ‡+ќђс…О=0юœoю^МК У+хЙЉ—ЊЋЛryд]qѕwчkS §nяћОѓЖmv:vw:qLзW0нћЪK"'PЛм§хХћЛщІPы 9/eŠЮdŠ’РU~Р2§iЁъЊ№жW7‘^2‡БЋc gkVWˆъа)LYС>›Ж­ѕі\_'W{хЛ*ф­яЬяž УЪgј8x3ш~^Т;\9t%ј„‰раФ Е}(“­ћ‰S„ўиf= п[ЖuнЂсŸЊцз –4ЕM§ЬќеN9х–H*Nэ5#ЙvC_ƒ }ЫVЩсни4гхOеpр›Оонь&š&ЛЏMБm %nЇЎЌё˜u[>д‰љ“9LƒlфУЧЌЭ~v§Znи–F8Q-m ъ8˜Э‰у{0цЌ™ЃIП1­-ёWŸлIУ!˜iіC/ЛШфШT•rЯ.’{LƒМUз6GЫ9Л0rВЎBƒ‰*щЪAёЎgа9Л0tЌХжЊяэ†•ђфК4rzƒЁš†Юа2ЁЅАЦA) !А``eйŠЖ6ЋцŒЙ?eЙйїц”uйФ50рюі‘ЏœлrSU?rƒФџaU}Я “`РњGБыEё*ƒ›V2єПо J?u8ќ‡ђaђХЉЋи“’YУ‰`КЎэ˜t4}Ÿ=Hъf$sѕаДщW™}ŠИ…МržтлiЅt •+ОH+д}#Г‚аMTђ_g–Rnœшяfж"тџ2KЇš3 ˜YјЛˆ~"Г~0Њlh%+УzЪ МЩ!“зЮЬŸКa8eˆMI:ЕБїШ…)Й!”Єdр{пII•ЦnЌ~мFѓH/^#ЪˆuИЪЭяЅЄі еџVJЦ  œ’^ъІ>t:5:}U yљЮсO_сЌ8tnv)ДUcxіkГrђуC60Ф‚ЕUnšоlЦЄД—iпM’”/ћл.ёgˆR+зПц‘Яъ|jйЅхŽјїž46b-эy ћNЉШеиЕЁp@KІупЖ'мђмUЮхєc' Ч/;Ањ3Š)aьйу]@1ђ ЈoЙHAєА€Ѕk[аЅAШЁžPЈУŒC=РД vXЊ($ƒи>Є€D ~‰кQЌТќШС\Tх3G+(лAТŠ§Ц—ІЫ+ˆиgfГG6mГ_ЙPъѓrд@ˆп~О˜М…bиULХ›ReS-ёцpФЩ кЇщиZВ^вЕq*VJ6"тИх й<оap‰З=Ёk2ЖуFмй7Ь?j ъаМљюГЧTг(sлŽ"^iчщP写8ЩEКлц`€О*LЧošиŸ8o€~oЗЫeбь"ФyЦјvCєcVXˆБЈˆ”zŒ%hУЊR˜ ƒйш8БФŒОUh8"Є ПП+?АeЗ6х№tзQŠКчH<0лбd%@F vХ€qЮЄ“[РŒ§њ*FžИяМшnZ€Ъ}9!єoŽНЉчшšИ‚'%жGЪY"(ЎБр]єйQ–А2'†q˜:Зr DљЉ6VЈўlџcЪљ`гaЩCъg Ь|#eФ вOцœ{Чє­Шt€§f45)Дs№г6ЫвеRа МZQ›M0р%ДЌE йЏ„ј`ŸіЁЏ Ж‹-eq•l&k *8<'ЃБXРKжX; ЪK-%H#ѓм,ЕsПщЯVDѕgр mЈ9ѕ@а<пžG tю/аRЈЭ=gж‹~D9 "іШ=Kn 5Ќ}шВЃмrhЧКр1„ŽШe™Iе˜UНŒ8ŠпЅзIЈС@BFвPzЫ€ЉчЋpСJЊЦK  TбЪєєxK7д"ш„JЮšk3L,‘Ыœ_W€Я( pSЛeю~"CУ™}ќgЄЦ‚™ Zђ{+Zф.LРŸ$Ж#9с™'IFJ8UЃёфЮ)œo…Ш?nU!zB(‹йp$~@џЦ‰ѓeфЏeŒ‹&}хpj—‹В,[ћ'Hh[Ш\єшe˜еTИžїR^aW=ѕLќт46SТХЊйВ}1vі1B9 XР…>э Љ­œc<'<ГЖJ­‡%ІЕ_qЁјћЎApіуЄрќ:QяЮAЭЫы-yХuђRМцлёзJE(fzxPMця…ОR‹’Ј№Еb§‚Гe2рœ2yхЊ@`Ÿз…“ИэтƒŽ’З’Вя(œса˜ћyйŸ§eD ь—QF(4Z€ЉкгTШh>ўX0ОD9ќЦ_Z„/ЯЭiрё`џcfBHHхяО#Ї№dzbёгD'Пcz!1Z —ЏЎе5SИlјВjV(ŽсдЗАўkЌ:љp8ќ.Р/}?] РщыЧК2аї :ђiњЦє ”ЏА endstream endobj 447 0 obj << /Length 2926 /Filter /FlateDecode >> stream xкYн“лИ Я_БГ/ЇYћєaљу1—\вм$mІq;™iњР•d›,ЙЂtЛлПО~ -;к^ggж$‚ тKЩMLЩЭ&ОYeй|ГXпЧWБ@Л§ }џ*QКЮF”Пl_§ќ.Яo’xО‰7ЩЭv7fЕ-oў§­БНЛ›eYНi›Лt§~—ЎЃЊs–ІГ,‰зЫh‘о§sћлЋ_ЗaЇл}ЧЌhБЦиЦ6{ƒ;!пB*ц8ГkŠN>KВy’у0цnЖHвш$+кЎЭ.’DdfŒэяi%QeiƒРЂ=Y>.ѕNLoBšђNТу‘–€ш8VTaxŒiЪŸ=}пбйkг{жтЗr'*xгB6к4ћСьЋy \в ЎУ}Ѕt#|__*R\iКg€hку–вuYЈСOcŽ,‡@NаOе”і 9чбю.‰:иh?;šОЏяА….ксWnŠ—ьkЇNк н`JЧ,+SГйзSQЮBљѕ3№а7ЃБКЊ†Жіˆ1&9 ЕuЄKЇЬ@‡ъmЇ[bav^xigзвЋ№DГˆеєy0iњ?9 [žЉA™Ка wГ<ўEЊф[œЧb3ЬX7ƒŠса7рˆ.€žR)rєvt[6%yFдL^Cб5sXdбЮдФЎЦЄД ЦWР3ОЫOh‘ъХ1єЧsp|ЎљнlЕJх`лы’uяXAќЄшMлA‹lТtdO6bF{NІSЬЄmUO§о>ў“Iѓ5ю:E*њg wЯћСр 1~IDOSЖЗ$ЖXЛЌeЙ”€T hѕtЊU’рсЎіšыЭ%›hЫ|ФЖšАЎ+ыоах2yЫкуЫЪт8Тё*  `ў…ђXŽJЈƒu}лй‚юVрtО&<^Туq1Ž–—–)ЬКkbo—ЪW+хŽёьВѕСbGЕœ™NГ7Е’эёXu… €гСж­kщЇАЊ?ш!˜™2Uџ^лўŒS˜Г8#ƒКjoК’ŸТЄЊŽ“v w–ˆ‹§аРжI-ІГЦ FЋЛuǘš'фq!'e@уљйYŸWcіxhЎэm_WЮѓT`Y9ЛoXѓlЗТИ ћQлЗŸnјХ‚+ aIєA|yy"ёнуІEnaЂ,ШцmQy бUЮˆЭЛkxXіBrР(ЋЋШЈ*уІ­jhJ˜6Лx 7Т“$Kу(DRˆЮЃleq†1 S<)с *yК чинІO€мїСС)ŠЉo[1тcFз +%АКuSЧ‚ zТuнђ•<Ъn%€В}%2афlКвL4\)ЙOж iVl™‰І’ЈœrВ<G`џУVu-fгOaтlоX†4“ЛI}B—Ў’ш-{еыX+$%lEЬХЖB„=ЦЖєлн3жœю*О’‘V˜1ћб›ƒдж^ІŽиG3ьЋ†s^LЄд(DжЅі˜ЇlfЕk'ЭЖЋ~ЗEяb­ћа Мі‘ъВз‘ЃВвю!žRHS–У)т3(4[Ѓ‘Hk х-FХЃЊД”j,]Ќ‘Vб/чы;?БG8%SІ6›оч\ђ8—š|.“шdŸЊZыž9ЩnйПLЫN]ЛяЬб/Ўˆ~ƒ4LRvrCЄЉ_зrRСЃG[ЂnЄёФ]2xФbТ Ю}вя5KжўRЩЫЪЅ&›ёЅв кbts”Rl& њ•&טћEaЕњVJх э Ни3€sёбЎъНŸкhuЛЩukрYvEЌВѓegdgШYі9'ЏAqіLudЇc4D3й#{>ЬЅЛёh]5u ЏУЁ-“ ЛТдПnыыцсбtп‡гEГ†тљB)|їgD™EЃ=uЄUЃ+;eя›6WЊїБF,‰џIA*v‡ ЛДŽjыŽ&ШIђяскˆfЂФƒЏ1iЬо]Œ*'Zxв`Bgў‚”—<р)u'ЙZСЌщљ( Ц|/3.]АУяра \ЉгрмрЃ Лз$бŠУdŠc;Œ™ЕЪŒЭЄЯ)ОПdnЩћb6Mwњ?baхАй"ЂšБщuХ_N†.шv28ўњdŽ')ШrЊ3Xр<П$ž…GЦ$Ђ†NZ5SHЛбШ6E=”кJ`јы/o>ˆ|Рœ}z;єгuЗ57K5{АЭŽНа2 މ ФTТf+Ь’хfОZ'7ГtžљNѕЏ‚YЮуer3 Щ0Р4Нdњх§ЇиKl‚а_=`а ЗDЌц8 бГFn3KVљ|НHЏКЙ!™A™ТлЗКќ4 идЈ+gTУАDК!,пЦк~њЈ ?Kћйѕ_ŠЮžДU ‘ їі(ИІЫR=e-т †Ѓi4Н‘†T1узMЦНLђ‘11-’(юKЁтэdх“'<` ИЗž|ўѓћ{АљЪ’Мy7н].сѓ~ћќ~ŽlуР';O(2Ÿ8ВH}ћЉV&4*јќ<ы‚Œ68SТ998кNцsm#YЬ’НВџZ\ŠСHŸа4RЅЪЙV:P`Œ;y‡бФd”“^М@žњК§FаЬљcЉv?›Qž4–GГ.щjіюкдYSyKтмNЦV­_ГЅjœШыiд@egdЎўпѕ˜бѓ PtvъiлH~ЪЫ%Œї№šћЩoЮ2пcL%1НQD8]ѓb+xo§ЂЊŸЪ2џХ /\^#rбч1бТeš›Ÿчfќ<зPjјъv X(ќуѓeё€вZєше7B3$л‡.Cьг>QRнwіaш+eъs(‹Шм9їљ–3пЛ ‹ЮѓєGН НШah]Ужђџьюn endstream endobj 451 0 obj << /Length 2857 /Filter /FlateDecode >> stream xкYK“мИ ОћWLљM•{ЂWK­мќкЕS›ѕfk6‰“Э#БЛЋЅ^=v<џ>јPbЯhœTD‚ ‚ј]…є‹ЎŠ№*O’›"н]•Ї!SћУ•4~ўўEЄ|bмxœon_ќёЛэі* oŠАˆЎnїОЈлъъ_С/m=з›$I‚З]{чСязё.А§PSw“Dс. вфњпЗ~ёўv^iЧџЇJрќ:EQt“]eЛє&JRQы5-gС`ЫQєˆЗСЏ4њžUыББ•PџёљŸ/…љdM;HгШXkNТF’ІЛ‰Ж*n/ууб с]wНЁ]—гЩЖиОђнЏЃ #™Q`uV–A[гє†ЁnЂф&кŠю5”ЗСЙПцyQPжƒm@MЁЏ wНЪN–4uЋ•% ъV%™^ѕ:кС*зОkšФћК=џhПŽ28ЭЈДžЌв˜бЎїuDyгvМ­Mœ'AcкУdіцz“тТmјСіVYPœЇС0šЖ„Ияz!щg6Ќ-ы_У(-u‚;UpрŒ„ьlOC85 оЩlнч+єp”%КЧUѕy—ћЪkfћвЪdr˜ƒuK№‘О|џN˜ї­ъв`щAШЉК[еѕУ2ЭЩйэ˜чC=Œ]џ№ђ†Ь‘Ё’,ИНо%AЗhђSOЧжK`­8ŒИaЖ nс]№цЌ%кМ[І%ЮqAћЃmeєœн$ф“јtUя„ ЫЋоŽ ?ФЁюCФZПН=ЉƒВ+І_tJ’GБът ’A Yj™ВьњJќ—К#l–ЯkЭI•…пPр’ф›yенMИ‹eе[оЙѓкІˆ|2ш<Ь.OСM вTщдПуИLO"— яъЁlL}Ђt(„V#LuE|9(pъRлїЧz>Е#Dу/㡘OїœЧС$І )s>7Ее^пЃXэ'ћІ`нn fN\$ч™=BРХБdЏЂ)3 uE_ЭЫЏ(Ў1JžOБєФТ•аяtAД{Л'™mЙLс/o 6@Gm№ ёDГЇQШ]лА˜]„L_iЇв­АCыИьš љЇ•ј“QFZ–є‡f}"лKV!еАH9ПZœšdйд­‘Я–M}я=`нT2wGіЮпAБBaTN]]IЌ4ŽFХДЋghI(%Œ\0Š‹R>'˜‹`SЃKœmЂэMЖл^F[LЮ•ea№Зї?Пy К§јŸ~њќёЧяyъкЬЯœ'Kюй€:ewіzВгykћšNоЪo+ВИбЮ;Ь)­Њ'rЋN€iчюm/Лљ}Y›Іб]ПfзЖk/Xi/$m†tЩѓѕђ{-ЎžхЮIИХЇI­Х1GЖ’-[яыУбm…Ш’Iх‹dљ2­бБЊЈ&Ё"I}rрEьК№3L‘ У…4Щšи˜]хЌeV"Kš FoaОkІ’sК€ЋiЄA{­yOiˆSОЦmАvТxqс.Ыйaа1Ii;!8RhЖщX _ƒpо“ЄAдВ i…ь„a ьнdЁK`yЫт.GІd|B oŒмOжђ•›зzжћт0ИSI(Ж 6ё,7LoЌŒ2п;Lта$KєХќБт*Œ;ѓ3•pœж \6GХDX–Ў ЊAунЎТFО ФƒФ™ђљ‚кlѓT‹Wb№L-LЇЋўщю sшߘ}t?1рТЂњTEЃї5[ >'Ѓ9.g€нjКhъЩ‘йO}"PРrBPšpеZ‹"ЩN­šdUFлнrѓ`hЉЩ1Ёв щ„aЄМТ( ­|ЕŒй=ЙdЇЗ ‹{єXp‘#|TЬ†Ё–C”$œ.Ё7TMŽjs…ЦЮJХхAIвQ8ёJ RуЄtnEG!в:ћCОјїv‚Ÿ‘Џln­. ]AE Љaџ Й~Э€СраqсЃСТGT4Т€‰ˆўышŸЮцЗЩЪи ІРЏГЋ/§з`Lp & ЎqЭЗЊЅ„\оЛ†Ј7Л$EйшѓcЮЅИхв;RBн ЄЃSTО<ёŒЏџфђИ™yO'шЭ2сœзАЊY"g3­(ютжb'Ѕфn+H^šœewњп)Ѕы…зЩэ}ў–Aзг“zFц ž81ОчьЙqU7SF­#ЁЬ™ншj]вžищ&’Ž<Нцў№т.Іx=ижіˆtZ{БЬfфш3ѕНRкќє†*еAлœ?ш[Iэж6Љ„2KйЊ” џObњъёЊ9onхLшzuЗ]ƒŒГГpŽ&У5–пЦт\œч Šй–l,=& Т#Т“``Hфg­?…–­№Отё!ФнбtСчёЁћ­pРŒ‰oœe}Оf9у@Ё@Z\Ю[Тˆ'ЯOшЭ я:’]M•g„Œќ—ѕ>ћw3­!›€сb5­чў›ЋMI;ђ$Щп4јК”Цсœ€@Џ•`“&гQBA.4•)АPЭ3ѕ*BЃТ="FХ3ЇЬx9хbђQё0'hќƒƒс­m*=УЁЇЎ%ч€6:N%ИzэЧ1HЄIwз\N'Р-Я+вЅ+NlrуЪНmџhНЦШ}“а“uџ?џГX@ endstream endobj 455 0 obj << /Length 2500 /Filter /FlateDecode >> stream xкYYуИ~Ÿ_бШKд@л%ъЪльЛНиЩ,2Н‚Lи–l3+KŽ(OЇџ}ъЂDй$h E‹dБŽЏŠДК‹сOнUё]‘ІлJ—wЛг›˜ЈУсާёО 0nЮžоќщc–нЉx[Х•К{к‡K=еwџˆ~ыьшю7išFяњю>)ЂoїI5ƒГанЄ*.ѓHыћ>§ќцУгДS–$џЇHШљ?dRJmѓЛМд[•jы…ш/їыЈЖnьѓelАŸFІcњчГљїЅсіЎ?у”Wцјgqm‡f7ЖЏ<оќC9™Mv‘!sh:$ >Т)C3л‚F`UХћН_ЭŒЈ8ъFЅ[•БєMmGVЈuьё‹М Ю—чжюЖгМr›ФO|ЅЈ"ыј;4p@76ѕєЋ8№@з3д3@40i;;6эhv2ЪТ@У\юєњAvФ“-оƒјАвюrэ0љзkкvqzХЇxІЭОp …Т^—бv&›NL†ж a'ђх„џeЉH8EЦЖУ#Ћ’ѕЋвш`П‘LЬ2a/hЋшФУFІ"Ž™nчY{ўž‡Зќfk№*М5№‹…ѕЩ˜Іcы^Ю iеŒХ”eЅь4фьšU[€H %šс„ б2ЛЧFeлМЬ–NЂЗї›<ЃOŸп?~||їіОLЃЇЧЯљBS3$ШџŽ,ш XюdPЏмЁА™zІЋQпё"тАoxќћBmПЦJ7ТћЗћROчDžПtЮфЦ… t!$_К ;ГBUbGEnЭЗhё4ŽФ6А9ьЉ(a"Ы”Щц™Ьf%чŸI2šZfpр`k \ahкЦИЦѓHуV)щ!ѕОїѓоИГЎLZ9йxЄЈўХюšЮЁЌiЂМЏЉjђilbп™E@тТИЖ­\)žЁoeЉ`ш&оE иЃRDlID\xх$“їА…fУ`уjngfЦ’аИб1—,$v‹,z9В>6ѓРЃ“НsЄzј8‡?sЮ nнB nДжбЃФЙЉй?8–g”…Ю їОИ‘{u?…Лk| АшиЧ]л-!]93Пњ3Iв•хо $ќF;e/yГсЩŽ­4E™ЭAz˜*й<РNjЭЊyкЮЧA:Я"ЛчAСoN‹8нШьy/tлQжё§аŸќ”Ї2q@‘”№Ћмj•,jе'KхнJљ… JeЄhВKa№5пlOž =qЧрдРЫбюpх#“мБПДЕьbї~щfЅ_X!дKІ<ОљАтC’У€WЇ8Ž3„ћko ќƒ§№ЪTA8ЁГ„Ќ7*A+ ЏB0Lp3юйЧaжХ5Wы8s’ZM№zf}T0ГFзНNt§`Ж3mPџИ#щ"-’KЌ-HЉHВсYŠ‚“uШуSeБ­ВЋИјAттЫQ™Б‡УwТRhћи€Ію'п •H~ сюўžИв Dsь]˜ РЃ‘‘ЁqP€ЄЯ^Јš8ќqfG)Ž–vЩ%бц>{цkшъxФvWЌ+Љ<xEЌ(џBƒS1ІЭ fї‡fBВVVрIр‹ЃcТњxАЂ EЊ•ЅŽFfэuжЩjж6тЄrb`ЦP|ВАkчІpxхWTэ­Є3ЮЮЯ 2џtU–[ЎОЈѕо‰ЫЭHЋтѓ>arј2:s"т4к1$Р ‡ц4Tbш‚7ЬбЛТr[˜1Ш몘J"ЋaŸшvŠљИYЎ—ў^Žћ+DS3|cQІnлЋєъѓ= бQъP$У] ЊЂQp[Лq6ЙИсэuЉљ"ЪлZ№нx›3д›рl­Џс;Ynя 7ДюЈи[pкЄў—йЭW4-Е‘ж3жїЛ.y–-ЕН&Tъ…r3ШІYВ4СG9їcЗk/5AЇр8ржGЦxHьGrš8‰€ЖЖ'eOYЩ0‘KЮ&фре ;p…чѓЪgМjт=лŸ—ХžСє*‰`Иѓ]П”'‰Р˜ГRoушВфЧyRђ‡3сд'Ч4ЅRт[sЉŸ`ЅбЩ”Ѓl^pZCЈOP]/нw IpСІЋ/'юIвђœ9˜ŠJ--љуj0%YЬ’eг5 Z“9АуЭС,иаUДПЏ#Юфr˜ЁГpa™Ar…Ш˜p†ОЬW;эяЄ@і/м{ІAј@ГŸШ>џё\ОŒјžжnB§RpЬЎ7СХЌEЎV-ўДŒ‡ЋwLЇІЉxTQНDІk ђ№/nТ›ъmЂЏЖ|\GС,ё•|”“аљр‹‘–(_UЊЅќќЦ]VЌ,ЦO…а BlЙс@4Е4x2ЮІ4аљ~УоЌєV K9ШVФ%•ј•r›зePЅRU’ЊЪ 3<№CO)›—ЙŒРщы6|"IуrQЦ’УТMnsXМ іЕвXp8t2Фмю „}ю…ц|S•юyєИŸисВЮgЉиУ{С•!2Мfш•ЛУfэ сЋ‚\54œЗŸИ№-“Р\Ѕ’u:zЏЈЄЂЁ“™ H\,ЈЃ+o˜кЃ”‹[щ}Зпэ-‹є5ЊьИлЫ—]Зšk Х>1nз1{r•ГчвьцФCuуvƒ}цУW>сT+5 ‚\НVЁ:§uпvзЯХСe o…ќ„жt3eл2Э—€№ѓwС Ўq%Њoћсw&ЖЂi3N…ŠuёоЧКмtS?К{–ЫЛCАЫкѓ1ЙМ?†ЫъЛЫИ@я_3љlЁб‰Фv Іsg3eObЉNфтьT'ыo \Ќ1OkЇCНX'ГdКZбZsь РРНьI^Ѓ`xz&ољ‘vkЁ”ЌЙЭш1ъW'XТMR>aи‹сЖIО@ы№ђD—.~•KŠŒ5\Fb+Oхђbˆ$вЭ4Oѓ/2AћBХгщ>‡/‚‚4ѕ‚ ЋdJ;амsс]%‚g†~&ЉИЄ*ІŸ8*я еъх'ў4э‘Šг^ЅА '%е+qeс^БФеЋ‰fŸ ЛуОмђЧЈХ‹JКњЂ‚?ї§Ћж0 endstream endobj 459 0 obj << /Length 2614 /Filter /FlateDecode >> stream xкйrмИён_1х—pЊЌYоGэSlyЗœЌьT<›­­8 isШ1[кЪЧЇ/€ E9Љy`Ѓ4њю&иљ№ v…ПЫЂшPФљЎ:П№ лпяјћЯ/Yw Џœ•Џ/~ј)Iv(ќ"ия\RЧzїOязVУў*Š"яMзюУЬћКsOѕƒ†сUјyъХЩў_ЧПМx{Д'%aјВ„+џOAт<йЅy|Ђ˜ћыa•ІОїг>МЎп_…0([dю‘ƒЊFbo‰їQЊѓ H§ЙТѕŸл?п`ъ^б@Ёя%/5фqЫЕЊuU"ссх+@g‰їЗ^ ЊgН№Тё$РDхь‚ќЩю*ˆ№!К;XTВсЩS3њВЄнnяфAйьЏYЏ˜n‡Бl+Zтcз Šйёё ˜'Эœ–3H eёEŒ€хЈ:VYЏoЇu…о‚ВgUK+књ^{ѕЌUžМз,oЫѓу D"Цzhкёsd?.р›тH<їqЅuЂ<§4 rx'žЄ^йkіЂ‘Ї>ВfЁ&;Џ;PMюU“ŒћЁ7Еe3Њ —ЁСdŸюTrк‚\ФHсш–6Бнˆ њд€вЯсq†8˜Ю(Ы-К&†)Ю$фСB†ѕeв,oЃЌИ€/{Х;кN0`нAз" Œ/e/3Є !Ксж'бž†i2WшТhi­БжЕjдˆ,DйЭ8pЈeЭЙfФ`hОmыЎf7{ 4у$ё>NЦ™‰ъНsщœФ’G)щАК­š м”$0Ќ …‚’†Сeo:2A­?љAЬlЦо?іy,ЩгИn~ˆƒpЉŒїFfи@8 |ЏW$3cgѕР@=шaдэ=fсŒpо<‹Ш•ГЉAž"яq(K€P‰ЎFЦƒь’тXG-†_аЬ7=žX Ža#ŠНc/YЦL‰sЯšт ъhъУvЏЯј ‹Dйї†њ6иd—Њ!єšя\ЌРl–PhD†FфИ]1'м­ ЎЙZ‡6žўф'>%€ЧSпMї'P‡ДМЇі\жTп#!лYп:TY”ЩА< ŒcqEm)+Ÿ\ž„lгЋВ~м№HЇЃЪBrш,‚LМpDЩн жpцЫЬЁ07”д(jБ]XНићхW,ьIЩ `ŸQfц(аsCц0›”Г'JнВ“h8OgЪyfъxj8H™W Л,uШSЙОСцВ’л )Эхі>s*›;™ИЃлЊПЄ1{ јъ)Лс-ьag€.­ої:7жвЬŒЪzuiЪJЬaэв5Е-е'lЗZЦЈ‡ є(zф‘дЂўЌ)ƒ™э-\‚ЌR\ q4нB.9Y9­њЭeФИ9f,"Ц6KТ‘ђLVHѕС№8HIЙ ЫСj%ЖLњ66ТбuЧ_2 ЦЫxГњХts80Я(ТСJs[]ЧВNдFЁ}x\ ~(=‡L“P•vЏTvЮ<š=Н8sк‘GFйоЃoО†syvЛЦuwєд–‹”Ю7ШфцЩвx‰м п|Иy§ю§Лї?ЫН№У›_oоО?~ф›­ЛёIџ ХТњ7шўюЬоjЬŠˆ$ыЦа`mXб|;FHњakЙPMN“†ФzеЈ’›хš1S[›Mь ‰+Мк2Дй†5вf'MuН0Ф’ŠпEƒŽˆ˜?%ч'Ё2Eђ\p^пEщ<%˜‰т`нpІЏDb&Ѓ<[PYRў3Sў3PЕЕ…ia–n‡pјйхйs85_ИЎйљ<)hEясT™Ўз–žБЬJYд5й'лШіD”ЃЮ 1 ќ}цYЇ)Є§Ря|љщеЯњЏœ*нпgqпq0LqкйˆЏ”ЏьЋЏyв-х^8WŠ(šЛ3s‰ф{> stream xкЫrл8ђžЏpх2t•­ >kOоФ“xЧcO9šJmэь&a Šд‚Tœќ§і $(бй”FЃбo…gkј…gХњ,SjUФљYЕ{Г&Ј}>уСУ‡7Ёр]тЅ‡љЭ›П§š$gсzUЌ‹№lѓф“кдgџўlЭаŸ_*Ѕ‚w]{eСзѓ(Дэ L/UИЮг NЯџГљч›ыЭxRE?ЩbўžТ0\ЅgiЏB3[7pvœЈ`иjTнљz4m9gЭU№юŒB‡~8о ЪчпqНЎLЯKзД4˜Ёб5CўN>š~шьїЗ 1Ч}=O’ Дчa`.QLmЧ@Кq|'НŠзщHW—dёл9tфdQМk‘ |бnц”,Чъ~O4@b§jD^Ƙ˜,&c‹‰§mАeEžАС$у;тzНd I№dС+2ђЁBјжЃЯŸ•иаЫГцё@~6!HъŒюЗ>\.]Є€чБ3‚ў…ЄQ8™ЌGй‘Орњwœ“ `bг<.љ3i,ЮШ)фJ”ТЃяі“0:Ч‡€EšКў3Кр УЂIВ™ЎbdƒЃсz=OІгV ќВ“†SЮ”їbЌ%WєLaЗ–p™Л”х‘•w;! ЧТkАэЁюмjѕКыЯФѕ_!т‡зЎP/10БЯ7›nюо_џq ЬТїnУАЯИэўсЗ…Р Iй ’%ю№Ж{TŽІЧПЮљMщ!€}FЬу†QСб)XFс,ЭT[У~r0lџВРnіШ+РЖ^яK[’’Ѓ г#5ан=ЉaDiу№“WЁ_Зќ}!UЖ_(Ъ8ЧђзщТь—ЙwDoш–JТ~eS ђYЯIŒvЪвШ2‹УЮ(U ‚z1Т•ИM­)?(ŸŸ­~qМe˜yт/? œкAЪЗu`ахC#Ітtцwћщ‘tЯпЖ‡ž3•5[+|Г3УDgї˜ЫŠŠ0`Ž2zœЃьЂ"bзЃyь1ё‹ СЉЖчеGЖFv?ЈИўBФ„4ƒќ€N(ер‘y*F Щю€y0џy кqЊ<XЂш5эŽ#і™ˆтEašёjйђ||6ЬHтиHИв‰hLЭЕа$Щ™§}6ТPєycSY§ЈкlѓЄйJЙWOМўВ5cјСU+hђќфšwНnигIС&Іœˆ)sОpOт8%3™ЮŽ}Вщ.Цкд—NF†ОуHФО–Aє{,гъџŒеS„E”NШє.uE b>NQТэ?bАІ#;† ›[М-Ћ(хМœњ”GOюuБьѓ5rБšHЖ†€yТœбЏg<ШДz†@мhF•‚Жe#ф˜ЏФ‘M‘‡Б‚ъыc”Њ ё$aџENž‹~сRю!ФШЦb'bИb~˜‚‹ёвkРЗrд1 ƒ6lЗ%Љ&W$ƒ[zK"CЃ‡`bк#мйН‹‚|ДC8Е™—эZ0 ЮI@ЙXл›)…3œdКEЮЗ@9h?БY*‰ђdЬНШLёЌйй чр­HШюбтЅЊЮ“б†Ы…єМ0=ч YZtтіV1Wтe2џ2dП.Yс'ЩІ'™™їЫЖk˜):г § M. Эцсъюгэ”ЬМVИ’ЖйВэ]ФŠUЮООT–‚k"oЌ *ЊќХPЈ8}СяŽпЂ6­УИл:Щ;ЦS]Bwщ>NќєчУФMПXeр™ЙЋV`А vѕЌ:@АъyШdв€]’84Ф СЊЂЊqЙtќ›–u’Ывв?щгдЪ%љZrVўН œЌЬЦйP§ б0ˆЏ=З№ШŽрVЦђpžЌщbНк2Р”,‰СњcOoQLЭŠSЋ•HŒŽэшUТ= \щЛˆeе8И‘.ф‘Ьp d†‚АžI’›Aum$ТЄ\вр*;Ÿ4їкpіšœЏъ‹bоKљ _ˆхоš,џA•:JЧЋ1п>эъІияЉЬЪPЎœ$и,e€c‚“PFгž'мЯŒ\?3:ЕъБJ/Іfои@ ˆСŠгZ'1MЄcњЊ)ЭŽu(ЮУуžJ=9ЕZ,•й“иpТ ЋТ{Qœ]C­oњ-O\,чTˆЯ)\ъЃ)ѕSвћq^?\JY;в–,žd­ВDž+ЃЎ“ †“”<­T%я”чЯИœч-%xp/ЋBЄGЖr’;ЅšZ !йБ^!СЖ~%ТP–њj˜Й„2ЄВ››.guгБЏњ}…”ЫЏœ+7РfiЬ—&YPЋУѕ-‘61‚MЉ†ѓП$`я‹Yn&э­f5ЭЋ9­ YЖ№™Йqљ2+сrО€xxч09n#УŠыŒчмЯ;уa~ву0 GШ|4§b ‰:§”BIŠђЅм;‡CжЩzіc€†<$' ›џ€xЂ­{q„PЛQ6x7š/1†5zк=Ѓи›ŠЛ]И(ќ- з=eћ,ѕБ—Щ”е@e$‘‘ф0…ЫaЎ~ПЙћA“ЗЃдsв0сš+ђzП€‰яy9Ы“эЭфŸ#yЦ(w #зБ‰гыo•оЫИь™НпЗstЃ\ ѕЭRр=rВ‘s™HЏrV ТЪ@ЭЎF—Kх0шн~рI7ЅЙD уЏkЃїЇj:e‘dОH "–ВzЌйХ…p Nэ™Эž‰ омHоьт Йdъ )”ЩГbвkм=хaшv`UЂ|Є;˜ЕЅ#+}vзuvНIГ]_VЙFGБЩџ џУъ№| endstream endobj 469 0 obj << /Length 2882 /Filter /FlateDecode >> stream xк]oл8ђНП"шЫЩ@эˆњіНesi7‡І дщ‹л{ e9&*K>IЎ›§ѕ;_”([о]ˆШсp8œяЁеъfщпЄaИXFйMОуДyЙсСчo”рЭqю`ўєќці}п(Бє—ъцyы’zомќзћR™ЎЭУ0єюыjЄоїYyEг˜ЮCхg‰ЅГџ=џћЭУsR“%Фќ ž”R‹ф&ЩЂ… #fычЙ8+ГЙВLНŽх™-|уи{Eh}ФIтх…n †ыВфСwS—Ку›J-ћКiyєбфDПš)ЏХAAGј€RШ&9Єс %lЈјœФл6ѕ^NdРA7@Ј39’:ТАˆD1WсBХ|ЛМ> бзЦМьpаСюeрэъrS4<&слІj;нžџцЧО†ŠЇ‡†ѕн КркЏГ,ђр ‘ŸzЧЊ,Z!Ѓ+йЌш@SђЎЩƒ?gЩН‚т;? гС‘ѓ(Jј„(ЁC1+яŠfo*И@ЫѓAœˆ,тDŽгШвHш–kО%bfsRџ^Wѓ =й†ц€htм~y™‰ євN3oЋ *ЋхYWѓЗЊ;Г}Хqъ˜,!"IV];јšNч%ВЊz/ˆ )(j]ŒЙ/t%ЇаtLнŒyH|оИбDГА&НэшрТЬP3Д-1Дш7Є ™№ŽЇК)иnЗŠcpџЭЩEЎБУDŒ=bcG­ш,§ˆ&NѓБдS2!я€ž5LЩАс;2ьk:цл)ѕёU§xвrмЋЦЈH4Kр„МY№ЃўО4!њё@зе)ЌЏљ•Ч-ыгЧњ„9щХЉ”2€Я_І=qd­i…яЮXкƒЩсuДш+ѕњЃѓТА7У5sYЕзн"vniyњиыиЩяЖЕHMWжŒar"YЁ‰~“шуї&Aєtї7]ЌD7(ІXœ>Œ}7š+/?6ƒY!0svЪў3ђ@ }ўіўBЋжE†Sd[cMdyшƒГ„M[,хIПzЦ $ёNDˆШ•ЕЖ†ЁНDZž+БVŒЩЮI)ШmаиW’6дZ:27n]~vпb* œvp@Є–ƒбQFШиш*6лU†іСXЮхpОE1ЃЉрЄW3NфкИ™Mb’‹й<ѕ}яq;к7yDFЌккeJkk&ѕ ‹QmxNF@ЉCТDШt<Т•!rKёФƒьCё"!ЭSыуE i„,Yp‰QЎЦŠVSx€XПGЫЏn0ƒщ’УџЦБ@e С‹БЪDЌСс`i№vXY'ц•šсЧV7;Р S7 ЭGfK[.Mœъ+=˜‘цѕcпЧ‡KЗ’O—CжE<Ž%ЬgM0†в#ЭЮœV H—Ьi›Z˜іЊ":ТŒц)VЪƒЖВvЮ‘lF’.ЗЭT[d#])обз””ŽDCЛЂІ•фOj_ШLq]ѓ‡vRяЧ+Os]I_7rТig†BРїЖЧ›ІK[?’Є—!uѓтк-C.оф•–Шыц›`і›Кlk!gпE7EлП”BЧ7! munJsЅ –gР^|MjfKйМJ‡]ѓЗ€єЧM>(Ѓ•ЎЛgЪДн’nrС2пŒmзЕбdЫ“'В[Ž=2ш_ њ•z(‹ОйŸJКC‘rФOЏЌ­т8$†~a~|rmїP3hс˜ю­lSыIСэŸюпк ьcѕРъэlФСе˜жtЖ–чStїЁ с.тРOТыЦ(Ў1‘cSЊnКEФћC‘ЇЩ7!Мѓ§§ќЇ_чЋ; Дј–ыЬО6ьО)@jНˆRяїЕХЛ#ІЛЦ@cВЏvœяЎ4пœmсьѓxxПЭЈЮ™OиЙН^АŒњќˆу1CБ ёЄ9И!ц!ЏBJžƒЭСщ0Ыu ЭyO:„%„ž Zф‘l>4ІЪЭA—SК?”:ЇЇ“H^J€ыc ІƒЭ"ЮLХп•–чwH1ІЭыwТН. №W--Лљ'~‹ ’Yil- [6†ŒгЋЫйЕЂwа ˜аШФИ‰(ьŸ}0ъОшЪќ~§q юБЪ]§`иУС№BiТxxA 'ЗЊЁX3ъEAƒ:ЅДгЎfŸВ„т~ [)СІ"-ф_&Ьб:Ќт&ТЩБ|rjыйХяHсћdЅ€)JѓbШч‚E8ПМepYVє:obЖВП“ЙаЕmxUž.qы`}ФWИО&уJьуЂ%œйЧОд‰=“е5Е.‰ЋЄЇ-˜ѕ?рФБœкїдD ЕN†ю3Q§ORЇ]OГ&l›š#њˆ Y* йw<Т+M4жЧu[ќџшў~“h"зџЩоyОЊЗžŒ5у.‘ЉаШ0хšз%xZОp„йFInŒо0МЊљЫl8?}1И+~t“:Ахќ}†?ѕ6FїUхzЇ_}BћsР‘•@X Cў…ф}žeњи]…ТA~оpъеOя{ЄИ–˜бд;F |?[иїЄ?О4~Х endstream endobj 473 0 obj << /Length 336 /Filter /FlateDecode >> stream xкR=oƒ0нѓ+<)І> ЦЕ•*eiшPUH0Ф˜Ш†HљїЕБ%CеŠсюо}Нw5 œЂcagша/шŒЊ9ч§uОŽ˜BrWЙ)O/I‚€†9Э•Э§ЈВF_јCŠQ„1†‹Aб Ÿƒ(У\iaBТ€f)ŽГрЛ|[<—ЗMI§“’­ќƒ„)JГ8;Zх‘$ŽS<œbHqUƒђPcm‚+щтэЖpРNŒмy}e•\\ јiкwBi;Xн+!yэrBКдxЅЁoЃ'YseЯaф`!$ŽqQЭ'й­э-ЯЗ3v`]ѕГљQЋFoч§п!zŸохцO4ƒђРzj'э{`щІE”цKд`чœEme> stream xкэœы“лЖРПћЏИіKt‰…’`њ)Бcз4“i~i:ZтнБ‘D•ЂlппХ‹€H€фбінyЌёŒХАЛм§aБру№Eџ№E]Є”ЂŒё‹еіI$жзjу/Ÿ`нn —NЫ^?љіE_рeQ†/^_ЙЂ^Џ/ўНјuW6‡Ы%ЅtёЌк]’tёі’№EQJи]RёdСВЫџМўл“_ЗšbB&š$ZіlJС&†(KˆЖ)с aЪ”Mп?ўуЯЯ§ћw ?­.)^МS;MЅ~‡BИ)jыЇrUь—xЁЯ\].ёЂЊХ[м еБVЇжB ^ЌŽлb'N€ рЛОgт aЂ]ѕњ’г…TŸiѕ\юдС\э }рUЅ6uјVlWGеє&{oE uф]]6MБ{ {‘ЋЭq­хчЊХЊк‹іЗjЏК26i'РЖзЊцІз+/"Ћыѓ XфЛЕи`‹§Ф6j[HgЏЊЭІ­п•ЛkuNХЗuy}г—C›ж$hМЋиеўїxађѓЋF]^дъ\ЋБ)›омчзХw*r_p”% ЃЬфХ1}qЯЊН4фЧ$^ќХб3јЋоРЁэF(‰2pŽьx[ф`†і‹[ЩшОЫЗ…GЏш‰MG$]МФ ƒ1lDˆСYyю—Ђо–5Ф„<СјНЎѓ]SЌеŽ@]ќ‚?oŸЊЭuyhъђЭБ)д>јєлJлД­жхе­юzc$Ў+ЯІЗcХqЗ.jгAKlР2нUрtrюхЯПЊuЁ=зтѓІНMœЖј_&“ˆŒш‰Ъ sљN[ПЩcз[ЗћўјfSnŒомvьГf§ГКjохЕ9^С•J џтsУЛŒ ЋіјЋнлМ.!ZZБOO[НЈЋ]Г|VН5ЦО.о7І‘Єнm§CОњC7іи Л"Эйї6юHДCШ…G'ˆЕйыє9ЈЋP;21ŒtлпЁѕ˜5%а_}…|ЩsI(")ˆK БgJм+ИFЙЭ{ŒІ2я™YGyЅчЁ8YШ0ш$"z:Ё` [МИфlQWЊxз™П”(™Г…oUwqЂ!кў!ћpЗЗ}ЄКЈ‹§&_ъЄI0ЎaFc:jw§S˜Ђ)С0ў—„ч"d3)§Y%КMЙгЩLuTЉЎ<јвKQB2•жXж…З t€^=h ‘ЇћI'Š`†жЩ ЦYгŠ-M’Ш<†qшK˜щЋG€ДLКŠ08Ÿ’SДœQыF#жRŒxФNЌэ›…9т$ы˜еLчœ1ъXЂТCnЇєєBц˜`=™,zC(ЭPѓўЂP“н ~eэ;mэРеМЏЦя!qЪ!К 7TЧFэДЃ!•ЃArGЭ2UP”CЕ-T‹ ќЇЏЊ­шћІмщЏѓЭІиЈ=] ˆMœѕоJьнTхJ ж‹п+93ˆ­ЬЕmhфœ+Žnlq†’ЃЮхкБсЮ>/‹]Q 'Šр§"&џ•Š­-1lФсŠd”Dee_жЊЧбP$K`jь— XћЙА_EБDIЁr‹™^ Р†ЇTsюzoлйЅŒh—"Њ+›?Љ&njˆdД"“A~ї$‚тФф†в(5чП‚k`к0Ы”ЛuЙЪEu(Žюы|!†GЖа‡ŽrЙ'er7л mKWXxсЋrВ‡ЧЯ}H‡Ю*“№qL/h €Cn+MУ9$ъsX™Щ%чщwэiњ/r§yšЌO•HЄgK–Т$—и^ѕšжƒšaнKC VШг`€ёПЉVљІ№PњRjБш…ЬT:Рїн!”vћ| Ќ€0Pnl) хи2ЈЭ(‘І8ŸдБЙт}œ ‰%1Р‰Ђ˜f_Nоs!Цt$ц3f„sУMy1Ч–)Œ hŒСвŽšL9ژЙoufь0І#1Ÿ1+ ܘnsl™Ти€fС&Аx›:1†fEJ`ђХƒˆqЦЮˆ9CЄщxЬ'Э “ц}`Цtl™Bк€fAZDсйDвDmє'К?`-5јKe-„•vў|ЌЌ€0Vn„)bхи2ЋЭ€Щ0J'O’ў*Œˆ0,ъ™rN_SЇM›йд9‚д.Э\[&Pзем{’JР2еїГОўр_OЛQ™›/ySеN#ФГs)чe2#Аžƒ_&ZвЛ3Љћ/}&;Jd‚З8\SІ 9 X)ъќ‰ вЏ=ИeˆavgмтьK/ыBœЉpЬЧЌэІЬ‰x„Ьк1…БS­YвЭzQе—žтПљрЌїЭ9ынOжУYŒhє8:‚<š62 С‰и5e‘]ХН‰' ЪВTi]~0’ЫiHŠg+тIРV<Э8nšr/žšр…ygЈЭЕт}ИVL)сѕqŽaYuёьђЭ,пLщL‚д8ЖLЁf@Г`‘,"Ÿ„ˆУёMSчЋсь…#,_7xЬщ+”UДчg+ œUмX…ГŠcЪ>:ŠO‚//>˜ynЙ\нЋ?<ЗНж> яКU{wЂп‹Мoжyо1IлЎЮуТоК4uфу>>`N<Ё|Ђ:?ŸXс|тFŽoBИЖLсЅЃЙЧ Сˆš,ІyYО-ъ7тЕŠ^\S Eіs#^ѕ УІ“ ЃєlŠИvЫќˆ[сˆЛОˆИcЫ”ˆw4ї"ŽЁъŒhёjЛ‡Єя™*bФNЦ№Gu:kХЖМаœ‡†У ЁA8[ІРббмƒ#ŠБгЧКМі†.)}А4тGs—М)6ћ; §к'œ3AЮЇЮ†щЙo,ю,ёИѕы]™1§—Ž€4]%jФ—‰Ў#п0v5њy‰9‚Бcx)wWе™—С‹іы|^Ќ€0/n№њ/:I^;ЦxщhєѓТRГЖ Он+ rќ`Sяу­Шлаi?ЮчУ ѓс+Р‡cЧ~>hѓ_lљИіФ0qПWНg8Šљч№„+Фія|nЌ€07nѓcЧ7~nŠˆcУЭЖмwЛOќЩњŸС т6€к›ѓ)БТ”И! Pти1FIGЃŸ#HC†’]ёюафuр^!ич ђ–a;эШљ€Xa@мhqьЄЃбHФP‚лћеf}d к‘ѓБТ€Иб ти1HGЃ’‰Џ"лњЕкKљE{/‚1\‹ьžђжЏ"ŒчfсqТ|DИvŒбеш'‚Sˆt{ЧЄ:6ћcГ„oѓ&№Ф‘<иТ&Сќ?ql#Ён2?мV@8мЎяћw eИ;ЦТнбшwJУэ }]­СЧчbэШљ€Xa@мhљgзŽ1@:§€$%)7€ќяXЭy%2w%bМ9Ÿ+ L‰В%Žc”t4њ)њ@ќ MЩЁмшПYuОvЇћЦѓљАТ|ИС №си1ЦGGЃŸˆ V@7Ztси1HGЃœЅˆЄqаыі_ЬM у–йсvУ}тћў{"ˆЎ#сюjє‡›'(fи ЗќЃГч|pg@Д#чb„qЃхЯЎc€t4њIcФ#Sdт~фР4Цг'#уŸэзІ!ЂДччe„‰rУ ЪБcŒЈŽF?QIŒ"ѓg–Ћ3QїG”іќ|ЂЌ€0Qnx“˜cЧQ~ЂbёљБj}ъў€RŽŸЯSл?Œ“лMжˆ1˜NељYbPвFц!^q†щў`вžŸO“ЦЩ Џџ9ЁkЧP~Ђ(A<5Я Џ'Q "Iђ9}№Ю`u“СŠФxїЎд˜ўKG@šЎ’5QŠpLOl GЗдмщџ ЅЅzІьа2ЅЃdрйЧDШЁгбш:„ LЭд›s2ОПdЌ=?Ÿ(+ L”оQŽcDu4њ‰ТБШдŠЏЮDнQкѓѓ‰ВТDЙсѕпQwэ#ЊЃбOTЁ$5wа6gЂю(эљљDYaЂм№ˆrь#ЊЃбKЯ ш0wм~:uo@iЧЯцЩітфЦж?у9FŒРдQчeщфыіэ™Ѕ{ciц—с-K_†wT А4єUјџ#R,’ endstream endobj 614 0 obj << /Length 4661 /Filter /FlateDecode >> stream xкэ]Y“мЖ~зЏиќѕ‹д^За.Р•Ÿ=№‡ЯЅ<Ё)Г’ž< E=П8љчщыfП;[pЮOoжgLО9cХiНн5њЯЇY‘ŸЪььЇч_=xђМз$›i’ЙrdЇ')ѓ\X“ђBЪEgвbcД§сsЎЁŒˆ"зл+~ЬdЖЙмw ~њrГэnШ9сRИ{эƒŽ3N$‡‚iwMЎ‘D”…Лфg Њhї?6ј‹Nџі)n8BŽŠ”ї.7шЉ#YЉџЁЌ…qј ФгнПZL^=RвzŽБ‘-Ѕ"+ЖрLrW4иЄИFЬБщђžMMжхщlђp6A\Gйl™УІ#Э#6хŒ’[6§|ЯІР&ыђt6y8› Ў6[цАщHѓˆM’F›vїlњlВ.Og“€Г тЪЪ&`Ы6iБIP"ГlкпГщ#АЩК<M^Ю&ˆk„MР–9l:вЮЄs жщУ Рt7ЭPž[цŽ#Эe~дЇU’ЬЅDПОwŸђы<l.ЯэRMЕwщ ФSd-ЧojVђAo@B—ШuѓЮЪєа ЁЫ]гТ 0JBSfPђXё(ЭfХЋNы#œ’–Де‹mЕkКјаБыеж%*ЛцПt#зЁ“нfv!qLP“_цщq @у˜ЛІ‹chf m™CšˆfC9gдІуеХEуsSзЋ ‰Šць„,ŽXЯЅЧ/#žЅ0e%"Š5%xЉ‘UG”Ј–~(ГыxqQэЋюгЫ3zZ‡ђйLYвkЭЄе;G$Зz mѕoуѓtа–ku№9ои)sp>RЂX­3гiтр4ˆса–94‰h64сzQЄвЫDюrDБMЇŠ€SЂ‰(Р–9T‰h6Ta‚”ЉУUНлUЏюŠАѓe:IњћqŽИ"ё†ЬaЎжФЬe”e"CvuЈЂК +ЃCšŒЗrcŽur:uМœ;Щy€-sибlш“q Rщc&&–Э.Р!СЯe4ТмЌyд ‚X7ІФ Р Бт%АeA"š5AhЩлжžHрyXpЬTНe“Ќqœ{“‰ Ф`ˆ›Ё-3ˆгlˆSш R‰3пwL#њX'ЇгЧ Рщ‘Ф;&hЫњD4њ(J”ЋюIЁЯzГП#AЊX‡ІSХ РЉQ‹Pи2‡*Э†*9е–чЊ,к ђЎВЇн%X?))a~sФЯAœвіp€ЁЏZ~ m™pDГXfDH`Ис`m–ЭрљуU3FI!Џ{ЩЙ{ффѕy ]ŸјoЌР”9XF,ЙЉС–,wn.wњЊ+zњЂк…Š1hNrQ\W$]‹Бœо,НМYBЏ МY[ц@бl d%ЁЪONђЈ2T%e{ІЩ}эD™ѕ^:/Мœ"Мд к2‡Э†:O—хEлАл­`mЋЏЋэВЉЗнз`ћFЈр›m…@hібвAѓpа џ" [ц€бl@ЫДђв/†л{}kKЄЛf§ OФM)ІЏšŸЙ‰Ьlf Щ"ЬУ=мШ†л@|ЦfН|оТЊћ}•Я ?ќжIщ№{8ќ |k ДeќЭ~}“=њƒЭ{Ж кТТМаьwЇn mїз QC24ыБфЭпцgtG Аc "Z5 PQWщpиnыѕљЛГ"?uMП+”еI™ #МTЎ НгvжQЩqРп†ˆžбCf ЄvX:ЫѕчRбс‰vЦъgЉхџЙкžПћпп MъfзЯЇЎoџљPэУЃАL'ƒ’пЄ’2Ђ y’ч%)ЫЋOЄИћ@Р§c%]@C‡SB;&ЇŒiьa—І жj<кэкъТЭю8vПљO{,­gг ур„№чј[Т;ІбиFэDJ˜06q;ЊF вq&+д-›nэёАоIн РA‡ŒЋ—ZаS G4і ыfЏ{(z;5гmЂ}зNОэЋ_ьп‡еЊнOм)ЅH~]ЗncˆкGOGд Р…ўСC‰ЁSˆF4іˆ2EuˆжІљЎэŸЎ7РЕvUлш^„вLХё›Л/ЊїПѕF:Ш^2t9SAS G4і SEЈШУ _6f7ыy§ЖqMйЮаЭ'z8-3qнFgН‹эЇушр8BЏВ2ˆ#Аc ЧˆЦЧLБ†уЖж@šя~ %lЙ"ќvOПb\АNKч‚€s"3оедrи1Х…ˆFЧЉcn–!\8Ќ5мВX[Ђеэo\6КПFтwq тЗsJ2ж@ŠѕРѓ<88ƒvL`гиc]H"xы]pХЅdх]_qщaГNLч†€s"ŽаŽ)nD4імP‚љ7Ћ.ќєп‹@ёKQheхm)ћюБўI‡н Рa‡ ŒзlZиSАG4іАчІАз.љ^4v^› лzзя^хo*'*уwЁVNъМŠ—ЌwиеyанП<* aгв˜1EƒˆТž’ХzЌъЕY<]жЛ]~ГВ/nѕ\}‰ѕP:ю^Ž;„qfLсQиу.8ЁrwЛn:…pКЎхP}xЕO›УН<†C—"]7Аc ФˆЦDЮˆютˆoš]žГ пэЉ–‡•™Y{qЖшЊ#=wFФ-Џ˜я[šѕYzsі№ц  Nа@3І˜Qи31єY˜ иЩt VIм“щzЈЌчвљрр|€№„#0cŠ…=(%B8>lVUГ~›’uоN­›=VBЅH!?I UfэЃЅЧr/ха,œˆ;І;в^8: —Т.й?™\8ЏЛZхfЛYЏъ6ЬлŽ/ъЫ.вЏ/КkіУnƒVP’хПqJ`*ђœй{`  ˜КkЭ)hЧІ1=Ђ2'ŒЫ МоœIuZmS0eщ—п~§$4gž%ЏэœЙ{кtНDшRьZЁS F4і Iђ<ФgОљ"”0—Dхьк‚hŸ6D/Ки1bDc"—эбšWёБГЮŸŽ/hAhQЖBYQŽЯ‹М?_?oЛЙ;dž0Ћ`e94яёѓ|h§\ш,P|š№lЭK'…€“њ!АcŠ=)˜v)K Хзџјс›ЇЯПџќщГP”–…І@RА()ѕНЮАЋњлнПЦœ;R‚ W3еVиA[">ЗWG5‹l5?DI—шOʘ)GJbЄ›ч€–t=щ('ЅW'нwІDђ‘Йц‹' %‚фьК‚СhŸ7F/‡:и1cDccЦu+O€Б>E‡їМЬ[ЙRЉїщSЬ.—,Zјф›/ž=§ўЫР†eўЮџьaА*гБіpЌсs!X;ІАŽhtXы|;л†5вKшб–њ­OF`rЯ“ €Т4pZ&hЧL1=L#LЄТєьлЧž=љњбwЌ JrtcцdkMК“НмЩ№‘';Іœби;Yi_ЈЋ8y\(.•Мm ХЮ5щˆ{8таџтРŽ)Ф#{ФsЊћЛЈўЅ}ЙСыj§ЪНZЋкзnЁшpFOЛЙ'lD+nтО ч‡txН^шьp§.Дc оˆЦ^Љmч=М|›ѕ`цpт=ZЪМ+NоЅZчДфE ]4 nщРŒ)*) OAsІэvяAў|r юеА‡-„vaй§>Ÿ9CћЮХїщ?М<Риk"ћ| SЌŠhtœbЅ$мНA3FVЏc6‡§хСІ э–с} Wр„нв=>Ю3Щ€(рїѓ`eДc№˜Ц№BДЫ­F kЗЃЧv#чІкLœW§– :{и‡_Sqэ2 Qћшщˆz8ЂаПЂРŽ)D#{D•њ…э‰^nЋѓv б-(›DсАЊЗЭyp—^ІО•%ЮKЩI€&(‚I4c ћˆТћœыСЏУўАюАŸW#JIСФнШ mгДЮJoџ^оў!"сmCаŽ)D4іœdт˜Ж§П84юеЪM`ЇО2G&оЉ]CЖЁZŸЅG/˜0€SL8R"0Цˆvˆ№хфсuНМ єщ%‘Rм fЧ—Ь8]7§Ќ "KШ/ь§ А<7T‚д"лET:V^Žє\ј "hЧV=V4#%ѕXйchGZwХŠЌИK+aЮOщ!н РC:#œ3Іа(ьбЯ2p‡~›sзэМgw6М%AшTqYjщєўЬ‹œud:=Мœ­рqаŒ)zD:z%Qъ˜ы яU“)vУŽIљP™ŸѕX2 ќ§( (Си0Сˆ6GU–Х)№Ю|[m/‚LвЛдMXw%уяяGё‡ˆё6Œ№џ?ЂGПš endstream endobj 430 0 obj << /Type /ObjStm /N 100 /First 881 /Length 2296 /Filter /FlateDecode >> stream xкНZбn[7}зW№БћBq†œ!Й ДkИ(аA’нЭцСы*YЃЉи вюзя™{ЧВЩ‰%ыˆУ+‰SHƒмпrЗYЉ„œŒBЕЭŠЖ Г.;лмJM!ч ­!њ­ш\ь№eiЌВbAФFiЉi“д~ВХiЙšЛš(І'“[ŸZ2,t†ŠJƒМЅсчnC[’К}ƒ•фT(K2л7Єd•VБиbC›I'CЁЌ ­ƒЇSаD €e`‘@ŠЕW[јh†ў TЌІ€)ULц^Э\ЌьЇ%ьAЭD$ЅPƒ9QЈ”A˜8T†‚~ъРƒYYЕHЈb‚c]Ћі:“TCmЩFЕP;лЈР€ЮXМFX|54ћц™е`ЏІZСLАЄ`‡(M!”РZaa4ЊЁuŒZшЩЃnVMІ?8†с˜‡фje2T‹wщfLЄйVR№€ЕWГѕкuіьйlўъЏ‹0џnЙ\­gѓ—џГ>џtБќ}6џ~uљлт2М6ЗLofѓ‹ѓuxMšbЦЌ”RЈ"—fЅLЋŒ~п…gЯТќe˜џАzЕ ѓ“№Э/Ы‹ѕеПSI'gы3kO/о/ЎўО§v†[rь&Юв#ўЬЪbцlۘbЋFzGіp#У//~џћцПыѕ‡ПЯчя–?],3ЧЋеЧЫѓХлехЛE\.жѓ=Х1V KIФБ'“ЌЦЪ4­4Z$Xm„ cЯуXЭO -йж—Ѓ6=p‘NТы;LсE˜џњЯСс),?Оџц‘}р ‘ЁТ;§NWЫѕ цЉР)ЦўЇpz яУ#њЯŸ_ЎЮ_.0ї0~rцЏЎУ›Л*|~іn1›џА‹хњ Л—иpSкЈўЋ!` _§МјэтьћеŸЃf- РЉЁЗчg—‹~:єЛ5#D ЏЮњГ>ифc‚ы~}ж›Љтa@ћЖ6А?qMгGпжGнKЃ•^е"­ЩbvhЫ(л›=|ŒњAјIБ#$! Цš-&Plm?ћєщS\_ќБxЗX^,тљъ=Нё"lЛз’ицГ‡FџсьќїХњт‹Ыј-ьхŒ…*і<5) Ъ8§`˜эЦЛФіˆ„щ@ЗОcгј9RЃm/8дкKйВіТ‡Z{Ё§­›ZDnRjьbid‰5 I}оЧИп^НѓЯЕфЏ/иg}QФ„рКзŽє UКЛWYЎ§ИХЋл‹'‡nнEПЌЈ 8TnЁmЙћЁrKz:ЙЗCЅ*Ѕ<мл!Mв”ЖфnO&ЗnoNЪ‡Ъ­љщфожЗюЇя[›Њъў›jF€Ж#1їШ89qЇ8œѓ№yпœљљАЕžЏ>ќѕ~ёvНЕЧъў&q„ФЕц--W:д:*?•uˆnэкv,=а:ъAьBblЋЗЭлQЧv1Жž6OH[іЖxыxЭёšу5ЧkŽзЏ;^wМюxнёКуuЧыŽзЏxvё0Жф-{›Н-оŠЗъmѕЖyыxфxфxфxфxфxэЂalљ ^љАуiC* qВрд1ЙWœƒ:NЉбЮу)ы#ФзœЅФ‚)l8‘бki;9s9gЮ8)ДNЧ‰d7g;'gl|rУ‰ QюЙŸa9'1Ž(ЗtKчЗ>­nG†kn8S‹rŸnщ8œTъ-нZлябэЃзГsД p.-Кn8v\vRъ‘ГФŽфmУXrьiїхQ=%ѕЉЯ†2Q”М{–Gђь9§ЦfIz$нН–ФGš&ќ_хf- Gyх>щ4сўv5ПЁЬp“О[Г|$7!sџ~ГšФ ‡Kš–гм_oB QТu7g>gЧДnЋ6ЉЅ “Nхз”ні†{ћX›­ЛZ• єк!šCУоРmFŸу5ЃЯёKŒ\HЄHБ"§ЫЊБZ51,W‰ЕаД|vџ[ЦлФЌSЊ“Фч _‘˜‘6|ˆ<мNШ—ЫP#ј=ЄLЋNЄ<ЭъcF—‘ŠмЌŽЦG9ТйG>ц˜*OЫ‡T'уД6№ЮЕyZwА4GэКнјBVКg§Ъ‘јЮюi,b"Ѕ‹­NВПlш*В№бИ"шч:­6‘Xи]иРЇ-–”ЇхГњ@ЅFе>-_FЌЃїYВкГLk-\#Rд‘/kDЎ8-iД3њРЧ‚€;эfЭ Hн>ЉФšЇѕ>ъ@йэ%M“ОlИZ‰#“eќЌ:эЬЊ*FЯCю‚OЫЇˆ=yмЇЉтЈилДкФž>югЄ„[Іх+ˆ=:юг$і:Ш4ЉgБcЕНЙ•{ВНQS# rќмqv™68l8mŽ_т;вюigЅжGoЗsRгiЃ%;цКR‹tЯёѓXЛ™еЯy „eЬ]&ЅУBћp6R61ѓ“ŠБ=ј”r‚сЊ_-а~оЇ ЧХюЙ_E=лл|eWЕжžЏ‹ЕіzЁ—NЛэ–ЙъWк*`)ёW§Т~uЭ~uЭ~uЭ~uэo ће5ћеuіЋkEќ]ЩŽчяуHvМьxйёќuЩŽчяАˆWћЅ8žWбЅ8^q> stream xкэ[—м6rЧпѕ)цmGŽ"n˜—œьу]ЏуЕЄ‡=›MвъЁF}в—q_,)'>‰Kur ьzІ[ЧЯUеѕџ(\ˆІW•љ^5е•тœ4B_ЭWЯЊюЗлЛЋў‡ŸП{Fнu7цТpхПО~іт[)ЏhEšЊЁWЏпASЏoЏўz§fНияžпpЮЏПйЌŸ3u§ыsІЏлэnaўї†гJзз’>џлы?<{љ:x’ŒM Щ^9ˆ‰]iвдЕpеZЪEбТDбєQlў{БО3Av}шт4QМјVƒ›ЅљБiŒЇюж~~CэџaGџGЧџі$n8‘iE4х!V "ЭпHe’B(ы49ў Чп :uвЅšUƒXE*жХ‚cсЏxVWAИЈ™‡CrRЩКwћC Я ooАзwWќўЧяzdкЕeшзХvГ^ЕT{ћnи’ъzЖ]Ьо.л!R”жDpўX˜ТчšдЭч( рŠЛkКDp…*b™ЂxЦГе›iRQчє‡oМг_‚%Z ъю:V)kцЏЋЎnЭпў`>/зѕе‡юЪе#Њ–цЇхеЋg:Ѓ•QКnŽ=~ѓњ/?Нь9iŸгыB†%‚ЪC юC• р€РЬeБL$уйBсОZЖыЛ§ћў_ЕГнaл~н+єr}З\ьмŸц‡н~Гšm?%ДŒижцЗаЊ1Ў ŸшСZЙћo€ЁV'NКO)QЉ@(SЄЪ8ЖR™'Ќ–ЃRНљуPЭ‰чвГcКЛє”ы рКC pнA(StЯ86КЫF’FyныvЖэ•ю‹Л}ЛН~c МхloыЬњЊ!BеgЊОk<}’Š[h`mЁ”` &?Œe‚ќ9ЯV~- ѓuУrcЄnЎч3г›ІњJ&‰Ќ/Ј„/НЃШхКœЂhЇ ЪJˆe E'ž9=СH Rг€б|Жlџs5Л'ћћ!FЕ"ІQ:gŒ0\–Ъˆp @,SШxЖњзœ4<еŒ,ўщ7„)GX}с ŠKg9(б д, ˆe (ЯЩ eццЎЏ5ўнŒ!’Ž"BщpŠ;—ьrŒЂ#Ј(ХЫЫŒ2ž-Ff$(UФш.Ь>šЎg~шkеФ$ЄЎђЬ‹U—›rеЃ\u(@FuЫеO<f%ЅD4n†ёOЃ3ŒpьЪЎП_нwSЛ]Ь–‰ 'Дт—T–ИaЇ0щЇŸ3Ї  c[M~l C™РKЮБЁEшšп4­K?‰†ЖыЎHТP“Šž% .WхD8PЪ2Ž-JЅє‡Џ;dѕ_НјG#ЮIЅBSp3lgQ•ђџ1C{ƒ›~ВЄнЮі›­ЃmwxЛпЮцщ*И1œ™рўё aИl•c р@I4Še ЧƒZšР=Ы§т~ɘїу“^Оwй%L~ХžnЋ€Iю2S.y4€Kг_Ѓ’ƒPІHžql%—‚ŠJюЯїіŸюпЗыЄр\?AС‘Ъа'ЄИ2аЪ№(ы”ЁRƒXІHёlЅœ(_]ќщ/o~ќўѕЋoПџсхч-/Kƒ—|иrгщЇUЬš ё=8ѓюў``˜љ'§ђ№!гŒPЭŽbЩdо]ї|bВѓќ5Š_i~йPŽŒЌsNLBРяФѓ``"(#Е”НлG&ыЭњfОYПлlW{#Н­ЯЎзс&ЌсхН0€і:ўšў‰РX€ЁL`!чиР ˆ5хQч0кА5`Пe+ънЗCѓMмIхіs%6*HЂљo?aŠщщ>vЙžбЎ'Ь-:c C™ЂgЦБег ѕŒkЄyOВнХ"ЙxtКўУвтN @;ЉЃt&ЪзЃРX&tRYЯ'&ѓTq|'•хиIп.ЁдФ$3ž-ШuM˜ФAоЙ‚јЖЕгёk;Ѓ:ь‹вЈЇаaъК”Ћ ръТDgдБLQ7уйЊkŠUЉЦеньпЗлФФИ&тŒŠ Џ„KJЙмб.7Ь<Х{%ЫЙ3ž­мBэ+›~NkeћžЗnўЩMpЭмПЛ?2Y]*JЃ8ыэ3X^АDxСeBWI`(SаШ8ЖhpA=FЃн.цюљ?ьяћО]ш†‰  '•`g3эсRо Dx+ГЮ)*5ˆeŠдЯVjЦMA9”zЖьХ~чцwЩm{ђМžzь9w9*ЮЃќ9‡Bр=>eŠј'Ž“ЌDH7Ѕ№oЃ“Зќiњ‚n}Ђgф~лЮллv=o/sg/гўХxФћQ:м%љЙoЧ62^-uCMЋўu~щKHЂы0Ы№еWCЊšn"іhэkaМмwНМюН хh…ћqД€вhЛт˜‚юеЂ%5ёХ.‚ж|ЖmїyЪjѓ# ЫLZ`va„Wњ"њ0—єrТ§8H@WЄЧpЏ$ЁI%Г ЅЙ,MJ›O^В\пиu7tŠ‹ƒ&ŒєЋšдŸ5‹Ј.ХѕiМ-OaЖёE9Ш}qЗV_nžOѕ8єЭnСЈ•ЉВў^“Zин'Їќїу4Ш?КЧФ1EpмЋœеЄnВ‚Oм~ЃQБ|@єжЃНƒ`ьЬKз>ух…ћqŠ€Ј8E1Ž)с^-EДлy—Ѓ(YЖ2ТtћоOqНC,L"Т%ПУЛY•KлlŽБеыPЮVИg H‹bSиТНZЖ*I8ЯУuПkjcDŽўЉДv­xsIћK}юЫŠpЂ РxsB™ТTЦБŠ6‚д2еn9ы_oЯŽˆDьѓ^”R%йeЬъљЌу  8I‹ЖP0” 8х[œ4'СiГ\мŽQ5Ёqgё‹в"Jщ'П8„!ф2]ŽP4€#хФЁLA(уи"Є8aЭBїГд„oЭЭчц?qч3XŽF4€ЃeТбЁLA#уиЂQ3Rг4іўДЏВ‹ ЁzљЊИЏ—Tљд—3 рLA}qІ@(S˜Ъ8ЖLIJš‘Њкm{4ПмЧеЩЗcœ5’ФsўЗ 3MЄzм“Ф/.­хМD8/P;tк†2…—ŒcЫ‹ „asbЅš7D№//?€—рrrЂœЈ"ов€PІ“qlЩс&њPƒ,vУbЛМэ[“‹л§ћDcFqђЬ—‹мdПЯSё‚0€Ў(‰С9Jˆe Я–кн$xgRrНйЎL;’кб$B)ЛјУG}њЪСˆp0 FјN(Ы02ž-UCУŸ6"gwщ=QZБѓ>Т'ЊhGЊСбхFЫ2ž )ѕј4vЎъ˜/lЯбT”^Є”>ТS‹i]Š•їЃТТуК‚@&ШšqkTЕŽeBUЛmmБУtХЙѕє“žm—Ћbт§(PМгLрФэё6Gn~Жs]GGZџ„эuЄLљ+t}§{;ъќюхЯŸї035iЃлK[’2ЂД4АQЋ‡o%№їпеO /екƒуa#GЬч<ЙMХ&„лИz?л:СоЗЛ6бq §x_‘=Щ•ŒpХУ|Јnўў``ХS'щAš51`УHpхмХ#n І_Днl+O€Л?Щ‰“єќ†0=cSа_<тіШ ’ХКіЎ8юў|$'Nв+ЂBЉnƒїФ ИЋG›Dr 9Б_sQœw>”'§цЗС€DиS>ь)ѕг’рЎЮ{>1‰$Сt€ зхIpї„rь9BVŠPЩ'&С_ѕ|j2„аХ&!іcЙPNœ ofЪЩk B?fК&­\Я™šуfDжкЖ4ЯХ 0€6Gb&+WЦ<‡eўexњ—ѓжЗnbўЃы™жn–w—>’DыѓЉa}zЪ5їу’’]ˆaLpм[алn •ƒжтјd1ћzэб™ЫЉ UќмF,>9хНC4€wP–œˆ€qŒIžё4—мxn‚цП.6~дВmw‡eъ L‘Yб‹нŽДr™+"Р€ђа* ˆc ˆŒЧ„р„1сXЌнЙЇMю):MaЁhО@сГWE4€C%BZ Ч nH­DџaЗ‡љоНЂпНТЁ(сь’Оœ%єп.oх5B4€ Pœ4 Œ1NІїsШЊ?•Еsљчб§П6ћE(С—5рФ0rQчz-…ЖЇr|Ц@@ёзрРР0F€9u˜FHEЄrŒў< ЬvЖОѓпїcCЕEчёL9ЌIћу1‘S›YгЋћ›G‹oМэaєіиЗт@{MпC$ч*acŸx<ўЖЏАi8ДіњЕГ[ЛЖ1šЋЎyЉќ‚r/Ј_љА№›џOЯ‡"Œ‘&ƒ ЂфSzW(ˆх2WND4€хсЩЕЧЦLЏO=ѓ…ЏњЏ~vО–„ qžЛC“ь’UоюGxЛaI@cdЈVtSнN§Mђй58g_І?Г=q2ЛЌ—Г р,AiгЭ cŒЅ‡щ‚k3Pё›4^жЛvОЫиnќњюАFŽ3Ѓ]БKZ№рuCшgLiХћб~Ч]‚|MБU1‚IЦ]`Dj"§љ„ƒ[˜&*ЮUОјџ\‚oъѓ~_бЗ>хХЭ 0€67GК&‡,0Œ1Ž2HіxDW@O:Б…з]ќ [&‘dš4%ЯЛњqЩ.'(мєLѓcУїшс*~Uъюў}ЛmуY ІZV-О€b:ЂF\VGфђUоExWEЁщОФ1FAЦcР€еf˜фf=vПf[ЇzW ыt-,)сЕО№Zk(\BЫ[Šho* jЩв†1†IЦaР„жf(х[‹б|˜ ЕP;РgjЭЂљ%mє‰/Ч)Рq‚ъІЛЦN‡ЇJšб”vуЄ§lяŸ–Гu}у†уллХК{…к§ўеЇнО]ЙоъЭЋФŒjЧЩпyП9&˜ћhх‚EИ`0Щ}60Œ1С2Н`Ќ‘„њякэЗ‹љр{ tvЌVDЋK8`AТ'Џ `EтHЁфЬ c‰œУ€„6ОCV˜&‡Ня›ѕђSњl|ЦSыЕ0\ЖЪ!ˆp $щ Ј0Ž12д šцїуТaАK~ —_F–>ХЅ#0€–ŽG"%зфacTd*L7Яљ ih?оoлRдЪ|F}Йk,>gх$D8 P˜ф:) cŒ„ŒCO‚nLmЉs Pџ‚Bзqи/noSЏ˜_J<ж3fнЧ,nму§hл39<Ђб ‚Q.уЮ ЇLOZёSс–‹;]zЖ\˜оЩ{ыЖ›Oзќ”>сЂпхЂXнx?Њ.L7OЊ ‚ЈћИ4‡3 endstream endobj 616 0 obj << /Type /ObjStm /N 100 /First 902 /Length 2244 /Filter /FlateDecode >> stream xкЕZM7НїЏаqїЂХI€ YУЙьFьУ&†Ž3XЬу1§їћXХщ.]ОИФ‘ІZѕžH‘"Љ’VN%i•Ddh5UЎh-БtД-‰ Zєл@;’ ќЭ%uТ{Li`Ќт*ROЪ mxФкMФяГ%вт/ЗDF@уžЈсwх‘Ј+%•’h…R-3‘š*TS+xK$UСDU0YЈbЉš“JKЕ9)ц^{їС#q)Ќ%1U  WLAЕ&fх“*CXУ`•Фк}А&nђ)єа]1@чсšбžЄˆ?IШ№ФJ’к№Ф( М…ЇЂк0†њ"C‡в\Q†з;фV№ЩРЄДс_qœ†ЩQУрц а1xQпpе‹ЯлЋЃгIлђГПIКј[70q_'+ЎУ^’‘?ю”ЌњФ P“‚З:'SŸX—dцƒиж|Al]§Ї†Е^pzjeСЉ‘kX­њФЅ&Х;55%яpjцц3СRј`M­Ы8щАд†њ“–z1гaFnWcЄ^Jя‚џYЁд]dУt;DF‡SoьIНУ. ык‡Ъ тІQ c+- ˜:†щТСbcЮFš†` F5 7иFœ†Сˆ 4Аох7BЯG@qшЕкOЉЈИŠнfЉ X€UМŸA„™ЙRЌТˆ1'Ћютs^ќЪ о`А№0ѕ7рдЬпѕ^O/^œЮoџїч]:џ№t:Пљќыгђї?ПџящќУУуowщ]Џ–їЇѓOwŸв;(,war‡оыhЙ,ZrзqпЇ/вљM:џј№і!_ІПењїєнw'ќїœr…]8{Щ№глœ|Ї•ьksсД‘aіs9eфЯМpjЯƒлmN9ˆ“GцЭrJЯшЯЅЌ=У"/”мВЉнІдƒ(Љg8н•ГЂ%›+fiYЪ†“,sгЉœиЏ3!Ш=sbУЯиcnrђјFЮQГ,AŽsE”ЙpъШbЗх<ШQДtэUЕъЊ-З7*Чˆ)Цй#н3Ї`S*|[Еэ1…Z›=‰HЦ~[L9HЬ2рW вŒ ш&g?FLdюWЪ"!yъ†€\,Ы†“ВШmЃЅzŒjYjюHU/œŠаYns$ІS!b_)‹bЏЅ9єЬ‰Ж\ЅЌCѓоbкAŒЭђ†АKо š|”ˆІЙщuџAэ‘‘Ѓоц<ШKЊjFwхє§ЈЙrŠРK6œ K–>е3+3МЄ]9 g™МžЕц!9™2йdNЊйKО g-Ѕ№\ЮB(з]ЏbГя}'Tг1œ4МovZEЇњ Ё@АЭN‹КEІъ–P ŒMaD Сл&s"еB$ЛrZЫ\љЖ”Ђ–lь–дbn'G‰‰ЅoЬ–Фav(ЫAœЈ„Џ‘Y5Вyš“ pЭ0‰zQŸZ/ аMYDХ3Б1Г\@BаэКЛOУЦыQlъЭOЗ eДŸkеš йI­З7ЂƒјМцЊmх3_S™ВС^јЄ! љ˜”.S’‚ [іCй…I‰Я]?TZЃ’!;›j;ˆ|w ОЪШ_wјЦA|(Б:žѕТS2єg>’‘АЎ|Ѕf$yS’Ž _чlЃ.|ŠФЌЮ•еры”ЫЈSіm%x—Ы ЯЁ+_ѓФqJ…~ЁSЏo‚[Эа:cПОh)ПPhSтєYЋт1RётqGЬЈ3Žu.tЈ6ќˆeЁЋr;­8Ъ6‘фЗB+І`mЇ?(6тЯђ |П(\Ї$С>E‘О.†cЧзљ НZё ЎњѕЏ!“љXƒžС•І№ вЃС=Iu^№ФxТ%7ЅЉћч…гeќ пa:E[)јPxSŸЬ‡Тл$јрFsљ1ЏЌщ Ѓо.2™ѕіКŸ1*misЩtйжм“НШžЫц%Ж­d^]ЯЪ;заРвѓrѕ]де<+…lШ# M-ъ`„й•ў ;g@ѕ 6Є€ѕъ(yєIlыТец'Ѓ+œaЧпZ7?њ5ZГщj#я_у йф‚ ЮPo{їЗrЁ(XюиЫ~ $bOѕѓž™k>Кt_!;hх1ж?-t№ОНOГGбuEiААœOЦдЂ„ЄфAœА‘ѕ ~а™!k/qЦBШкkŸ›Ѓ!КкrЃI'ЁLd ДFpТ#кqёЃШJц8^!8яwа1tŠŒУ•asLd%Bv ЋoУvdњ‚ъezчkI?ЅѓПў%-wЯJКџќЧяŸЧМzИZP^ЉІОŽ}Х„є@т§юЁ!њMS‹ю№i-} ž_?>||s‡‰Їѓы—Џвљэн_Oщ§—ђПў№ŸЛгљ ПЛњ”-l.ёЇ‡ЯяќQ]§ыюЗп?ќ№№зЊПХд–хѕ‡GМ‹qЖŽ[Tњ Ќ~)ЭчтWвжЖEлЃk[c\qЕFЫбJД­Ex5№jрqрqрqрqрqрqрqрqрqрqрIрIрIрIрIрIрIрIрIрIрiрiрХšљеКЕ < < < < < < < < < М0!ГРГРГРГРГРkцfajжЏ^ Мx-№ZрЕРызЏ^Мx=№zрѕРызoоМx#№FрР7oоXёќšькRД5ZŽVЂеh-кя§ЗКzХжB_мdЃ9Ÿм.wєќТœl.щ‰Ÿ@LIЖ—є m8YvЊО™3О љ)Иn/щЁ^А)9Ф…9и ЭjњYxЇ™Wr–Ѓ№Э‡Хх8|я‚Ь8ˆсЏn ШФuЯ€ŽКŠˆŠШъѕгЂЂ,тQчrЂ0›яўЫѕG›,'Њ#н˜аr§qЧ„шЈѕєL{cCъйv™Фљ|1phо^Й,œйfњІtЩ›Ыа‚ЧжПNј‚њ endstream endobj 743 0 obj << /Length 1783 /Filter /FlateDecode >> stream xкэšmoл6ЧпчSјнl fљ ŠфоuEвЕШКnq7 ]ЉБš ГхLЖSи‡iRвй"iUХŠ&) Є~ юЮїћѓtЄHFXџ##…G‚1Є9К\žрнЇееШОјѕй qуІzрŒќavђјŒѓСHaEFГїадl>z3~]›ѕdЪ?]•*Ц7*ЧyЕ.єл)#XІcN'og/NNg'NiЯЬШNLt$‘JгФE”Ъ–иˆЖ:"э8aуEБжБiЯЯ$И€I„ѕ`l‡?™Aьtя9ўн}Йр€•IТšМBˆыяVњЁ;TћŸ@fѕѕS` УэаЩŽсX”@˜ЊНXТjЉGG=Х†˜<L™-'dœл7—Ћхѕ"пw$$ѕK*юЌ„BИmR†гnЎУyg*ШК ЄъА[C:Ѕ(Ѕi‹zmёЮГfй7b’,ђGіЭѕdj+иЊЬ]і*Eќ.Ul——сД[aм0љ4<ЗA,}€G<тœ )hтk‡<›Я =гѕз^ф Єˆњ:Ё‡јК, члѓ…ЉŽ№Бєсёlј&"Л|sЭЯp- ЫВ-Џ<ѓX!Aх]˜Ш!Т.У ЗТ„aВi$ bщC8тйfБ4щKјrBејCV^y9ысDм­Щы0mk Œf9‚ФвmФГAKJI‡ьћmyщ АЇcзѕ>‘ aЉСцlИšыУZXhИ/kщЃ„А[#=-%яіeџlW›ТЬѓвЌ#}ыЗыхƒ[Пu˜шIAI“ЧOV‡Л~ tхqрd—ёpЅЁєбGФБW лИGоЛ€§pѕО+С‘Hя™P%ЂNжр ‹Ф‘№ ЦвC1ЯFк9KdW‹еnЖњ{{m?Xц›іГЙwХЮЙыZд€:Gƒk0Ќ{ ‚­> Ѕќˆc_шХЖJК№Џ ГQs™,жyНйWцYхпЊQєОmед‰>п[сљГю `,}G<ф)GвGМ*Ьцœ.љvƒйг0нnЈ‡л&КЬ —Ds}XNфавGaЗFœ#,гЎж[#з4fхмѕ…n X^ххeОі­uKњ•/%B5о%bxo „k<ЬЖ ђЁєql' bŒ!ьыяИDiš>œ…@hоЛŸј­№Ь‡”ТOi`,}ЄёlЄСтBИ'/ŸЯ.jПџ4Цˆ^eђTьЦъЁкв›Зx4зпНа?™iн}м\ŽЈ^ p§j1К8љЅыPŠ”ћNO_>;~ёЃб чЛ%щMQ­ЪЅy­ЦюЙбЭ„‹qVйЛ…чОD˜йЮTtBФ]ˆУ‰ЗТФa˜Бє!ёlˆk’2@ќьљљщчЅ?С(Iџч0Ъ§œс ZaP0gP –> "ž (BNuўѓг'чЇ?=yе›–Ўю^`B"* eмХ5<у­pЦсdФв'уЯ&у˜ш%,wПАЩМиd:‹ЗzЕШJїђЉ[WѓЂЬъя/nз›|щ›"ЅќЫДEЁіЦ§КсэMk моР†яa ”>и"ŽIє=…ьŸqЈй­Зе™љ­лwШ6ў-OЬњ–''1Н–z,ЅО>z8фа‰_+цTRП)ЛѓK1‡F„^П2зШ2ЯєGžЂ)tDеНоыlШИD Чпу‡4ќјAЧ№G6јSІ%ЂŽр/ўѓФэЁЎƒd.ƒУuбыbђы„qL‡.ИО7'nг§ѕьl*Л  IЮПhьЏН”МЩэЇ+Ц^?<Šйwb›Eщ• ˆу˜d< ЎЛ7ФЬІ&ˆзЇ6~Г‚Бсб”0ЄЄсŽьОГ§GНЃОкnЎЗягx%ЩЗrCДBиgT›цњpББCьvЋW8m Чtіжˆыˆн“„91W\f ЋˆwYUŸžуј/Ћ F`р1жЌ#ўэ /A7GqОгfˆгZ}ш2лЌ<q!НƒgЕ’.ЗУевЫ^Н€0Ž &тАV —КыЌ{фbV‹­VЬ2пыVйгђjQЌ?И3[лѕfЕЬЊ[пj4E й ›:…ѕ/Ь rкK›З‡€aсtшаCр\Ё„ИRђћбТЧЂrЏВэ•ЇхL’ђ[Чk.xТQBљ№ц6ѕЛ-ŸxЕт8ІЅ-]хБ“яa-Й&љжд…ЌšыКрьіh—y‚_•™9Уу;tmГћйf„ŠЯР=АЖјDЖЂDŠOlџы?Šf!Ш endstream endobj 717 0 obj << /Type /ObjStm /N 100 /First 901 /Length 2137 /Filter /FlateDecode >> stream xкЕZKЙОыW№˜\(ж‹EЦЛ1œKk’>8оAАШb&АЧРцпч+5%ѕъйjГEQѕБžЌ*vх–JЊм‘Ѕ*%1fЊPeŒœд*FIцX'šjУŸXђо1ждI0zЂТ~Јв@H 3 Ш†ЅZIMЬ’6aВЊ*‰œАX5Qу˜БD=~Ў5q1Чƒ'&чCе[‹™žX ш6k„ЃФБеjœи5f$qЋ1Ѓ‰ЛЧŒ%)=fj.1уI„хP­YьЗZObXXkIRƒп 9xƒ %­ЧW’Д,Ўš”8ОВЄ Оk­I%XЎžTН*иV –kOZ;ƒЈЖ:NI{lо9Y ™;dLБ зd цЊ[2СЊзdŠ…œ˜5=ToЩjШа{ВV№ѓV’uТЯ~P ШРZ NК8Љћ­ЭBВјyУŸ…TуЏvhАhХ еtzI^`ЕSђAШб2–\ ‰к5A№  ЙUlЮНФЏj”о2У…/EГнж#я„^+]ЅK|О Љћ(Rм2])M2е9І3yF<ѓИШОb…тшŠжЕЭE4ЩmЅЧJљ6 щN–ЃšлЪVХ(гm[э;Б(@ОЦб’ѕvЬк‰GŽHОт‘{іл–ГS`oYVL"iЪB>%”Ÿ!Ћч8™/^3‰Mхв*ќaY-ЋЭЦУjЙ•ЄivЗ9qчЬІ ю№ .SКЭL˜NБ‚ЩJs! \! Л@2g–Й&[$—Е§чbSЙЄзіSbmиЯN\RЃь+ѓЁŽ$ЋЯ…DтhЋ№CоsЉ}*$RGY…„Ђ,2—Kdrue>d-W›ёPGf++Съiœ™ЂЗмx)5{Пэ—";aRЫДЖЦYВq|н}HŸ1‹g]е"D8Lфvђ#;e”Ђl+Hфщ(ВЇB" •!Oo6E—†`ъб№’Q{'ушsTФtRќD)).бџЩб‰P$=К7–ыœаЃХ+ёP0љтН<Ђh(.ˆ›Еў"ф—ЂЪ)}‰H$ЅОIwКЄТ8{tо&"^&“1я­ж/цzЦќMо[py–ш[jЭ­щ‚gHєŠЬАе {ˆоVл‡<в6"лNxˆмЅШ‚‡$ВћmіИя$Nd‘]†њPvѕRgxХЛEЇ7рРВtсїgiZW8пˆЅ%’еIЁ{сЮрћбq 8ыШ"7 sл Ю%SДФI+2€ЉТ<…oZрpHrjd1PE{ШVЫVЛЊь„Ї„ъx№‡T•Y&ё7д'%wВO46›Щ8=Е4уTј7ž8Ѓ‹—'ИHќ}у\h;сI8Р8Y?mtSeЇРЉ №СR~лj4юGЇ-Ю ˜ГЌАя#MT†y˜ftqХ7j н‡;Aю)Cy‚$BhІ'ˆZіЁ:‰~дF;s'O@U}ФM0‰˜Іtˆ/ь1ВЂ7Ѓw[ЋЯ1•}ЈЖФ•hмэS•WЂэ5LNб7ЂцNg,їИУ–Y(žgК97Э•гф^PМиЬtŒТЌ wм Ю„)5‘!ѕ2ЕФ5‚˜^ъF”qж9.Юw _€ЃНь%Ўcк’OГEэSЭS ьe(P[ж|z/8Є,Х†y"e)мцР хQGƒ;ŽvгЦ щN СкP5DЮЫ|кЉеC.ЗDj‚8й6юЙwrЂSVЛр!gЁ wп+G"BНТБЭИс>УudaЌ ŸЉжПC8"њЦ§РН3Zє­;iбe§?ЛЏг'БгёoџGŠ——ИЄЧoПќђёМцЭгуѓ‰ЬCЫк7q*аxnxцёьиХxŒЗтЊž>€вёэ—ЇЯяАлt|ћњM:Ојѕ9}ќ-гo?§ысpќŸП&згж‚ЭЏOпО|~ˆ)ZІўњ№гЯŸ~xњu‘E4 Н‡О§єПMNuYw’уW F™{‰W›N#•1вЧї4Очё=я™Ч(cд1кы}Œƒz2шЩ 'ƒž z2шЩ 'ƒž z2шЩ Ї НїwЏ+ђ НДЏk[šr^0rМyСtTХЇDš fEЄYН‡Q+ъi“)­К І•п\3WCHш}.&*[dWLEшS›њ>ђQфзЗjN-бNs1qRе$JšЖqЗ}o'є|UX#)ЅыыƒбнJПwтв:Ž)Л^сGwTxNПўЬІсЮгКdѓ)Yу…ЭHЋЎ6kШЌ6zOМS8Аo|д+$BR“Щ‚5ЩёЎј•‡l4€лNl*ъЊvЕCDВћаНЂЛIиЫ5К"R+sЎ(/˜sюЦ}Г•ПdМкВz=Т(^§НзPџuГА endstream endobj 762 0 obj << /Length1 2382 /Length2 17612 /Length3 0 /Length 19004 /Filter /FlateDecode >> stream xкŒїPъвŠтюЎapwїрюnAwww Hар,И$ИЛ;Снюl9'9џ{UїUРjяенп%ЉВЃˆ™ƒ PвСо•‘•‰… І ЊЭЪ`aagbaaC ЄTЗrЕўGŽ@Љ tvБrАчћУBЬhь ’‰Л‚ ьВnЖVv++7 €……ї?†Ю|qcw+3€@жСш‚@)цршхleaщ ЪѓŸ_4ІДV^^n†Пн"v@g+Sc{€‚БЋ%а”бди ц`jtѕњŸ4–ЎЎŽ|ЬЬLЦv.LЮBД +WK€*ашь4ќе2@бијokL”uK+—jцЎЦЮ@H`ke ДwЙИй› ь5y€’#аўcљ џ’`eb§oИНџ deџЗГБЉЉƒЃБН—•НРмЪP’”grѕteл›§ehlытђ7v7ЖВ56ќ]К1@RD` ъ№пў\L­]]˜\Ќlџъ‘љЏ0 š%ьЭФьь€іЎ.е'nх 4ёюХќяpmь<ь}ўƒЬ­ьЭЬџjУЬЭ‘YУоЪЩ (#ўЏ H„№[ftpВААpsё€N ЇЉ%ѓ_ дН+Yџƒz№ѓqtp˜ƒкњY™A?|\ŒнWg7 ŸЯŸŠџEЌЌ3+SW€ аТЪсwthўЭпйЪ ЧZ?VЫ__џ§ЭДafіЖ^ПЭџ1Г’„˜–Д§П-џW)*ър №aфd0ВqВXYйyмœ,ПџЃllѕo,П}eьЭМџ” тщ?%ЛџЛ4џ-рc):€6 љНшњ,œ,І oЌџŸз§o—џ[ўW”џзEџПIКйкў­ЇљЧрџGolgeыѕЏhsн\AW рКћџkЊќчtElЭўЏNЦеt "іЖџЅбЪEвЪhІlхjjљЯКќ#зјыаl­ьЪ.V=-FV–џЃ]—Љ шљpэфп* шxў7Ѕ„НЉƒй_WЦЦЩ0vv6іB`­''Р‡tŽf@ЯПЗРЬdяр r€šѓ˜;8#ќ5Q.NГШ_Ђ€Yє7т0‹§F<fёпˆР,ё_ФЭ`–ќXЬRП€Yњ7b0ЫќF |ђП(ŸТoЪЇјђ)§ё€ђ)џF |*П(ŸъoЪЇіq˜е#PяПЈЭпT‹жoЪЎѓ_Ф вџq€ђЛ€іХЪХцЗ Јx“пфnњ_Ф в™:и‚&ўЩ_ƒg6ћ‚ўЖіЯЮ§GТj 4S[cЛ?|@e˜џ† цРП”VП#ВџнџHё—оСЭљp ‹? ˆ8Ып-ƒˆГєrДўйHfѕqdѓѕlћђGэЌ і‡тЙкƒ–џ=Ј‡пйAЮџЃUяј[ ЂЫ4 ‡п„rš=я.Ÿй‡Тѕ—аСh 4џƒZоЅЮџУ8++ˆ€?шauыђЛтПа§:8Aц. ќЗ(ляp wйевјЧ@Иz8ќсbСэ"а§*гуё‚МџHЦ яѕёу§›P$o ѓ?Љўч-1usv}Ђў§кƒšџрП?О@O )Ттœƒ)Јumhл}Ёуޘр4хŽV-ЃЯЂsЛл# l mѕ—рuч[‘”Сh+л47я—H^|Žšыa#Z>ЉД>љ>&ЊNюД",Lрє‰дѕУ1ЊПпѕ}qђе Вlя”ЅЬurуAQЮЧМїш‘ђЌы-[ ŸлQй­ц’C|.›bќЈЋTqЭ$ЯUЏлЧиљЄ‚ћўТo|\Ъ.[яZ]чDH}Œhмxˆе’4‡Цш$[k Џ уЭFœАєу$„œѕШЗuйNo”ЗŸŠйGІ!ТKvо#AlЬ;ЉяИ….˜•щ'у2ЌљdЛэЁ†хžЂЩйдђkє’zГDM0„G*РƒBkЙЋKŒ RЃђЉ š",Ў‹я”‰љЦъ'KЇ"ЬЊEЭ’|'eЪ&NУЄ?xD* V•ЩХХЯXГЪйЕ>}эŠb™Иъ”eТсšЏš!HSЧW<&k uЦЃСЏP юЧЮNEк !ЯњЎkн}k™?и@ŸІёъQ§vБ№\O‘№ычФ–ўІ–"“X!ц”ў™тю.Qnћ&vtшсK[C4—юR…pхяweˆq^цj^%›s&шЃ?xнˆуњn•Зjнœчhхн,KуfƒЇФЧѓZК•gb>ћс}o"юъšAјХX2ц­A7КќŽНbЯџv[Ка7Ф{G…bvЖ•ens”)yлдГЅ чЋ;оч2šŒ` ]hЎ… NЙх™Œ:№izяgtЉі<pкЎgŠOб|ѓеXƒІљр8ЂШЅyм2šГA/аs;ЙZoЭ™ЊШ _x{ uu3‰э|MqB#О% Ышл…+‚…ћлЇ'юœ нцтГшуϘЫ#e:C-ЬAЅД)ѕМљУ-­ŽžФeVvЁ‚Cђƒ‡в Q/э’}ю6џ‚ќЬ\hЊѕ9D<­џП„Еѓx!4ршeёN №mаё‘„Є§Ћ>”€kUћЃcЌљгBётІJх0b†вЯDР|fЛoKАЫАк}Ыbsў–Rz|н+Є[~:В&<7ЪГЅЌ nЗŸCnWОžЬ(‰фj!LL~р-rД”ш2дІщѓJWМOƒЅс%(оУ5уœШ_гц(ƒnхФ$?GвЫ„Љ‘x'{WоёMaЦ@; Џ%ѕ]}UцѓЂ-]гЬ!ŸQЃ‘у їmJ“|ЫS}џ‚nvϘ]ПэЭУME4FЋY:kС(sа#Р‚”ЋЁ}ХяcŠЪ§9,/ЛІ #EхЃэм‘TUCу27)? И—§цnљђ”l}J€Ш4 ќЎћ5ГѓФьв—]be4ZŽѓ9z%GmУHWgЊ^МЊ.…€eЎиšGZ;ЩХ‡ВfВ‡ЅIg€єЛ•„_hpƒjЁнБї]Š*і=ёє3ЄžD.‡fXЃЗ*ГжУ #|kP‰БЁ єnУ';ЫOe@ѓKъЖІР==ЇЬяХpLYsb,nDљwФЧэTe;Ы "“№Œdєuk…BSЭi‚фUРїrtZmQеЎP†ƒŒВэЩ§ˆ&Фc_#О^щšХŸ—ZFЄ&дЦФїy*ž”цЏ9nЧЛ@e5KЩ.*Z ]хL;|Мž>Ъ-Щ"ш[’х?—ЅзЗC#!’ХтТњaƒ7gФKЃˆ0Ÿъжk?ь[ryјˆ š ЎUЙћeŽ *ƒ‰ЎУMбEћКˆЬ>6—ыЃПЎd% ЊќXќIЭўЁ wлŸќc€!:]ИqvƒОе9)іƒьЈе—!Їс4;Y€\РМ=7в‹NэХя6ЪJJ“ЫУј;8ю&…]mИЛšЗЎ сљй=ХCUЇŒ[вe:юA7yЅЖ1A“€QџгgУUYјБ`aЮ‹BhDu$o—тњ?7yЃT……РВ2юlЙŽiDШгЛНжЫ_сЋ<^J€ŸЫЫ„п\w#кw?˜ФУ‰ˆиѓwSф(R№БОюУЇЗиj3RЇV]~f‰уЖnLЋОE}*ќЁŽм8bњ Жœэ81„2шйK\_Ё]Wzс\хcлl–ГљЕTё‡g}NЮˆђэEwlН0ёzZь=Й_j…ˆъ§э›г+ДŸxЈОr#ї™QМ~^MAќрЪЌ…Др5оайƒW wUСбЄ"чCЛ(8 І%оf&дъ@<\вЭt\L!А eЂОWN’3‰ї­И%w„&уъ”ћˆ"OЂЌ=Мюm‚R”Ѓn:uчїtBK‰+П gЎФ†КZДЕ QœЉзHЈfЌОЕ;фФ^К!Љ–7{ХЊлитЕPoдJŸL#­ёN3&г>t>Й}CшrЃЧВ­7ЛљХбpаф]j*яё ч^]FКТ}Œр9l7VX+Jё>F›ЎЙFкъьTоќЪ\r†ЙXё+иHВкиˆЁё(iю ђ–шЁЋСwА~;n&tХZВ*sК3GСбўŽТcI*Ю,XцМЄGРР“:Юр2 ^ЗKyєуxмќ|c‘sЕ№€r‚qш ъ˜ќ'jFHТ^„qSlєВ˜•;v)ПBupќ=ъŒЅМxћ.ђBёSЙsдЙŒ™MPk+’ї Jъ ет.ВiУ*„-ѕн!>А№OAэъkпЏйЊ4ёЋ]жЇтž.Q:(EC–,c/—)ˆц6Џ„rv#Ўф>/‘IgWЃЬ цšЪйЦDбJ4FЙЉeПб4žЕїgN^VšВ*ЫЌ&lо1йцЊЬ€[JRZч”(з#АžЖz›А V}г \S З“ћкмзoЮ@ЖТЬюџЕЇšџщ6•;Ÿ™ЛЛRpиqO•20zwУ>•HVД‘шН§.ј—ЫСЫ.,UIоšѕ9$Ÿš|ЊДsŠѕА„ОсkЫN‚ЛЗ›x…7ыЎ=и’ЄТcЪI\ЭаЗЅHЉ­їяС0ТFj|G|В@GеО‘ЦAдћ€-оЬrАимсU;=ћЯ•з§kqGpXг›s!<‡фd@И AŒYbDт ѓ5ѓаМдјиœaФ*Œврz$eB‰от›q Хжа%ќ—’ЗH2kmшVmШg‚…C‰ъњуЌYљgВ}вc:s<њLRp ‘ЈФё!$avŒЎmOюд .rТЮ7cвЋhСШmђЬЇФС”AЗBм“ќ&цOыRu+фiх;§R}#“ЭэYŠ[gСкQсц"‚;о8LLQ ДУЃEю*І\Ювm<бЦmU@z]!Џ1ž&)ц6Б':ЋХnёQ…SšMŠ`jјq,#@—Е-ќcuлЊДоYUЦ/IcШ5їїS_­=іІМШ_Ь2о ~ Ÿ…ЃQК ­ћgъCЂюЇ hтЮ–јv.йZ „'1WV|ТrwЖЅrцВсозђѕхйV<іКяђь/vHЕLiF›З^ЫЂЗх­tŽШ€ 5ŸЦ1 Ÿо№3^сРHљЉQМ3іEКлt@šoДqЃ>ѓШD{Љўь&y˜КцјГžэVѓЇ?КЕz\QБq!/с %УApш6ŽЯЯ|[)пL$іr5 BYЇ4ЯLBШ"ф$YЬLŒ ZŽёпFrжЬ9Є>ŒTи$бјь§х[A€Kox]3`Ъ~_0!H6 šЦў–ѓVнДбZ€YН6#\R2BШjєхъ™зЈksЯ03„™FрФСi@E2мYrŸё(фsŒС{яѓђmдmZПк9Лпd*_Ч‘# %хТ™z^ЖnоЕ ЫџlъЩAє*/ћRs=Ю‰:ЉњžйЧќHEьТЏмlЈ n`ўжaлЙю€Д’Ѓѕ%g2сІ5ж\љЋУї“РN…iњд i(Ї\†ЬЫZ>– ЃƒgƒЬQ“‡#ж{uj~SЏ'Воˆ“.сбГПЂ7чЌqсKжъќН3х}œDєСTЇ,)hcјМеdхWНˆЌ?dї$ї'7€'єНЃRŸ№Ÿг…С~TfŽ†‘UЦёЇђчнЂњYИцоНѕс .КƒЖ=B›sPаRq*иXmЁЖ”ђ#+єжœ; ыŠ…Л№^ Wwєm"ЮщыUƒтѕKЗuў–qI;жb‡ЩълNAѓGpз<ЩKЏЫнК› Њ3Ÿ+=zнhйЄ|Ї&њцЭїˆgлvі ыж іц2Hvˆ%ЊRФеP•ѕ:(еCЄ№#Ž#­пђЫEо„RЋCљЎЫw›‹пбœ˜шр‡5R%Љ’ЗЦЃ‹ѓщЛВЅ,Юию’{ѓK†ЦWЋ:pžrМЅГz.ƒwЩч2#?л*>…ИЁ†бeЈ tЏ_n5’ё1AљЅпУQU>…/6ЈУ'ƒЩ*ђжIљ вЕч1?Ю‡Звд#М!tBMП9ѓ–Y6ьo}ЕoŸЂD”ѓXіLлrѓ2V$ПP1Хх™А Hе3, ўQйђъЅЁз­`ЖwrЄв‘ўКf^;брСЗКJ>ŒBeАЏаТŸIї+ёцyыƒТ)Џ')ГцyЂb.вZЪwrkމ ліŽн8яф§ЕФщ}]†ЬДЄИЊjНXaMЪБ`Е9 хЄ kЩ{NЙ'їиgqаа9Шь‘ЧDReЏ1aR6IАљ™ќСуХхfС‡W‚u‹&јПz˜x^Ес„>‡ўаbЖKљ1дйGјYbЃеѕ K зн=FaіœўзнТјevoiНZ€Ь†МzSn№#›W0Ѓ%&lйL5STЄI•Л3ћ&gдѕЗ­яјТ–Ѕ__šэак&Žиsœhш•ˆйKЎcCгчЏi2 АžЂ\Sc8г РQiхMlƒ2>шйb7Ž&…§4ў…гEѓЕЧywYvауСv›™L4ЊЪ‘&ЙQЭнu7хВїƒІˆ]йОёeе™Au3#ЃbижмYcВЏЃХO;љ\Њ—ŠњАТ‰ {—љ§ЋЛлШёCS{ЌˆЂoѕ!кнkь"пЇ’ev›ОBK==РUAйААѕ›ŽФпШ^с%0бЩђ:RшЮ„1бЌКЎ.и>Оtјфћ}ќjЏsY0xžŽ ЬјyмШEUђlђН(Tы˜5sdМА_Ў‚Hђ­XЧhЇ/l†RєHПА_Œ`єњrџё’—Аšw#E&ЄіщFIЎДнЭ‹Љ‰ЌЛњРЫЯBі_J"#ьЦЮh†Ё”йЗщz.8š+ўйЖо{n1_о? yыГ>бЊ.Mсѕ УЖzі†{л+њ™\ЩžњНдЬ№І Є‚cю­Šр–WЫ8СсињЩЂ‚–PC§јШxHјЄVьvyVтnIŠЈпЮ”O­‘ољ&ъ‰жКь ГэМNгъзДь-3Ц[dŽ§Ыўb _”7н^љХ3;gТбаТ5JFЈЛшо?‰4’WїЃРŒ кУЪœШjЫуGниЪГw„‘=ДCNu|~žИ џgОHC_Хб]н0"Дˆў0@v™1PЉЩа--šЯfя_UєtэљEcЩ \Я8жэ\в›швшR‰fšС@Й’Ѓrг*l{RyЎД]НŠљI.sTG№c$+Kw@)Ж~’Х…гžёМrЩ@SцpS@S”>џ№PžЭšм3Nќ ЈЖ>yѕuТ>Я0ъ š'›†Џоœ ‘ЯNу|УVѕЭДЩ’тI,ъ6mMкшu|ЫБq€Кю@кТLя№ ЇeˆYv№ойjў’гѕФw"IHУЋХXD47ŽБ!,н…TЂѓ­^K>мњ‹пgŒE7 ™п/*3лћйЏњ„ЮеШц…ЭHеLђ"7DЄњЉыђЯ2*Adоы`ќAК›d‡TšзdŸжіћќš Ј‰'4Ws'УИ†˜AНЎK.?УZЮ…QІЦн?Џ!m1œ`итn~›*ѕАE$К№ЋШйsŽ’bЌ-х TEhЎє[b‘Йбp>ХpНЂЩ5ЧгL§ЎОVD§ЃиA$( ќk:€%ш`LЂкY=Д‚X3F*П­,яW@lЖњN†Џ`ЙU-Ё_Ÿ\Юъ‚хљ9ГРМ. qЪјsчR5б~BЖˆ+ZƒьSŸцящ[AуТСх‘љ—=ЕxgWь е?OmŠ<_дB|)хŸ=џ!`ьЅЩжK0VУ ;ИСТOU:д56*ЈЛXФzl~А>лœ@3!‘AяDЖк;G‹HќЎnЊЏі[Јo­=Zѕ(КЌˆЙ'nšр+‹8‡z\7Ь%žьре|ZѓЈЏѓz˜Дv]mА рMM"ŽН~F@n^ БNs2џ™"бJtьuХ"В†ЏbšЏуuЭVaBтМУТGФfіС„–i.ZЉŸЗVѓ„,nf1#сFЄBaШЉ‘“~+›AƒA№@ИХVi*˜ љU7О9xЈЁZэммN3q“иЌŒрyЦrŽь‘Њжq@>œЙажЅ“Є!A{aЧ З9&7Їi'FМСжДЁLsжUуу•—+ИШЪ3эжД€{Н€ъdK”ŽEІc Z‘Чz"qу$ѕˆрУ‰Дф7Q:ћВПy+ъ}тЧJRћЫЕк}-^Ѓ#‡Q—дї ылL?ЇлbцгKПŸW|X*IЫ$T&СvxРкГ>щuА Рybљq%Ѓ> §“БбЛНR"АBЭ*ђ…R ‚_‰h„LRЫhй_Oз№ЊmŒKOъH:ьЛЄб|жЇ VDбe—§?аNк„ѓЖLПьЪаГgєаk]Љm{ ™ \œMVєљUIЊйябŠЪђŽЏNёfау†uв =Л{Їз7m[ЈŽцу§ћаљЮU)LГ$Ос’Т%Т7DђCЗ+l=ykw5lчћЎЇх ъ2!jKРфБ~GE“ “AДуFГ{ђМо51шD—eїЪ‰…RpVФ[ъJТƒK6хх$‘Ь…ѓ’3ЋN|_SщкЧ“оъŸAШКжПП8;Ј„loЁvќ:1=<31мЖж-Ъ4\“м• ƒуЌї"qЁйЋЋC…Ѓ@4cюьЉh‰puKGЂ”}d5їщ‚ЏPш||dћЭї#MщЃЈј-Зcш0Зя6,dv[=†Ж‡сЌ™‚‰АзFё,Žhм > Џ;Пђц8"т:nн€Щ#трі‹“еPŒ\јЯ8К{mтЊŠ#кwГђŠcДжЧ†@œЅнŸ;"ЈЗ ZWYХ;CС{шyиYYyя–šŸЬ+ЭПз=&уХ Э+пЎлРИ•ИП3ЎšMњўœцТъ^byiзі>cЪђЎ аSІА1ч<…лc3КзЎvx‘ыМ 'ю˜С:OpъFQЦ|иѕ#Ь(ћRЅV„– ЬвœД+—є&š’$ф‘йLЩю„ Н'TŠJOћjїx’юœІЂQ25{ѕЭgѕЛЩ”Y2Ћ—F:і˜ЗЌfw#5тзž\ГЛ†Э†=!№щ‚ЌŸ е—X+u(ŒИtАЛyјоo6фwBCІ’}Ѕ 1Д8tO^Іk0v?nsJюˆoy vw5КŸС=ё§˜сЈж‡sMwуR§f\ЯNтЩGэHGДS†ЪЋA{mЪтbќеL„jгtЬDX+“ЂЁ€~8DЎxйŒ')•,йuќP(І‰ХЅ#›ž s‹нЈ{їzзкўЅ>•rДіdІlн^ЧїйШgmdч‡ ЧЗ9ЇО8ТGZeуЉSя“I‚ ŒšчYAB8Ё8sёs|[NŸЎ†‡Xл3d№Ch ^…N§ВJў™7ЕИLSЁdЏˆкqњ–ъєр{bСбжЯЋ(ѓуо`fНdѕZ[=Lу4uР>ќТHH\фzўМJq‹Ѓ{rЬhpЪš!1Дˆ’[,ећ”QŒ[9.—ы–)šз5љкO‰Iђ Œ0пSљ^ПŒвdЋ…™;Ž6‹8€ћBН"ёpЯ|DkZ †YЩс§Š­хє€]tЩgЧпѓKo3+ТрА5Њ>џЄ‚Ѕ˜ТЭТg0ЛЯ=Kп:чZІо>ІApE‹tэž•<ЁьЗч;ЛяиY‡]p—ГjњЙj…Гr5ŽьщyзЯ0!“FП~8}ааЩqН#xб+Z5Yє,sRСц-јr9ѕLO†вXРМUKvіа;Pѕy: ђшкi(I§u+S’ZЏdЋ"џWS] <zrЭћGo…lч!~lŒ6#жž,E Ўї&–ЇЋQљќУOЮ…Zо†є(Б=8єЋдFVД­Ќsщмїѕ“ОmфкI˜qљщ$;-‚jс.а“O!ПVцrБжЧD‡|kЊYTЁъЌЬGо˜I'ЩьІЉГЈъ‹Ы|pKvпєўЌзLa`$Ь8НЄuЊb>рRы9єћхв4EйњБyQk™7ƒLзŠHш•МzbњНЗJЮ'8€п…‚„zфœ&­бC*`›№ ŸрUчGЩсK,Ё щ•”šнQНfлюLQdќs•;ЎоO0К™Гfц_иЦ98?\ћ‡ё+Mi ƒ ~IœO^иыsЄМяЗ &O Ыз’ќЌН3вЧfњ„ОЗvЈDЄ•žЧдX(љ­‹џ‡сР Ы­7U^CRЃ=Цk{јЅћхчеAxЪd†/ИЏЦєї‹яršbЇСYU\PcЇT‘›&ǘе№mРљ„н [УАE—оћGэ}!\bыmЧ•Сїм+Jфя&В%•":W’ПЇ3,s1њЅ‚м d~шюь„пўшьЛ]УЩА%Зp,šы?,›%r–Ўяъђк?uЛ€/-є‘›йЪ/EеК=~Ll*ˆI vBEЏ1 E„Ž —Єђ|_у№‹ЬщЋУѕѕ‚—УiЫ ,ѓŒпбKk„F V[CKџƒ^єJ‡BŸЇлшт‡БPx€ѕйSsc{ї"&лОјз‘AѕЪ79ё295•ІЋГ&ЈhПїйfЬЉJAhиqИ `Œ•ЗШ_?Oc5\тrЇЗu§№тN††;эџтЂЋЁэ§Ы˜ЋQ!kюМаg/ПЕЧ<МќЅy§KpЁiо!щмУP&Њ/`њs&uЋI™‘‚ЁЏнIˆXчd.ЋСН‚Ж‡,‘юэ™d!З~k˜вyЂКЮЋгC\™К qBшю xаCMKы}ЙЬЙvQDь>@гћо\_ўЪ%=E7њѕ‹Ь1“‹4<Єўbс%Хњ‚^9K’˜С„ТЗнD=T9‚ Э њW$vf##ЧѓОKF0]ДnЛмЭј—_8V“зdDžtER3Њц]нБeR*)вy)=бh<6)ј?дšŽ”дІo№%W‡ЎВ juЕ€І~#ПB?вЗСaЭяYVё‡Ї™ўŒыХEtVŠ˜{ѓр†pй>ЭЎІR‰UgˆЂЃEАИяЂЃиЌsл‚Q+њHХХ‰“i4№у ‚lџŒш‘Ўъ Н5ОL+џES€эCJёЬЌQ<о#|txH† в{RъbѓФŽI\+Жб”;$ЅоZшХyЄU[ыѕrW•ЃžЦЩ/‘QАОiiVіPr‹™ йљЁm„…—ѓLž‚4ь YqŒшAЌЩЕ ЗQxhуЗt7`'$ћ‹…(C’љСjLДpCЌ†)y%i˜§Ц;х|f-OіїыЋjwМњоЫєОjИˆб`[Щ{ЯеunVёii’_Œ6йј У…\лћбъŒ5љіJЯ7шѕкZђrЖB}і-ˆ†ѕZk>,n/AиФS ”EЦІ[|”ІКSWžж ФгузРN@ХІ‡{эˆuЦкт„ЕаЎ}4Є’АhІФ6З:фpзСjJЕЎцЋmС‡р™NkЇ)ˆ>їрлzе? aђŒя2SKВVыо‘Уя аСБ/Н ”jœ'эъgœ%hВ%K@ЌЊЧч–z?ЕяІ‡ADaсЊ'&,rЇ>‰ѓг&УЃ$DЖ4І|vRИЎ‚uтj рbЏАYўё~wEЩDŽлЉn>qœЫЇл?мв—›GѕLLЪхый, кЩЮмР–мШ9iэM/…ѕѕœŠБєуИK4Ю\э4JW[ЉЫbС‹?ќф‰'ѓš*Ђ,’*C=•B*rOjK€Ёaю‡ђлЋјV­ћ1„А идB'wюN~—еБўMПкrЂЛ"лQŸhEбПCd`o„ЛЛzеЎ-DN}jфЯXНŸ0зY7-‘D1 ;ЮYŠшя;†g…Q’ƒЯиQwѓуKЗК=ГьH;б–viйЃч )hиŠ“ї\ƒ>HPNмŒldVќ Ур$ d;Scн›Ъ7jtЌ=F%2Zi:уB&n],~Я~ји­GiAgK5+єХІАЋ}РL“*жк“™ЁбшsШэЎЫ4­+QуѕyYПьчљ§{И‚шiыУƒ9?‚љ+ЧйLАьBА]хЎэ2a‘млН“oZCагœ Bчн9О|OУZљтqvг` 6Dš?бƒQЃЇK й2WОїтuђs\AЗЙ(X1SЂŒБМT ў5№—~k‘ж 4јnSй(ЗЙТ—iЄмdћЫS(ƒ…‹gtџіхV—Iчkк™"Ч6TЙc§2hЯ' yйї>У\B‰…Я“ѓ”е†уŸЧ7LщЉ)Ѓњn‰‹Љšœэ;Œ EфDо%лЁЏŽщEz{ЈнЊdpВ'ЎйЬЈ@BIє1.ТВ.NфYьГ|­‘W-€аРSУЇщ‡LљИш_ы„ѕoBH“2;№iФЕ3ЄXщХsЦ'ŠьЕ'ЄфaсŒ.фччзпgUџкЇАjКIЙ2жГёs›šыuпKЗЬэЩВ3tЇ ЗHМ-DGЛŽ…пХыgd…оiА-еуиљUxx;аЄ@cё ­еC…Г_*сюЊМ­t!н”]іsј‚w.M)’@C2гO@Ќ~Le@RЛѕVш,LУхЫЏ иЂыз,Ел!ЦѓЋЉ?2 ЭЇЖ;B&ы?To|Jъ;›gЋњТ‰ECJŠь~Р›Љ№УЬ–иv‰jr•І—жIК‘P~ xu pPfЩїKb’'sС&еKG­=ы ˆгy‰Сдч9h] сŒѕ4Љ›~ѓ’І-zл оf8AћIЖоіs.$яі”ИС•№дMП+ТЮGJK ]І“ ˜kˆ( }D4~А9ŒKQь6№”urcxCЭfAЭuЋЕчЦс…Ў ё§ЉфоїuЙНДicбдь…нQа;GN1фaХdОы\фl/I:§њ!кj4‘eшD:ї;T ?^XhєглЮИvQа#$I"М ПИ1јЎєŠbGі_ЩнdА.‰Iw’9&8`ђФnTРUњтпqX­’xЃXрIšзО';юеYоѕ$И9ƒe2ы(`О&Zгщ ѕ“„ТЇ1ђХMnП*-т;чo‚ѕ А‚O'eŒ‘žЃ@`иC#Ї4В6АэЛSЈ.RцЧcDK§ФуўІлГv0у‘’ЄdтБT‹FЊc`qлy@і QmхmVS›[Эг•ЁYъ›ZЛdЖ''хь€ЪЗИ бо†шхТ,?LУ_EзZзЋиЁлFн #йД;-я?QюЯMŸ<ф1„9Д0[RX“чYœИQ.ЕПу6ЕР$§Š$QU,)ШЮЖШh?ЪНZAк й3]јЙЈˆ(*6‡:LwLОцB"мУб˜< #~СлQƒlxКWБC1Эˆ—Хп<™W}}*ЬŽўЇsє­~щ\єH^C‰Џmд11…ГXЏє­Dœ8˜4јЎZN<ъy ЦхCУЉKЅћ ,т;њїУкXC‘иљ›9mƒ?чЕw-шьП #?с"ц њ~Жсny|jКˆJZСџЎ|ЮЯчЦ=rjЋy(СцжкA7хо.щѓ‹эlшНЕCЈ5uЌHШоі!bщR`e_DИШƒдBvbљ+?П й&!сz_ЯЅпь‰œƒЌ$њТ_Г-|ёѕЁŒfšЏd UъУЊбФќщ]:И~ >УВЛ3№ѕb(ЌѕVF‚Љ”LZ ZIЎ |быZ`ъ№Gф]lУŸЪwW•PЭIl'зl!OХ–+ёФ;Эkpˆb§ѓ€Ѓ_іˆuюВДWQ Л…}GђЂ&eщ upп-tъђ xвЖшTKЙюZtџ№lє0л"™Ј!в Ъ2ZхгчЛлKdЭV•<’YhЕ.lРГџ’ШЋ:%fВ№U4e??zMЖ(є'рЇэY1E…иЖlЬОs&VлљЬ]ъ3œ'ІKUЛаJв< &І}ї;•D>Ђщ&&vnѓ/.…Е5oš$wљїнGіœ[SмїZ№щEyып#I,YЮj1/4#§)™b L9њfЭ­JэфwЂ‚>П#ж•~ ]ыD`[Ш‚уn AЮевќŒ Ѓ 7—до3&gђиeТNC8 ./k3H§Q УрŒИbйDј%мaЧі+LЧwi2ъš#G$A91сhГ…“­мHъ†ЮШЅФўзŽЭrк9ѕlі+(ы†њ!"ЦšШІ^† YЩEŒNфйt.и`a.юXX•OЪѕT”пcтвЧШхY‰ѕЊьЙžЮєqЯс1П6 ^zoi@wœu‹‹ї§xК$‡Оœ‡6•№0ˆ VУMЕ&Mсз!Т+tЈg+ѕXWЈoœц;ЧвУ‡uПоe, љ&ЯN„ѓН0ŸhЧцˆхЂX/ЦzЦw%&‰ j•ИgЃŒЌ˜lљМuї­23-іЦQŒСv]ЕН›vњл/VЋЙШGжЈQчF"HXЮќЧДfх'џy-: ŽmѓёДџQЋЙa8lЮ%Їжс…Ўд&ПЭOb4жоOy`­gnЩky€‹г™kaљЋН:L‹ЪŽ{urЪXлчЃє{§Ыs^^н;bX№S=Бƒ—†˜ѓь}ЎеuYћJwЧŒЖЁ )„вѓБЈ3ќI•Љ„D}•с'Єoх;ЂGhш|eЈЮ[щ8/ЪАб.ы2OМїВ7j Уц#&œŠLFь‰Ко,ŽрN‹•СTF™Rˆ"d’W*ј˜ъsŒ=)ЈQYŽwƒхEKЉЌ‡:п–74Щ[lbЃ} фВв зib*ьx5>йа!|,х.Ъaдc|Ав$ЈžT нЗ&Чёљ‚rrмOФUQ‡ЦsГN„јйЙXШŸШЙ(ы†+C‰оš‚ЉnШХАуЌ9™ХЯњБлыКцЭ­AgљћyН Єƒnqю Сюв*sGtэЄЪ) БEЇWмЩїbBйŸИУ?ыиШ€ќ4 KHиеžcфЧSг!*xПSНЖлу„Q AРšJ5Dkd”'[&љЈЦ\9ГЪyRјТdЅ‡чѓsHЖЉќѓ!9Ь‰R<’\FkЭѓьюОSГ! лluRдЯ,#ІФИИЦъCJњqOfц#SЯи”@цŽœ]кZWЩї‰# PЬгГЈЋlbШЎ#яLjtŒ&“.Оїљ> 5fПˆmlyчx,НЩŒ 'ы№єvKƒпФуšЬJлGЋa'ц‘ЋGLLdYП_`шxпД1У‘"ЌнWтцVžќ5BВ€жIкЬpDЈ^KШЫУ‚_,[]vџђTФыJЪп;O~№Щm–L•Š tЧž ‘єЃnЫœQЙ[#%УDLЪ Ž>“ЕxŠбšGLхщђЌђ2Ж€,ді'фQUџ+Ћнa oёTљоёŒ ўMvкX#…•6„}т†t…Я—‘Pю‘TЁ"Ёuшјщ‡имяP~]ІRЇ[‹4FКUЏЁйГbh=ўФ‚дpЮХ|Бo@СКњрSpюrюN"ЁЛЖuUYC’уѕнSц€Џ6ь}Ю zzцыrhrЉТ‰ P~№bМ=^ ћc™ ŽуЩ‘вm>аеaъAБмL`в0ћ.Їёэy? o:Е(Це‡_F2ћп}Iѓˆ‰6—ЈћТr‘n№VБІbшœŽЊ“ђБ0rЌмžœD7‡™<ж{л^ђ>aўxихIJiО6I!k(сu(Є(žэМЗ•сЪ Й Ўс &С)HsЎнЁЈžтCЇІяРqH=ƒЋ1лiЪw ˜|WХdФp§ѕ Ж~™г%ЋЅUQЪмЈшЃЉZйpџ{`з ƒ›ЕЉ€iКЇ>-№Еи]ˆ“”)ЇяБ-mK!%ДфRюЬy+ŠЬ­–~Dc›dЏ…гFН0iѓZ› nŸ]Hч{ [еŸчQИгьй|~ƒ7РРЄx`hfи3xе<Ђж№G:-%ТŸSoLC’(VsяŸъ‘~ђ2CЇФ/ЂІAЦщ?Y\№JЦm€} Хэn „сc‹^._Одїі+•ЂЈ5ћѕ>…‘ЯиђгЯOхyoEё”FZ{m^ЂTQЙIМIЪЊл†-Хч-Ч%ЧŒ‰ѓn|ГgЋqЬ‚[н2o„Яр§†s+рT•шЩ~Ц1ŠЪєЂФИ№ЗJqvЧ/ь’ЮŒВё ˆныђ(9)йь9.DTN}›ВXЊО†XA)a-z”ЊONs8иВчs% zщŒО‹ј6†1ЅЯ!ЪЦN•ѕ Œq0\ ІП€$п\›жVžШD№w}рдЩїЂUQЗдšКО#Лу mжОNQ'ЎЉZЙј­v9с9щЈ)‰Ю№С‹е‰EёЗтY—Šебу}FГІ-А;щ dоlФ|ЗЈуъxуФ’vх‡Ќ“”д|їкА:МQS4ЛхUјк‰˜Яr@‰Дѓю3Юя†”ЅЙ xВП'aц(аћFЕўpБVЭЫe6ŒДпЄEЂSw9S`Ј0О§Ёб!‰jTм$ЏЇ,2,kн– |>€\ZlїЦ’іdBgŽnX­ŸК“—…Хђњж<ТpMЦе‰ЧЬ5ЩWТ#•Ёu$„‡М $ІйŽШѓЯRхˆf9Лё•дqё~тx ъŒќјTфє6jvЌ‚@?iЅ™Bя>*маK)Ћj­ы}љгSЧzЌќЗе€gЋm>и#Ш+ьЌ”РАК@~„uЌI5Џћ‚Й|ЛЄŒqŸfЬYЁZ[ЙёGЈЉrо‰~^Ё.yyв•ц\уžЭњЕmЪьЯЌі TА$taF—Z@šюЉ~РtЈ№yWЁ“^u…f4іOїˆ>Ћ?ƒЌ”РшAрІRу™ЧžuрiЦн ПЃё3z“LM€–GiЙcDf‚^V9Э1ТрAаSiпѕL­[ mж>•р ”!ЮgjRnВ2Й™ЦЃ™so№nnbX зў‰тWТЛђІ%qќZj›юeJYя‡ксЙ…}рNsУЈЕв;š†ћЗvžЯ9wНmИЩWЫB Э]Бe+VжЉVEнЁо…ІfЩ 7ФZb2А7ПА($ЬХЊ3ОУЬ7фH2/Lhї NГIЗТЙŽЩWИu„Є|Н•Eк&žс…Ће ћrO1ЮЮŸK–™"zcГy#шд-GЋd;&їѕž\п М?ѕ’‹+ŠОУ1@™3М*>^!R‘џP,xZ}†г$зцхїDийЃ§Јp\4#pŠє:bАп$CHЧьњARЄRч;MhР•А!_п"И/эydвДъ"Еh~ѓЇ—мЪC/œšc]Hб;BщI[Ї)џіхЯmZьь‘іцєб§gWc­)кIю}лх/хпрїќљ„:ФЎšЩ‘г?=щy0`5ЙЇQВ3н*-уOAдOщUќиВ}ЦгЃQJŽo<љ‰DiхюъО уџ2\Њ2дЖс Ё8!~ “3ћЉЅжљzxн5UйdЄ<7№|ц­PY™ jП џSŸзјu‘зХСЉёђСаМ№ѕбЫ:оХOvШюТDЄьЙЂф 2'xŒ\ZС+ВДИтж€ѕU‚ЫЗŒщXЗхцgnШТеW[NБHн6Ко.§?’mїCЪЈЦ^{нмъв<ъB-fK 1TЩ__Й—ЫNўГzgbж1ЪjdщЇ|OС_­BœЋи]Лх!>—–“VŠ1˜х`r+7рНЧАc˜гSD“AяˆG\Cэхч§Н№ОќBE"щ Q8щюSС­Й€2vПP џh ЛPx~!ї).єТi 1!ЉЪНр"А№–MџzЙ;BYЃ+\–\2M+ЊРЅЊ]<ˆŸ7П4гѕФхНћ5џXШмЭКДaЃŽ-:і~9Wьmd‚)žЏŸcQхћPЬд|П{ѓZ( Ъчu9№WіTВ1\)ДOЮ0’“ŒWЏ;<ЋFŽO1 1lПiƒЋuAЗy—ЛђшНјЧъ`MђЌТЮЛіM&ГфрхЎЌBBЦ#Qь.ЇNіэЪ”В({АЌВЬvчˆž\‘VˆЃejz–›[ј.^S„нO5'ЭлzAkaБЃжUс­  ƒ$VKi7H8њЂёSѕ†uік ч–щŽŽЅ§Ц ‘$а"ƒр%c>B#‚MлR‘oМ‘пЮYИ[“ЬС.‰stˆь3ЮJV† уRоf‰>їПюЧўяЈAВ'Eе[Ёk|Ђ =яюљ‡уšЕ$Щж:№†вџє(dœ-Жщь Œbѕтblц/fŸŸ6MыЦHF њ<ЇЊб-AІј:Ц_љФВМXH>Ž6ЗgжXИi0,•ТдzFQœЊGАœ?uЅŠ$}\3{Z”Ы жbQkXѕ6ъL ї– qœ2Л“RЄB8ЧЕŠіŒўЫЂ5ХІв™f\Оћюlx!ЮФќ^ъЃ{ˆXвх,MR–О]Вђ№iЯˆ%Џ”ЕOФеѓдяzz#ЖЛГЇиdМ'mЧєх\гsЏlУёѓ]~‚я"-Jmu—ЈuS,ю-‰vї…ЯњТ!$ZKХЗљFЋЮ“C=|O%uнgШDщЄuЦа|№Љ'ь ЛЫкХ™дZnt­wя™кJPЕМ›й б:zfmМmUЦ `„Й­Y"умUIZМvНёМвkZЋе‰WUъ ’VйщщЗDЎќ‡д]n‚љrFц7GДЭ!њЌЦЏЭЙŽcLd7t'мŸ5•™TМзѓў+Z^Ь­бžЬ.Ц§=Т5м_6 eCUyœ‚Ј№љ˜Ёзr7Ч)—:6б "Ќ`j€†и$Є…Ў*ˆђB‹šƒ”ЃQ6ё“‡Ћњ0мVЪ9l˜И‰p@р7ЁЇ•EЭoPн•:xЁџ ~ъ –Я2dXЇ4к]ЮГVsД@э)ьЎFЧѕSiщwЃŽЏKqP{ЇƒЄлD^&Ч?УrЬ]ИAuO‘џ.Ч6"TЊ›ч@Д"ЦЌA.ђ3aГ‘^”њ•…IHEфJЋёKњyZЎ–ŒЗЭYXПВ“Ќ#) ‘7ЎTu/x$NЪвкљЇŸ­Љ‰ЗрXrЭЗяђz–gЖ!.Aˆdцк ЬkєœIbлKўоЃбWРKг g%ШJ%9јr’Љм<\+Ќ=/Ы–ПИzuА_.+ЉК„ЦŽ?‰ЗЈ№90:KlюЌ­А sЧЈoc!рЄEЃik”Ёšh#BЈEЉэ•FIšљЗхWЯ™`{Я3Ќ„ˆiЌnІ]ЇnMицNZМаЏ8Ђ}ь/Э$к™яD2„˜t””BYЪ‘ЖіWцoŸЃНPѓSоФžЂ>LЂж‡йжЄЊйJEЮpьЛbНй/FšщМPVБ•–šqткў~+ЯtВф"Ь7ц’?X"а‚Щ”P4ўКNыA!™•8ДВQo"!yØi<ГКЫ#ЬdOМЧщд9іДОKŠyьЙеШ,о рЂьъЭЪэ——о\ы"™НWиГXJ3џ*b&а к,ј endstream endobj 764 0 obj << /Length1 1515 /Length2 7596 /Length3 0 /Length 8613 /Filter /FlateDecode >> stream xкЗT”э6Œ”Д”Rƒв нн-Т 5УЬа!”tЇДtwJ Ђ4Hƒв!§Оя9я9чџзњО5kЭмзю}яk?k&†чКœ2VP А"д ЩЩУШihЈ№@ Ш‹ЧФЄA:€џ%Чc2УЈ“шXШСС $J&BЂ 5 NU€GP”GH№"џ2„ТEђ Wˆ@ƒ   u#№˜ф 08ФЦ‰ЪѓЏ#€Х’Р#""ФёЧ у†C,AN вьˆЪh rшB-!`ЄЧ…`ЗE"aЂммnnn\ Gn#ЩЪpƒ m:`ю Жќn  rџн@Я‚јKЁ ЕFКр`JрБ;!P..NV`8• ЋЂа‚ў2VџЫ€№їхxИxўюoяп NœA––PGШЩтdА†8€ZŠъ\Hw$фdѕлф€€ЂќAЎ ˆШe№Їt@QFBuјwK8†Dp! П{фўuЭ NVrPGGАїЛ>yl‰КwюП‡kяusђњВ†8YYџnУЪЦ­яqvЋШџmƒс§#Г#@a!>aиvЗДхў@ЯўЃфљ-FѕруƒТжЈ6Р>k0ъЯ rpАз*ўсё№Ќ –H€ит„їOt”l§FЭqМЂшЧўўќћdŠb˜дЩСуѓ?#цVVPUб4dџЛх+eeЁю/N>^'ЏРфЁ>џч9ђwџсЋтd ќіЛ^дE§ЋfзПIРђї†Аў;˜&E]0€хІ›€–Ј/žџgОџqљџЃљя(џWІџoEŠ.є,ќє GˆƒЧп(ъК Qk E-ƒгџš‚џк] АФХёЕ*HjdœlP”цфсчђџ%‡ !ю`ЋчЄЅэ_ДљKЎџ{с NрчPфї#хўЕe–іЈЧХЭПT jхљƒQKѕпu(8YB­~oЏ€ ‡ƒ<№PУG!€jM­Рюи рцr‚"Q.TЯ>k(яї м2ПE €[§пHр~ўтpkџ§Ўлъ? /€лњпP@Р CЭњ/* ђDe‚лBџрџjШвGuќ‡‰Јnџ…џ<[Р`wА%оЬ4дR,ШЎ&ЈэW• ЕчњЈ8ж~Ъ/#^ЮбќW8Ш>… Г•8нЬŒYЕХ™^ХWvšВЮПВП{­евзy№Ÿqв+nйа[ФLпн›Šї:Їy2§  эa’,hМэ9mqЎ”•MŸ.гяg5=птн˜Щ‹…Tƒл4;КЊŠ3д)hD ~|зA6[ ъ­ œP>ЫўюИi–Ќ™іDMМу/Ю­’xy`hpžЄ—Ж;Т_е5`§€1IЂ 6H#ЯПв`>—ш:ЛШu7дЫB‰LzзЊЏt‰5щWц‘экбЎ)KB—­y‚u$ЯЯ Zи<Йl <'o#мj.+”Ѓq@2ўaа“ QўАXўж^54XЭcvЊg|љкE-YххX ‡FœФmйкŸzІі(Wыє–gUI$k ьЌ;>жЙ§Œ™ѓg,СS†М/…Slлє$ чE‚ZќŒHјј]!)њDмѕ›ї ^œyyђпцwtШ2Я:WF8E‘Fz.зЮ{ЇхПЛмчсўXg™Z)чщцИrц]щОbЊ>р-№)їlsјЙќ•фm$T@Ÿѕ~Ї3<(Š’Ћ%ьIљмjя›SК2є+ДbЭœвЫŠO§а64><зbџШЫ]Я›]є4€&ЌЮЋфљC1ƒ‰NСм>|tЩŽЛCЩ–d-?U~GрШ_Уt3љ W{.EЫЉЩJ0Фe}L#aMKњ­'йЫ[ТrэСРэИшШ6™х“цьжЩjъЉŸmХў8\"я73vOјlЈgHбПь0ЃПГИƒš=<Ѕ1Ш_КьОпpdј„ў'њZCfњ‡eаб6дXЁЫ”ЯДoХ{дьЉйZ>Љ,y*яsz€3—лї"‘Јэg]5qE M1v'EGs†j ШлМУ6ЊШт5kЗл‹Р}Ы—Ь@Л„ƒ#4!_6xd)ЖTКСЙЬXЏ}HaЗœ;жгЏ Ћi3М>j~Oƒэу-'ухNZГ(Аte-КЇwRlЂ!„ЋQd„ѕэ@jКlˆюл%пXtД}ЧЋH‹ИДЯсfўp0П™,іъщќUџш%Я>ћј,ЩфН? ыkx‡`а љЋŒв0ŒwЩ!ыЏЪЕ—/щMѕЮКэвtУ}ЙйЏ№зж(vi)Ф ТkžFѓqАš“ьєLeƒѓyЋ†?1+ўм<Н‚3ЂЋ—ЎфO-еЂйцЇХи=Чо7ŠЌ$ѕ$Д<Ъзž\rы“9ї[ЎѓDЉ\6Њ3K?9•xГcнм ~`Їv§v’бОЩсl‘ЩьФ‘б”8Ud•Г70g§‘=H}јѕуљ‹НБч<^Ÿ§Щ“;х„Н§’Ѕ8ыeЁз>вfђ§gNЙW˜њФ.ѓ›Ў.М!ЃL‘еЁТхЫѓНњ%I)ВйЕ:Нœoƒа=ЗДЩQМPКtpѓ>їnXЫ-M7%…ЧеЯ&"Ÿ œPфЦЌQn`Ы!П#gdаВѕЅOщЦxkUˆ0ІЎЮЄQЂЧ#Rё DЏ]ЂжЋЖ•РbІ.‚h§Ь–рe/ЩЉ(юœВЪїrŽаЅuр(S™Я;им#ЋM/[ ~Щpв№ћЏмф ЄСк'VDН; ˆе‹ёWЫвѕR80ŸMПl_Г -јъŠnрф”cќIЙšхі†о‰фѕЧk=шИD> YгЧсK|П™Ї02lЦT§QPЁ__І€6Џ1Ÿ(ef#ѕ ј Ѕq/ž_w–*TU‚,fp'ПТСV~~ %šЛ!МІ–аЪџёФ>э'xjЋЋЧ\Ѕэ+ЖneЕ™jo““o/ТмШъkьцёqАеї†Л јp•ˆ>ЊЪ~"jЋ#!ПиNѓ‰С|ЯыЃм33ЈЂmМ?7Т]$их;<В—{гыА'щЗhД#ў]љETU?ІЛ+i;™пš"'cњ“t r–zO{ym ЄXэбЖ]~SoІ=ўš&ељ$6џEъЩRэќ [КЙЭDЈvIu .KсІиА•6Ё>}Ьbы“ДиЏ94№6ГтK–Ммыр‹˜‹BЉQЪ(8ZјЯ”ЖГ“Šрћ$жZ8†‹ŸбW‹Г‹].€ чБQімqЬ•Ї'Š/ъП|УѕЏц\Ra`\bёƒп(ыхаeФŽBRaЪОЦЏ†СЈЏK=ІЃсзЛX§фЊГєU€FЈУЅž2Э гФ­Gz/XППџю,ƒ9Ÿ цЃѕ6ЅTšІЎmP{6ћ/hV0'>NPњЂЯ#]ТХ-‚.60ЎrogLб3БАУOџЗ:†УWkAwчхZ\М7ŸъeeюZ6ІЫ9‹DћјЪыеPїЯ v{Щюy5Кэ)&ѕЌNЄZВ ЖTЈш.АйщЉэAС9/)<чGЌSЊ§H“ПZЋА-МДІ’@з Ѕр›dej;|_Aя\Rб Х‚еiТiЬIE—ЕЋкƒЇЬJз>‹ЉЇе8Ы{­GiЁюУ-9*`Oњƒђ\Bл-WыVˆBрњЭSjбФЏЙњfъЯЅbы†iЪUlшjœ}ь!œ•L$"щ;ГNА~ШЧіеюЉaOІќŽ№VубЄїQCЃbјваHxгэуэYѕx1ГзxVкIЊ*Œ -I=/YОQR8ъ8o‘чЉОЄŒѓЕž&ЦсH*Ќ§ўШŒч2oвз €пКћžF—KŠ'Z*џxZfЊoЩУ%`U§^ѓВ5‡c_?†tяЧnUЉЃєХUŒЙHЬœB3zЁ– чlвtwфƒ*хmи%H›ю މgўЭbю‰IК ;,ЏLžАcž‘@НъDѕ› C5oOП‰уефяйф§|;YЋэ`‰ ЯОй.НiUпЖ—5ѕЗ_јЬo\snaN№@} У’є3ЎMВœШ­д”эЊђ^ЯЬ/‡БAhЁxтК‚Hžz‡оѓV‹ДpДь4•]ŠqZ3жLуду)30Б‘.’А@пRрЧ'ЙщˆhŸё€ЛКќЇN™”№†з7}š…ДŸupъ?3Ќћн7xхY’FœrjfЇ3ц ѓQ%cуя#„=3mQп/Йр‹8UtЧ /пsb”н4ў8%к ,іїlOZ†W`=иYž`,-СWGчйm’Ѕ8L/~eіSЂЮšхqš"Ь§ётNНгZтYЊ)јГ—ŠXЖdkn8IьлZ›Гњ“ь VNЎZеш*#ЄЭђežm|э2n™ь"Хс`ду:NЩПФ(ъŠ‚љT„сcЭЧЫм;ЪxЮœnf`ZuhŠ=YKѕЅФ+ю€-Е%?lЂ’S*$ђ‹зќœ]ѕЖwЩ[  vOИKfщ|jРм|­УN”§šqmДпн­~!лЅ ЕЩЗуй•јйXёЁѕч‘Œ0 ЛrПЎўmЗd0;ЄxR‘ЏZ2•еx=hз/ш>@lНhЩД іЩХ3љ€T–лЙП?tA—Ъ'ПВhТѕ‚€{W R1ЪФпURwьŒнxрђJЖЌ uј|›ї†ЅˆbіЕN ћо'š&šуІ[#€љTє ŽQЁ$NQ9Ъuщбb>VrIg’юРdrЗgИ‘Kѕйо4хlѕБїU—оќYіpXIЂїUЉэЗVћЪєfЎАХdь/iФЋGПм•юИbCpьRj‡ЄGьйUЎ*’ыЭЗ}&ф`э>ж™ЋКDX'дхх3qєГДчVГoМЦ йXТєыVи ЕирЋp>юaЙ1"лUЩKяŸJС„З›Ь5|јxї§J 5w[i[=‚I§›ЊЈЬАў"7њЛњ§tГ!ж,dъи;7ptP&‡ž˜eЦTcъ+Щ\bђГљ˜Wўху_ДЋЦ>{HаœПђPˆєЇђdМ ЖќЙЖз ‡EЗЫ лСјСэoЬБT?ХпкGД5()иN1oI= ф‘-WP›'fЎJ‹D0Є@MЄеуAzЩІ:Hќ<;+Ÿ=fы>з сTМmеГјОа)АVйиyнЮ›а!YњCЭн™ЏЇ`љЃВˆЖ<};цГїИсWІ7РМ‰ …XщЪ–Ў}оWЫ№кбlZeЩ2№жьѓ‘…к)БЪѓo_пљ8flsжkЌШŒz"Ь>1Y‘37=ˆ&irГxD7zrжЊт›Ю Zq J“і"mM”Ь-юш„ѓгY_щѓ‘U:ЇеMюЏЫa=)НsэŒh:ЕЛ%A‹’JЩОœ–Ёlмр*Fˆv˜P‹)ѓVЗзH9tжеX’“ЎнЂ=/8?aуфЭэp"yо~у~Ь=k!’?cХНюЕ„Н=žMЭ! ŠўдБњЃ@X‰‰$ 6кіqЗПQуPt2ёвщцЃЅЎп.ЕCI\V 01ќћЌt0CRƒяš<юфSa1‚зяŽъюŽ˜ДйЏvЊ$lфrcыќЄ.ЖvПzо‹23oƒћЂ^2•у+УИ‘зј=Ч[‚rя…”lо6Ї\|Є}p!+!Тxzџp`—’1­Q0ієrаўр”!—\&Ж5Lф7aиЧUlх{Ўt THYХEЫ_”цYk(ˆr‡T…”8ФŽ4U–&”OУ6mђ5яЙy˜.M›dЬ#xїnЅВИОЈ5\ž‰yžъ5ѓ‡teˆ.вЬнŸ"^ЦюАп]юЕZvяVБU,zS`g шХuљЖьЉ\§Lч] ЊxJXŠ™zЛгїЗ*яKœЅЫGГОŽП§2F ъI§Puщ'џЮ я6ЃчS9э},лž‹у;Ž^Ўэo{4‘lй#‡i–ФhђЉе#у№ЭФіS‹œщ™;ќДLEE XŠХћЉTП~ж<О‡!Ѓ•ЭR‚јh]ЭФ2•ŸS~ТЫŒ•Т ЧWлї­ ГX=сcpQ8жоNHЦaй•ЋЕЋъjМ\šQYПрEгц6,]Щдй„(ХвдЗьчКnљ 'х YXњ"їі•œlЮJФVЙФU/šї<-SЇN*Ч8Y!ш‡ŽгK,eъiIЋ†6яянТG%ИЋt2ѓ(ъљ(˜ЖёН[*вeЂaжhђˆЪ{!—Ÿ€kqБкTХŽ+уіP-яМ@S››Ї ИFы`ЧцП§Ѕ1dіиTяMЊяГзJк+)m<ЛхрЯYљ+ ЏЛёSМ9Ћ,е‰1ƒNъє0IВї<}IHа3юЈе/‡M”+Бw gЫFV/…wюH4сА1јы • ћОyš2БмпщјA˜ўa}M_{“­ъUcawM.‹]дХ:…„72’šУr"HкthмЏЊћ„7hqC+р™H8GЯF­Hx”ЬYм3W{Aђк*8X0_ZkU†AЌ№:ўjˆЙ‡<рvQўЏзъЭ\RРКЮ/ЋГКцrhBЮ`НД|Š"q‹| YгИ8Q…д3д2Ё™8рчвrgtsп$9|ћЫЈ‰*ЇlиFXM‰мlXЫр? =ё,4 <†ˆ`ЖБa&ЋеЖu^OыaКmОG8‡ъ•uиТgwŽду™E _„їЖЅЦVmJђые­$#УBбеюЇJ_ё}1йге~—GёЬsЛp G_j‘umJЧ‚iќjйш—В%.HИк;рЫš‚Ћ‡Wњ~РШMрї“сoћдb0#7хЂji‡~гr<нРiw Pуњд6ЎЗЭд{Д~S'‡EВ€mєwЂјЧ ЏРлЖ­§o.—nsэчyчгЌц‡я“ЕЕЖYЎяŸѓЧ P&жО* \ зXЊ„ОЁХPb3—њЄЃЈQLИмуwћeФfѕэЌЫzv н у­C ŸчUY~sьOЕо]в—ъxMЮИuВ] Œ=вЯЈо n3ю.уЦ\*КO9 iоИ3АДЭ2Ѕt`ž[zЇиГ кќX+›ёщ`8ƒМh1Z Z0+њ}rхjК†{ќЭрР3ѕфK)šVЄl—ЂЁгР}^S!w–-ќ0ќŠчТml4\˜ЎДYˆa ёгЗЕІък!Р}Ж_ j?ПВ7JK‚Й8gЁ%“б[ЗrTT0“оѕћ9 яї›јRщА?dtэ&ЩЄЮк„,смzј_ьфlhh…5§Ќ–{эyˆиѓђЙКoщлпЇџŠzJ1 Ma™Ї^JЁЖыгЌ мZ–“ѕfЩэњXљНQЅiRПМ8pйпЦЇЫT7Љ,ж^Bœ5З[KЩкХK“-“єыnХVњXю'„…Шо-WёEЩŠгЕ?ЙQс2'ьQB‹y~@Ј….]Юое‘H{ў|z+Œ§Evvг8Њ$иу{є2dњУЊѕ€ВО_y Qкx Œѕ}|pAbЃџЫhJЪсНBоэ@~ѓ’œЫOwХh.xkІЧЛ§Кkјw>Да‘0јgOОBU…y–sуc]оjЫ œ@[усоЌ СdmУ<ЏЊ“uЏю` жe.ZtіЧYтњQ†іЇљГWсc*ЖtR…a—Œй!BGŸTG_н@ Ž:hЂЕгё&л>Ф?4пŽ4Ъ‰WOЄ&и4ЛЖ25c#ищ•WР_г,U7aPЗЈчА ћё№щ‚fЅŽчOКоЃoшЌe)Њпs1І}е _^`н4мЙ g >рeОhяд”;к˜ $жPJ†Є~г9zиU?ЯFT:SpJdEуvччоа'/@э8xнвк-аEўЌУЃ<™†щ­(šajъQК‰ ќBСэx(Ї§уzGЧ[nXЏЊšщ0 й0ў:•дВіб›R–‰Црn_йэ‰Hњіф Сxч–8{кЦC!9CŒоЫЫШМЇ‰?ювЌ•tъіх#’П] \ћ]b§ и ЗD'к3+їў№ЅžiчІ!OгU‡ѓьНІNМ'ўЛ^ЁMќAуE—цCКфспЦ-щш'Z:"9РИw:ё RЋ 7бЁЫ \ њ%Ьу!DŒK о{=ё$ŠXMЊ*є29сгi9~Еd]tЙuЃгŽ7hI­р'с*Д?ѕdђ4їx“эkВ‰[MЫхѓ1№]гœt<Иq=I•ІMb]iOn2ђЈBГ*“ж{ъ З>Sф2оЖN%,%B“•ђžŽд˜CŸ‡КЯoЫЧ‰ЮƒђaЫ*пŽВZxyGю…ˆešЕ?Ћ?%Л6‰оUЁLбеЭ ИcgwюиŒЙЕГt|‘уРgžфбъд~œПМbћ&}Љ9-ˆy‰ѓ]ващГ0лЬAчЏƒ'd6ќОcёЧiЩ]еœCЦбed09yб­Ж‚б’Рв ‘Эћщ‰ ”c„ќ#Ю<*Ђ+Тмп˜es>@‰‚‚ŸЙˆlЄZvїQ•‡о)Д;-zТoБіKє.VLTc3ЃUи`y+G‚Чјў…z пхн'ocw]У•1уdчИŒGšUжй\‚“НvюЊїћмen‹ї_+ŽTЦК œ˜Нnп‚ІЂх{еВпѕ ь_Ј`DU\џ ž\†Хfэ{сf5YрKгlККљw—Є>ї“|Ш$n(Щ.ѕ‰]Аѕю:trЅZЭSы}QVЙт4 QlŽвБ~e <ОП-9ќыЌnKQЯ”xђнЏj]ћџ]ђбž endstream endobj 766 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xкuTг§ћ6("LABЅa”в0КЄ$Є[’БmlЃAКD@К;%Є„$DAB:DК‘ў3žпѓ~я{ЮћžГ}?ї}нѕЙЏы;NV=C~E(кІŠFсјABвРћккъ a ˆ€0€“г‰Г‡§mp>„aАH4Jњ!юc``оІ ЦскhPУй‚ФЅAвBB@a!!ЉПhŒ4Pь‚„Е€h рМvtЧ сОЮп@.7$%%Сї+ЈшУ !`PŒCР№!`{ !‚„смџ•‚KУ9J ККК €Аh \Ž›шŠФ!€0, уƒŽ д;РўŒ&р!ипCД-ЮŒё{$†ТтCœQPˆЏ4Tзъ:ТPПСZП|Р?— €ў“юOєЯDHдЏ`0‚vpЃм‘(8аiъЊj рмp|@0 њЖЧЂёё`0вlƒќj TUд‚ёў™ С qX,вўчŒ‚?грЏYНvp€ЁpXРЯў”‘яю‚–ћ…vEyў}ВEЂ Ж?Ч€:; ЃNЮ0uх?М № УХ„$%D$Х0' Ь ‚ќYРШніЫ њiЦЯрэщˆvктЧ€y#maј€'ьт0Ю0oЯџэјї ЁHhƒ#Q€ВуЭ0лпgќў1H7 Йž~  аЯЯž,ё ƒЂQіюџР­XPMOQЧШ”їЯШџq*)Ён€žќ" ПА˜$$,”Р?xџ;љЇЁbеQЖh|Фя~ёѕwЯ.HРѕG!мР'гAуЉ r§Уt !1!ў єџЭї_!џ7šџЬђџdњwЄъloџЫЯѕ№јСH{ї?э›x,"ж ™˜љ™-ўЬ*;­jрл\?в3Hs4~eЖgСўZkџЎ4v/DiбžЯгІсvIЏ fќ&YАъьwT<ЎЁkGѕj DYЗŒŽМНЄц icфрxЌ Gы_э + €ЦІъm§1№–Чg‹ъjр 0•§“ЎDмxQСщ™t_‰ФЌTмеИј8šЙ­(/AЋZљи(iFк5’,]шїЅЕ= 'Хu%їх/ Ы&5 ƒ§dЖГ ЗЎUyєуŸ6їЗїFšЏO–l 2:T Е-_ђЃЎЯШыЄыЁЭм›д 7ПЧ"ЊBЊеPpgэtž<МxGBќжЙНѓšeЎRяIІGа•nОl“Гx%lЮ_lђЈqЉ е‡_ыYoѕ›жz.БZСНЪ\f@žўn"1”хяb+;В4I—jц!#г] .Ѕte& к<АŽА…€й2š?Ф‹BЌ\щIЄTjАР#•Цы§$у>х—š 7 4U[Пм\нІRO”iƒЭŒ%ШцZžz‰ПZT9uŽчЊ+ш^ЎBrЋ4)ŠO†=•_єё?ŸЄ•LfдЂц›]єЊcП#U˜F ˜нйfˆ™ш}ž‹d€ѓ?уьї–єёfЕ|Њ/s/ŽsЌеU{@RиcsЫ+aЦU:Й•hћ;Ў’МЎ‰\•,iX ŒаRьR’l%Њux1dћф"э%q‘Mъ’†§|с“KYfиfЪ$Ѓeэ“7КQЩk.a+;zЫЪ ёъTLљ‰§;„Цгу’пЎQБ№VЗz<ŽрьDє,2ЖNй|ИЩNѓешŠs=М:l4і`Pxo-W™ЉќbТ.—;œhјцiї+Л>њ ?Щ…ХЖеЮSp.—‚wn•Cвe`aпPГшРJЩ^!M$ДŽSЃЭ|{КПи1‡ЇK‘ ‡‘šќgу нЧwY2Г\ а=љІяЬ€|…Ч0ГBe›Ќщ§˜ЕЉ€= Ѓ~BFЧЄY œ0GFЗЄОBЬбŸЧожХ–LUTС}N^4š\aAT|еШьх~ЬќЪ“4Ѕ0эЈlЉ3єа—ёNЉeь‘ ЭnэяІ]/a& ,Хх^/+“z`[,я;ЉЎˆ–о_`DyщВ…]sјєpЅ'ЕJљњ„тЛŒ“žUfВнмУд‚)ЉЦБП‰ќ'ЛoэP•ё^&!Ў–У`#оqйNOMUyI‘+PNqХЩњЧa­hNю23ЕAšдйgїcп­л]ыЃ'ѕ>)СвЇ:ЌMњёžsЭЃc`иD%ГLuŒˆ%Kрк:ƒZŽ$nў‰ўD№ ‰NГи=ѓЁ^Ч$cщUпEƒз ^q›Кэ6ЦŽŠ]ŸоїНцЅќя9k-я!њ ›>iВVД@‹Тл’ П˜єUŸ9](Wѕ‰„ФRг(o’|@"Ю”П‘яшљэŠ9KЫЬМkю7зОьLƒЫ8е>з№a<“Pb9^{одTГsЎчщ^Х  VWs[э1ЭMЃ‹MінмиН|‡Ј:ьšЧф`Ю @n]ъz”(ЄЮ8Џ"uЁнЩƒю:˜L7Hkла1WЮ^VЁЅї™aѓ’X МBжМeйи3ХˆшПа’SК(тT:U‡ЇO™>y“ВŠШчi0Bъ†к OEgНKзЩTЭSб$љ<юЋ .Žс~‘КusщшЉ%UcэёƒœРн…1UбЕЮњНтя_ˆЎ tт JŽ,j‹ л]Э№фтƒ’ЕЗѓpџЛƒ7–j]Ј@ЊіbЉpTжEЭFN_чtр$п`а јоgыa‚•§IЙДђж їу7rз0—oˆмИeСaбA›5вгYyPЃБAф}) ~УiюЊТУw6щsЯдбм|_+дч3„<’||/Z§.Яє ‰!3ЦЩСКt‡d#Ьd=Ю?мpKTXXу-ПЖьG5ЊLК7vЪpЉ*rPщйЉ™˜шNžЋЖYёВ т”ЊХЏЊjvONF)žїв_чpљ!*&|UгћЭяa\рЂ[QV oЯ„тEњ\ёиСxAœ‘ЮGrUvƒіњšB=t+bХ­ƒ…ЗСHмvЂФD§f§hc_,!BЉяЂЋЭџеэп=Лeъ>аdЋj?ѓ…ёЙžnW˜ЩЛ\Ђ–Zщ§ёKkЈ’"žˆЌАgЪ%Бw ѕf[0лѕ^ХˆЎ|ЕSu_? (Т51џzkEƒЯєWзїљъa|f Дm-‹8Rш JкДЅ„ЭЦR3УЁќУрьDиі€ђЩјbЅ[.ъгиЪ–ЃE?h‹ŠkoA€Xc\ВђfVХђЂЫ^№,ЦцюZtm^qЅMYД‘{ЌчБЈ|#—ђмо $ыЧј ƒт*ˆœп­НSR3шaЙн20šOћšЦhЃу{n7А}иёщбЈч†йD$СŠq$‹Ÿєн)тд‚ЃВё;G/ђя9 ŒЦьRкЛ^Ъѓшь Нџ*іс„}<П9оы[fПsLЋТ^`-iwЇmf—й,'<@орб{Šд ёє+ь‘ЛпVљvхђдFЩ,(Х*CdЌgн),ЈЅVЄcŠWліЖ 8>іђSі) яGЦp`VЖO*ч>&%Oэmotэ g_ra:#Ж2ЕЯ"Ц—ђъ 9цžп7јђcМИK‚ЕTП“мЃСЛqaщї ^р<­kш%ˆu“mпЄ5УzыŒCvш еMNŸ ъa€њшсПР ny@‘ŠчТъи Бэ>—=Г{И№†rтžУ›С Ё­ iИPЗНшJЋ6F[ыќТZіКеЋb&лWU=бд“ЇBЭ}k--_Л=ф .њHжFДЩќŒ,`ZzWM<€YПwімЕuиDxш†й=@5Ь3’6S”Sшqvd S“K…АОщOшХ3#|эш’VH^ё–Ћ.­kk]PъwG“СЬ@ыjърˆ@I йяЋжќ:ХіrgНсљ /Ў,пOx˜ˆжЪзщгMЋьјx™ѓ1A@аЛѓ8еœЇ3Gvcб‹V;:4{‹РfлзyФHœpњQ=ШVХЉКл\ёmФY„ peMба2и48#ђИЂd6­Аc-6RЬѕ˜*ўОЧћ‘RŸ%iЇsе‰GЋ<,ЯLС/ьjƒђQšъ ё–&еА.šУЬB?vFж5‰МlБ Оі>‰WKСф'лbV[Ќљ„гїыIK_ic‹aУ9 Кк,JhЅ~Бћ$Цузык3^У•ыЁШмпhжЇ’}асжІПЛРЌМЗRЇY(Њї3qќт]LaеЂи0:фwВ“‘R]@g —DК‰Х­37AZ‡hx*ыlн?ПTЪЯ ь"Q\]”|!ЂhЮ–З‹kAјвУпM$цЭїКх€C$Qф>”љгAт%і~ЏbvЎsё#П>І„bR_ККчљХ7TЬПxљEЧОЇ6 tk@дˆН1:cшm$iЄ9M”§ЊU}эж-„ыљ@й3ЗЇђ?иєдnъІЈxЙ{МаьWЪ8M впфHŒ4›ѕ,ииы ОCY<V('Ў^—uФ}БЊgw2™БОMlІTЯэЏФ>Ц8бџ–=zЯъЧІє]0ˆlћFк’ZR)…ўн-ђщg”ШB(VН6‰nѓŠўe›-у1ЅмNў›ИLи{c#‚Аlcўё^ЎЫі Ÿoгg„eМеЎ~Фа™;иdК<мЉўfщp/#ТАœy=Юм‡KrўЩЄeО#тcЄMZ€_в)Gb‰NrZтxХYвr@zNMЦ_“„Lиѕ€в*Лo\О/i‘Pa T+L,ЏiѓЊN—Uuz6‘~ ‚ь,з›X_З*лYUї-\&,кјX9u{е‹ф˜ŒНYtЭa№)Ж­L|“‰@!кжv3У~П4ІY];г-В=зTLжкП Ш­~)з&{%Фm}м„4dГЂTsЕ ŒЎМ„Д№*ђЎЫЖ‘AЗ’Їч[‚B=ЧЏ$Ѓк AOкЩNŒ›wew\rОm_v?йТ=Ьи№yyUр?3oв$чЯjтHюЌЭIі 6А#кdА4d–]+ж$˜„й?R}OАМѓаЕ`;хЭы  ёд“Nяаp)},ƒьИ…šЪСѓгUуŽG—іпƒNЃiЃЄпN3ѕъT–—­WŒ$ш]5˜YjчcЅЖУiѓjи|ahZ—шŸ…ЋТ9 lэ•ЏєПоH&n&Hѓ }ѓ тMx“РѕHzџђRk•к^i>чp?ГŒЈўšqџu вЦy*~=‹Ѓѓ/э§UихбЛУЪ2_‡іRС•ЮХۘa‚ќGььЌЖMћФГпF‹6/OnKЬ?}" Q єЗЇ|NЧeiG4э”OйОAђSЁUxtI^ТЖ5fhй"Њs7ž’р‚“—*=Ћ|іfJ AШИJ(ь/BOrg h ГЉ5ёžрЪ5ЩŒЎjо„сс‰йТкюЕI>гэ…ыeѕЭ,Оєхо<М60х)_ЁЏaUь›.ŸK/шХv=пPЩŒ›Xѕ1,4ЇТИ2zп3>oЋ…ЅŠЉ$@‡*~АжKљ7}2ЁSxœPщ8ъУН‘ДФ5ї”Щmh1Œ>mЧЋлм–›_ЬgђКyС$юŠYФ_Њѓo(іhJ/ТкіШМР=ЋЪЂ€№ S ^ЅЛY(зN6oY~пqZЄпZёт+"ЗрзŠ ;"]PnХ)ЕмжlШЦP“їж’I‹6џd‹ЦjŠgЙЅтЧМ`зЬœYп’Ф9ШeЪёŠГ!Ѕх­1‘˜Ћ‹Ѕ7  Њй “xѓѕA?іPХќUЅ+јй‰ЇљD˜vь/GљЌМˆ?пА?ƒ_Єjƒ_šьœЈЕзu++<Ї3Й Я•-'ц›2сЁŸE/ЕЪŒЊTDѕ‰‘3mc* Ÿ&|TВ-Hyt(u§Г1Н‘ ”6ізыИНб~LЉnY!Oэ$СqФзЙСZёЩіћ}nуєgyс˜dљеєjгЭDLK~тЋdтKє$п˜Ќœнн™PзЬ +˜sXОЬIгЗLЩцЎ|ўиіѓ9Џћ*гыК_јЕ‘Ёt’ИtV5ц<ъIУЇ™l vк­‹ч „^3Ч}<5яЫВяТІЯ  m! +*к|i#y4ЬДм~›RPзy'б‰Ы$№ьй1 ƒ€”-OїР„‹Зд.:5плК%lMс’'ФЅŽЧ9E' —ЯњBJW%ejОф;™Э C/‚(__‚‘xеьюŸШtEаo­ІЋiДѕm’jПz(ЉЪRЗНАr‰}2зђ“щъљР&md›‚Eш/НdУџУQ <жУЊ/=ф&|ˆТОkя xpэmTы§XВORcбђе"д|Аш$“јмЇkхкы{‹Д/Й:тЭuжжŠ›Лn]^{І›Т Ѕ=УTd~@н $1Ы™jRХ)\u›.З8ЖQыk —kЩѓЦЮмЫ'Ѕ*ESлн#Ш\ЎW› С”Я{юєb™ъИ ‡‡.Ž4+ &Б›я6wѓjѓы> stream xкtT”эж6вФ€Є вн "!УCЬ3t— JЇ€в н)Љ4H7ˆ”JЧ‡њžѓžїќџZпЗf­gžыкёь}яkпЌL:њмВVpKˆ†фцуŠф55UХ@ ШЧЪjE:@ўЂёX .(&ўђ.ђŽS!яќ4с0€šЋ€OР',Ю'"ј@Б9Т]Ф 7Ј@“ ‡AxЌђp'OЈ-ђю3џzp€9|bb"~‡d!.P0а!m!Žw_ƒњp0‚єќG  [$вIœ—зннфˆрЛиHq>ИC‘Ж=ттБќj r„ќщŒ`` EќсѕсжHw pG8@Ст.Тfqм} ЏЊаv‚Рў8kќqxјыl|<|џNїWєЏDPия` wtС<Ё0€5даVврAz @0Ћ_Ž ќ.ф‚:€,я~W(Щъ@w ўеьuB"xP‡_-ђўJswЪŠ0+yИЃ#†Dр§ЊOъпЛ'яŸЩкУрю0яП€5fe§Ћ +W'^CдйЂЊ№—Ы…ї7gA„€Ђ"Ђ‚ˆ3тЖх§•оРг ђлШї‹ОыРзл юАОkт Е†м§сy#@nвХты§Ÿ†"<>>€ŒXBl 0МПГпбы?јnј.P€)№N{|рЏпПпЬяфe‡9xўэў{ОМFКВВКOИўtќo›œмрЭЭ/рцј€"B‘ЛпІбAџ*јwЌ*Ь~ёЇмЛsњWЩn)€уЏэрќ3™ќNЖЧп*7 СwОџГж‡ќџ$ў+ЫџІђџ.HЩеСсЗ™уЗ§џ1ƒЁž9мЉжyЗš№Л=€§ЗыШŸ­е„XA]џлЊŠнm‚,ЬцNЭм|‚<@С?<Ёѕ€Xщ@‘`л?šљУўк5( ЂG@].wQ@рйю lw ю„љЧBмmђїaШн>§ГEnѕkёј…„ 'оншяР›яnC­ ПЅ рхС‘w!€Лž}жpМ_cОг>ЏС/ъ7№‚ўFЂ^Ы#Ё;фt7EИеП)>~ €зу? €зѓ7ќG`W—Л&~KыЎсп7туЭNССCьЊBšЯ*dяЛsoŒH`Єœѓsф?УAі(ŽYЌ$шgfЬЉ+Эvѓ)=Гkг’s>ЫZœўюН^ЭXу)xТЭЈДmУh7u{‚:‘ш}JЧ+‘{UзLЂ;yЁ’ˆZhГVk{Ea†%˜боЊВСВп`Cш5{іЊcl№Z”йЫd­4fu‰жsМїrтхОўy’nњŽШ@5З C–HХЧ§t ‚ихFѓoЏВпЙ}M#ѕЖT&“љjеSВФ™tVЅulЛ~ќеœщЁswVu7Ю^†r‚_ZnЬ@‚Ьp|ХїxГЉїaАErО‘6iћмrš!ƒˆ˜ѓЁrъ|ЭыРЫ J–Џ+ГeћЁєwlќЧ=НСялŒm„mSŽzmєЭ8•f|ињžн =гзфф|”4&‰ЋšЌ#ДP6ЙИЃ›…‚EЇ#Л‹чoљоkЂˆJEћјx=љaбђ‡щ KLA.+DјЗєš”№S—/QЧоƒ›+;?ќ >=UзхX о>FъrвO{ ZщвўZэDЎѓЈ ‚`BDѕ“.,Ѓ9кИgР%4i{Щѓa#вqн hђ‡`&јеo›ŽƒDЛЮ2>Ъ}8Е=ž2щdNm,_p]Ќ˜ХgpŠYќE<т‹ ЃвIюc—ю,~н:'{ЎТƒЩХžАтŠXЂИ%ШGlГ,9џИ№[Ши‚ƒJIЅћџaНŸl|КФyЄGєzb”qэЯЂpѕr4†ˆзЫВяяяШlw–zБŸа"–aе4iШLЭЄИП8dЮлL0W€вТцЏJe­TЮћtB'm\Œгы }KSz›Цђt}‘ЧЏh7*‹|р EVнNэeЛВщC<ЁcЧХ;8оQ*ІCЖZ,ЌъTЩIу|V‘)й{гН%~NыьЋƒ1ŸњE8жыИmХЉп <­>ПnсЖЙŸ<^Hv кv#Ѓ "пМMыQ]ЛŸm8^НŽвБКА§ФХМŠNЦЄѕr"˜ИP_ѕс›ЬT”ўPхqzЌ@ВЄХфЃк‘Ъ57Ц–[Zy€КХ#ёlњќ’epєђц~ООпefS‰@ѕg.mVщуVгgл‹Ž#ђT$ђ<{у—JЃШЅVawС‡яY,3м ‡ДUŸ&‰л$J…RtaыЮІз5zŽw\Уš"”Х^ОпКoќ џG˜YЌtc_Yiš ]'Ю‘ŸсCг•Іœ˜'^f#+EмеыBЎіЅ€шo‚цƒдО[ХЯŽ_д| [Mщ3`Њ™фЙ§чX= H™’Y9Tѕ5yЬСzсTЌоž] ,яy~&ц9Ћ{рTy.~IЙѕА’z#кібЎШч{[fтЃФЏЎЎ-l)„ xjžЩЄˆk*пНи‹1‡—™“??.yŽг`*6r(і”м.:О2МhхкЭˆkы`ђ uИСyPлkЪ4зŽT#ее7hо рXЎ:ЬbЪч•йаь2зъхцqБG‡вZIОXpЇЌ†‘>б)$‘2ЩA~!ТЏ,š†˜ЌІ2ЁŠQЉЧŒ~ь([ыЙ –ФђЌѓ ZŒЧЃЖ№В[жЯДeюпQГЮFœылˆКік1иэлЬ/(й/JeхКЪИJЧФЃšEОї‚ЏЁqЗЋїодЦќ„M–ѓ+uЋъ'мУиŸŽ)5ЩyяbБ $К9v]fэ–ŽK)ГM5?ыяyФ–‡ нѓ\=%Ё8z*У!(Йyj~O г“'^BЙ лЌОѕoъл =Нф‘Д И№ѓЭWWНy—э”ЭФйЁˆнoeвС ћq Г€љ;ШеICЉоюi ЩвaZ~Ь3œЈЩM —І+x У™' eQHЁp}N.Tнцw1ZЩdRцzG—ЅƒН,wю§чl SЖS OŠЯљ.ј™ќшjѕ =бю}ЯEcЅоеbно I‘LНлї|-Qњч9'7/ІќМ,ПЛТSчЇeт<]1‹ФUпЉw}B”ц,ЙŸћј–vЧ-šЪБ5~ўјА>ЉNЈF™~%ZЩЖЦ["Р ЗЗ,˜gа˜:ГhГVUM4^œЇт%СЎ1Э}TПhьQgуоVAчwcЬ_3ЩШЫ’J)ЧM„ЏЧ­kCyКџЅЫm7(Ь5ќбцАS/:Юi<рV+zRhѕ>єeБЎŠ6и.~эЧй§Ќщ–ђŸи…xЁЇ2TќbhСС. ОъёtFJƒ ЌЏš—пžљГeДјшœЄ|:;УЂУ Лђ Œу: vЭћю§AŽm‰щ‰sYpuбЦec‹Џx#е%‹o&ж"Ыpйžы˜ЯIШS*ььђWFДXXЃ2зЎ рЄxtмKЭх‚ђЎJћЫЧ,ШЎ№ЎYИц"ŸkянеFЛсЊQ-5m№КŸ:ЩЩАд/ъІ?ц#бDШ Б8ŠНo@ѓ–І}Ф‚WУ'ѕуѓ|g"lлEвёtчUљНлxЎ•ŽH]LМkœ‘8ЩЫolœ] ГТ\гпО7ў|ЎžНG`-‘cŸ/ДLЈђћ(9lЪ#L.њЬП[ЗџN]\žbQxoCиЈ0”ъљ?З рІИFœp№bѕЉD_VђPn%zcфg\1шНдХБЗЈ[JиsьаŒњ жы,1Эр'} Б6ЦрвYѕН'Е…гŒBMЂ њЄkŸ=ч^лбДікdхЋфGтџ`dA№ЖiiMŽKПхLO—)ЂЁ(_$9wVО гXЇжЇб,Ÿй5дŽ‘~“‰Г'ˆy ЕšНѕ8ЫТj’w~jы7!Г&~сzє#Z-мy$Vœ“K%ё'Щ7Ѕ!жpл‚њ(сЅf“Оъ‡цИУіRW)­,жЪ'.ъ,иЭЅэф1e‚…JˆЯ\h Щ6^Q}qЇ ЋHЊ;QžXяа§ЊеЎsŽ•›‰o*ŽМђ74 Кю‰АіОрi0S ~SЭУŽˆХшЮ%.AсС- a’РпЧ uSЄ˜їТ ЕeУќž§ќPћ”KŒqLІсh˜ъXnRИ%Чq]]FœўqsqЗт–|u"нŸЛnЩ ]ЂЎ#чзрѓEзЙiI_T(2’f@љ:0ŸД9БѓzjL,3ЙМZHfя@"дMu5Yя!\шЦ§Ѕ`Ш›Ѓ2†д)”ы43’Ix2Uќ‰Њ9 #•Wл ’ mO!у -j‹HТІwбЬ&€2Єu…чs”XŒ‘Р/ЫИзŽН [(рыћŽ‡ СеWЕ6…Žr=ќЖлЉДђ‰Я9‰‚tкoЉ&ћю:ї.ЭэО—ІБЯuЕІ˜R&š§Ј,PЊ†е’тЎ3U>!ХЬb˜TM C‡_IџдїƒJф­ŸuЃ643ыЈq%ЪœYЦ^0 њ ”ѕЇ'qЬNејŽŒ5ЗIЕЙЉиЗдD4‘іTfЛЎЇ7„Rт)…ъЌŠч8ае§—Ф_TŽвKgеFоŒ™œЎя ЂOžх<€<Ыњбо*ныјРМNlрЩxcџˆЄlГЁўыL)ь{hэж` *пZй2ЖšH1ЙђzНSRХyБУс gдыВ­Џ$м{ЎзOBЃe+en4% 5h“0ёIОcѓ2НKОЖЅыaЈpPђ[bŸ Фс:.іH!|tўVp*7hбdœ›"&tІ рї?~ѓё…•ьž Vkљ%х›Wг.”}ХS+t.Г tфхYљАЇО"М L&Фи…сЮпг\—[h`е{ћ[т5_Mbп~4YЦ'—šёWЭxє>”рс:S­ЇK4ПŒЖ#ўFЄКСN8O‚  ЙІЇ0ьЬCcІwѓЫхЇ#oѕ4€"™1ё„2–ywЊЩѓ§й‘|ђKQŒ#ЛЬОАЯЛўFу8ŠЪ>Ў*ŽВ5IY/В \<ЮLю*`ТWвЎS] ”кНG5ІсєbuvMЯщњ<а№Щ!. x‰7ŒЮt%$ЖfлyNАКІ‹‡™Ъ-u>т1ІЦb QЛp\^Ÿо‰жP”7 u*Яzй‘нkкэиК)\ЊFЃ4;BІђЩTIЮyn‚їфъ|§d*ІЂc}_”ЯЗ•!ѓ^йк­Ф‡"ўлRtеЮ •ugdІyдЋЗŠoЈYЭR‚ЌВXл’3XyXƒ\‹єЁФ4%ŒїѕQ‡~fN‡%Р*hљq7DpйkoDHќЉ‹ОЏ^ж6U1в:!ŸCigкд)a<В™5ХaœЛ^K€ MUЧ@ЯЫ*сžГL7—5нЈлSc6{zй‘v]Piх_љŠNЏюƒy=6м<џХИАбžeЈ C"е?JW`]ќ Ъ]BД8Hѓ›6G›ДЫ@З:ОƒмB@…œ…~КоKCПњB‡їбРпЋ|§R{ЙpЛRяs‚&ё-ž„|#lёЊііезƒЁ—шiDmјO‘яЦ4Ї™MP>ЏПx ‹_ўФфr№rki4ЦCЮ(ПЩдР›5рэіaШ/”4Е‚™В(IбZБшдМўmMЙк–фчLgVš”ЋЈњошл‘л§: ж]Ю QC™•ЩN…m’YЌЕЙС7‹“ЃЖbe…&ЯЎ‚ўљЋЩžїшм…zuу‚AЫlщ_ЉˆруK^ uO0ƒ­в9Њќњь•ЭуФz™хmЗccэтDkМtн =Жх—VŽŸЬКиT2dдf­;Ем§Ц: ЈGaпцчкй~Ъ”СкцX‚?Mе”нрqмћЮЙRыqСюА]Д№PъуdR•ДцWм7Џš‚$ъfФlK'tB‰bG3ыEјЫљ?ВjєфУq:`IК\Ч В= a=MЁЅŽмО…ЌЦ{љв:XŠ эZШUo%hLОШŒЗIж`hЃ‹˜У“ќАoo n+A 2и™iФ2$šZ;cŒ4“щŸ№?€œYrЅ^y’gлq}}5БVтLFьMЄСVЊ7}ИUЗ‡УтВгљ:›],МLюѕчЙ"З2~Ь™ЏіІХ#яэ-Д`хjЏŽ’Г(Ељ„.Ѕ b” c ДЧиєўрŒUGСŠOћ\ouqГЮЛкЁšуоів•ЂєёT:іІs;-Б'hь:GьвŸ+ЏzaЩ6є•щ“k]ЙUiЈсJsRБЋпДfi™}‰і7fuЈ}ГЙ~VwїwjЛЧП ОњxиŸЦ§Ѕ+ягРўAчR*^ШЗJ,ЏI—№QFАhcŽ--Ћї]81hѓаХ.@|ефи3(;ZЙ ЧЎ&ŽLbТ‡]Š%aјеГаЯЪfтž"lАѓzј\‹5<ђE6pД…MІэtGCƒоГѕ”СH…k‡Ѕ[сц№Xй&ЯЇšї‚и0ЗQП§ƒгuqџp NtуŠЕй6ЂљЦяeШN№ЦžiЋЛГ:ƒІйBр`ХžЅФ“r эЛFU –JuDrџy!OAД†ХУД‹>"ƒЌJѕХ:ИЎЊ&ЇmЋЩЙи/п-г‡GФGv‘л™ЕвBіaВh(6У.Ьq&\Ї‡*#иgМz&B0 qWї~pйэфЩg#ЌvНW4с-39‡SТmрЁйх$г:[ЪРЯшвУ7Eё4е€™г'Г[ўЭ4 ‚”Ѓ DmяЙbfюY8њ˜Œ Дat:j $‡ДяИ ]M1і=_­{Б­Ѕq6эФAп6ШXНвvВR‡†х_{šЈŒCžŽ/LgЩфЃтYІ|š;ќэlЭ6жяyоЭxL€SљхœЎ5)ƒНŸxZкRТГЩ§НlWмі0=Шœ—•‚АёНТPFъZ'€a@vyЦыїЏnЈ>IFwCK$~vOІ_8>—Ÿ†|зщvЂЏ#нœе‰~ŸЧЈY:RЫ\H†К=(=иџ`;‘CN лќ,хфoЯm~АВњRQЗYџHз,“\иТяейд\]ˆђ6Е&ФгЇ(ЮС—h{pк $ИaˆІ^Рїx,j—LШaМЕz”xЄЮєy2§Ш0№ *Х‡ШЖнЭ–эцљм&І­Šat{u›ЇГї?Ь†јџ|ЙKГщз”˜тIYE‚oљj+5ј4ošЛ5pЕJ™o$GбїхЄЩkйDх|ќžTBя~$РХ?oЛуtКNwрж`=ЏYяеF“Ю3ЌоСЄTОм’їЯє}Ў УЪ†N\2T%ƒЃ•Кr-ž—SjЬйІ 8jЄ`№Є@S=гzb”ЇFn"\‘HPшФUeР`г@[ˆXњФт}-ѓ§Рќ˜8Ю_њдo6 Э$ЖЌ2žб^“oTJїиЈс№ƒDЗXWyЖ=Пфиђ„кœmŽЭeЦd4Ѓт!WТœшуЃ;щё‘S@tЫŠ.H6(ђzЧјœзk&}l—es,/f#%в9 fx+9нЂб•вfb`c’№ЩЩЈдяctшV{ѓе2тбKЇь€HЂRм–›йUУ7Т%3;Ю#˜dь]МК@“f€},!‰r?УGS6]УщЬ3žзa’†MЁЅy%… €R!m#{лњ@ЉL•У™яіjžіu-ЈxUЯУщэЬђЃЃзЕ š3эC^LPHхœчk‰!хx•~О|МсѓЖвyУ!*Н 4Щ” ої‰t)•jЉƒFg(з›ЌR<БФЦLЎЖK*НЛ7ьГ /dЮrНЋ—ќДT+”ž3_YЬ7z^ГLJ€ I=ДЉvХОЧЎ› ћq‘8•2ef.ЛRJj:щћTДOьYO2*Ф­rцlѕФиbВл8%j˜ьТжY,мПMш.ЕМEЎ—ЉЇЗКПЙvљq2rTq!šЎ27Еб›@n;ЙяJ;З> stream xкŒїP\ зŠwwH qww юСЅqwїAƒCА`Сннннн@pЗ33п$ѓПWuoQНЖЎmч4фФŠ*єТ&vF@q;[gzf&€Јœ23€‰‰•‰‰žœ\еТйјž\шшdagЫѓ‡Ј#аа${oш В“ГГHЛX˜YЬ<ЬœZ9 ‰…‹ЭџеJ9‚AижЬњп6Z8‰[ИM-œЭџо–ПхjПЎЬкТЈhчdёыБ цџш@Їelzt8Vђ/t9џM)fklgђыФXи9†ŽŽ†№ !ƒ;Р‹t‹&@їП–РШ`kч r€Ъѓ˜к9Тџš(;€Qј—шoФ`љ8ŒЂП€ё§Пˆ€жЮ†ПемFБ'€Qќ7YKќF,FЩпˆР(ѕБЅ#9™пDNі7‘“ћ@фф#…ˆ‹тoтЂєИ(џF .*Пˆ‹ъoтЂіИЈџF .Пˆ‹цoтЂѕ/тqљ№ќ~wфgєx9[AЏ%SчпrжхŸжП P"у;(˜Б5h­ў'acћ%ББљ№зО1šќA)П#€Jў'3 (аЦФаЩќˆh+џ”qќŠурКхпЁA}6§ AІ@Ж_ат˜ ќВГў‚ЎП™1џќЮўЫмЮХёl Г? (ўovl Aš{и›mџАЩўШЯ*нђ“едк?Kѕнцв@=§™фj :ф?є кэ~“9л§G *ЦўЗЬє~Ж§Я А1џ#§яАXлƒžЈvŒєWЋ~цr:§ѕИљwoX~ эœ&FжџIУЪі[ёVуЭэЙџ‘ўз˜љзxџ3ЈзNПrrкXќwWйй]џ;(ˆшјoБ Ц:Yџg™AЌ~ЇНjЭ,4Ј™Юnv8€bИќAsu§‚˜Й§Б“ oї? (МЧдDЯпф@‘<ŽЇњЯукиХ47чП^Ј Ћљўыыш4†_šЗ3ц ЖЌnНЏ&pЃпчŸ!пгHЁІїZrlsyD†IЄЎHмpМNъF]нЃКZ&њщuвT кЏдђф§ЌЋ<ЕзП8‰н?‘w"\гїю-НЊаОїOoѕ+ˆ&АiђЏ.\ШŠ9їnНю5}Х+Ѓ!ѓ{Jћ2ЯХгєQj‘:ГфйFsИ$аЮєя`iа/нQfongаГ&^‰Єciс}NЃXѓН>lВD?ЬyЎ•ЊВ8uт‘с}Р}qƒ>:Eс%r˜$ГрU˜ПкПшоФ—O”…D—МJЪpШ’VaЁaлаSх:КдЮМћ5LIаБ_Uд€ЉяHЂ€UбЂс\Хj|wиn*ВжzЋоej™ќv™{Кц0‹Єe~тпихѕTыА64мO’м|?д0МгхЃQ и'јжЬ™FЬ\;|u…'э]2TБѓxЇP •nй5‘ыЪ№#ŸWрw‘G|цэ<&І\P=`ЃoЯйПzі)ЋЛ”oпœE[АvCз z т5ъHОМЬУ3g3HЁЪNыњ”НCЉФ[ Ќ› *fМм,Уfx_фA$ЗЭОј}€,ŸMJЂgoЁ|(\'аУђ;—с\НL­х3{Ўёюi§иa]Р HаЧ^ю[“Уэл’=Ќ#;ѕ‡Ы2З0‘Ёш-UЮрьOэЪўYN ЉТрпюvцzрŒHЯTE\‰mbP4TљwЦ:П=ЛбKН'ЇЬ_’ы“9т ѕ^в]|ŸпƒWщ/„§щІСŸЅКMсžъ b:ъZ4yњў Љ~лPƒњї|ећRЯЭ7= гc;Ф#S;d^жe:lН^іШTыX т…џ/зќT‘с/ІсыjnТЕЫoЋвfћЇƒЃ"Є0mЌL˜уЇ’€М"Ъєuй|ZЬзљјLЫmЯ ЁGЂ˜Fўr'ъuЬО%ќ:Z`dяУдŽс&їŸ9ГІн%В•lJО„уэZTЯ'd/LСЫВМСЉвЮќ‚іc'пš8вєЃf Ќё!Zь›О9JЬСъ˜ЄяЪŠЌbйФСєd~Йў5xЃьШЖЎЎВ2MpЯ@№š3щAє+”vbћ5—Л"ѓмЛk~ч‰{Щ7Ы(HМЉM>Ž2.ЬGЌO_дDп@Y|СЎ•t.ЋžšёЙѕР%œё5&$зйpИ№зinоgS`s%жNгП“jЮЉМЈЉxЦъп7ŽРgкxWr%'§ —ЅХT:уъХБ›0ЏsпwЬrњBТŠЧ‘Ё:­%УА*ƒ{ЦхЄŒлЅ§й*ѕl.џX;яЕЋ€@Na†u5žГт£ћжI1H"wzlг+д 1R†›WfГjDЮД”Eѓh№хІ7;~#žбєІ'УК\QŒ%›‡P]˜ZED–qŸЏћœЃX4S8wу.УšЗмkЄŠДyQЪV:Ž6тMЪ›`./хEЛ8ДЎ^UЊ]}Kp#с?o;9}Œљ™d Д—ЗБmHЛr‡Џў%_Ћєкю 3‰`…˜OВ3оˆ'JЈgѕ $Mн1F‘“[˜”шћ№sMТІєЕйs"RмнКјЁ„Є[Z ЙЈ.Ѓ!ђжч@њ3фЊЪрŠ]іEРzС…2:v#v~[‹xдDq›bУa›,ф”Пћ=ф7\}эqMѕ04œыJ_+T_o\ƒО>Р‡щть_–ёƒ§Ьуу]АПŽ4 ЕіТ‡Н*нЭж2Хс`Х—мP4tђФSУвЏЬУьџPТLHSМ;…^#G;`dяТыЕV< PІФŠ}ЈЎЮ˘н:6ƒŒ„^ЎР ЙiAзЪХU2Otкђб,‹_‡SˆD|ѓQFќ^5лш)%Ж]= кšЪкЌМ+cйhК,jИёАx.inDgычƒ!›3NхЈ/ „{лA=ПБ`4чЄgu–уdf‹ьл S–{Ч3џV6гO7эВи!ЎљлїЃеk}$ЉФ„ОЛ%МДœі:ynюxшZл№zkьbхcЋ‡ёXшoГєW›’$ъюЖ.ќЉ…­0ІЮ™ VЙ\Ў]hЯw–HЏx/щќ<‡jЇШсэZ*6ОКC 2Ѕ8ЂЭтЁk0‹ЛOœЯ&oЬ^lbЃъме=nъ–бІ2HtI=}q“ ь]ЏК2о…ФІо.і28Šp"УВmд-e~ьu.6"Н+фz3i%:!S іu†7Зѓx6о:@ќ‘ a1Rў:ќяцVОЩKiїгX\ъѓMk8_џЗьФ>Œ`ŒbЇЮoм|u1HЂbеrЬ7л†zЩБ”тЧХѓэлzЗЇа‚ќШŠ?З‘LБВЖо)r/pŸ~ˆrтЃ4и)#D:u\жxр‘OШ?tšЙHh ‚6 BLз{ЇБі‘‚…Э НШкaŸl–EуЃкmэcџЉЗбkю‰ТЗ,Œс1qtн5ЦoХ‘JUpaC :J‰нт4ХЋЊипЃѕфЗ&њЙrAy!*фЊ5ђЭ2œ1АДЪЉѓЇкŽљiЯƒZ7}gZ@ŸжЊХЗˆљw‹ZЁŠ?рЧХСдФrNЏ_"/gd‚:чP$#)ЋыР>( ЃH-m:“чюО&ЅwjRsіRД?5ЗЭ@ЌТ;вЂœ]1ьЎWэљNЉщш7Л‘ЪhЋo›!-›K•$_}№udђ |Yќ;/ёК•K=Ћ4Ѓѕnлc_ь3йŠ\]иУ<ЕlАІ>Џч0tзэ йец§ЖјЬ)d~Ž6ТЏчN‰˜н§зWЖ6 hR[ј‹ю†n.эв0„Мb=ц`‰EE‰"МpŒa4ќ>дŸ^ю3си"lй4sRL1!ЃŸвЙ­ŸMЃхГя€DoDБЦ@єnђMЋх:|dъMЊЇ5№є(t "квЏё,Э љС"ш:л ~|нzГкЃ f˜KЬ…7—gŸДŠkцЖD {ЯЙ'Ї%фЁЂыћ§cxjйƒЕШќQi<QR†+1гУaCИxB ткЦуy‘и†ЁvX щНЂ;›ПфЧЏXоЧ0ЯЕМ+„ѓ˜ЈZ$Ќ"?и—ЎŸїяЗ$uHfJДЁя™“ЦSЯŒйхяЙ‹эX8Ѕ[D~^з91Bœ‡з›Q§(rЧRЂCvа.пц‹—pъk р!R&ужхРЄ{Дё(ЇЖЈУ w:ВьОе(ŒэUб{Ї,bhнqт^ЃџuA+ƒЇš]Ў rcџ|ѓ"#КЅ ЅŽРЏ№‰б2яуfпR6БЯКAТљЩ{ ЗўƒХЛѓJšMdа’(ЃЮRye­p~ƒs KZoП -кb•8&Ёъџ8Е] ш†EjWxоq–‡Ђ—EВMŠH„в_ЧжгџИb†Wч›‰нУe@X9yV(#К~Щь­яZ%Њˆm„H8ДюPВ С/Щё›Ёю ЉЯxЈЫПbŒт…QСЃDдkКсйu†”ЎВ:Цt/Љ Ѓb’цoЦZQr.HАRЅlКЬDхЭфћь@`ЛИырl-+ЪЏй `УO†wˆ]шu˜Юм˜єdUЁэ|›ЋШмуKWaC`-‘N’[NДІњ>SGKи RкcДБ—g—сгј їІюYY\7 —L*лќа4SСцЅцгбз{аѓЃS 0E<’Є•xzќцxL vVkЏp& O†ќа8_ЌЂё”№)_diTJ—Р_šљ@z=гŒfŽ<Њ­"k^ЌEПшЋтјтaШSд’(š›ф%ф†ŒzЋ Y4…Ѓѕ;тЃЛмкЦ>ќ}zЌBFOPУа{IЫад',GЌ@їе$ј}†nхЩљŠŠь Ћфђeы^^ŠЄ RОƒх/•WРЯдІSЛтži  ‚9;RЦo„T$)’ј^ЁZуЮ!ЎЖoИ02ФпъьЈWГі]– {xДю№|ŸЁХЬ4&ЮuП„J 4š{™џДХhъУК‘”v2ђm`‡DЂ( ­ь€вTЮi f–HSCэЇЯѓm]CЃVo]”‚џьЙхиБdћE„‚ф+ьаX4‘ўC}яahѕј•_ьЖtЃk6ru€ю*)<йL1Ъ ЅЈЙ`{*_А юЯw-g#•]п…тЫp3рО–жњгcІ ћ‡‡Yлi€еЪQ]Х@;Оi( ]1X˜ДеђВ\1`ѕЖw}WnаL)e§ѕЇпfё^эsіЭŒbї№ЉWBДXEЪџИНсЁBРЂљ‰‚„AFУyкŽ§§#b—‹Ч*™уUвкuЂ МЉБC-{—‡/ёЯ5нЙŒG‚ћЮSd5К2АvчЏдћ<’W_л>іЎP•ыŽо‰ЋЗП8LBc ”КnівK№„m}яѕ Ъќ˜&љA‡0]Ё ЙƒEНщ& ™[^іш<З“Ш])G‡ сBVSсР -4 —RџюЕнžЋЖЉ‹гit-GдЃwяonybЂ–Ma”ѓ!жёТЮhˆ'єХŸщ0ЉЗ› ‹ѓ†šЭЗ'ИЕg \^aUpЙeт№‚бzUeŠ 5ЩvнЬ†ты‚ДЗСн#‚r= ЅЈ’^[-Qйe ŠЅ:ы|МЭ ;Щb=пocЈMtvkбŠЂmћYњgќт w"Џ/ЙуЊЮкo иI0fрr/Žя YzJ„5ПvXћЅ_o™ƒрœ1гcъЩР№2§л RИvХx8ЊСtћЈXfnЗ~дЉ!!bЖчОХ•Ќa0КхpхСаSnјžOŸŸ;Ъў…F=LъžmЈSt “- Вr…Ер‡"ЯыˆФaєЦЎ3"{zй)ŠСм'ˆ €Am!yЗARЮљZЧSБ`ГыHKПžЮѓ'š8ЌљŸJУ[…ђFІiWZлзƒ3эHрЂ– дрZ=ЇЎЭŽЭЦ wЃ?ЛдŠJхыСа|єXk,.Єi4Л}eдdбэўЬV(љe,'mсъ‹^зЄƒ,аЎ:=Eэькё.?.n’Sр”К?я:Uвіs&xsa™0'Щ‘зћe>FчŸr}?œіОљ?YqKiўˆ3Э-JŸ‚и~јљD‹БєMSьД uсx‹ИsВ‡„FzE…ЙsY‹Аіэ!д…х в;Šщ%сCiDк’§АŽІXєetў›$љь=2зj|U-ДOЄ+ИхВЩЏlуч‚io&(oOяzќФqLд%dчщhААJ%^ђ6ѕ‹j{ ‡nСЬ#ћPJ>–zП/rBdНЂIЫ:”[АЄцг07и•k x]ШzѕнnžЉП—žѓNnnжDё™*u ФщW‡qЁ>ЋхЇ?КQ—_ša„`9ЬђlšX’ц7UЌb…™У8 фЇЗ:й!б7 ХСЫ@HpЦь”y+M†‚я?ю>\y:y єЩэ•ЋUСЯчё7-žГi-шfНˆ™ПTA`щхЧ‹зЎ1iXŒ–NзY­С&,{{…m|КŒыџќ€т =тмnЩ<еŸ&|рјŽUо9Uў‚7*экM'Cф wUћq"Q}§ѓчtј”ч4ЅрZэеu>Е.MžЗЫ+‚ЦДЗф›Upgђ-Ћ"*ьм!їA]5`QХ™$=ѓНщ5f‡ЊG­kЛzFE}Аа+Tе4d€H7швћCjЌ№Шјz˜ђФŽe=Zžљ|љ!8ŽЩМТ&RЂŒa>№є–0Oы+”бŸсщ2lј4c2єx kљ*{ŠcхТХ”AНиНЋ85“гЃb,‹“’Šœ]8„gZЛCєетCшbrБ К_E>mg‘ЁПб§ЮBЮЇдДПэЛaЎЗEИs4zZщ—;@К<рeђЭоm*јн‹G‹c";XnЧј15/[Янk~E§3ь€OuЊ€V%U{Ѕ|yeэ‚№;ЛМŸ Х &§[eјBФ Щ‡Тzјх82хЋЂ МфЮЋЃѓ[ЁіUh5КД1ВH'ˆVу’"ЄF3L№DОbМбХ„ƒЉђЩгт­X?vMьюЬћо/z€‰6HВ*йnяСњяв"›kc‹R СеїeНБШђ~yЙе:o}"eЃ -л"Ќл.ž‰в?O—n‰=|—IіVвђ"чђМnntъefЙ:‰ BuGШВ1оРZ)R‘KЃуД№€kdC ј‡šбЖЖКo,Щ•чх§ЂZ@nШЉc‚Œ-/?Ш–4ъ(маЈ„"c[Wо K7мxД ЩфиВгud|ЅXѕœШŒ6g!нн>DэЎ‰ˆи_:E œ4щq“"~BJTШшMЊУвqI™_@Уœ2мbщ%PQуoѓp Nš*@EњЋKsьЩТVd|w; ЫFіeEМ КфФoб`Лp““ЙДDПg ‘щ+ІдфѕХт‡ kгІ”Š5іі‹MУ3чs_u~ЄсVŠU‚˜мЬэjVѕДWЌy-№ˆWБ}nу#Nї'а7л‹8д ФZŸЬо`[d[oйХќЊэхcАЭЋљрьсc.ОждЬWДcШ“ЛХ‚ˆ6‹\šљl3бѕWK.fУ9”n‰В!эЪXм %45@цуТЖ%o Ї чЊŒB р+Р-hЌ‚#lЯХФЩњ›› іm€HBыАф„‹бм|zKоЖСfб‡рwy1cxёР"7…Ш*ˆЋM$ˆGŠoЅжОŸY“яоaЮЬ6F™~У—ЈЪџ”`ЕYж9ђОЕу=ц[GjТllŸƒ/ѕ'Ф6кHУХaіzрЧ[$A@Œ/4b…ЕUК:Z­:VxqNa"=tgRJHеуN™Ѕ6з”( RэT3kй‚ б[ р&ЗЂNеoХсјЌЏяќЬ$ыymTиSIШ%ѕGE­Е‚jIfŠ&H<”уъBDŠ2lѓCв$`Zі .Фю DR—žкШzcy іslКшUPiˆДЎ]] —Px/ ШMгrе3ф0N7:Zн˜”юPŸ}(ёІyв|5ецеиEŠКЦШѕ еЃљ№Цš•GХcЫЭ r­cя5тF›ЫGњDЅвэЅЕ№ЮфЫUЩ+Крг RФZl/њ”}f:жGZ6іTOР1ёbrх^LЈа˜WїЌPœќь™_б=ъЕ=KЬV№‹ŸWu4…Шj,љ$г7™Žјв€pY œš1"}Р7”ЎsjTзЄžяЌ,еЗ’йZ•ОsCЂ*{АёюS‘К,Zыœw{К]ђ;‘aЌ4f)ьfiВR/У]x„ч*ъo?ŒiŒr2gЇЪL /Z ч’шЦ„Ш{~ГI†›bzxaфЧ~4{щг•l†ˆ8&јN^ ЛЧЦWаФы$ћі› ‘Š 1Xgф4qЈ ™yел›Љ;ўOPщ0UTЅўqˆт-йп я:’дЫйŠŽ> гџ ’ЅTtЅљКм‰@-БCEqŒDX ѕТНЄі"\/тZ"­ЁmBQШˆњЮO ?R‹S}*W;є ъ*ЭфАЮK9Ц€вЛ­иЙYЖ„ТCw!ё['„wьь•СC уВwцѓЊ]ыЫКдkЁPA]џXŽЁ{лˆ†дkd2:П№c'ёФгbuЫђЮcEG0жчŒlMЛzз—P9Ќ‰Зž§eіt‰a~юф) O+— МкЩј7з8НШŸN“”ф=5pз“љСЎ”юaоўћЫЫљ‡4іи5Yъ`М YЪиG?П—\Й83шO†лgщ‰ЗЭ&Я3ш‚{у7:vєѕАFЎ:uОУФFќ’0€с+~ZfгЖцЮР=ѕ9TьАД/VєŽ# я">ц ЇЈМ5§ўf\7=м­Ў/Ч™Јъ4пЉ‘cћ[лФ8U~њп„А…№щЈ-%l,нeЮл-яЗ‡IJ!zуw–d†Љћs–і!m^#ЪpОНq˜ыО‹ed­ВЄъ§ціЊСЄ ЁХо?™]У’н—жЏњЦэў†ъ•›пycbюМ‘ЊКЌш€tДyPYюSOъљe‹<=,ФљU~DСЇrX+:р–N{ЄJ=Ф#т?rш ‚pBС њчѓŸЖxу8 OƒЩm8ёNСн4Gт}woЯЦ8Љ`§P‡rz‰Йђ@‹к.YЌ7ћdH1ж‘ШF9AЂБžЭu=ІŽ=_1Ф1ІQќЛ"§p>›HИЖОєŠП-й ЉIѕ0@І aРdќtСЄаО -ІД(Џ6GfCМеgmаiЧж­uР\œ7ќЙ5Ь—ša˜\,3†4ЕЭХiХwЛГЦTЩ!||}ƒё–!З}Є\№‹їѓgс'№˜.‚хэ„—œЧТ+|„їЏЯєqšD ­eЧОя šхЧЃБnш8Ю.‚Џ•бД#И}/–Б3f|“dк']*№SщЏlgЦШСDЁЇ ]=я–л_xЬяšу?0ЯЏ а„ЋХЋwцђEmrаЛV9G 3Qh\7n-‘ž Л f№&МоЉГЩъЛSп‹’•Мс $хu~BЇЈђн4$#ЖвАuDsЯ“kгЅЅў.­MsдН3т0"iiџZ$ њ"м}ќёсЂШ[ПчSlФ!Ь)$WCъ$ЉeЉѓ8WUSйiƒ9ръФ~œИ§qФ7 ЦЈ@ŸT†хpWЕЈйnXpB7@W‘ri/NЋiv< ?ыгL@Щ{§Ьи Ÿ‰лeGB'рx5ЂŠP™]'r?DЏЃчКТvФЄб^‚MјељЪ1uЪ|$ Ў>)>8ЦjрšŠѕšН=ъ№S(9Б9•—ЃхЎ†пAARZKaїШ…/маЕ”р4ŸuШэ€бЅёpт_Лхœ@^№йЁ~ЎГпQљрZP?bх&A8ј)›XФ„ѕX0ЧеjLe‘iј*‰VПc“ƒЫО–1ёY”N8sIЗЉVћбљЁўИ§ыH;‹ Љ*@фЖЏєuŒ6SХvoˆчКќМXyu]WЃ ЎГBДьцЉ’YUeЙЪ?^N‚K ЦдѕЉŸыžЉš|Ы„GЗєЎЃЕЏ)ъ3в!zG9та7ц‹M0“r[їVљфЯ3Ÿ}QЬЮwхЂlв>YF‹9ЋР+*ЅŸкv ŠЂАK'wЂ…•d_ъ љVŽ[yPйvЗИqБпЋpЇ&;4р?д V?RМѓхФфeа$)ћќуЮTtК…ЗЃEдXfhѓjГžК(\3#§мх4ЌџАM ї(ЉЃMfЉиАптхGƒhсЧ‰ЅЃ’ЬCpOдP>HIтшВКb5йЊ—JЁ{oпškб >‰)р{л‹ч№$єœ ŽЃ0sAЁолE2ЃўО+K_ьЂ*йХјУ‰fОOжнў.’Cƒ…е>–-9Ѓ _њqОВп<œќДі™фЪ–pЛЋЧн<|§SЈtЬћёœ!ŠXоˆоКђ~ыTы=DдEgНцМЋу`9•ЧнлtgiŸЫŸ 0оЦUmп6w-ЁaŽ:п&СЌиИЭЃЫЙ4ЪІ@–xšЙ] %Р[ЇJ3Ѓ ѕТbœг  PюЗQYые/МUБ7b+в‘є•Й7‰‚СпƒёeТЅѓЬ•ŽВEя@ gcЂ;\ЩУOйљКћФЎuШУ.\ГЁgЪP\p:)F вЌѓT‚NсO5§ЦH&“шЛІКƒђ$tŽo…ЎхэќDY>жБЈх0фьсrtђМoG%†ЅБlщПeTItHƒоЮЊђž‰л:*2овb’Zgћ(iSH9HЎОOŽ=HNьў4;\Рx+љ3к‹p ‹M1Ў`Q™wоХ† Ю[є„fёжР­ьхиМН‹€Ч Д‡fцqИдЖu МwSГ†)БдСЅsг_ u$FѓwsŠmжyСœ,,0•р5ёШћqѕb?"m9L…}•J‡—B„=Џ‘š2а!Г‰мОг3YЯ ЗИў6№ЙD/4гFЦKi|_С№”ЭљЛbшѓvqБя<]F_dGЖ9—мњ9_пЛšƒщFљo’8<ГR<нфjЮВђЂЦЄЗЊ’бИЎ‘§” /;vйУ>Akэ_‹‘i^ŽšaM8MєiЌH4!А9Ієxс)Q‹М2%t Jё$oЩЇTљ№r6IЦ+мT_ѓъ 3[*5RУ ојжЫuЭŽСЇT'@ъ1ЭO‹%ж ugа•'$^фУНѕ~L™скщО}\ cŒЙп†$у,Ш’M4 Вњ†›зzёДМ*ѕCNvсУЃ†iф—(.FzUу›ЦъсxAћ‰h=уš\ЛнpяQЊЮ›d2ЖQЄB{Нy_Т@ Уя‚ŠчљЦ‚™oЬj2~ЊиЏPЙ 3ЦмХ˜_пшM‚Q)Ј™<.КШЖ bщкљOY­ЈйыRЯ+Ho\L„Зx{(›Ъ"сА„ŠdТџULwТ‹КoЙЮ6RŽН zо9Ш^ЉGмsK'-wcVЏњЪћ>>SЖїЃœ=‡ƒ‚d*]­щvXMB­Ÿ<Ј{€^`Б;вч˜<дХі9’n†`Ё€Ры XыФbp}Nй”cрC ˜x+ќ”їPŽЊИ#УI5U—Ћ†ін ЈjуdХ<NЕ–Хы&иxDKЋі3фxУgКYa‚пzЄvоЈЩtЯbЗЂŸRу†c;=oЯ:ЫтЯжш:фЁGC&ž?Д:Ёзf%ˆ.:<‡•убЉ,~•7ІHўZ -@\9Х*јЕI?~iе|sO{ЁgmЎьВСюš+i:MчОt 5X­cФї Џ—U3TГЁћт№ ЉhuпI>ј†Cќv?њ1ўƒœё‡ е'Ш№7 ѓЋ9ЌanvЅпŸbв№їWVЌ№ЫоTІ(ісГгё=о!šЧ`зR>хvѕЅ9†ЇІ4sa’?тghHр мУ;uŸ7зЖЏе›%–й’W6I;шЋRђvgˆœLм`Еn хшСш№ўќ0ЋУ­ FУQЩj‰Ћф5ГNJŒєОг˜)šЯут“Іўwѓ9Н‘c“UќІгwєBыWйЁіp;љ‡—яH*_“IsŠw{§в 3Ом}Aф6/*ї'$р&Ћ)’Ѕ*RKбувzЏ?CV'pБHАo:)Љ&%lЌh\ч[ќф.~Vz­XЖGП[jUeOˆя†ёƒgЄцŠuьxЯХУЭѕ­w!n§bи-ZyhŽPјьЦ†…ŒЏMгnъoІNoJ^Ф-ь㲘ƒхл-B#§ктФф С ЫќзЪ€.q%Ъ•QjBёа№А‚эЄq4нГJЬhŒžaЦдsьQ}Ч  џKЪHѕnЕ*ьSQƒ_4‰o7ЇрВ№hšиё—eОжИ%& C:Cm q|ERУ`Бє ˆA^ГўмS“wYO5ЪгI›ѓњE,Л З‚Ж˜§MыN~/3ЅœкX!АFЕтpљђ"ЁyvЙЕ’Ї‡шЇ•$jŒ‚ћќщтхƒ >™о=і2ПЧgЪЌŸŸШ†2!’RŽДчуTT’оD\цђUАѓpжiЉп1Cвœоа„;ђ}(фŠmЅU—ЉжС}дLЈиЗ^М О “іRG)ё+‚ИАё.QяќСmЖ‡џФ BЊаДбˆж dnБ†jИXПn™{}ОЋžw–ныР™Щ‰м&БљЁsН№CmХЛиj'Џ]yЗЩ”$”%ЊКўЅTSіK22CQ†ъЪЪбeЌ{6‡Є;:™;t—|Щ\ШјІЅрль/„ XŠ‘=Ÿтни‘—ё'юMф€–ЙƒИe†зхРиЄ2бЦ˜‰ІкЯЪЦ•[СxА.ПU,KщEтф4Л k—ЕЙn­вж'B‰™pНLеА>‡m*Ÿтс­Zю"ImqKЖbCѓ’Жѓ‡*BЩQэH>іл(О•эXЛм˜њъп‹Ц„}l<жъсЫЪ х•[Сж}=ЃЃЫ6#UœБєпa&њ,zѕŠcЎШяЧmPh8ї3bj&І™1&nй=ЮУЄ$-ўЊf Ыиѕ{я]ќT*n‹eг~# EžѕЇ.ѓkкswuШі#76wЈsЖЖйЩы‰Въuэšx`мg*фЁ”5ж*ЦЕ?? ЂxФuюœ`<œРŸ ЏЪ-rјˆЉЖЄ?aѕіqЛ +Ђk‹ЌОяOт8ПјИ\‘ёыŒЦIюЋcН5Џniyub§#>{=FS@“DЋљm‹ЬAсНЯїCЏЖ‘%љvЧIQћЕIdУCпFвстЬЃ ђR+еŸњ5ж№ž{`ЌЇъуЯ„Œ”§CvЯ eЂ4Š*Y( ŸS‚ŠЕБ‘­E'k˜`КѓЭ2Ћѕ H2„ѓЩdžЊђЖ;БаCЧ*Њ/ДQvu›атаэT^D#смАиЇЎД фJs8‰і˜h—§й5еPGH|пБuѕЗ’ žiу”ќaЦGй /yй6ЦФ„QGѓBљЏ\щщщp* ѕо с"кiјJ)kхЬЮЁшВ)Pба‰И–Чp}к—t—./ •Л1ця OъŠelWŒ”ф5ž Біdˆ.§Œ—’з$7šЗDuрZs~ЕŠЉ”-Ц‹цЖпЙЖ –ЯеDy6лћ!Ѕыv“гКІeV>иєЇcВИCљЪє“јoњшKАЌўi qДдЪ"ш1*x“чу5…~ЃŸc). }`жлŽg{%Ѓђ2?[kЛ8EЪšйЩ#еQ‹0!6‹ГС=vоьжЮдX~OЁž№ -іAB4`С0ш‹і-Йє>сRw}Я[—ёпfыcˆ ФЗьљц™І(ЁІ‰†з4у1%љЎ!ђIgbрFжЉc—Xы{q+ЂaІMГчlЭ ДkНй'V:^fѓ''єK"$—0ЂѕЭю #oxзŸк 5К.Вš]D.е+yJЌ „зVSФpB-‹7ev =URk-tЭ т–зsЌhЃл'NBjІhŸюNќKШоŠhгŠЁШˆЉА-†тСЈ9рёMс@|EA„БжЖ6яC\В!T<№[)зєuVНЙHЃ–•“M2\1ЊМ•Ёј:iъШПєc…-ѕ ЗY\h;ƒУHГш1„ДФ^MNvsуšЫіEрб\”ђ“rg§фрŽxжМФэЄйчqБ›ЋbсэŠN ЊM; їp^€ рР*ZЏ4ЮЉ•d…_”ш% щ.д‰šвЖ#WњMmеiПC1ћчѕFМџшmfЅп!ŠЬзшlzЈ&ˆиђКхVЈЊЁЌ.oАн|Ey§ž1:^/6§и} LWлŽ“>Ы>3тT‘Мl—ћрЙєК!‰єЯЇŽюPС-Љ8y2пU~13™BЕ(ВŽPхŠ{џh9ќёЅ7CЄщŸ_sМ?()eф_tтџ€СZ"Bі)Ўr ІЈФQЩŠŽX,N Љ‘ЛЄ‡Л;Г§4mХ\–+Ÿ%эoУ}sЊQŸBH[ѓѕ -Ш•?Х‚т-Дн6ФфЙ„ЪLђЁ€œZлыO=я$ЎiЕхѕбэ ЕT–Йл&ЉЏю"єЈ……д*ЯMlяшЛ%1М§НЌRKћ G;–р„x/чк{€Дђ–ѓкЙ|ёб= БP=FŠЬNбŒZќƒ/ЎуV^™њпєuЗ.pOДEП/ВМZWjЪIЛi\ЉПŽнAзЊЃ#Щњ‡0ћ oъG49Зхp›Ю^Р—чY\@Šјм…Ÿ3ЮЋ %юЅаŒ‘Ѓ=tќЉ KhъgБД"ёBЯсћ№ЋрЙСhwmœР”!Т…ђNsУpЌPo2…Ёфы”XЖA~њтZpJ !„ќї`UЌioyяП,>“ZEЮ—OЎGfY…šіsЦjŒc­œЂIЩ‹еVєѓs?ЇйЄкGyTвВCиВ1дkјšЮ—ѓ=yнЖэ 0[г,дCЩщ”’Џљ€З?”ђ.бЩ5i™@И[іЌѓ$žјїѕ]kЛћоRьgž}\Љ4М,kс˜!i#j­Щ?uюGIС58s=Б5ан3 aŒK_Њг5СПёхc„TЕmwтХЧŸ,?`І^х)2hЖw†NOOs0ЌЫ;иuЛШйtЪŽ(њ8ЋjащЄ}‡‘;FцI’ВeDыЯА%e~KDЙFэк“PхпDЬрЧCєS!З—аo!Б‹#юр˜o2ђwƒnOЙГ№С ГWN§пеЛЩ/­сSV(0…яLyёKКи1лeвf‹,б%› dV`КВњ‚Ф„ш|{=3€ƒБ№‰E=М ƒP­“ЕhТdщq(ЌVУ‡#•?|a‰NчаfЯЩГћвY­ЄR,сrX#ќЇCœћЮЯiqЯv",еIђK}{4/нYХОў;kˆkЏƒЛн'Ц<єJ:V]^mѓ#ўf2.ЙJк=j<)%џ. ЌšrmXь\рПPb‹—sQZЌ=ўU]е  ЪГС‰ёьФˆ•zЅр0 QŽЧЦoЮч|>GуУѓkЈ#Тhщ!Ь#›лqlг’k c&xѓ“иЮ}х9ЩZвDрGХІ№Eю'Vu9ЇCжСДMќмŠCLŠЉЪЕэу‹шБхЯP“ИИq)CўОДйЛчщ dддo,hЈ5Ё(Ѓ•тTŠMљ=ѕv=Кžќ…Шмxвlšѕ>/nšyЮПxДwz|Жf+ˆrЫHн=ЉЗƒzеЊ]б9TJŒТс~ЅNфZDЛТТˆ/гPA"жXz-џєшУ*WnѓAŽгфЋў„>sНП+пйsдЧMfл$И6р?=л“КхlІ~ б•в`YювfaLЅp–њгpе†ЪжeјKё€,Щ’Њvјw[qF <гц%Юќ65ј_šхMГg`m˜СpLэAЦ*™wЗsпМь`eэ.=VŠПР(iдЎ бЩc€фu~ИьБа—сћЅ™_.ѓy ‰&[YРаЈЮRЉ!г/$ЅŠYнoцШќ`ћ]ъLП.%йјюѕ}v€k  HЖs“puАwqёbiгйЮrН№!ѓл5bх›”јHbд:BЉ•.пх>Ш8О3Ђ5‚я?&Ю›…љg<_кѕeig‘#J<оЁы—4|ы€HЁ­Žn^‚ѕ ёЇZ#sмh:k‹ћœ>p+U$,W@пG* ]S@P#sё`§fb!8тЈпБD­є[и yу“uhžLЂВЗ­ЖРљA0І,jE№‘W\аћЅ•ХaЫ‚T'ЅЕѓшЌ‚5€g— :ТCŸ@Ў–ц‚DњI“.Ц/э1ZYПВЃШУaцс%Oљc–Jќ+–ў‹НУ4М~uТЌ*‚піЯ^™iт,eЌ!ЦgQyЎ"dЄд~МЩ7&Х€1вq*щяZHлFЦXщ, ‚(ЖГЙ1ыЗ]ы}Y5‚o "&)2Аƒ*›fx\>Kd+зЬwЩгПЯŠХЦž8ч‚ГWЃrI?ХЇГ<Сљ‰ЗˆАDgѕpQeяQ8О@вфФ‰:§ўћЇжШV•ФTЬћxY_ОбFЇ) JЄГС"шNЇ$ŠД8ьІњЂ:$ЪTЪ*ŽцДYѓrnЂхNЇAкф­:хCъАзOŸs]-W­кјТn|~UНеЗ-ЃIЊF]лd&›љq Žпю‚ЇЊ !”.yи Й§0}Д,†ybВzQлШ^*п2јшQИІёсEŒхgљ9iИ;1BјэН]ƒф‘$WШЪЮоПN^чІJЇ­zѓ nЏ=šDlИ” fїdјжv\;\сЭЅf9в1­#Uл{зГ ЎZб…нw(/„3z КжуƒЯžЉy~гПšD9%љљ[fї &ЩћЙэl@Т™­лEмTwК сџ} џћЗ6џ0␘^хOWŠrЯ+0=Ќ'Аcp1P€ŠњyСr%RЁ.Џг„Ж˜Лš Ѕu!pЭT ЪЮх!/pƒ‡jˆ-P сSВыOжа;пщњн•ФъЬ ћU6ONnЪ­ЅrЛЬ[vПЖaaГ.Ъa^е­цМj6ў)&TSз0є‹]О†ЯKЂ4IS_‰›€nbе’ќсЌќПѕzа;uе^ўV}џЅ3ЧъUъ я“z4ƒ$Mtу‡|RD&pРі’ђЙЈ6Њ1>#Т$еф‚QЦ%‡ZЇес?J]Љ:о`!с9›мf, +ŸеlёYіK*wИsТ№$@]#ѕЉC Щx *иЧИЖ!јЭсёtС#А‰НХ"0Э"гЏŸЯЬ'N_џŽђ)bmсіЅщеЉгxи.@Д YЫб{2рtѕЃЭp9тю=+у,Ь}пёŽВ%>В_ПгŸзb[Eч]щƒ0ЪUM#ъvЮ›ТГvh‚_vTќ2Bfт\}уš0DHбРй|№ˆŠVѓE#.E<*hГЗєПJЉŒэОСмо(€.*76GЄ_ РА€•Мьб~.У—РCОкЏЄS;пvы5XƒyН хkLХ(ш Хtѓ yк №БЈфoЙцKњ§‚^’ГЫ‘Ян+­py №С+иРьн! pwїИ„3xтA€Кё"6$УT4\DLщDŒза2\AVtђuHзюŠїe’ZРЎ Бh‰з.ъ“ƒ[мЙнФNzUJРkњзƒЫ3N{(э<ю‘? BмЃрнWУ?Зq\7[еѕeШцМœ„)K–єХVпЗГїЪ‰&I‘ жeфœ01Т}№@|є7„ƒ#‚#йэ?кDnYЧбЂЄCє.c&m)ыІ-чJrŠ3.ЬYф„F†ЛlI‡ІѓгO[Hћ п5бЃK*ъ‰Бž`G–naŠ02и.Ўэ?ЄфVЏ•ф<ƒŒDІr„ZдKІстЯа€SъуjДЪ“ˆ”ИNзf/GІFMјYVOŒŽбf$Щр_А#ІфJьЎхЊ'*УDФˆм4†Кv№:?жdLцxъ|‰ыдк|Ь3•Œв[v`‚Д@=ќ ѕ”ДЇ6.ЙI'‘SeТШтк ЮFЛ^Д[*‰З)Iв*@:œэП pдЮ^mЁДёЇ.e=яЦ „BпџёЯ!v&8›гу’Ях™еr—€евЭЬ‘'%љ є™аfцuупINyŸžЏj аЪe%]nGа‚4vјснНє Ыƒk_рoХ,}PЁŒVІ‹EЗ4нjоАЖњќ‡v[МьVѓhп,їsФР8УŽрkяEОYrGt‘t™є•џРe]чЬйНш бшьПGюЦR=їЄЛьИв†Pk,•ятюЄ іq.УLДтхUпЂ#<@яИЪов”Jьuъў‡БpИс‹/ЌЧƒяХeaО:=vLƒRЃЩ=фЙyрZДUХЎBЗˆЙў#‹‰`КёмІnq.Šzkмћѓ˜KѕИ1рm–бJФ§Ъƒ.44*Ыœ Q*| Нs ЗЗі %]‚я­д РуOj(|0о=p“6Ъ‡х<Ё“вœmV}СКJВгsЧ$RvŒъlўЉ:VХ1з›œxЃЋ эZЌš;m…#$wЧ{ИгW…MkсmE@DЗЇХblyЄ#ЁwсqšзХ т…‡56ёUИЏгТ|ГАђ†g%џ›л=-ЩTТ„ЎAЃљфz8UаюXяˆlЄ€@Q5]“РVЭ5Ђѓ#5iие5gЭЬ(іТжб‡E ?cдЊ{ЉХе"ђёJ]Џ‹РБД~кBЅc j\па՘c|TлOэBгZG2щrgXcкијдиDЃЕz“еП7ш“ИjVЭЇ)†ЈЮіyuОЎРtWWyеўa@`=œшю”­ЦŠ ilБiaI@хFП ЬPiђ\‰Пq&aЫшЉ‚{?9оM*‚џfH~9’4Ÿ#a;яg.iФNвœgчT§dW­h>!u!чЙ4=~k%:‚bŸљY.rѓƒ(џK„|\›в‰юjњivУljАR+ЕњЊТїА‘:гƒ‚Г}ЅCОўk•mѓ“s72טгбуog”bьK ьЈИd“xРа/єDгЉ;\c*ГiFвг/0ў†~.с—Sj1y .ŽЭ•ОЛk_ЈЇ{э}4šOо•5ьˆжШTфЦЮбAјd)ŽќЎvEУWJ0‡6pяћЪЦ›š ћs"Œіъ/…IЦ…w д1”єВ7ŠMШсжъwdСЉ іЛ-Gо‹rз3ˆ иЗУщћ?2С7рk\#й@­ilyoП‰ЁЂЃ^Ÿ)ˆгй˜Gg^OХЦ›Ц†…m Пё@ЃДE€i@hГ %ŽDFИое`ФчеRІјЛВ fœМёIЌ„Ђ•Omhб#>V x…Ў1оxІуdLcuhc)лчяš{™ЏЁд‡LL^pLРŽПx&,ŽuјLnт…š^ž4ŸrЇŠчЃВ˜T Ю• PHЕNФ#%dДЛd2.Ÿы.d\д5ЧЗl f\}­-%!шy,OбЕTm2оЙЭšq/Ќ|K\^ „;“юП2јЌѓD=щ.ъѕn%‚’0„ЃaЩbдŒ цЎаьVЅu%mŠ |ЭdЁ—ƒ~XhJиƒYмсмБ PGОЪБй&HжЫyVf мr—’*@„Y‘Nєm š/ŒUАє=ЊзƒХдћy]ЧrЩ.ЖїI§pЙ)еЇlZдІzн@Eн яшцluЙTрЮžЉž$яј8/с83ЈŒЬc3N{ў•ЏЉWb.ŸяіKv\Œ5‹[|š Ю”šсd_Хќ^Х!hXSRь-‚Б'ьё—ГžО– ВЩˆ_ЈЋMgХдU!дО„в6&З<ЕяЄk€їЕ`oHZэhЖ( ?G{!Э1Щ Мф*єZ›йЕЧЅЬsZLЦфЄ`ŸDёЮa–/žS2Њš=ўз0C|oqѕ!MЎTF,d{Y0>ЯтмЦtfƒн_y@'~e%e7№ 6pГц~ФFтНAŽтМ —+k9КH‡іюЅR“пй†kѓhCO…9оCнeLћ“’*БЉуu@IA€x.ИЈЙe2‹Е!RѓdС }-гZэЕIРО„Y“3hя~›u•qaѕЎhјrА'к’-o Ы7x­ПпЂ‚+б”nfаЬSЛ,ЈgXЊq^M“ч/Ywѕ: ѓo?%эЦієРAgСqX~гО o*Ј œ@H'…B1Д”E“ЯhфІцnZј-YРˆH–д< хм’щU Gт.k:ТйџŽJУѓіŸ}юйЉАЈЎдЊАbŽе ’œЙ@4?‹QCјЮAц„os=YеSРdmГЁŸ{“ДЭ_2І9М)q'Юžta=f/I8ЫЭЃ)FƒжПšМEЗJњЏTо7|W\е)ћЈ<јЃ˜`6cFЏgК]%ж`Uя§AО*F55mEТ:Љё˜Щ}дяЕ7%”VДФj5ЪŒа„нwp/sЅF7‚гDІяЎбЖји$—&ЊSI8иХ)–uџнТ—€$oйQŒЯ—pH-x:{_ёт;ив")C4Ѕb6˜ў*Џ5NЌфЈищž‡_%]эЙЙя<9гщ\юЋJ‡ЋLэJ„‰лaQэqМВп>PŠ@ѓ‹№<юѓ™ЧШŒчœY2љЌ#ЦЂУˆР,ЗJJЈу6u^,э­HЄ†BЄŒЯЛ4†ЦэЗdЇ>ЄБжтЖі2y"\~ОЛљМu.илŒEeіЮыХ=й3­ ѕІ‡А ~\8ўЙcDАЋНё$‰RюЫbЬ№ж"о†!yџСRDSvIо~пВеQћФŒžЏoщ$яsШ…ХеіФ§Ъ-•m3ЇNА^G‡,;nНЛъCmУ:ДMЦšˆю)ŽпјƒJœGЫЇ45Ю,аOcЙ6ё•Ў~oM Ъ†ŠЌМx"ЮЋеЛкюГс О—їыо6/‚„šЬФШрМcя3јa”$м}{šќ>МЏc–ПuїS•"p4і.>eњНХЛћь,ёF]Ix]rGvД,№uMIЏЃ„Хм}o//M+†ъUzѓВ-TєхvЏжћ\p*А НuЅ­H\%N!M_o›x2КsцДў0\у"Jь‘~ЌКсбНqЊзќн§Œ0бŠЩЛ%YЛДmэек рсїEw8оzљŸQоOР†Л!ЋrїJИЂЭаВЩ…ФdkЯ[Ь•žj‡ІЮmЌј–щдЇšвЧБ !А!KЖ:П*еьXЄ*љWџћXЙ"(mx?<—џйˆ]8FрЄшm‹Џ•­{џLЊ`Ј4 ‰ЌgёБl#$eR@‡ВКб‚Y˜VъV 6ыjЅsf1Њf`ъyi‘ЋŸ’JF!НБ=2œpЋѓ5іѓЎкІё(œсгЈЭЅ0аІвўУxщ*Зр4<ЌFШ”yЮпЃ\#0Бjбp6нŠ‰>Ъўвƒ1ZЩфЗ=<ѕК†Пt CёщXмbUТ[%ЂИowUl&ЮЉ}Б 4;И шrh fжЩќ.н~^U*АаV_тнды ,s›љЁ•зу›7х/Њу#0'тЁRї•оU<“0ѕчЩе{фДŠŒ`cђХ›ТјAџлˆ]R—%ЌыsPз§ЁеФƒг6мтm-њЇгѕ`-`?ОЫЇєїиNYнrMzZњ/†Ч ŠXkjŸб˜ˆЃQЁЁƒё^–Ј+œdПTЗк$+O6ЬŸCo.Гўн‰шtаeЦPŽж)]ZЫкŽg(•I4bВ вљtG,pHш4Ї-gђЧН}‰,Њ бj,– K+З#ТРHњ—0ц‰Œ}AэєдЛбЇ8‡ŽєmyИ"кЭѕPјѓwŠС‹:RВь…ћЪЛЖŒŽ№tћt|‘‚дЕSjWџ8ІU>Э'Г(ъ„-хиWvјЊіѕ4 љџЄэGFЖ*1„ЋУъ Бд: РupОbЊїКAРў–ГУэaц'лџБPš…QО“ЗвЬ9ˆьє-ЂŸ…?їm%Рьr“”Z№Х`3–CКˆs:Љ,лБvмЌˆНЎС irяь#Ѕ % їXsдЊ ZjВ Ф9ъњ™E‰ћАŒаНdؘ1^m‹jQgeъЁнˆ"зš8|I/•Ÿд’€`Ї6u н’ЮŠW’Ъ8Ё%xЙму!јѓЄ‰ь€ +}щWФXГšZ§‡dVŠ YќјvkЯ‚ƒц)КЄL&Vоmы…dC/›dЯЕ;ї!.)3}& : іXЌЌ{еwч(їKeџшЪГОctдcіkЩv)ЛЕh˜љ7YКhИЕ9ПžЋьgэђ йorцЈщYќ<ДЖ}жЈ­G‡ЬЬ”nМ^:Хt?Г?НoFшftЛw6КšeGќ™ ‚1›л&л%SjѓЩAНе@ \ВМ№F1­ЧАVќ§№№Ќ4ФфKууЧ ЙЯЪьгXёВўЛQ™оq;V–фй'Q1VвщАQїŠєТИИ)dc_s$s™:–БШ[ќјnїч\*аpRФJ‰Ї9ѕ(С|…=nBHГ.ъ8mГS‚iьлa} Ÿ–Ў4ЬeЉ_*пјжVГoЎм ЃЅiѕ‹hЯR‡AГОї8А­SƒкиЊœЩKљЦц Э„N3gоMИСЧ"ќ_™ЂpO.XВ†Я8Чq•ўЩцUp­л—}їЯеŠkyП\tœ=q}dužbŒё ЌЯ.каК=|Щи†Yп9юиМSџ{г6еЦЎ2@ФШKlЫlTп.ha'љМn-Е')>ЖДёШEѕžxДЋЅ§к~Žд DA6*ŒХйRПИУy„РLЅr‰L@>>FŠjnм(ижАМвтw~Nю'HфfE;—7ѓ8яHe3fЂ\]r›gR<žKGyЪ—‚R3ЎR}є­wШ*K рG|BoSWиJУlгДЦДœрD BјЫyK’жа“DА А?вg{љП(šcўП‰ЙГжTB„d’DФ7‹+nb‚ѓ}ћkЎXSЂ`Œ5x7`OД{BUХZЮ?VвšШBT+ЅїbФЊ/ў`ЂжЩFЯ86y&й~#ќ=Д™a[L„ХМEjEcMO%\k ЫіRџŒ†ВшhET5›%u:хoАБ§6ЭљъХТц'ъŸ{ш:ЯЩ/Y? :ШZuлџCœф‹s„=ў~fй>NL~ъО,в—[фћНгК‘ЇлlN^ЛUЋХљkрS‡@Ъ№чг_Ім%Ÿєє5Ќ’ѕ'ЕУ`иs‘c„ИŠ–yЯ[“<л ‘ъњeд9эЯ яРŠi‡њАхЩЋtцB>Ђ‚ ьЉ–х i[ЗЪKXдї|жё^Ѓ… Шк#zнG‚Zqщ%Їm–Ю’ЌбЊqRЫKѕЋ9$*GїHLТшpЏ^юЇЁJвюH•„з№ДcљІj^8((1-ž<ѓ†Zbв"xŽЂWO[eIџEzЂдVї@ тпћ>Ы7—zXЁŸю›ŸЛJJ%іˆЈ^Uбв:Aaщžhо=ЬЭТАяH>-cгЌкМgЦ/q‡ЎgJПѓXЙMвsRУ'| п]]5юI№‹ЛзUх].РSРkcї786V‘ЌG2ОЫ›џhi9VцГž~щЁ?nІ\Q;Uы:.ехЦtK^xiЗЭ`с_‚Г/ъHƒањ}`цў9ф CкiŽŠНЬ'yTи*{ъh[ %jв1(p—§xF6ЇфO#ж\Б3ЬЋЎр;ќЎŸйФшЩH]Бтс›иЉ;Œ‰€џBЭnщюЁЫЭJ н§KQ(э%§БмPZЉ8,[JTЦCаy‡:VТ№ѓщRsMЙС­~xёЈЦf—э -?žЩ@л$ 7oXчя­‰ъ;­†#іeдvР6œЂ*f HОUѓQ‰ФцFjИ„ќ‡3SЯ%ЋЬr:NН3`ты™%Х~7‡PrяA$zg‘[тB#ОE?Ху€ИфЯwщцЇyї')ЂF щСэAˆ(“ЬžЁэцЎ;яюэє3‡ #Уn5xѓЏ`Fy'Šƒ Ї_xН§‹Ђ%ƒП`šdkЈц• wI}O8šЩб-јŠъ7 < ?рš3НO^9?>ћEљL—{щbƒRВe9ЄхwюсъАЋњ6h‹р„8Б1mфaўё0M>Л”тиШЂџbRЇАФТББХж-OИyСЯ —эjОSЬD аteнИEыЕK7 ЇФфMUЊИњ†5lATЗъРsъ0ЉАјЖР,пщ6Oэъ%ЦS3RgSп–€яEфЋФ<Юх ŒЧ(N‡=n.ѓ,8+‘дYX[tЫђpжџ‡|T2Дg;5?ыпруАUЏЫХBжчA[мС]дол‡Іє…h1ZHЖDВіЋЎ,@Ы‡,нT]Ђйzиr@fяZГzА<Ы EEїS­’ш§BЮ"™щАљАйY- 8М€ќs?НнEђgx бCtŒ„<ЌИzp П:ФDЧхпОbютСuхjФP—ƒњоOLHZнвOE:Яfpђю€w]_˜ŒЭўьB‡_nmH,ˆ„И^IяЋЗЮЖ•ЊлOПЋц_Dž‡'(]йxIЛsК-+SИ7ъ№Ќ‰яџоwСwЂ7$ЧЦЗn_НAB‚хеиpžѕr€D ИA%Гf=ъZк,hЄљ)sbїZљФ/їмwЉ ПВ89Жќdž;c‘ЃЅў!ЉЪj}U3ЗъёІ:хЙЬM­ЮЉ„*I(6Џd_гФ…­‘ЫЯ/N= Б‡ПuЊ@ЋОx7ь‡уbnП^‚l;“|<œ‘й!ЙОЖ;WtВ%ˆ]Zх‹рlЯЉА}{.ulgђР5Ћ‚Щ:ѕЋ&г6тah?ŽzцтљЏ Б~$џL=§Bxv],9r”ѓД.™IA[рuYЁqІhOŸО}ј›{q?сGЭlЈЄzђ6ЗЪЂxќэ31Ш№–qщ3яQ{а§k! #%+Š…œщЦЇЁ›ш~FЩљГƒб@ъ˜ИušiРЩžМузYњXќЅ2ЯCj˜o@—д4^0fWf652|Э0Ф Єњ@<ПТѓЮлЃхЏužЌё?&žOищЃzћbKк)s(|Ъ­љVУn>ещ”+ OЋ™ЭBЂј$WфyВх‰ŽЌEР ЕЧ­<н6ЌЉC‘ЋC0Г}Ю_xыeтзі7 ?БЪ<ко|r{”/zэљ•h‰?є ‚ПЖY,”ѕ•Fp‚цuЇк еЉіl@п+И/so<ПџЈјeЙKјФ‘“š)ћ‡ЅЦ† š*O"&l№ьАL7м(z~‡Y Rж-*“FСut' чJ}З endstream endobj 772 0 obj << /Length1 1426 /Length2 6611 /Length3 0 /Length 7586 /Filter /FlateDecode >> stream xкvTZг-RB/в‘HQz:(Нї‚Д%j)JDŠ‚Tщˆ(RЄWщRЄW)JUŠTљЃоћнџ~я­ѕоЪZЩ9{ЯЬ™9ГчЌ№]32QvB;Т5а(ЌD,Tе7‘‚СтЂ`А€Я ‰u‡џA|pŒ7’ћ_М*Хт15(oІFu|мq DJ"-ХР`йП б9 дщдъ QpoŸ*к3ƒtvСтOљ{ ф‡ !ВВвТПнЪp EѕЁXИўDдhІ!си€…рПх‚ХzЪ@~~~ЂPoQ4ЦYA@ш‡ФКMроpŒ/м јЋ\ дўЛ0QаЬщ§6E#А~P ˆм‘08Ъярƒr‚c€јГІкz@CO8ъБоaр_W„ˆBўю/я_ЈпЮP эс E QЮ@в4даХњc…P”г/CЈЛ7яѕ…"нЁŽxƒп‰CЪЦ@(ООПЊѓ†ažXoQoЄћЏ AПТр/YхЄŠі№€ЃАо€_љЉ!1pўж@Плъ†BћЁpж$Ъ ёЋ'O9 щхзVћЫўСœсX $ ––с^@И?Ьє+ИY€'ќ7 љуѓЦyЂ=| №`$ŽџрМЁОp уЦ§oтп;tBТА@GИ3ј':†#ўьёЧ §wРxсA€р_ŸџЌlёкrBЃмў1џн\•ŠЁЙ‰…ая‚џCЉЈ §81i ˆ˜$ˆ‰Ѕё‹рG1‚"џЪќЏ6 ЪўIK'ьћWїљџ рПc ёŠ…љџИ X УAўПeўлхџІю_Qўџя|4|мнГќПшџƒ…z нўтёzѕСтЕЏЦOъПM-сЦUю„єёјoV ХЯ€2Ъй§?—ˆєж@њУŒX˜ЫЉќСЭ ˜;7B{#=(@ќ_~Њ`nјGУЏЧп?4џ>RC;§š.1I) ƒ№-Ця$8~ рўП ‰ЂаXМ _^0Ц~ѕяњSўƒˆA$^ФВ@ўхњЧ@ђ†ћт_„џ ` ы‡ўНџWv0 ?›ПеƒO§я§я‡ї‡У“уhиЭ{Ўoю5U(Гћ‰Ќ Ш№­XІ ˆр&1>'дЄЩЏ2Тч1‡ЪЩ=mД3ЫъќJS\чИwoIЃъ’ŒыOƒЮьM†WъCLя_l(Wvr’sˆ˜)­{Y„ЙНЛдЌУ—эх#Cm”ЫpфзЁщ_йY2н9ОbМњJJ—тЌфЃШCѓ8›АТQОЧчc,м$XN2Aњ]šбƒУњЌС .D!@№цCё|œѕ‚иЃуБРй231яV^VkNЂњОсы8•ѕцOИЂќЙМQŸ‚ё™[Эё%rщ[ШD™зŠнDзVl6SдіЂ„5ЃЫЇR^Ќž —о-ї$”\];duпЅнЦs–аWПсn>{!­zєіщ•%Љ˜Pžklђђ7žpэbLљr)LqiюГІ”_‹QqSiPыП щD€<ЎВ ц №gr_CЗftC%(;ѓЮШ’„uьJЋюГГ як†лхз˜™й> В“ЏŠvs)!t5є[oœёк$$пuЛ.œДjЏњДяgO4ь*wJёА``Ь2:I 3)eьC л'QљCЗі”еиd‡­‡ж/kžДƒіуMщЉ(Rћ“ЋHюТ‚H??YБьtF7%n'žБ}(уиŠ”q{5Uг OюѕдIhф$3јж~8|jDiБНRФ4‘ат‰tKЌupнл§ьа’^еЊ^j.€&лўZeЙKсЊb€xа:нRaдc7ARW№jЯЛѓ…і%Ušcф„ј#cВУTVkSD€хzf‘лBAнтќАСё­ŸYq іK9Зн’Ѕ™GДгп)№БŸ­мLм˜^1{z!Pr…W›oрТkсБ‘6OЅˆ>}врК…Плu›чІв\УшtƒѕМŽ”KшЮЫЅ)yхЉŠљ>9кfžДуИoн#оdsЮЕO“ГuЉ-Ї“œдГ~љfєJ%зЩ–‹ Ÿ?Њv‚Ф~е|vзљдЂф4 pг”ЌVnhPЄо#:˜0#П‘ФЯgWдГhЉeЈmb{ўѕcgзgўљн-:VD+щez“Gb`‡Й˜3=}аЅУЯЦ єрЇ дачєxЭеŸџ:?cїl‚\ШюKэИЏre­оћSгŸЋФ—csыvЖП2aЯžхлЌЄн'c ўSЊm%Э’УФOіwЎљхŒи}IЂ‘ЄмZфЦlЅд4ЧнД‘й‘є й^Й#Ч%ЄЉ*ЗџFCˆл€04Тvw#Ъ:Эƒ5UЋd:Дy8˜х1-$_QbбС Eb™m4Д ў=ш”0лгу)˜Л>ПЩмIz­њSkї‹л™;ЩЂиЦWš‚1cеяЌBВѓоВ ІЊ‡ЦјЎtGrмзд_0•dдЛЃ6шN№y_ЮЬГЫъНЇЮђ!%kД=lЮјЙмі<kв—хЂyЙБр@ifv эzЏЄœьmѓa k,ЁIњМ3эЁЅWUЦŽumQтr}шГж^дШHЖ*бѓѕюЬВ7Ў‰ˆй§`ьxfЫO"ТбЉ‹НAHШЦѕ$='ыўр}БHЫНt:б ‰ТGЂлѕv|§‚љCœ•LНj“A;жŠ•[їЄя=В„ь^zI)HЅvЫhвыj{Г@ЈгФp”œ=KђѕБч7F5Ж,E#ћ‹ь:ЇO769A/іЌ$і †“р`Ž|†c>*ћ Ѓ)‰cЋШѓИ ž ФG”7я,н1­Lх>HvиT))ЁЋPG.Л ЂЃуГBН~т ГYЉŸLnг№pжчЪц{J|ЛУ§†Чq‰ЦH— #ˆд5xI@АшJv#§}\Жqьh"ін!ЧБћ'Г)TШЖшVi№^s/{rP‰}чU†]–љ„кŸnƒќ/5.<ЈeСЬ3+ёcnQg‚/тІ*eзњSПї{ЯЩ4 ,ЯFRЅ$#гj'ПЈIПыaR;Ћ?.пуYyu0н‚V?е7€=‹Q%}дmТ:&ЫO…&8ЅS>иSдџ Œ0щˆЁdAЊЁUgШegЃx‰ФЏXДЇ7YrэяT1šьњь>Гл|gћVZŒ'ђesдnР_šqЅЦTЉ^В"/й0sbhЧќƒœ"њЅe%­Ѕ ЭЯWО­peyХ03Э|Ро:ИтriЙЊ­ЋбDиї•єuG‚№Юе:kIFyЖ…ієуTвЇЛуŒGykяѕ[ЬRГSЂЅЁй§’€•aжюŸ1ŽђKшЃсGLЕEА‡1аŸ€UŒ‘•Wu 'C‚§Jж„И9М гXЪѕ1ЉэvЬЕ*ЊФьн+=aѕЏ?}#zЧЯkeCi”†n}ЁЛ№P,оiПїlЉ­і|Єйj;•ЙEzЬЮеѕMпЁiђЖ№dЯ!š0Ар9хДmdбЯ™SjUгн\OЧёо‘цю ›юA\єq'‹˜0d>ЯьКŽЩŽЊЯuђsкCž xг@RPяi№Uг{_–FDаЯYв ЌЬRTmW‘Ѓ] “ї_OКЌvUQЦ$аnеЋШ\ЩЭK‹/ŠщIя9Fmн(UZЊЮіўp‹ГвZ }’ ЩЛЁ3йq0š”jXЅ +FХ!Є1Н'JСЇ;Г•{ёЩrІzъЫœЅѕeЪd‡1mющ˜Щ#Ц‚„5ГЬЊРY…ЬzФazЪVlмMЁЋšу…пnœ7qЪНщ,ЮsКВЩt;jЄнp`л_”чяZcEеy# x=SB?zжм2w<ѓє$kilьWошšЙdХџЊ{HИА7'ЏƒщCx›YС ™њЯфО@яфBA˜l‡<‰ђ9Б,йшqUGkЉlСЯдu^ЗЮRУœї№УЕЄШE‰ЋtžŒеаБk6[-\C.M—оэїЇšb‰fЏ ЉШЩ}ЌЇѕ›ˆ}Uпичў™EЂ‡˜D,Хqї.R‹Ћх;[Ч§E‡тМ;лLER8Ѓ -CsГˆ[НО…NE\ sЭ­$q“Љ›ЛwЖv›& тcО-Gq7#p)›ь,!мO7Ѓ?&as§,ZnЮ‹iпІхAН‹jThGяuo;AћGЧы• .г6ГL;МЬз­] ТHo’VVѓМUж”RQЌцъьб_РэЎ1^/ :лŠБ/оLЅžTnМдЊUаКmv—ц;ЖCЃвс{x]rЙ'pЪ“њъCйЌ0Д6]@:ё8eЌ,wЪеopvU”юtВ_r•Ђ˘ыб?ЕщоЛцc^У2ЦЖ‹€:{U$Н)8Ф…S^kТ&VGйб эX&жШsIхaŽј@Ё ЁEЈњЪю$H7бТсŽЂЊђЎcеrџл7 №>ЉЅќаYcНЕœЫюP# ЕGЖбЄС™W–Ќ$О(‹—ё /ИEэїЅЖ_П”ЛўЮѕRŸ\ЙAЂч˜g>л"§фБђiEUмU”ЗѓћсНнŒ~ч‘ЃAд›тѕРЉ[ŽoJЁ{“QKьBєo№џq.ŸNƒ4$’жЗ#хпI•Ё_•1?~1F]Ю‰эЗOJАкhпж*ц“ЈвŸж"ТњmБ‡тZŒ‘ёЛ‡юuL5@CTђЮэќa‰т(œP.Эqp/м^єЌЏЭљьZАlУDKOфђŽм|и•<_ыRoGqќmНpуёГ‡9.ыw ŠІ™–Kt(РUићe*AУB29ЩŠ§ЭЬgЫС‰AG+жѕц]?m\у™Ї2ўиHЃZ‘’Љн xВŠfџA Ъ$Ž]те…0 К‚ќe3ъЂЗЦd_,’~ЧAЊ/3ы2ƒtУ$,ТрxХ3„Ќg‘‡L‚ˆT ­љ@7‹3сWк4б5MЇмuъЁ\lЪ:kWј$ШoM…ЙŒ3и‹ѕn=БЌr-Љwв7loцњLЛb:э/foуnoœЇ”ЯѕИT"› лCє8нRœЇ\IЎXq“(ЕDкІМe5sЩ}ВмИ§ЭwК9Щ аsFє}RЈ%щ&J7c^ЖV/Ќ•!Ў\БдЁNф!„2Tш5Qыїдє–rзЮЁОi­я{–X›Иля‡ОkЖшD мY7Wš6”Ÿ~Gь# ’jЊДМХRя–мšЮ“Ћ%v@9‚ iЫМњ ьЅ?=–œxI+“ŠxщСqФ№еqwi(tцЌ<šŠŸ}лO<кцЫS›л™ЫЪнЭщw%вњl_mЅ%љF.GL‰Ašт)2Яяg95J‹JkдЙЉЎ‚ :’NщЋ,№ Эіз1'l^сх)яBЙ |УЭич[ц3 Кзƒ”lљˆо“FТUэ7кxoШРTОзо@р(ѓГPYЦWпXМЧ›TЦЃВ ‚M sЄ*TЋ_ž2лeФ}zЖжЖ&B3BІžwрцК:И1уrу~ЬўIВаѕ$RЖьј ў@НќОь^4OЋFЇеtёZHšчЫT33)kОoЇCZф0кГNЌkЩї@ёЌŒ)›+@С'Д• pGОЌ чєїЙтэc и‰Щё’­DнЙГWv•w)ХwјTи”xKєЊ7yeј7М“}А„X]ьЪ‰%\џюEGм?#‘vР›(ВАђ­l{ЏUMђŽйЮЊ‰ЁRŒ/-–ъљЌАфлН^S^ЌDu;ŽђѓщžЯўєZZBj|qОж!–†-ШФ;Х‰ (4ю„eШ]"ЭмсІфЎЏТx”С3ЂS7вzqЃ?ХѕИиЄузœ3žwUІ6l˜;ыЪМцВ9кнžJE€]В_Co•_Ш0цмЇ ˆ˜xюЕi0š?оT‹|gїВ Ђ7щЛgsŸ—€ЖBЕIУqgЯ]пјRрCQЎКоЅœ]эщW2Е_ЪR‘ЩBОЉЬ|УА3‹ЧФЬZХгVЬB-ž:СІ€љž7žM:Ќт‘E=VїЯЁЙо”ГYmФU‚ІЦVzu*FіwТЕ,‰Uш;ŒЋ@‡н&ŽvКЂG›wќћІ‰тAФ„žЫ€Dпl$E­Bz Ћџњ‰ЎŸЁ^OЛŽ&ЅЇ<>~CЗ$–i…/{—xОlЛoˆЋGьgЋ‡F+! ВœЉsD9œИ;Ћ"шYŠЪ0K+tlо˜: Iж8S‘vsЦZf{џg„ }<дѓ+Э И‚ј[цsEцљо№Л‚\CшзКэУгќnЁ'Џk$ЄЛдљvяzl4dя]ПЖЈЉўSУDјыf є“JЖЯ[ы<п?N›d?Й{Rь)zчѓЖљkзEП‘эјиМ$яЩL Oяv+”WъЦв’ч-’6Мyt›+kfžv.ЅЦCf^b­‰tэяф  ч!.бv„й‰Х‹№‘ТЉ}оcƒžЯЪ7ш\ГdПейр ­O?7Y9!язHи wЫўў•Ѕц .f‘1ўL І’ИМ“™ ЛУUЁ6“œ'ƒйќ~Ы"yзeEЏVюц\БчL%˜Ъ.&~Mй \lxР‘БЭ‚яфA“љ ЦоюЌdЏEуrтыЯМїqт“AзЮЎюЭ4Kџдт~ІIІЄ#{ўЦЛ:оn–М%yэY˜k–UЩБе;@ѕSЃћНАŒR‰ЈАGг=ЖSJЩхЛŽЋ[WGSFр^#"SкzЃуу+0i#SС6ѕИoŽ‚ЊЫїОчСЕћ'У(aЩNы~Г™’кŸ›‰lWJБЁjђ2яНj0‹ф2XŸЁљ”ћLŸІŽ]HЯ}ЦgMWЭœm†О>)ak7њВИ§ќЛёЌФy^fсjw&ƒМ’aо;Jвkdљ3”Ђ‚Rf^+"дЊšо ћ7=Ђ˜Оkб=)eќ%pC,Ќ€е“Ит"_fMА§И^иЛl[эй›сМ%•ЕкkЫНдPSaмс€иѓф^ fрH5Й2ъеЦ1ŠЋK/хlr6ЌwЏмoKH—˜2бьњД.Љ№ј}"Гы'§Gя?zœR<ЎЭђœˆuD>k 57+ГињР–#‹ #їВOmбƒВЊlW–ыЙZsѓ ‡Ї]ЦxNЧФ>Ёa№ОTk^?у[€™4щŽLЖЉ—e4Ё|&š„ƒуєbƒ6NЂ+І w•-…e7-+2‚uˆччZ@gЭћMЌzA:КЦ?ЃˆJkŽœYУXшј“t§3ћšiGиугзящTИ€fноXь}€п{љЂ/xˆЉн_ФћyУrSVƒД‚ЩзыF1–Fg‘гGк+OYVЬУ6о<ПЛОљњМТ­M—цн-^Чƒ‚ЅёТЋаo~r‹ƒвэMkѓжЉzНo@(ЫnН ж2цЛ’№BƒцY;џKН‡k&ŸTКќЊhл \•є’Э~bi‚”­Љ§>Ї25ЃУыQFfиЁzeУ[Э"е’Енйa4ЌY'~§ёPjІ&–!&ук BёЛК–…ЋfIE™@ endstream endobj 774 0 obj << /Length1 2512 /Length2 20338 /Length3 0 /Length 21779 /Filter /FlateDecode >> stream xкŒКeP]‰К-Jp юТТнннннYИЛЛЛ“рюA‚ww $мюJї>;нчНЊ{‹Њ0Чgуг9љ2"E:!S{c ИН =#7@DN™ РШШBЯШШ OFІjщbќ[ OІtrЖДЗуў‡^Ф hф’‰Й€ЬфьэвЎ6&;77##€™‘‘ы эИЂFn–І9z€ДНаžLФоСгЩвмТФђ?J*э_ю![ “Ѕ‰‘@ЮШХh b41ВЈи›X]<џ‚’зТХХ›СнноШж™ооЩœŸŠрnщbP:м€І€пхфlFOPЕАtў[Ќboцтnф€6–&@;gƒЋ)а тЈHЩ€vЫўm@ јOkLєLџ їяп,эўr621БЗu0ВѓДД3˜Yк тВє..Д#;гп†F6Юі #7#K#cС_‰Ф…”F њўSГ‰“Ѕƒ‹3НГЅЭя ~‡5YЬЮTФожhчт џ;?QK'  Јыž екЮонЮћяg3K;SГп%˜К:0ЈйY:КЅDџcСџ‘™]lŒŒŒ\Ь #шabС№;ИЊЇ№/%гo1(_o{€Ј ЏЅє олйШ pqrњzџSёoЯФ0Е4qЭ-эрџD‰fcаф,=:Œ Хc0ўўљя“hЗLээl<џ˜џ5\Y15YašП ўЏJXиорMЧТ cfc01ВА8@ОџŽЂhdљŸ,џјJй™йИўNдЅџIиэ?гЇќЯaPўKоДБ@хŸзedc4§УєџМцЙќџmїя(џ—џпљˆЛкиќЅЅќ­ўџhl-m<џЃэЋЋ hїхьA`їПM5€ŸЋадвеіkЅ\Œ@7 dgnѓп&Z:‹[zM-]L,ў^•ПхjПЬЦвЈhяlљћ… cbdќ_:аU™Xƒ^Ю }ќKЭП)ХьLьM_3;РШЩЩШ4bbx3Юашёзшэь]@.PyО3{'јпѓdg0§§и Т€Aфт0ˆўA\Бџ"FƒјФ`јƒ˜ ’ €AъБЫќA vй?Ф.їихџ ЛТ'ˆ]ёё)џA >•?ˆР њиеў ŸЦbањ/тщŒў P.ЦШвфПˆФzхйўБў=Uг@Pw€џ… Ё1ќНRџ5`Ѕ šГ‘ГХŸnџіqtнЦŸ0 2Эў@й? ыohљ˜ ќВБќ†nВ`њ-јœэЗЙНЋг?и@цџ€ јВcѕбТгСєјc’§ƒŸд@ы@PџY Ј…ЖџЈдА?Ёи@Ўv [ј‡TЌ§vГ§Пд ьўЈAС@_7; йŸ&Г2§GъєЏоГ‚Ісz%йџ™+ЈrWчФIџŒФцшjя45Жљ ыХПYИиџЃљЗ=зЄџ6fњ=ЫL‚ ди?ЩАœœЖ–&і6іџhйo л?цС т њšќ Ъс ш­ЬрbсќЧ^‚кцтnџа\џAtћхсўuyџƒŒоѓд2Џ? Eђ:§MѕЏw›‰ЋhB.}{@ё?јЏ?#€@  ќЪЂН OˆUCHЧ}ž;но$пйžЦ'*:яЇNзG$˜TЊкЌ MЇ[Ёд‘^”ѕ1ЪСUТяЃЖ&˜№ЏЩJэO>Я‰Ъ3{э№ЫгXƒSEGBpјtЊ‚ћ>/Ž>ъжmяКЅЩђ]9‘ аянћ%<*жЦУї”іkйež+fщbеbtKчЩђГpˆЁ]ш`ЉбЮ=чonчаrЇоЅiр}cYŠНЕǘуМ6ЊT™{pIqЕq nаЦgШН…вЄБ—МЫŠз—=кx‹ siгзщPш˜3k-•ЃэZњънЦWʘvѓR!xƒшЛЩѕх-NФ ˜Еэбш.ѕ,ж@‚ƒ.3сŽ[ѕofVщјЋ\Гo€ЂфzФœHї‰ Mюžї,љЙEвюgE'‰ŸЄdАЌЖŸЬp5žБ_Є>г[Л‰ŒklАеЧ–šЏihпЄkм*<ћ­ыЩ{ ї -GЮ8ЙKЯЧˆOЌВ=Hgc;F‚ёC]ыޘ!Q№2w%'ю&сЋTC{aeCђ3ДYoюuўщRЌ&ЖКш LZЧqйђеA[%СLзqиOм3@6@€9Й(@<д‚9YСИ%i{ržF$tѕ[_‚dˆр”Š0гx'.zр “R7ћ?­‡YSeЗд‰>Мg™J‰RKыDЧ‡u{8?LfHшK‰JЊ*ф€pMQa~Лvkп˜ <~яБящr;&cJ<КgFЄ=*@џЋyhЈјtќFеіK№‹ЭОфuVšNˆЖxPCЙЁвЕ'•сїьѕ{sS ЎИTzБ“н Дп^ДЧљ k˜Œцi5bМїЗџЊЦЛфŒTФ}ŽCвзІН‹O ‚rO…К™cа”xВ‘?Ъу2`НШr!>ШШK?'іWЭњ.jАЗєчсСЦ*тЁАЫЦdGqЖwЌ'Л.ШУЊœj ^R[ЮѕгОzH­eQ+0Їѕ ДРЛ0ёк П‘!тђŸHђ…i |—VкŸю1)ыJ”UєѓŠБцЧО|6 П9ЌƒЁьђЫnРiКE"Ajы) йРЈZыЉXІœ‘Т'‡ьEЭнп™и%єЄлўФэНч)FкjЫ}I1ъ[2WŠnЅЏћы­џ+џŽѓЫO`кАљРЖэњ— †зѓ|Кw\ЭЎОIХРФ/RžPSsЭЮЄqІ? †—ф•ІчИЊxёs‘f ЯО!†|ЖхYeuM02СєpЊ&ъ~/вг‘рJŒŽŠ##њ+NХ>mІУфС‹зZеІ;V7k[шiуѓвKлїзЁБЫЭ!ц!)…sЁV|ќјLѕў)RЖ\D†OкфљjљЈ˜*ZYJcі@дНсИЅюƒїŒ%ќ€—њLюcњ‹§BРЁМщ`О^fїНZ[meпiї,ф]9оЦМзGBvфФlHѓu4rЅ:m)/МЉ†ЭЄ}і~шЖDЛŠя&NDљ‚Џ&c‘вн^з‡ˆїwo~є[ХjЋ/ dХ”?pежnШF–UvP:Йь(ДИЏ ФЕтй;2ЙжRЎ™ХнЋ{G1оР 5j‡ЅЏ{Yбч!_Еs5Wп*л(М‡рsЮЅЎ-bзm№/јѕ.И6њЪьiѓsZGо7л‘-le]wi7И)e‡лК‹=JПА3€57B~DЌђ/c@K]УюялIљщЦ[b+4'ŒЈея„LL5_пeWfЪЂ›Ш\Ы4Ÿœ.ПФIгПГ‰ѕ=эѕ$^Е­щ!2 Y-ѕ0žНs`“зyЅVіtNO!=т6f8ih}•y„Dї6+[йєћФQ3GxїЛЭŸEѕ­œrљнј{ ЅИШ}v‚6 сЉf*ГЌA›ШѓVОщТCА˜—Ц~џЊтЏ№C$шbyЁGqЭ_угьЩ,-_S;U9ёa{нhЩШНй—‰Ѕˆ]љеlоЯ–иeњžхцўкЉ(ќГфњ іР *н3YR_?('3A €8–SЈО/ь]\Lзw™W4 ƒІ:љuЧ§‰оuJђ_–яZ?АцB9Ч|яЪЎ$Ўbј5bLЛ3ГŽUНsр•‘sДЗпЅдk^hѓхwг  JЂЬЪjЪCD\ЕЊПPƒИƒЩ ?›<=Y[аW˜3EЃДДрыˆK—ЌЙљ3єнїч%И [‚x_›!"zmѓ Ём‡Е*Тёˆk^.ЗЉЂ”3І\SДЃэefXЇК5њѓўёXћХЮzј#SšЁm-•цpЦјsdпЪВ2?>ŸРGŽ\•AњPBЄ3ѓoсQЧтQ|ˆ";ˆЪ—|ДШ>_рРŠxЉс„оЭг9† я-ЛТMSЧпїR|Eб7‘–vгЪ­7v Cudq9Ц[КсВКь^lХє^)Ї†ŽХїsj!сК*<†Š+$ѕ9šЁ7эJѕцщіŸy„›%ДЋnMн}!„D4ѓ‹кz%з”'Фšvс–НdЕС)ЅZCWђ|Ђžm,†ВиЎаQ,–кЦžWлoЂ~жš,sГЈ,œ’Sі"ŒSjб3`пhwЋћDGгpЭљВVР4Р?mЖНпЊѓьhC_›ey ЇZоa[&VPsШ№БmЬ—nЅdЂ”"ВfЪЫЅ?Їїѓe=ц;іwЮпйг_o•wEŽE­ЎJQЙГ1+N VВS1tBuпЋC&3'oъюе;(nРH*9=Зд?№ВJRЉєI=&q6[7ХїO(?нј№\OzAгHfŽћырщфˆ,я˜…Ч9|ђh! >ТЫmLb|˜ЁЃ—‹Б[qK”Ѕ…ЭF[$N›W‘ѓ5ЦИ[Р*‘ЋИ™7Њъ|Z’љљ<№rГфJIpЂљMрЭM‘QW2№{‡–_ў)уMЎ_+ХўьFDkAђ*mфъхo/МmEог—”|ЬјUе‘шмЌџДQRcы>[*ЬˆљKY+ы§Ё$9—ydLџУ гИхЧкє>)СєЦсfМАодs-ЯЙ s{Ќ‡•вЏѕOэрV‘–?[ѕŠЋ5ž”jz= Кйqeђ˜ 1%Н =ЂФ{\еС˜7˜ыHЕИDžfжЧEGАйі“хёя|Oz№!ќYT-Нм!ƒwO }GгŠхoіJ_З_пхрK %юљ(т4EРЁf&9ЫbŽьcєž§+b€{ющŸ)mЉљuњя%ИšъNП™аsˆA­„‚ћVwUcЈ\RŠ-LHћM‹њ#)‡zРлљЁ>ЈKm„k‘@="HЗІjШХˆ@тР$JR ў5_2љКihџ^†ыЁ&ВдТћЇxЌ5—0*М,SЭнQЕЇ=ЅŽD")учЅ:=–j’_рД в%œ>~лЇФ1gSЇm C} іц”§э?D6ЭORкЁY}?Щэm:p“Fя(z[ШќЕј'елхэ‡–ЃCЎm7`­rјx<Юb^ћЋЏ3G{YїЈ Wˆ$Ў\к—ЭЄѕpC)aoF™НзЉ,˜b9вLГД†Е˜„Ьyе–RЦ-е^}ЏwœZ›!єщфЌiЂ&7РŒwќlжнйш‘КыЙŒPT;aуЉŠ*ћ>ЂхuЁ˜RpС-4pр!ъњsМ‘№q‹Ežq†UзПё9ЖIЛ:з,љSА№є$$&х(яЫЛPк%№У#W Н…џ €ќіеM(=кеУxфL ёz6#SR:nЃѕКСeF"5dШТШԘސъш{“ зTГ^ЅIK'дЩDељ=ЧФZКш‚--Iж‡wi­лU#KЧš|k—8‚1&Щ1„5Ё“ЩЌŽќЛбDЧ{™"ЪSяИУ>ъR^9IЈзKAŽ~Б`™.­EfJ5^СЩП‡_шž ЙVŠt6vk‡wС‹˜щыш'хї<х;Ђћсѓ3ЊJД›p]RИђѕыјЧ–1†онН (ѓлХH•~lё<Бovsпе6уЂд’™­l,uˆ!!O{МTлЗїu…­Ю|ƒ*-R6:Т_КпДУ§6IНРwўЃжm3u“љ%щxш`ыІdЩхСФO Ь~4lЧІІOМЋU`€mђu‹wrњ…‹GЫ0В1цтЗY№drѕХbб€RЩaЬ…WУ?еgЌТяlф;=ЏК$‚HFЅц ЯЄhl“Є0СS<‹„ЖjхT>Ÿі”KЬрЈЕФЧR%бб{œ‘>аУR§ьрЃM!e…ђ:кCВ1Ж>ЧwˆVѓbмд40W!ўЎКб-ж5Ÿ*0n?ехg\GЮс tSЪЯ‘§‡ћн3^'=oМф‰Y’ƒѓiŒДЮЄˆ‰сt"ЫеКмY%z—Тг('ЗЗs—kqnXСMy5:!-›єЁТиžŽOHиtmюяЋЦkзЎЯЏљЁVУоа+VЫ2/Љ#0”1hLzhнSѓ†~Ј—кц5Хћu\ ЭМЮSмћHэzfћЗdр bУ$М ‘Хf0кYaУ›yуXDёє+№ЂљdЮч+Д}Љ„-їH<яL ЅЩЌЗ]9ћПš/k@m|г!T&Рv‡@у™Ї*Т~Tзк œ ўЦшJ‹€-Ѓšў},ю8юŽ Ш†нbŠђ>AYšœ5rЖto2мK”ђŽЈq“p˜*жЊHƒ>iЃ4–”ч:љU„&6yЫь8"ŸC!хp‡Зйˆжa9п+ЛфСuФD‰`тэЁЏ({Гt6?ЋЙaЎB"Љ™vgм $*G…,ОВа6P(л+RW"Щљ%Эг_…[1ђŽХ‘}YF3PЩЌ|tюyLЅŒЗўёгѓ!ВbЋщtПХ>Št~gP<Рr[zxUPЫ^/М €ЛЗ;cжЗ,ф9хЊnI2uuˆЯљЦJ^+ЪнbЊ@ўЎGœW‰ЩР!мz qW8||Kd5QЮ§Е’.˜qoЏ6зœЧ№>жі p<Сg‡_˜†1^ ?ъB76ŠЭXдFчЛF+J{–е!ПєžыeМђzйжtњ@xŸмгiOАšxнєЩц—ђхvv—~ЪЋžБ=аJЖ‡ОTЖpэшM‡ш_;-›™œЖ6ой%Re)хœљGЂ.7uї4NvЙ3ЄxџjП*J|оЊЧŒbс™b3пОvІ­Ÿоп‹ФЩўіљлк‰Љ’ѓћ§ы‚уPš`ЯшwIu%ЁќоЫxч„ЂХ2,tј^ш"Ё 'Д‰ЦDјхH’fZВB3~/ŽС?БOжшЭ2т˜эnLьiЃkЬ7иjFHТZo}ClkйОУŒэЭкK_;єKЦ\ˆ4ЕиЛz#œ Н*2љb-ТYтЋ"Z+ :ЗжvŒкYF1>\q†й:њ#-лdДE#3o5П&т”jeЂe Е;УјІз‰ХbЩŠжJLЉPS ЪsFВQ‰ ЎбfтИпм™Э`хыœg'–ѓr‰Ыб[’Ів“MЮ‚vђЁ–ВKЋЭбџЉD$е‰VŠЅЄž”Uwў9j/FЛсЭ$Šyu!A %ЌhgV8&НIмјB|Ё65‘ѓквN3їKКAЄ,@?ц&‘К7(3Фžў0MїQхtћіУо dМ–”ыБ'ŽІsЕ:ТЧqІ‚žюЋщxю" ЈгкŸŽяЪЎхIЅЭ+ эdwН…ЕFѕЌpSϘНj Џ:ХE„м\ZvсŒ]Б58ЈФ@W~ilШsф†‚ртђš@ы)Яy{‰дC„№TјЊВHПOГЅJbј,MнD]VЃр4БФРDза!a„B,ЎiмУќi@Aœ†АC я€1ЄJЅFiЄў&џЌИО];i&<іI0"bЃK;ЛaзЉ^?nŸ[Ў„ЫЙт§khюŒЃ`ЕhвЃж'џ9^0)c~‘  Юi\›рtЉYAЩp‰ G4aіќЏЧƒaeЋФ,kfЁLў=rќ`§†\eЏ>3дШУ4Њ{s+Ёd pcaESокb§й8к9"фО|З…=лeiЂФzjоšz•№с^p>Йq._M5e–эG!fљ`г#тn`тьpb7I:gєШљ“sкђђAЂx;Н? -p0c }бЮe~ђГЭFгГQЪl?bЮёгР„гАЖ{.–a~‡ЪŽ›^8еб"lэHЙЋ" 3|FILI̘H$*.Ѕѓ)ПQV—sb‡3%EЕŠНЋtЏ~Ш§Z{BIFoH{‰шв“ oˆs1ь‘spлoЧДg@ЖѓšY*goи=июb|WЈ] УqяuWpЅ–КGВѓ0‰ЪўќІ^8џЋJВз‘ГŽyЄh •хЂ`ђђrЩ!ѓК ˜>P%šf[Й3*QЗFЏ'лXc3ŸЈ@ў{БУ ІQп)c’Y|‡Mќ†]ћ̘hьћ&˜'ю‹К+дНљc%HОТ]АФŒуй_№ А8Н?&кŠЈ-З№Д(ЙМтэdыдDioV ЁZ f4љhA(Бя‹№bjЇ–OБэwїE9яр>вБIR№ЗэNжЄыїО€_нІ#›@sєЏюP:‘фиHд0 ЌNсEˆGІœ&ZCŒbА}ЬЛ‹',Эqлiˆb…AИЇн5‚12„Џфƒf9MЁnŠг0(}ФАѓ–ф.@/џЈZ>šЯ€}М CЃwа@>Л:w$ёФУaЂрƒСeр@GуЇP’РK(šb/rРЩ^|hћœѕtт|Д„ИЭ*r?Ё~0Ї„(е1ТXblbOм–ЬBYƒСdСЃ–рJry~їэЃgЬй„ІarЮwƒ‚Ј~HJ6ёЅ@™5wЋsЃ’ŽкЗ]ZќOb”œчL:Чž^ЈЖPи4"`_<ь<Б–_ІU^fm‚ŸШЪ:e§5”цзСт‘яЛє2,LZПЫšLF{лГRлŽCˆхUЦ;б"Ÿ{]%/эccxcш8АЈлDLšшŸЪФsžnЋDГIэKђТЮт^Ь+ќI˜+4§э‚юk`‰({ЗƒЄМўmл>тєЋ5лкm“ ЩДuZљДу3“h"8&wОЧлhrnпГАRNyБŒœђяxќЖuюз‚„lЭвЊТФrЉоQSv4ЇD’єГОž”вFEа^Z”ї56ЖЎ‹ŸwrkiJЁ‰‹6IО7Ќ!#KЁk г^Ћ,\G'Й­й@\ПVЮ48БDzfд,фЏЁБyъ&Ѓ ПŠvž[Hб9/ѓl…žƒ:c љсЫGGdd'ІPл:Џ;,ЩŽФNОЊЖY%ЅнЅŒР&gD'б'ЌЙб?€BЛFФkїuЇыYkМw}Е›zЇnѓ=ЪRь9>яЖgO­Ьщsе’ˆEg…Џyb%GG‹[1ЌјЬьжbVУ э#lZiОˆSОцывчХ4ГцамoЋŽєŽhjещѓфчЮrЮъщЏћ Ђћд+жеш7щˆЕ<6%EЖˆ%Џт1 t>ZW-е№ЗЗK?аw№EOz™ВjЫ28ќ” )ДƒтLyG“ЩKoО[pcw–лЪS……C!GŒF%и №їтЖY­Ц2UЛ њ кы%юМ.~аvžї“lЅ“ЎЕ\)§r ЇSuтБ‽{•Пі*вв<џшнRВЃТ`ђMЭЁkй;{ТŽЮ{”šш›Ж№цTур‹ЪŠeћЖђізхo$ŠУуь/щ~2л…„3BІО jnwћіL_XТд”›л>љПЋJкВЩ оže#ЮEЇd}гMГœ… AЅ((н њц6бМЈ‚Жrž–5$šWA}ё)йQЊђЙK2ќkЌх/Кё ~ЩА‘ђ q‹ ‚]ЭёЇ)œ’œ}Ян%w5žw<Їcvˆ•”щTЂ P68@*)-‰bƒТйЮZЙˆА_сбљх—o§нE›&М]†їMБUдXФlк*vAJЦ Ц НфъїЏФ@ F0{nЎ&žзНeф1Dю`ПС –іэ:ИZTSzтъСb“^Љ+ў{Т6 ?j4‘1˜|Ÿ$EMЫЮ—§тrлЩCН aэЌОШЩrё1GКдQЃ”6&й­NiщХкЪи­дм>jъ%$Pœ+V ’ђљx‰оГ(’КЈ$*ЕўkФ”.Єчх5хcг$@y9ќЃI>ЫћŽoёt•Џ.)НfЗ‡ UЮЗа˜fŒŒS€*кW…aYD”Ј^Ђб…ŒnrН*—@шВв€л\ЬВOз'qqъй||§лYжuАєVБcW_8f:ъ•ќѓсѓŠЯŠc%дƒšзgћGљ Ј сТКoњћlв{Ы{СjuиЭН н.h,ћХьш‘Ћ>zВхМЇp2 xšЃRўxЕ7Ў.РЏўR” '/ˆP•'g>…{zдк!bНчЯеЕ:Ў—5ш?(sЉОДр9$Е,шSќSVяdьЬєЕщ\#оФgѓaч%u%!ўhїУ{Ћ.‚RŠШšКnцИcmƒьlфЕ4MўьяьSS_Ц q)“3J:NDеВ`HM>bюuнЪR|&#N>ЦQnЈУ™+М ЮЮъѓэDt|{X1YŒ[шbfУ€SvrЂ~T№ісіXЪ”ІoЯ{žиХтa фВўgTЖmя˜O4СЉѕї'":[~КЯR]PrPMpVLМтDљvш'у№2mEOюгG›Іk{ЦˆЙпŽАy_‰XТQMHt*оф з6ляаky­$!-|‹T7#ћ`6 ~‹fЭ›`mA§%к*Њ=o‚ЭяЧ †M}‚#q*LoгеЃЛхšѓOэU:*KЗм ЭцlV֘З?ТИV‘\–2vдmSv!x…kQš‹Z‰М‹нatšyбJж_eи/лЅљ№ю9щO0чЇшВЭ0 IyУэ–сZœ]Lˆ`,nщЁ(Х}Лm+FЧз"Шmэ ЮxКwЕfэš0Џ”qї…ИЂЌэ[jJЯж2Уѓ~мWф˜`E/у~І•_ЙENг—ъHПїШ‚|EiПe<ШМЅЃХZƒ8‰{юLўОЏi}šLм#м Иє†яLХвU'dZЯкѓ„[ЂJє\рEuЈ€ œЗIЋрGљЬЦ5ОжDzщаќˆ(ехжф8ƒА№mY&ѕn\KЏŽЪ”ЕŸЉP5яtx`t@Сч˜ЎЃрt!ЄжjYIзaQz繓ВфH?Ђm8kjџвеԘŸАcLdЅЪЄXБg-)[Ctš4/ЙУzЩŠš­Wё%dNxв8GRTf§NCсИЇ’QЊ11А|њЎ™aЁ§Ё Щ з8bмРЏl‚XV9Qй+#8_ †sш™<зЕ”ЈќбЎЦQ†O-OЩЂcEDcїEы 6 EЂS…?:уlБDфHЏЫИNЛ —cйцЌJћHі€knДŸ‰IŠ'n…wƒ2PtІЬ†­КфЩ Bk‡MBЛ‹ъ>(ЅА+ЁчѓсйBE­oŸ_RWФТ кŽрUчšъqƒШKŒЛгЪЋ$Z[Q$-MЩзЯG/AѓђBя@хЮCNŒДћѓ”(“,ёn@Бj=ўx!Ћ!ИuЛ†ыiїАIr§huL`Я‰"ЦЛТU1єфмм‰xЈ0lє+rL_ХьјŒm?_ѕНпуEАЏќЪфаŒ&BmЩrŠb#ЩaYlzsEь4ЮEi†ћђkMZ7МLm‡'еРMэ6еšд8: ЙKћfиrЫERйљр3eХ\sЪyІqј+фЪГМфїЬИ}VY„Тл[љ0ТР6ќѕZ79+ыЕж,šmWЉ™я<œюЃ.‚э šшgКWЩР~gЖIHSЪЃњES/Ж+вPn0'ЄеfЙO‚м&d„)ANi9š­™cuЙU/%>‡”—лQ‚Ў\6UEqй А9ћmЙйGДw4мŠ…BKетШD˜ъу’иœњSжсF …2еЎRЖ$ХшŒEB€7ЩmВ†ђƒЅ…ВЭ№"ewЬ—CКdMжајnTойH0B‹$6е‘Imй\ЩDnˆšбgKCЈtQВ”ќСR–yдчeПяf+5ЉЄ_ŠY\чяЦw8Іg ГІd™_J`ѓ-*“8ѓѓG$&9Ќбъьe`Y;к0ЬЎ?аіюKБsдиГ=ЙvN І‰ѕuч–гпyo•У0ЅqћЬ4ЇЙ(|Žf"J{ЋКаZ&Bя5t-ŽH9ЉqŒ™Ж“њЌмXЗЕ4—PуЌМZјюьС[Œт€uоу ojѕ}­1‰К\„ˆз9dџ‘цiк7!ХU}yШkrЊnœ=‰ЗŒ!FёЬCd“єH|+ОЛн-‡=яe*LЋ/Ьg -G)C†нјЬf*йjЋЁјіЂ‰[VКтЛъYЁ"iЬT)СgМЮю3Zz:Ц^:Q2ЛзѕsyžУpŽ”Ў[УЮ ›<œRІјН№Оe”8BWЈиGы2)GкЉтŒBдЯі‹еЖ—Щ§Иёэ9‰;C:\ТЧвя­ ~Ъ‰ƒ}чС‡ИЊЬ~Дт]'d|щЎ чЩ„™чюЛЄ”a{|8+ї1(Уя‘Mi=|fн С-Рƒ „7р-cE|jь"i"ѕ­IoУТД$ e5K)Hѕc|_Л?њк<#џ?]CˆфLѓP?Šu2Pz6GїЕЖјНј HjћЪV§ˆ"\тRˆx6В_ёЊ№і№[Ћ›cx Чќ08IЇє”7ыEŽюЫЯЊ ФЁ%jЛъѓФђ mІtЛ•№L’rtФЯцAYИЖ;ъяы1Мu†E‰RGV1J8wjш(šcЋД<гояа ь”CЅЄ]*ЧR>—ь[lUї%ђŒ—š"Б kылYz†m{І ~Л ЃЂцЙ&}Cбš}ОцБ–Јгѓо‰?КnuXŽœ\‡E г`;cjRW#‹РЖZŸ"‡БВ.G;А џMN1ПшNЛaBь'Ј>@­ёlСэјЏЎOЃ;Tћщ’o?Y Šx1Jљt„БЃ756ЩЛјчcI:rЪё\Ž1Г1Й4~ш2l1– u‰л2)Эи>7+i~wŠЭ-WНЎсОdЃ“)“оєсЬ;‹9У…о ]><цјЄџ…]Г<ЁJЗ97ЫЃO‘bљђ(­MЋЏZщ3/м–0jСљ;ŸoЄTƒХ~ZжtAў‡т"ŒЉюOP$bИAVЪьжš!лv™nZ†хPŒMŽЂHTмт%?цЋД_œšіі†mСоЪѓЊЌ†•з;№&“3ЋvВТ9лшјјр„b>ЖИщŽ9 ˆ‡t€Н|Нхњ#тŽЭ=—4œOЬZh=њЪ|‡q#эЎ hфeв/’lЊЏќlЋk +šBзО=MИД‹Э-‡b7мЋЁRД: )бgЖМв+з ієБЈљ‘Sy@CscэљpӘџвЭфЬѓЭЕЏА71Hи8šЕ8fЦ tІ>ЛЯaчЎќь§E™Ќяha›;&цŠ{&”В&Q0гMЋў$є ЏУjyФЏDuZaRє_ Дrы_NŸEbQЫ”РнL­р‰­kUљјй ovЖ=;H>xцBФвљЁ ЏdЪ_АBфЈк g­Wзx›ьЛ-ѕыпH‹^ѓеl1ъмхцБ;з'=s)}2#6šЕСX^ Dќ|уИїжwUы)їd>*ЊЙ!I"ŠсЃнz4т<ЂКlй­ЅH:сђх™мшYПЈНyгщй х;”P‰‰–Х‘ђЬg’ДТ#YяЕ•YуьЂЛиг…—LхС–JT˜ujuVСPm їІЌS w+xJїбэа{"‚=™’Пђ IпјхSQC‹&§r"WЈn^cФ­цЈUkvќДюЊ7~~ђc; f(Kй­шG№+[RcАСИћГы—Єћp”W4Э%9ЫKФ-Qђ›iЧJ4+dОО‹bуЇs‚—78е>оCђРєъxj„нpФ6~Šт[ Bѕэќ$ър і ОЈИІа_@nE/kF*Bі\'њiM­g!ј}jE$Ђž Вw€WkRШyЊн)ёj_—H~_wммnnр AVЛ‹MžНљ5‹*SИ;оy\Т{Eћёš _н*šx3Б­ѓ@г,ю7›#Д–$Юs ЙлSХРiэ—Ÿе zƒEГЏШъkvњЦЃARЁО`ЃжA юњџІZEђNЪkŠ|ƒЕЄy2ћЫђG3Бyx„•[R‘Ц•]z"cE4BЁЦєVq„ЯАн"МвŽ  ЙW:*$ŠhGlЂАoВН3УвWђ…ŽpZ& г9gЉЂеЪ„PSƒЪфH2кЇ;И~ЗАB:|Qp…р-љKwТці9уіНЁеu2sМŒ СЙЁLpU^ЈйjH^Žуы9B—ѕ™І"Мљ:Ы34N8>4јaЫ:„tЁіпgu…ъ;]PеK&Ши QУšwŽђ‹9)ы#Z[33R0ЗКeЇ:а5лTПэb~лŽЫIŠізаљМNтеш™ojUЛЋ+^/}XЭэ‘/XPёЁЄћDŽŠљОу‹hЁ,яЙ…ўBъ›,БбЙеЈЯ‰Вt.ІчЉХўЇтЩ_нdМrАœ4‹+i>1 3н:N?. Ћ mRЮ™^2nУaК\цQ%уЁ_œ хУ_”ЌKдuФFœDЖЩ$ ЄoMBЄН?ƒѕжћЪПЛШƒТђќ F]ЃgЭEЛTSэу›QЏ,рЏ†Џа4h h‹ЫЪ§ЈМL D-š,•MO ќ6—фч‡eпu?XГЫињыhЖюpО§0kZ30ЗeŸЂзlcУ?gюnОЇ%зюˆž*РЉ ЦАЩ@|aъV,УeŒ <б–/лђI™ §xкMѕ†gЧ|ЏжќВ„vПmSIД6‘јc “Yщ‹ІwnaлјХ@Љ:Њ' ^4ертІSСHšМsвSЇу8q ФЬ’›ˆыїЦЦMЅЌк"yEFЮЅѕњзѓg’~’Oбк.”ЄVђ*„Ч”ŒЏЊMО‘Ск(oaNњЬЌЉђоŸCжЉІђ Ъ7<Ю~ {*хЩГ(œ,rЪll›/ц_тiь ЮDŽ)7ПЮХзsЈам’Х—ЅЯoЕпњзSi§š*WrOа=O€њ˜cы tЪтЇХ еђръM“EсЪюE P}iМ ьх{0Аљ%.ЬзY”‰УF№щƒhЩB-гЏzNИйtла!Qqэ‚4ОiA\ZО zl& јцЏNOшк#Xsц‰ƒыЅё/‹ЬЌƒGд^bzƒЕ=ЎdЊЩмЮ.y­ЉŸВ 3бЛбЂ~‡y…Š„.XжДGЗвь]\ܘ OВ™,xŒю%ЖœкqжŸ‹š*:„сOъ—ŽЂђДДK:'Ќѓ!,е2-"Hд›~}С€чќКcЭ›x"+?t6zо,ŽЗЄˆLQk†‰$%Х1wЮŸ6м˜‡XАпA˜РЋФ†qЫыk гzBђ"ќмѓ&;о‡ЉчиY ) ИHrЇ*уx’рŸhœx‰К(yф™‹иhмљpжh)Y8.йљ ЇsjЂ§шь;чFаќцЋ†O„|Iт*isu’тkБнРŒ‰R“!єYяГi{EІшœ§ѓ ЏЂАг›ХdЃЏУ)ЋЪн†OoфcNŒЮДAЦѕƒ„^ўvНЄїЊAА`lТEвэСљ_U‘Т-|WJ?ъдV0­/t1Чˆ ƒМ [чM^nпь’„ОКЎЕђ‚а/ЏЈЖ9ˆАЈZЫИ+*šуїѕ‰„юЯ–•"У}­юB 6В#„Ой/ѕw›Q]vП‰1Lљj з AkTFœ+к3.аbNЫUƒ" …єіЃ,f0KУтСНЎUTЗбТ!Ђ~a+ќ}‡ЊФ}пKЇо<щ}pYС­Јw!!wЬ)Ÿk•ўњсMЖ{Š8Р;Oе<ы… дйј‹1wСBDЂ^…X.х3P•ЮEКDщ†ЯЫІ=АнвW сжŒЇ'єAдVїCŸЙ‰І?сИAžAыЦV-(јИ[юидГVKќZњfj”…ˆнEZѕCсІ‘5ьЌYSѕˆr?ЭДз‘eАФc+а"зцн=эO#TЦСDv9cд4ˆТ ж~ДЃv‘MКк“ъћ(LїјK1.бцІ\‘ВЖЉдялN'юаќƒГавж’їшˆZ_eЭŸХьѓ–Єr?‹!УR№p[й' )•EОшщћ€A=2бPAjк2c.8лш{У{Ћ‰G =R]‡†™їЬ (QSlKпVдЙВ\ƒmЇz”У<ЩЯ† ‚д7Б ›ƒ,ЎEАкTханІ1~VryыНнщ\)› ц–я|“ПZ<ЯЄo~IšjЋT§сКSŸhTњуёЊ@чBw}Œ‡OЮЫ>hŒ’С)Ќzѓ9Ќ@_ѓCљю;§ОЮЊфђЋ;Сњ‡ёš—>А1 oYU-‘!ћ `зЄкŽЧК/чaђЙZх]z њЈrˆ8бG.ƒцОb Aжr\HШИЇЪеВуїJ™CfQО(Y“’№М<еƒЫє4’)Н Д? гŸhKрmФ“+mЗx”“Э'ЁRl6№х8?їmАO]љVJОМ7uƒжzёщ@)q4§(бw+?Pў#&І̘wOАЯ>9ќж‚ЅЄш8C.к\ЕuŸ—IчѕЊЄбаqћ`уRNYŠБ&9Mц;ѕВMЩ-ЃC?cГ;Щ yктНЭВЂТ~ыц{аX•Н•5р‘м6БРѕ&Г0Ы}ЬŽэќХ~BoЧ1ъ ѓvх‹б™єn˜*œAЯ:˜љ€ЂLt €GY§žН+QљlŸѕŽWо8о/}ДЏ:„[ЯJ:OЋaг'RёГяйWИ§й™рY‹SжвсOб—rBЪF u2žяhЇ)8-ŠД'†ŽГѕЊ0kЭІ+/ыж3!ЌЁŠСyCє–ocб%%Ъ~E1дGhpŠŒЊ2—6ЯЗ)РТыyтs9oпрд?‡'9Gkыw Ž=ˆ(§№ІвмР&™Ÿ™7AБ4*кЕпŸЖFЖ LыXUќк"АЧЄ‘мpsж!fЬрИ№1n\ЂУWхГŒZDQ5з‡bfтУlУSдœ–ЮЃŠкvєЉћc1+Ымaч †БzuхЕ6ЏТ†yњ’vз* ’еœ:GZlЧї(OQ|џх м—МchНЇC7DN™/ёˆЋ /хŒ™[Ѓ\#§b™OМЏŸ …•a5,2тХ*кOF ™ ю“žeoVќtЩј}№‰Œ№Зѓ2™?rоPUU;ћv€MмYУ†О=#Ѓ#Њшt9eЏ‰оЄdљU]ыьa&ТЦнэ§СЪєК}СхIћИuЇв”е?”йŸ№­r,kJ7ЧA uќJќћ‘ѓЦoћ–jГ’ŸšЧ{†+Э…u;rдђЯžЋNŠеаF ŒYІGJЄP@ИŽЬяйЇ…vLmrмТƒј…tŸНЁє 0’V-,Ы’xсЅWљtуЌЋuMТŽk,tpm|ƒŠ"УК~М•ЯОЕІa0[™(‘­Іzћ^взпЛ‹гЯб НxvЯ -ЕОхЋtх…A—рЋј1ЭлЅа+9›+’ BЋН‹9S]УлУнгХlЭхбјсs8>/тњgхNсйгйёŠ[z€vјБ)JозьД,ћДыЃЇб]Љ–EЦpшISŽЅ<ЭF:7ВёIƒ†,У њ0‰‹НШ {nBсˆSу`˜РЃЊр8е>н ќkUmiУ‘ "JЖŠКzеNг­[wPЩX8r НщЊНв'‚bї­АIщёјЙ'ЕЇ„Šgї2K–ігrA˘(tш…‰ƒdGкŸО›}рdКЉќЄ5C‘'ќYЈфю=ййHuсчЏЏЮЄYdтЦ‚сБ ЙшќОrKЮЫe~КЂэщт]:сp“п­ЛЏнШ`џiпј Сч§]ePЃЩпэ JЄа‚Ќ<6ѕјЪяrО?лIžЖN=b—й мG=Меы—ЧQK›яЊ|†HZФ}ЪрЅЦЖОbЂЎЋћuп‹1рy/8\”Џѕ ЌAШ‚ТИ[k)—ЖˆЇџ=§š§~TzA|мЂ—ХВbЁ`{RŽЎћѕ кЬ yžћKHPЪсŒ€6єі@–cГрs*BД*Љ6ћЮ„}=ж‹йрЦЉЌ„‘ЈŽlж$KЮЉv"o0ЕƒАzБgsCй„H —Ђ‡@ACеmŠпїzД№skдh’#ьОk2ыч1(C”и ­œЙzO Dм%л:Мw†;žSr4lЖЃt2Um,Тн`•—!тУ^љ:?вˆ2IšјъФАУП&Pє)$ 0­rа.”*Ы?{iz!ЃњC!Qymћј8БjŒ<•їŸVY№(w‡mOчПIТD'n<А9ЬœHо ™YDzEoчg5—їž+J.ŠIЦ<+;6‘ЧвЬžиT ЏЎB>“q‘ь#йЦєДюьНћѕBб3‰,{”сvЖvG[ƒ*;Ћ$Ѕ€Нkж—<ћœзŒNЇЦІXџЖг,лWNЩVlЩннkік]ЩК<ІTПK35Џ…–ПХТ%žAЁСbэ|ЭЈл‰qЛЎ№Г…2kkБ@{Šxdœ{RWWзŽ9‰х`Хзl&˜Pg“юŠјœŠsЉ#ŽŽћ…vNг|Гд_jw ЁЏлС6‘PыxXЦPГd§C—–Љ-яєqщ –Х|1y[{p (=ёёЭjїSЬHZb {wL [Ъю­Kж…/›>йuщЛœЗz нћMо~~_Ш)ПМє‡јйfZsCЪъы#юS74c|j№”Љ{МНлВ-э|WŽЏ•Єг?ъмYПЯЉchIѓнГЙAї^6šaћˆн\$B•(ŒіФJюA~Нх—žc“мЯЬађм0WЖКCBsъ ѓўœfТй*•Чms”ыЁбdЫŸщŽ~BзЉЁЊХFйIДЗd0ъ˜у/ЎаšтЧЁKOЈЕrhдэ™Lfъsњ…`ЁЇU Oix н#4—]SЂ…ЦkёeУоdйU)Ќ „—žЃ5OяHУ“>“ъпCCE>Ї“VbqНž(xeЮ€язW ьO8Ѕї­чЄ•єў“'}ўщЕ›”СІ8šДcJВБ{fBџєђEЮ—лEНчШEРзЗ—ЗЪиmбьЭ”дšЇдтˆ:3Ћ ›О7еиiDп][ЎСY‚gчnT5Ь•8пK\ ŽvœT*o‚ˆgЙƒ2Ž,x4QЙТЂoУ4у'8Т">ЬrFУХMцМьOlѕК­•§IдrЛ…б}О–YO0Ш6ŒT&‘iиј< ”ЈИOA[XІ}Њ\zc\я ТЎAЋQ˜Цvл=^ •л>ЧЯZНгЦ\tRJДрЮ ё,™щЁsvиЛХœљц›G6ђ/ўггЖ`•пє!ozвˆ”АUXrBєАхКлnVїHы\юГгєdЮoНeт3ПЖѓ(8’`лщЎM”•уЁЗ+hѓyоt…HU%>GУkЫ‘Ь ЋоћœЅ‡ ЯяаW$†žЇ"н/ž=ЭузЊЅФšкd'§‘‹aАfМ^Е(ЎkЪEЉh\ЛЬfžp.7щс ЕV6ЃЖMМobБ„8”ыќ]AI1W ‚sЯЛЕ.udfкDїšЊŒ_иŽ З’ `Р§YџпvЪLeЅМЇКЉ&Ћ ьqvœEђIН)Р>т˜е<6Еf. –tF —кЪ!Ž–oY€‘ŒЇєк’aЁž“žўі@:ЉWОае§в4|Џп… тІ)I1™ПZйФ$їу:+‡Zћ!Ћ’ыdӘ6˜ЂКF9LšGЩаo2Ж–j€Фf"А Ÿ% !СЬHgЃУ ‚š{кckЂК КO!сфПЌТдQ у8ЈХoZм4<]п.ЌhУ …цаvЉ5C–…=&4ЬMM§цe5єИFYU_Xые(}8UE№OSQ%ріэдLЮKуќ…4и=eЦ#(ЧЄ0альyXОE'ЫKcОХ.ЛТoЦРнлкнз!Е&8ix…eЕьЁф7кяMюНAБ]ПЙ/P~ @"fd[юѕfWпз9Wе8†ђЇtџё Oт*ќhЫњkž…]ЛЎ‡Pш1дoўцВOŠyHZЌшЧtѕ’DcдрHЛOР>§”ДŒЇƒЌNИ;aЫ’ѓ>;*‡ЃмьТФxaБсRЏ@ŽШђЖўXј{ilяЛ”…YАa‹е>iАGh№d–:ЅФ8џС(Њcжxx}‚ЂŽуА >LЛ_ŸуАЅ›’р$Liї,„Šk'П5Bе}Пœ…!п9zz,ŠKZBнf…]%!LѕrqKŠ6БРШД№8л\Бы1а rc\`Kт•ъ(Ъй-t8e|Д?Ш>D№ŽХTД…ћw $…к&i \8Ыr.ˆЉ‹нџ(P6'œx$˜P#Кдо–ƒРaЖў@•Шў­и?'TU}А:5.З8|"љ‡ЕЌ9кSЕјhЇЖуЇP—ЈњKЧ(+oV›­1юЁТ(іž[м(X /E+А,цAѕЙ)У‚=ђУъшRHc6Ё?Щ;јUPЃиyЌ:M–{ж{Њu‡м}@0у `ѕeŸ~>Ы.žТPq аўЌ;Ы Н>€bу~c<)п№Чс(::ќa‘u{GлKѓаEFW-лїHхбg)Wг(ЇЪnH ГbWэSѓ ^ЉŸT­y~•6шВЄmUєкшEз:Dј-Zц НЙЉз:›{фљю€Ъr ŽoЛCƒРBž§ддCF$м$“8rŽy\^dў‹/œ’жэћ Д‹KaњЅфLT™ќ_aяd~д ПbŒг-<‹€$}ђўёЛЖ”`шЈЉ#ylЄ]мe]…GцŒCѕ,Е^Јпћл…Q›й‡$ОsŸŒ`` з‘H*aх'@ Cm|^Pјz“љИ;KНМПMе$ѕŒЎIя№О.:†ФElDJЭvоЙЧPЊ…ж(?ЏЈ”4kU,Зуj8KJЃБПі’ћ—оzЫі3дЭф кyz§/qœХЊ?ш ѓwщ>`!ф`жъєZ;Xм{жU“е WРёƒћчg[ˆм„Ќ*_ўЫђњ€SНБWБ„ВАUТб/[ѓ…[ш]”{џ9wнVыt‹,qљЊЪUdшƒVщ8WфПЖЖЁNъР?”ь*u:иЏiРvч[4бѕ(шў09jydlя™Д­ЕЧ;OЮ-†–K}VЃсlAГ>‚‡Z)mf‡№Š^*7YйЏ =ƒoŽЂ]ŽЛЙ№'zЯ1;d§шЕ*t- 'J$укліъьїeзкГ V:к Ž4€ЊЪ‡каьб&ВхŒObPЪ#МЄž8ЃЏрŠЎUЫ„xОф!y_ ‰ф9Д0 aљYх+h-;•И+5?>‡9 Ѕ_ОзW%§$тTУ<„)!#|Ž>7Їќ"Х­­ЃЎБZт2шЛ“SвSзБK–Wѓf3&1ё—лЪžЇя'ЌДˆЈ^5оŒАcх’чфп^иЦŽъ˜Pы8Љ*ytˆ0цф:Ѓl,O№'(чю•Ъљіжв5:yЦ0џЄлћ3t`tr%ИoиЋфу]к‰— ЌuЅ5љйW2ЭШщЃ -ЖcІ<ёџ;ъВљКЬІwoц†(uy­бІОmI;лHЕћcYЧсEЩПwјџšь@( аФрLuџiњszSi4$Y†ТѓЯПO˜Z' b#‰ЪgехРmт[ž˜ЇфˆwиXњ3M-в=С5JŸТЩ‚ Л™tТ\—ХР;!KАUSлУ;Жуi ХTxЄЇWР€Е*.‹%п[fr‹>ЭS2Р ™.G }оi>š˜uЎЌC0”DсБухœж:бI,0‘Y5ЂЯg—тэŽщ™Rp*lgЌУJCPЛ5Є:СŽхюO*PњгU—йПЏЭвk—‰yr їS]…~ЦЌ qOеTYЪЖWъkФ)&JSt:йк:ЌezkMHbMфихфу д3o&ЄШ ‘ЪсссроШю0WФЛ$@•‘хT"Л„1˜PKN1Т1ЧЅ=s*ФuЋCcuЭўўYЦ6zёЛБyqVвхи,tяje:ыfsЕЪ )HЛВѓiBМ—гз2#zgЏ#bэСі=V5 ­ѕA„xНD@L 71ь&Jœ 3КЂЖЩ/;е;ЬйџАг4ЫŸлЬ;vM‰8аћэAhЉr‘wшфмВ‰:ЩY№ˆAіœ„5Ез—љщМ.0Ё2, ь‚sхкtšЇ§ы‹щžВж“HCНbыšш/ЕИI  Аы,З?ѕС]Ѓcбƒv#№ОyћzЖ_ гЋœ!JёѕoЮѓ/ ЫZЁЌШ^џзЮФтеIdЏдЌЪYGlЛяеХю:PЂzЊ=s,eLх,4јEfЦЋCЌ­@sК9Ёщ`уРk(+ЃЄПЛlј€wSЏfе‘Иpѕm\_ўFь‚žфѕGд-G ь’4'ЁBВлнКТшръFЅ•,žЕS–6СЖ' ПM+y\„[ниїHЭcЋ”лдќeЬКQК™ЂrИиюK:#ЄЩ?нёУ} –уCSˆ-Еr)>Ъ4ј`'W+уZE 43WhЛе‡&Д­vЊћеi"jє5cНŒ,ШnЫMY NM шзГЖИЯiXш„Зuєјц9АОn,avЧK№“iУѕˆ‘ ь5„Я- ˜ш–ФW3Mїі"Щ СѕXи1Шц`ќaZЈ*ЇŒOК€лУК’РЩЪ/%Лаѓ6дУ<[d-ѕ–њВЊ•Hё Ф/­GC (щ џNэњMMфЬ‰ТŸЮвТ‚Ѕ)>œЏ=нЪ‡laqюцUŠп/4€ЏЌ@^ЯˆћAХЕЕЯžbтZK:і B ЕqeдВЬЋХПСУиˆ2eNеšЙ<ЦЁ$ЃёNїозФI{в‘EQL'аЂYЏ„Њe8 бљЛЧлЊЃM€еъ†ЎЋ<WО.иѓŒ˜v]жН”й#`Ђљ§9§,юЕhHћM;ёПqkЋ(іо'…^ћљЙ†ЉэЋЭŽ6\ х{.ѓŸ#*•I§кdЧэ€аЂˆ:ёИП”йМћnN|ћЧ˜RеŠv.^ ўХVп9HWЏŒх}NЋaЦD ЖO‡нaвЉ?] žЬ?C$Š џœ‡'­n‚}ё!‡ОЊ_НъксWbЈ(›žгЯœ1[;к№ИkЩдГняІѓ’dХЈ[ ј!.Xю[еTЮ$n ж‡ьЇп=ПpдУ›&уРВмН‰хёъОіИу<`bйhBКGъ:/АхДsаЉ]иf& vдцшъJ&<т>р‚xРЯo•зŽQЁЉйфо†>WХгAƒљ жХћ]œњКЮo›Ѕ?€ўХ7аU0†Ех%Іѕ‚ыПЗ*L­рЇуœ{Ирн%ъ‰E5м эYЄ#qcьА}Ќ”XђЭ"OЋ7џШ‰.QЕЌњ№з>ўхъ„P“КLzsŒYЉЈZ!|Ы>dъ њї м ˜Р|“D-˜Ї2RМы8ІШž5 еЋћ]Њ*2кTз~l’"qэо wјѓC[l#UРэи4ˆ3ƒEїоBi<Цў>ЫФЧVbpЗ‚ЦA–њшZгЬяищ %Б§#GZмnЃlmЉ_Ї‰ /NOШ1ю=RбјC"EvCфЦlxLјѓhзŒŠoX‡~„е;mЌJ`2ЪI>Ѓc–нo­№˜ѓE$—к .Pг ЁСБЇŒ]Л Sљ5н˜„J|.X4цŒфOРНЂCCMWИ*ђ9VЙЫку|ЩUхЂџв˜цKљ˜K{ЇŒжM.Ъ5U6 ƒѕ„oН(Yk=І5]ч|‰аzПlsKЮhNxK–, мzЅ~$eўКѓЈр Sцœй(Чy˜zђ`ЅqќF#(OаСЕЅв ЗЩQ9NпјG… ЄцсŒJœЋЎЯћр^[іkл"“ЧTчћЇЏЮіdЖJІ‚ђоcš \œ =aў$€›/—”слu2;W<‚9HOy#„$ІдѕRѕёk0&ЃЩ?ѕКЂЊDЩ1˜ћ"Š|'ƒивШ~rG“4ŸˆЛј}Є’ежDсy.Еd[Ѓ[N„ЋЃtxou`ЎСыџf,[_o6ъЊеYSOпuАgkЖ/‚љтЕИPNћ…ЋиYsH?7ћќ нfо]лXў№šrЖMПhiїІД?{ЄзЋ?ДћGiaš0П бEw‰Ць‘ G„БйСн8этxvПз(6В'вX—ђ endstream endobj 776 0 obj << /Length1 1834 /Length2 13095 /Length3 0 /Length 14239 /Filter /FlateDecode >> stream xкїPмлђ їрn wwСн!8 0Ш юююnСннн킇 С‚œ№8rя9їџ}UяеTЭќVїъон{Џо3CEЁЄЪ(j 1J@РŽŒЌL,|€ђЊrЌ,v&6d**5Ѓ5№?vd*  НцћуЃ=аШёе&nфјJ”‡€2NжVv++7 €……ї?Dˆ=@мШd gШ@Р@dЊ[7{Й…уы:џyа˜аXyyЙў ˆкэA&F`€М‘ЃацuE#k€*ФttћŸ4ŽŽЖ|ЬЬ...LF6L{s!Z€ Шб tк;MД P0Вўн2@Эф№—CbцшbdМЌA&@АУkˆиhx] *-PД‚џ"Ы§E`ќН9V&жџІћ;њD №ŸСF&&[#Аl0YŠrLŽЎŽ #АщD#kШkМ‘ГШкШј•№gщF Qe€бk‡їч`bВut`rYџб#ѓi^Зљиє#ФЦvt@ўЃ>q=афuп혟>\+0Фьёd›š§б†Љ“-Г:dч”џ›ѓjBўЧftpВААpѓђ€v Ћ‰ѓ ЈЙйџtВўa~эСЫУb 0{mш2О~ {89ŽіN@/;ў!ГВLA&Žc 9ŒќOіW3аь/ќzўі WРg–WљБXўx§їIяUaІАЕл?є?˜YSBNVGўя–џыƒИ<ЙиŒlœ,VV6vїыƒзџцQ2§]ЧПbЅСfя_хОюгJvў[4-рs)@^• аќ#t]N“з7жџЯrџ3фџŸЪџШђџ*єџ[‘„“ЕѕŸ~šПџ?~#ЕлпŒWх:9ОN<фuРџ—Њ ќktхІ '›џы•v4zQАљЋЂy™8Иў2ƒ$@Ў@S%Ѓ‰Х_ЂљЫЎўЧИYƒР@%ˆш РШЪТђ|Џ3fbѕz‰8М*ѓO№u„ўwйO`ˆщГЦЦЩ0ВЗ7rC~=ъWФ №`}JS ыŸZ03!ŽЏ!€зНf{ф?Ю•›Р,§‡щ/Ф `Vќ/тa0+§ƒ^™Њџ NГњ?ˆћU„џ Гж?ш5Їія+гшєЪ4ўН2Mў‹ўи fгAV3№_ Рlіќўх}-жќПуЕX 7[‹з+эЦЋэпЏ•Xџ О–bѓ|*цХОЮ13ф_№uqлСзЕэў9Ьіџ‚Џы:ќ r˜џ_ЗЧщ_№Е*чСзЊ\ўеѓkUЎџ‚ЏUЙ§ џG!&NііЏЗхŸ“ќ*Ÿџр?Џf аh‚МВ1сДЌ ьИЋ%vaм›bу@К ПFдм§DшМЏьџQрўŠ=?bYДgсGФ§&ж1[ЩKГ•‹•ўwЯД>М•†83уЯ,С‡c9'ЖВнн:†ь`SsМГ•—k‘yZ|Л‹НЏ™‡’д-UЗ•gš~2ЁBOEE №№АЃBvŠfvV‰еŠЮ/tIПwИ™:I •8МOgумZ-c€mЅЁйЪ^g ЅєqЩЮцЉvћ><Цвј_wњб;LЈ ПуЯ’оЙ”К<ЭвjРx™ Й—cР@iр§ ^lзR”Хщaп•Œ“ЗŠ8ЛХ–тhЕQ1ќ ‹ЈxЃЎн)ђЯђ0єЪQЏЦ“}хЌm@_G= šѕƒІгмZ…вдм”Ј|e (%œy‘™-Ј˜u9S[ rДTїИ< ‰­КqtжОч9'5а#}щЕSФDєA5ЂЅ+4%ЃaВCП7‰”К6Ѓ• ЂшЗWћ ќК4ьжTЏзЪј§‹9pVЗДЁž2д k`ШЛнп yж~1б bgЭ<$:Њ3ЎiƒЪл\ГTyщC?*йjвыђ5Иh;yїнЊ4›ЛF;нЎгŽяŒ_i,˜ŸEsЭіаХњ2soЫКxфїхИУгU”ќкЌй#”Ы}8Dцкlб8§Иm M§ј8T­ЌцВН|јžэEчЮˆhЅ)ЦяbЪ`D*­ъвг1‡ѓЖ`7‚)šГ;Ÿ„ з1Ц”Иаа€”#c‘Х­a‚_:АрeКˆv§ВїT^lМ Вм%p\PD‡_єWв DWt”ЪE„(ˆ2n… В=qшtjЛqg+Ш ‰ Ћ…ъs=Ћц№фјEсХЈE”Я  9иF"i–1&ЯФђ\e`œ9р…п, уG|в‹qQxЖrhfўќБіыKЪ=ђn!ИцЃiМЋY}е(Ќ™xQQ"Э<„jьўl,Д’‚', ГQxф›Nк<2ˆ>ЭўЋZжВщзЄс4‰ЌS%˜‚уа‰ЕSpS6žxќBTЏ‘ВдaЧі"ъчošO”GЁiф}Эн; ‘І…РеРЂэ•w^щгАєq(9љeаdнŠћТ_P6шц–њЇ7Щ}Эј™ј47§e3Кюз‹™Єe№—Ђ”Э~Л lцтоп^˜лєд\АY јy‡mнр…оЙ§biЅ І}‹ KCyj~DџqNЩідu&єЦUёч‡Ш•%!ЪЛm5™аŠУPэЇw0ЛЅж п?}^ьЯ(œ'ЊW`Љ AігCgќFљpyѓўЛъ9ЋЭ/Їрh>QАWЩ,’ ЋєЫрQžHМQ\fЭvЫwќŠl˜аЋЧЉРUоЮЮув9жwи№TЭше92 vGѓ7IrG’fіAЇєqЧЄљэ$ѓѕи&UиНO€n"Ў•аlйZДžFКŠхqIK‚…m‰Y8чс65OН†ŽzЭyNЌ„Fз юFзzИ"^тV*/хAL.Y—њИ”GЃHqТGЄG”syЩHQWќ‚u[ЊZ§b'єJe“/ЖЦ2У€дK‚@wЌx-]з˜щттй†5V;кP‡ќŠ– Џolp?7­бѕЬјaжЇ.СwЦŠ#§qVїq–];яЄ…bMFPѓэГЃУ>Щž0мmc.ЖCŸђо_шМ‘њFчф›шЌЁЪ_во)‡ЫJІХEЃaцуьЉЛц‰Aеg=%ЋёВцuяZ<шђ(rЃк‰–S…Q~с.D”"mŒ3жЗЋЦЕLnя—N]>КЦjп0Ь_ zР/•ЭЮ™ХЩ{lI2ЛQ•Ц§+шѓUJ1Ы`…`штЕ|`ДKDїЗ"#~хIГLEЌнR†тф0ј|™ПgФ;  Ј‰kJрxƒXNФdгlQ~пЂРJ;3(n.§EE/ё(џP?EлД_Ы“^hнПдž“ з№U&одї ЌhWОT§’ѓ=}Еgjё"нЄЙщЌOЙiwЧ8“ŒБдЊ‘qx/@г(тЩ›˜?ћ=5”jйО(sЈе%O8F&ц5™[ФЉк#lэ@в 3ќЙ1нн’ђўnd†ЕzХbўk+U+Щ;чкnю!qМ“Ÿ7й?Йш-;ъ–)–ФKЧž“'я.МыDgЗHЂЕ‡|ір”r`š‰"rъкŽŽьK’žѕѓ‘љtЖ†MOЅ~№е ъЧpтчѕЬp6лz^Жм]Ў‡мS4‘ѕл§[8~хІњЉI}xІ<Т\жмsaRя/ХЖkјOSњfХK|еs'еA‡щ=vпЧLž ›ŠзёйˆѓЛнЪ ˆƒƒ4žъ•V|ЦœЏ 6НЫ Лy”ј„}б›J‚.W‡ёхуЎсЪћСŽ%S0]wCитЫ–Иі9/Kш9B Šo2^•’w•Ї шН‹?Ю“N"ТW".№Д=eœPeqPэм"v<:Д~Z.п4ЙJШ гZ™;˜ж"gЁLR‘š?В§>N‰ЇˆКИњФЫРЭ 'E”ПgmЋАBr ŸЇГ'яЙЄЇ[x§9gбоџіц @єNS0&Їˆ2б65џBШйЎ)ДЏч]ЉХtfР”ХИ–™dƒ#эзЦ­Z—1џщщОpЌ†жZSаD+і;оf~Ю0№яФт­ЁB]Оіб>7ЛйЯЉAEЕ)ИРNД.ИУЎфuЂqе…ЇюЗѓ\FYюЎVанТ5Ф?Ьд%ќг,є%?хr2Š’gЋmІ)}ЇЎыёЏЪAš|Yж6ЕC<В&"њФНј( TЁšкЧЩ@J_g*Ќ.mеЈM•*:.Ж5э2~™Уnm№‡i9 [Пё БЬБ№}+eУя_ўє$П0!Ц]HЭМзЂgt,Г0ыТОъ '‰їеZ dF*}—Л`сќќУГИ8&5ˆЉ.gjр0юРУZлВк ˆ4ZЧќ‘зТ_<œbsКЦ3в”EќІQ7­MІиЄrЋѕb–f‹ЦП>ЄГ=Џ” zа–q?Nм‚Ёь%^Успg'sРс]qJ20}ФЉœTэщЙВ@чдДяЯпqz™ўЕдШGkеžСїДїђЯснЗ•IЊ%ИJ,”ьЧЩ,%›]Ќ\5>rовЭу Wљ'ј\4sфB)3ˆУJ@кьSЎ‡єF2Є}Ќ”yм—x6Хd yіЫrpZBd’Ѕ2ч'ё@sХЇФЫtЂиt:я<ОB$=р*а%чЊ‡ 4Ѓ"sdU%цGPН#YмЋM”šЭ=Ё'Д^ФрK&ХђфgоІтгќюš2ŠpЯ'ˆќцNВПИ" =юзхWгЩ‰бїЅѕаАŒ‰Ž<їbЈ*)‰2.Й>!› MŠцХ}ТЬ(-ЯщЊ!k wвѕzˆЈЌ“ќмлžъУƒнZурŽэOr!ћaГзЩX#‚S“Ј’фmœŽ§­ь gлLеt$ 2еН˜ЙЦз}PD†‹ЌГІSоХесІнОИр=`@г{И•1)й`VwЛžЭДС.ѕg–БKЁб—ЕPBoЙž ^ŽSї?ьR‹Ш}8ЋЃяхUtr-ЬЖdкЧѓКЊђ€X­fo]§фwОpюХ@ L+ћWтЧ>gŒe:6ВЬљжl кжхOM.ОЙЙ”њФyГћћ…іећgХœwБяЇЄм™љiјvД\3^џёЇ|Р/лёndFГЭ†очє kVХЎФXзй‘[‰ЭО1csYBnul |Š ЬC>їOФ?šчєб›=#ю_З‘ж~šЬdUЩёьЭІ8n„n 4 Ь’;}fЬ|аЛ\„Э—Ѓkˆн99‘~‡/8wЙ.xUНl—=|0UеADPЄћИ .ŠЏ#ту§ZvщоєbМФ:3–ZЬсщ€{з(А5’e B…ѓ'Ѕз™хЯƒ+Гf ƒќ№JЖyIЙNdї‡дцћ Єи—уrYmИОTЏunКЙЫŸ/Йсю Nїg^ƒ9пfIыC…>cjЄ”рЙтш&U‹ЎвЮ™Ц[а™3ЌйєŒйтgсnыбЛ‚єкюi)Р6щ }!ГщА ЉbЫEѕ–ІЈZatшЂХšЊ$Hя›шиOј*эYЈЧ* Ћ пkdAWРL?яХхёфИ‚&ВhђћЦьLiXwюў8ОъJЬ‚ТZ<ЅЖBљМ„ щЊцј DIБ“з—­^wLBF-—kјxŸ~Гsd}Ц  дДцжЪШmДИу1ш(hхйЌ`ЉhQізQдЫŽЋќ8П†ŸоЛvzЛЋQРџ+k,Ќ”ЯЪ›—гѓM”–4ЪwјљЦ/Ї+нЁŒ›CwЂaБЮ“мHю.BъєюMВ'AdмРFДЌ[ЛhЧњЮЅ<щYЛSбRБб‰бQ„(СfоCэ^3jз§№Јс“cЎiђ=Ђ†з V4О3W“ЙЂЗ–Gй )vёЏЩ9= пЁ€Й;ѓлпђ 9 о ОyьИЯ#˜ятbЬК?VШ'Х v>Ў*АфЏиSmЊ]<џ>ОF/сјТ*>a„ 3l Д)›ЩЅѕЃ:—вRмU:яt7Щj~ƒZй]Ћ`SyС—№„x^LЬ№Ў•БУЂtHРќ&ƒŸ ф3РЯWIц˜вJэ0ч9+д7дСœж&р˜[8й\_ОЦ›gY—(Э=}‡†ЙчБьТп%o…=ёТЗЧPЕ-_^ш16Жj6C€uDйLKuљмЇ@ИХ];XпЁN:№’zŒVѓЉ)ЭЖЧ ѕ%•uЦƒŠЋжb9P“”Тvp›д'{;Ћ6~2 іьGfЮpc5KqvOНvYCCЯ}/=юœ@ёЪ&­вЧ§ŠЏ›@эJ;8œдSягАwї3*a#kЭЌтЕйa - Сotау#RыGP(ЯC˜ђc›кFqАgН†тNжK‰АЋЅe"ž#ч\ŽЃ˜ѓ’]Lrсл8дћaGy3\‰К_іŠ;f=Ы5E5%|–lЎX05очП§жfEЗk^ьg‹3г}@•ѕ2!њЩPхpз^њy­ш“ЁkоiєgГ†§Ц”Х№(їj)AJ:пСЇ`›"ЊЊD ЏВѕi…W=œ+RC€'В“#ГЪE‚/"hvAь`Rrtf,K3дЄБvјИъJ}щъ2њЌЪmДТб@їџИйr“Du"3„?vc™њ$že4ЎmЮ-о!щf0ыqoЕ*!YўЫќгAgјс…ЊЋfpЩAЄuЕ$йqЈžК_!­EђќgLg4ѕ.-œ–wG‚ўmŒлœпfвп P6Ezхпи№^ЅДщШђwZїЙПHЄТ”_mh@sѕё™šOк;g:q} CдунР‰Т7>бcг‡КŽѓ€я+Z‚k№„?`ЦдЃЁ<^X{a”ж/†ЯэТwTBsБОYŽм№Dz)–Я6"К$Ш=† ŠГлŒр% Pиƒ’2<нддУПI]ё`š}ж<м™v’ЗЭс'щAgУ/›я№u4Њ,—XаBKVяNYйž•зК™ wЅ:§­yЈB{№j>JыОЧkiтЄFž ]аюИџЬѓєS"VK4ekF)њ RžaЛпІџФprЋ-ЂbЮmЎpнLEќяJ z‰ЛД’ “I)8ƒ‰bљ[ЃfЌgе6ЪœHT[™‰h˜v0ŒЩяАkGбјE|)ъ№CTЙюL8}oьŒя–bm8MіЬŸ(іU:ъBT;"Їuоойсf0 Ќ&ЋЭ==PВ=ѓ,m“њEС№žђыnB •ьz\Љ. лиьУФ`’ЁbbЄ`ёFЖщОЄЇ^ћ)мj[ЊЙ$+Щ2Ээоё'|Ъ–ъ|R‰ YjъОsK=A™0šСѕ‡З/еѓЏПС7(ЧЉВZвXЌ…)]noiJ\beр„M‚W-’№[ЌKT7ЇzП_ЃТ—K˜ еˆB“Вф’’S%Ѓ7бQЈЙ<Ь:Tї€ёˆШx \=ЈœQфhwыЊЁIЪ^ЬХЗFЁY№Dз™S{TшŸgCƒшлшsтл-кь}%5:вn6Tyн]~{­№d“tПуЦЎпVŸ eЈ‡KAїлљ)ЅЫž*GРьј&+№‘Ю/^ЇŸѓ!RХ_zС_Љ(”П‰CCЗЃ7хѓюƒх^Mnw"ю›œnХќМв§јRш|Аpсї4bявЅџШя%sЙ§RнЫЫўЗ$9ХIЊ†ђ&Gk|-ЗbŒљE^4J \мо~Ё5књ”лїЛn^8XЈэ!ŠU,ЅйЂПzŠЧ}ХМ+Й*™Z їђPц0gBуЭіn:P„BКкЧf3 {гИ‹нО“ОЧфяйRB}СОЎы>я[`?0_+`t\6€Q”ЦyS… ?”>Чz}˜‡й{sЌсWЕdHМп+ЎЎuх](vV9ˆ?єЗ•оБ[IП№рЮЈ,ЂщЖ6O…КkёV#ЕЬ6бmSщ<Ѓ}$/kxLЬ;П4]fс˜6ЂhTRK,ыЇ.#§[зе^3зG5зИm…ђ“ЄM.>ЄтnўсКY=ЎdŠЋЄFжФT+TjнНu§здo}зЩБwasФИъФЙЇ:R:u­e:ўЗУ|к07ЪЮ4z ЙQDlZд[H(ћ(?ЇyЏ}г6Х% ццЛRA:Ќ№sІЙSNЌA!h„Љ%šu z}ъ/HPhPjvцПБ)%Г=цљCожпИjІ#ђ GЋmИ* ч­ЈВ>њЙsXМIWёcЫ…NmЕІWZоqDН“cE%L‚пolOоGнŠ„яdъЮй"$dЭўŒЮCuџ{Т|€aXыqН\kr%˜ЧtF’Е3‰т§˜6ЅЙў{Aœѓ|q„œxћЃхсtЕ0ќz Ѕџјc g Z2ъЇЈdпpКk;у{ёSJvќ.ŸŒ]—EжKІЪЂlІў™Xч…%Ц9оcх_флв;VuƒЂl'“MйЇЭ LЉіЖЊа4Я•Ђг6>TпN‰DУ83hЕї!lU{08#BƒˆЋW—сi`„Eъ_ЎQоETо; Ž|bŸ“•П~(IѕРžЖ }Yq,&м˜;IћY­xз‹CРћIЭSГTЗрzЈgeRвФнc]!5N”‘эR„0Р1q2VœN|_л‚žUОж7теAu цЌcond‚’ŽЋњФ–i‚;m_EНДšEлЌю+)цЁ"mѕ Eў“8Б§їno;*ŠDЩ&Ј„]9XgнЏ ќ c/zЅZRSнМў•*єz71BŠЮЎГrP7Щ5ЌЭ/#šЪŽЩьtк _Jm1ƒДhkЁц{Šyђ“74bHс,•„ куймЗf}Š ЗЬШ<Јн\СYPЋЮЅсПLЩmСTK„9ц  ПЪ;gФ†qKR~ˆQWNђД7mм.Б&є=–ЧRкWзоЩп6сuх›+Qh!шЕwЃЬх9уxЩ9Z$Фˆ№2}UO_šл аб–|ШUЉО|їАs'щVC(<Єк2P;›тЎ2г*/ŠL‘Ÿ)+ьјУWІ њwсUв‚З‹§{мВRн†BqЬбьліšйј­тBUUс.L}лЖЇџ™­бвІУZœОьэug+6ьЄaGTK]˜k\09†в eО6ŠЛяє6ђQCЇAА;ƒЂйЫ"ЌвЇѕ–ыy1ц^пАтйHfі(IЖ:бяФRлŽ—ы|‹=5wjФщ :#lќдŽœ€пТ|м„ё-ѕаэќјgS.IнžКФJДžuк˜фЧйЗЗБQ:IЖŠљMk+АCˆ™ Sm’юXя+ŒOреъО 6ЃКlїОб"DЂ,Сё№ZСѕе™РќТ)Z#Ы#жIЎE%ѕХ”рar<<ђ‹h\$xKзэРгщ…aŒЊHe?eі;є"мЂэo|Б>A9aреЈщ-о—С№iГєЌvи/А•<<щ4цœpМŠ"w>m-tп[№|ˆl&PEы3‘їŒ‘Дˆj}ZЩFЭYаЄљoэrIќeNЖ:д‚ЊњќRЄ эaS№ љBРЖkЦ')Ѓ4Юбп8VM™> ёа†wеннп—оY—яŒC9vчrЄjІщг‡ЉД№?ЉiОiП‡хM№Пšx\йЬ*(њE8юЭ9ЕQдZSЃ#ЏGlˆЂаТ +5"Сˆѓа=ЪоИшяЦ Џј]тЪц 5ŸktPy1ћИЧD ЇЩwQoНЦ…<ст›зїчгџ.}ЫCШЬшM2ЏС4 ]Л\я*dv‡ QњюэfTнƒ;” ы@mЇЯь'’тэ5ЮСna!›JЖŒ:ј$§.ЂсНЕЖГѓ ьr$іqиl€т€ˆс^fБЃ™&эцс„+ƒ ‚цгњŽД˜Тx‰[CљЪ§™qчМђЕ~vЋx>юwЫрMSѕЊѓKю/Д,В0;хЗ'Tќі!Э‡™ЁъСRKч#ЪСCrL$gЮƒ†щБєь%мˆЯё ' ~‚@‡FtЬŽћХŸ!p6ЬЮbЮlЛƒъы^ч=з”Lюќ щЦЗV"ŸŒаl.Xт—ућ:тx3  )Аy‚Ўш`Ѓ­GЉ\ѕŠ‰vI;ЅЯJЇИ”Жны•9˜i,ёšл%уьGь;VЎЭЄ 7™{ЈЭтoЉЯ5—=SУСlЬЬВ”ћиS4мяћБ]ŸеїˆњaАk!opV‡oEНшШэ:1k‡ ёIієшDYй<ЮЊњ{%ќ™x™Kм†юOы&обA›ђњ†ъЧЭgzЪKjнѕporнƒfwЮbŒє”ЎkѓпЮxЩхC<29•­Л:чœц~ыžDГ‰‡љЫ šЕ 'Eњј№‰[сšHя38{Ežƒ}cC&?ЩшфЮщжћ4О/_?v7H„X„р/ттvq-ЋјGЌ›Gф?З]№Цk`tЈђыХ>dh{^]‡|йјFЄZЕNКpŠё”†4—–Ч~џ6Л)ЅZ§ГКЂ?Й‘:ЅkLamўa<ЗДдгѕАUQ^4с{—CшШŠŒРС—ыВ:і„Љ„юEэ 1‹)–сQТUпЗ-Кљ9)КхжЩUtэв=ЌaЄ\‡$іHЩѓzKƒЯ&VьfcЁUkЙВžoNMТUЉДУчeіЈОэ™ђR[Й{H]шfЙiцКЅЭ*61 ђЃ,_n8ћu]и|5ЁІи5DSХP3 wvѕЬŸђhw%DŠкЂWŸЇY™ј§іWRQпbеђWhй…|аањ ]Rй‚6ЏШЖф/}ј(ПнЕ CЪ{sЦ_RМ%е@Вяšm…]{KZй;m2\GЮ‚ Ѓ+КИwpbщ'p“>yО9Rtэљ•§_й–W:Mь‘]чs)ГЮу™2з:cnх?mДW~Ѓ&:L|h~Уш„š!X‰яaGшY4ч]*С П”и§бƒbЛІ†ѓ єK.(\zvoцкЗоOVkJљёћ”Žнhx.ч^xЩ|лчЦЙІžйЮž*9УЇЎ‚Ї Н‹Г\Z^Gb‡z;pир;‚Ђе–ГH.‘•’”ХНM€tќ*sыїцфЂXЃЏB^Fо€юl;ЬШжм•рќ9њГY(ˆзMџЇЩGTяƒ.G€\з‹Ќ%‡}˜­2­sљ>žЉ/FkjrAЧX„[rŽ3ТТfRйXoŸб€ЈD‚иppZ†a8Bж™іЮСLнТљ ЦЕ0!r BgЈђaўЙ3Ѓ5E1+3Иіћќe>B:ЦЎ*œgOН–Я ­л6z0“ЛїЙЌш§ккм3sT 3ИяФOњ94‰ЂНkЩњрtЉЪНз…ѓъЇ‹4‘д5Е5ьЗ ‘Є|мIді­@эrКЛФ+l DB0КtS2iЙИ_Я4š‚з4нГџЪЬ7~wыKЖЯгх9Š€Ц“8KaЩ<‘F.iEkЂц:ООd,ЇёF5ќЂчђg6Ÿ›У. ыЦgп;)Ѓ‹ХоЕНЊѓ}&ОщšЧPУ<ЮƒSH3’Ѕ™Ь бDiц§ЦЧЪЖцИ^CХїAэ ‚.SИ*YСˆ\S$є:w`{Ц74l^DН­lk}Ќ{Чf1МЕХмЁFыд6#ЙЩa>†tv”—‡JђK—О\п”эВШUkЏифќyuтв[[2љˆ2тxиЋ7Ÿс‚д%’„о†Њ2{vJe  ХQ`зД ІT”V> JX3­r4Г№Ђс>?Šц§№\е}Ъџ‚’ $ЉcГЮV„ˆіхmвgŠ>mlЉ^-ьсzЛ7‹х•/šЛ;з›щ…"ЮsoΘчГДz<ЪXххŠЦГO‡Ї’M]Тх? Ћ+ЇЗ?ˆСh<УOђ6:~AE™˜9БВФыoK6ТшAtЗЁ'šl§МЂsЈцьЙЯDf‘.ЊяхŒЌˆћ,ы8Хc‚wхД.ЬXРьщTЦИYТ;"МЏјЖАZi• Nм§›Ц#ОлœJјВђ aУэiЦe…вBEdЃVгНh"­њЭћOВЊІž>Ы{‘лK&јтЩьгRюп*-MђFіw}›Х™цžS›6!w:\a€аН‡€/pЙ›ћ“i}ЛЋжЛ;ћ™zBŠ~[/œMФ_’fиапgд?Liнц}0Gя!ХІхйLбMЄQ‡œгmћіD5.hг’хO|HўfкŽeM‹Š˜ч$…люуѕ1‰NуiЂ‰КЩ?Єн›гоuuиєNЕПд#-(ИАЁтc„$ŒSу” ;вжŽЪщKњ†ўвд^ч™ѕU9mˆ“„АeЁV AsМЃO} ж(= ц’ѕ5yЄхwžАŒ†JкЙ>>CTВ)ч|яя’ЈXЄV2%eДM˜›T9КoФкиZiОЗmOљhЊhsМи<Ь[BЈк.U[$s˜І<М‘šKП›а: tьKЛh.9Д|yїњiZ{ош–ЙЇfО7ЭAd›ЂЌ<вu-Ж=+—G'Еrо‡<*эOЩСз}АБYЕ— Љˆc8ШБуyЛЮГу‚8L‰НNI%МЁ­ШUКгЫЙ^…б˜сJxІY lэ2ЫЖ]lЮ@Kђ•+ŸEЃХF6}ёЏбžѕpзюEгKїFЯžЁScљ1%v Œоxhєѓ"=qЌЙg‚.1$ЊUп5ПrИбЎ`Е’ йг™ђЕw5@ˆJЖІAjђЊєЃГdmoё.оЃуx—М™БЭeіJg№ЊіpM\žS]˜Ÿ‚%I„ъ(@ъс=›П2’lЪœ0цлї•Bзi/tmЁС ЦYё2сЫЮWYN4|АаЉ#к=Њ A§~[зцЖГ•}к )Х“ї–6АћЂ„Ћ?№f—ЄЙ­КЭQ/6 09Фg%d–ѓƒЭPею;РЄw„jš8ŸцЋaЁћ6Iмщ{2О—­mД|ЅQ8H>R@УД}Ю)ќБч)kлумEt]š_џgЉOEХ'ыs'yЬbиПАќъђ—ƒШшдVЃђ9†йТ2c ›ХюЈ8Бл`с@н?6Ѕ,ЩМ.ПЧ“їRУ­PВu№#—=ш6&fз’‡3 ЩAb!~P"ЭИїўŠj—t‰ћЊGl9ьFЖ„F.-(—№—"и’ЩЁQc™ЊЋ„!•Ђ‰Ж+Ў8№ќЙЗъ…бЩ;-СЖЅИЧЭMН]=;_ёЈJК#:іš!HŒƒ'[Yь*?"Oє† HвеФуЋŽNŽtЏЅеV­дХюхЙЈ№Эќ­knБŽLвTАXŒј фй’ЬхVаяSцgЎю/,VђіЭDœx:6›zщГ/мFƒŸРgaL%“0%яН™XnQ4иПtюЫј|Tць …H_Їх}§IКШзAРИ[YАjЖёan …ЊђѓpТь–ЭќZ?`eлxQMўвќ{х_ цI2(/G-<ГfwЊќјЙгdАy ˆ˜2нG‚^‡OшМT=сn':,i{v‚XwЇaд4с<4ŒГСVйDжЁ-П(мљц3y‚ ъљb qаOˆЌYОмъ ц•РУЄPЈУйy-F>јOНыќš*ПЦ y ІP[‘Ј"?W[… ЖћЁ{ ЏoпС"ЪgЋwЗН/м№Ž)<ЃЯZк|>№AуФГЮiEъm2‚›и­Jф1јђЄ95ЖВопІ Ђ$S­\ˆж=аэЮнтцтX+І$‹ сА‚к"5•І+CЧРнЅ/V|lѕЇIcЏљ2цT4ђиЉ)Л&NрѕŽWБjЁк1 I мB“іј€EЊдp;N&ђ3™Ydd‰4Пu—G.™ ”he/ебYГoF œ+]­ Fа>ЌP8„биX1Цhуѓ‘/л‘•4"š –ƒKz3Йњ=&1 Zy)ъ—‚няЧнк§YbєžЎsЧEо§gukŸ˜x‘ўВХеot,Бџс.u PКрqрћ™юqJўи˜ІЅ‘Ї|Х[дррїюЁ%‡Ъ/Fjњ9ИњВO‹ž&ЭљГ8­ЏпžЫЈ"yЂoj=ыЮ~7oъзHKОSДЮ‹E>ўуmz…Э[`Хlщ-тЭBcАgщЊšдд/!†‹У”Щ—єe.Ф2ё6Y щ’§w™ќgтЎxЮ­іw NiТzПж–Сwѓ„НĘів~ЕЮIхEaWŠюБ*i3Ќ“ЖЄЮТT *Л;KЮ–]nœЖ ,M’њ–Yj'Кsфw€д‚ээШO‚FUљ3Wf,-9hЎы№eѓџѕрD endstream endobj 778 0 obj << /Length1 1427 /Length2 6879 /Length3 0 /Length 7850 /Filter /FlateDecode >> stream xкuT“лв6Н+DŠЁw]ŠєоЅHI€PЁIяНH‘"Ё ( EšTЉв”оЄJ/ъЙїмsџ­я[YyѓЮЬ3Гgі~žNVCcA%ТЊŽ€ЃE„€2=c]i(&Š’pršРPЎаПм$œ HO.ѓ$„ТјTA( Nh{ЙDФ"’2"R2@ @”ў”Ј‚Мa€ž@‡z’pЊ м§0G'f™НxРМii)пщ%7(Сz ”д Г"ф 0F€aP”п?J№Ш9ЁPю2ТТ>>>B 7O!вQžWрC9Œ žPЄ7ј50@ф§3™ 'РФ цљЧoŒp@љ€PЦс Cсž˜ /8Š`kщ мЁ№?`н?Р_{љwЙПВ‚С'ƒР`„›;юƒ;`ЎP€КЎЪ%С!П€ WO&ф ‚Й‚ь1€пƒъJї Ь€ч FТмQžBž0з_# џ*ƒйe58Dсц…Ѓ_aM #u#ў?џ;ІЌŒ№ј JŠE%€ЬC ѓ ќgCьЏ6€чjСщ?нbЖщ_{џEžПФС јg-}†ЕPЯп$ЗJј‡Шџ™ъПSў џUх#љ7Єюхъњ;Ьѓ;ўџ„An0WППвzЁ0аC`dџoЈєhѕ ˜—лGЕP Œ”рŽ2 J ‰KўqУ<еaОPˆ! vњУ˜?~г_Js…СЁ†OиЏЋ (ўW #/А цњ№ФађwŠQЯ?—Uƒƒ_2•€H ц 1–Р_ЃGдї7‘ТBp “РŒp@ I~*†щТ _ЎпжЏ„!џaJ„a›"тaфпІ(ьћлќGK`/$ЃЬпФСєћ/ћї5…њBС$3`йчWmg5JŒ>‚kcЂт7оЦ™­Њ1xНІ"w~$V?­д9ЙОHЕ-њќКЩХœшbГ/C7Sп†я`П"0NuяЧЖЇЎ—шКЮ›7–vbpˆ#ноkЃŸcХМєkSЙ›r\ЏЋN_:эr7ю‘сŒ%ЦоК{WŒ 'Ђ])ЗНJЙVщУd‡‡чЁтиnГњцyvпАЈФђлЯхиАЅlЦ­­ю:ЧЙ[ђYн’ЗuьЦ8WЛеn]Є№„ЗE„ђи{Ž+АЫЂЕVЧ5ПЁЭы)Ў'’ЃЯu(HыЅЙmр[Э th:ХVѕњыЙФявіkŠ7ЛйMс|7ЕhIPœ“qоŒ9B=lТ $нkщUИ…ЫUХdˆ&оСхЪЯeњЈЧlO‡бтTK–~>‹щнаЦ3 TЫЮюќо…/ХЌб3Gьœ‡л№fT•ѓXfн-Pђ\, UЛ}ФЋOYњжє;ЋЊ?#ИN˜Т+=>ВЭаѓLlл—й–qі Y9 'ЧTЄ>u^јFSЉ‘вX–%ічx[Њ—}pr&мl='nЭQућкЏ&vLpЫ _ДЪР6Зчmz^ГбtИRЮсF^=о1 щc$щћPј{Џь”[Pт жѓUЋЇ8Q„н+Х…šЯб§B1#p….У&ј—вgЬX‚пcн!СŽ”d#В2P† ъЫr$Jdq\5QZ>Їе#=ѕˆoAŠ:ua–\ГрY ь> јЧLF!ЖТ­XІЩ;Z;”ФJсŸ&cЯdјДbЧƒqєзЩлQ&Эmr„eЇЕaјHwЌ Г”уUъ"њ5Б {ט‰PžЌ›HВРЮќЛ7ЏгМшБ”>їGžhtЏs‚-3„<рсн–ЯЊŸ8мбљ@vЉkm@€їhъ ОјіІdсT/єsк4™4г&jtўˆmVЯ–КлЇSї0:Zq‘kЏЙн8ЦXЏ>7‡HЁцѓ!ч.ITLјАšдЉ1ED,2ЃNV{шЖŠПум“8:!ЄФкИъLœ ФШћДFэ‰x XЅХё™lšќУлN`ЛOі:NRЇ—Ѕ‹їЊъмФЖБox”&%%’фTЮs7ЊоИ>ц5х‹Q‹4оХзмЁo9>ѕ]эГ(Јхqn$<И_цqє<)Qgh%“rš3€6]eМ233УО(эёTN О‡.н™`}є–Чƒ\[ЦЯт`оJЛТpb9Езюа'Ф&h„єЋsзYIџ€,>B\=6УІ‘ЕM7Š'dэHрЋ­\Б”(F1ПzЕ№оžtЙ`EМcrЛNŠАžmЛіTŒ\~уиXP„§жАУuŠъmamан:WБ9yїy{щюхђ‰GеlчHйOѕ]pы—žr•йн—<г5Ѓ^!†яFз%дEЪz­š~?ˆ ЅaljnŠG hЂур…C`cPџцnB9.;юlŠђHZ4Ѓ тœbо=ƒ@m"ќjo+pЊy*х VЙioLkвЈ<ƒП‘" ђБІЌžmLџ‰DЃ§UAР„Sq1+вя‡|T€ ё Б †ft€ь=0•оЛ8—–žХyœR3o:вр­РРЮрєQ>ЛџнŒІ‚ИBу5Hз• €M/ЉщТГтV>œгс§#рlxАыЃŽбјe“іƒюф||Џx 7ZX= “И6yѓвЩŽ Ћоывўј жdAЮ"г–2СeбыG ПЬи`ћ3B[(N6‡s8Вшј6ЋRѕ e&еФ—МoђBИ НЊ}ЬHЯb>tаkэНzЧ‚Е'Šњ5Г‹]a гбща-s˜ЌЭ+‰*bsŸёŸИФA…_ІzјљчWьњJ™­teлъfљФ’'\ОћЋэЅY€A>ЩТж"_їхИгЃъS*‹3ЬЮBоЃƒрЭЬ–нW ,ч ѓ˜Gў6AаЕиamLvУф1Mы‡ {ЌvЊ2Нз’‡:egQoѕ ОЅR?;њJMXCqJrѓ’Іь —ˆ§-ЂњЏёdњgы™еЈСв5ѓ;ђДК(Б`їoФFq}Ї\ŸаёŸvЇш‘?§іы}ј№–дІƒ~Б­A‘­СИs2ЃюМUвВї|“їОш*nž&lєЌе•юAuу˜:pИЮxь'4йнY)Їx™ЃœРнЏoЈбYЧФў.єHКЊ{NрЇZйэ‹ЗЇM‡sRНсыfJх)ŠdNЭЕfъуZ[5љШ^ъьbћ51р’ЖзWЅs8WCыJfM•6ј,е˜›ЌHЕxfIŒк'Д зb“š"ЕѕS-Яэ‡Њcl]ZУЊ™#эДыЬ=tг tЂˆZhB™№V)НћuBчЇНЫpJсыЗFб’>g’Uв%ЗјљY”}! YVŸs=.& ‘в1Щ &єRxl((9кЕЯ-q…ЋРqpПю'ХъЬЖsкб№Џt%Е'c‚0K`fЊHЪвэfu^nЉю“}c­тGЇЮТШёЉЯЙqЭœ?gЁ„NBЊ}/ŠЗ^˜ДоЁh ngŒВЛО3скХ&tVџ^}4M#rkпFќЃцо+aЕ„l=g—”ЊгГЕч‘šy›/DZЪЏgЅ^ФIнбџ9Я ›&Ю“Кѕi…F^ЈNлМн 5ъ’ёwрр4$rќ&qПqj!’‡!ъV<йKк‡WУ<є‰јюPSтSMЪU>šЗив^Лб.LюрШ8s кƒ<ЫzуЩ№шQ%Й4ЂДРњЮ“]-!k“=ї,p|_нUтыT_МъrDжžЖјЖЄа’ЗmQддмN{„ЂˆxoФœ-zБ9qьeDппŠˆRGpvБЄАШр]Z{Їl~NЫtКшЦоЖЕхЬEО”šЅ=6•юj6ЗUˆ<Љ, ЅЏm$c]Ќ~ф#ў§€,@vБ‚Ў”"^—!б‰'0ГГJм`бЄ­0ћNPnŒџtO,Ю"ЯвM­ч[­yЉsNc=§a>2WрцЁЉ{ w˜"ът"Ѓt§“Ц m‹Ке4И@ю+џ-zджИ^‹гЌ`vЄѓ‰ЪГƒз\жъ–{ql>™oЃ•јhe1ƒbГз!схn“;iGaSžм'‰ ”sіQ‹ўо"ЭЕO00sЇ‹дL яєЕсйMь9gђw йљžЗ>чЈвФ—OнАЄзкf)В‚3ЯЂUƒц'ЭЩ?Гс+sпоEŠдd<5•fšбрАлn/\А›7vГЖхвеЬмLŽэ/ЪпŽрфžПЅаDЬЪГqUк=ж]{хЁ…‚К№ дЉ‘еЖЗёйaчuЃq‚t`ђIЅ’д™Э™“ЮJ@;цљєjДz:?ДАё ёHЭf ƒkчЅШеy—й9a%КњЋљщєВрЮЇˆ•ЋРђPS?мСNІU&AЭЖЄзk•= І2сЌ{ŽЉg%MKфDq]Ная_8!ЎрoЅlј!оu=л‘џ˜ђLўЅQшщk…и€ШRI•“.ƒж6oGб[—ЉG:Ј˜™IшЉЫ0,-љ{,žpУiѕ­.S!ЃУй cџ:ЪЦE_КХ[чblп2:лycгУy? G/NW#5їyќUkС#Ђ*–qk0ІI­nЩTфѕGs-Д–6Nвjwsфѕ„”™9+T>*Ё"­ВЇз:_KФ]ЖN™iQf#™ЦMїxы3Лl[тАo{їњЁИЛгтCQі”БїСF#Ъ‹Џъу!?Xш"ѕ8Ю8ч‹†дъveOСІnЯіГ›я†ЊЭKйˆ™вч&Хп‚NОbOТwБљЉјWяBЋуД™‡Т\‹НМeЃщ™Zo†iAв›™П[ЙС‚t‹ш3Р%€n,›ІЂ’дœДЊQ7ыŠГшf3Nјzh чї'ІЊюFGyœѕНnEщлŠ-y/ж%iл‡'ОЇм,1лWД0ТџtЄ.XHфх­ъC7:Жг“K“•ˆ№уdCв ХЅ:ик2ѕ AтКJ{cOЪ—™7)UњL§ šц4ЙАœ=Иі.C>zpŠ[з’МъоKыъг—3SbŽјЄиŒ§ž‡mй{Œф^ЫџМЌ$ТП>­ЊиЧ Іў№Е2’QŽƒpЅЖКнŽ-” Q Ižћ )W3yQэмwhюAтqъЯъН’ƒщЭc0+iCqц}<Ч|М7-#'7Z*е$кJnџL‡єˆЭМšѓ•mЫјјf.!•Ы $ФtXKŸ•Gљ\х—Y~ж7˜йX‘ўЌ‡В.цщŽТу*\P“ХрKCxZЩфxŒm`NC”Р\(Ж*@}Щї9‰х!( 5ће'ѓu[•Пс3OжФвЫмЯ@йƒ Bžмq |ЧНžнg]Уя’sГ!&JЕ—)вў­дћ‰!ЙВuљ_.Œ Љ+WM ЦŠ4$ИЄ}вc§Э›#žБAІ"ШŠn Гbˆ^<сй‰ЅПPаMтn™џv>У4ЎsŸФЄUBЙ{АфTЖ7dўј нв]ЂSЅ%…`ŠLlВƒcИCX_‘ѕyБ f"аšzуŠZЈй—з4рSJTћЋрШя%MN<>ЮТ€э›ЛЕе ]QVn•ŸTаTmU!Њ!Э37њМšА0џf.Mn_.3œ0Yxr”BА†?њ0)rSzчС$шэ{IЦч:ю‹Œ +dйEIћbЖjе‰ULОЌ.‡уђZswe&ЊЛcОИД§геMPСлУWTчIупr1оРЙ2Ÿ*ьМІYx~^1 qWpGУGHљиtЉшВJJL&Q";XuєVъЈ№jhє0ŠŸW;ѓˆ–AN“ЮyйЋбЫЙШуЎљЊЉd/љЋŸнЎ~,Ie‘жѕ5gпLёЦЌrT+=ёЖ†uёюьMЛoˆ šƒЕTжЫЌц1џA‡CtЌ`YŸjЙГџSчикLоЌф’NрXиSЇСЗ8хЫfƒv$Тo^‘3№џPT­гнЗ™пъЛyтЙУ&к_3ь‚§q8v(Х%=4ЎјТœТП|X^ИгаџnичіТбnЦсQ‰kНЭјІ”h^Н§КZOнA|ŸХзф‚UчРИ—cё—„_šюэУ~<ˆdБђб‰Q8’ћ$Ї’qBœ3™wf)€fУo 8Л юл&œrЄFИ‡Д6E}ЋŒЊ”WиЄІ7’[ЂЅ|Љш0=<CљHљS:TЗїцM~х.pУЇќуsGaN—@• Њžэ"—%Z™‡с˜ПЏœ|w,F’ЂддНЌ 6}KТ'вО§P§o{d‹FщЊНїY(пмaюжgp\‡ІКч-h><•я~ gы’ Ь ВшюNЈФЉgпV(пP*N§цяйVR+I§Nмфяyш“злн\хяm N^_ђЦНЪжВгk7^Шу^Й~ш м4ЭN+№ЗЁбњЃфMђqс%;бзл8ИиJ='н сLkеф#Й •x8ИЊ “„_:NЙt3лЦгˆэQ1ц3::`ђг’ЧХEƒнч$ЫYtйsцЂowа:щŸJ†g‚їvЗ"o”j'S$оѕ(,\…Сk|ЃGŽПFясуWQ1…Лžs;ОkЃOЬf Ы'JДвєЋжЭ*Cп>x-ђ œЬ}г&cЪЮиЯ]q—Fh њ’ЋtчЪ^fЉPO>g№TЭYцБЏYйвsuД•Ntуз`xJ­76асs\›ИЉю 3е(їt5"rD@Oи?ЬД(Ј”ж2јrXЮ>АГHj|Nlаѕ™Ќ=хK*ЖjŽdŒ9ЧЖЦв?§НњR2šЎ,ЊЎЂIrЏ† 2љ№•оЬ‚k”еCQШл&ЩхxЭХЂжрЫюЂв›HЧ“caqЉђЎќёйД#ив8™LпО†єЅфмˆˆNmРIMлбТ_Эq™dџ$YW`*Я)ЭgЖ–QLф%;H+gыxSцЁZ6$џЌIУ.r9мЫ"b?=œ&ж™˜ˆ^iдpп#D ЕуdэG!‘<ЖO№жŸИJв­ЦОЋaРуфНЄ^7 ;№ж:9щЇЃЕЏРуЮ+Кpнъ›xє8є5ˆиgœ­щЃњјeuФ]НbП€œЖЁуГ"“‹ў0О[XуTЋАMГi4oDJы‚џ­ …мŠ №˜žОЙ””ТGёГU”РTžЋ:qљћJЖŸ1 М•QzTлg[eѕДшP ~з …­ЄIБПкѓ4рA о=цЅцЙLЌБ˜7€шОЕ/бўwЩЉќІ? бcЗxpсbE2фпПЂйf}~kжw†p$+I мrщЮМм­л­цЋЯEЭU­~c]ОЫž№зщЯjжї>эSЏeы™—Ž˜ъOT?Д/.‰ьvvШ$й˜б08sв ђЈ_о1Ёtž{TOьPd~'б h‘ œ*И_l’П`ЬKбЅЭŒЊˆŒљ ГpЌЗ'ДОЫ*)aЖŒG_"ЮAvѕ„ЬЁžј˜ЫI‹А`ЃRrš/a­’ѕРрZUзJЋ0+n;hXџцЦ>™|лD'‡+пС›H;ЯщьР?pљцњ,гЗ}{ШъчЁЙ’нсz†бSœЅщ†eХOТšЬйDŠqк>Щѕ5Л№f—Д~9–ЂхŠ;ƒ†пЯœ jомqЯS“ tvlєТъCUх,О|h%Ч$їъ)A+ЛdњСхя\ˆbЄш ГhЯю(oJ ЎU;о$‘BЫЈЃs№Ѕ#ƒ­FГŸcПБuqNН\…ЦŽmE{З љZьlшгxИ<ќrгт ŒМs„ЬїМЗƒн‘ˆkо˜НДg|t7ЛлФь]ђ#,‰ЋJJTђSіЃњ…Асльd/ЧСёэТ>ŽŒ@‘”ђH=Б#ˆД››8оЖ kшc}мЬ)•X‹DИ59œag­PтЫФЃ’Oє ЄЊУ"Хя(eч ™—%Д‡pЇшЮuKt•ždЦ „в/ =#@t|xЁЭN ЁХšЊу?вЂœqг‡Žњeнкл ђz~ky&Нј-’ЏЉ'П.й#@ёбДЇj]м6š„ђ,XЦfгI!€Ѓ”€F}YОOљЗєї6™ЩфЪА'љЮэКю*@q$›ЛГ>%їцЗLОMа"њЪ>сЎ(<žŠДЦ™X’Фн`1и=Vя-Ћ(gіряю™\8›бbwжсsЦЉ ПIhЯzqd‚v>ПЉМЈ6КЊХ=џФчўВ­к<ЅyY |љ#ѕŠyO •GПuВžУХSvВюо$­‹ЯlИ[хзRЪ щ=TˆІЪеlшEэ:y­ ИWФ$ObБт<}‘%Њ:T[=LЯА7ЌгЁIэМлВl‘ŸАЂ"лТ\“дœЛxкŠn7зЁi„&МюЛ *;szPі?(лЪЂЉ˜+0#!jnŽU-{/'I +‡˜iєfШ3Юо %Ы•эй[Xыїб=KŸRФЛŽAƒнH#&юˆCУY}—йˆуы‡z&йŸ=ЈCб€БuTЙ:„ˆЕћпS6бѓк{$Н;жW˜єбkО Ѓ"OУК{QмБНzƒ2ШUћ‹чЙAJ6ё}с$•оЏто\gJбJ(n­e…жЂ”TcЩ@хдХСкьNЭ†4#}–tьЉ*і'i…ЖЇdЖ|­їVfS—бeЭбЃ|ќ*П Ты}1Н~ЗžЮк‘WІ)bGН)№ЄНGAб—_/Д&УЃrV•Œl<ђУJhOХОНœ1]b]Ћp7F,[ ЅTлiGh7иoЊ'ю(žœ`ЃОє8'œБ}~ЮnTr&Ке.ТЉŠ)ѕ)M№илЮшЅ<3Л/>&иЉЗВЇ–EkŸЖљZQ*ЏIєUЇsВLЃžл…џ Й1ѕѕ йєЛо(тёШ…™1ВwЋмбE…ƒ I#ѕ–0+еAYЛЕ,Тr…z§ъ|љyJŸЇQНВ,п>O™г‡Tщ:ПМA?2ˆ” vхђ ЫhїГхИžтhŽƒЏїgv#Ей6ЅTў-VTђEябlщ>Нgв"ЗY…1ЃsRšђ=‘§@›šѕ9\+јЄ LоyB6о-ЙР„бЅіЉu+тЦLmГЦџфw&џ endstream endobj 780 0 obj << /Length1 1835 /Length2 10300 /Length3 0 /Length 11447 /Filter /FlateDecode >> stream xкvuXд[.н" t нУа в!н) 0РPC вн JK)!]Ђ вн!%Jмёœѓ§О{џИЯ<ЯЬМkНkэЕі~зў§˜ш4uИЄ­a–˜3œ‹ШЊщЈъъђ€ тХabв…Т!П=8Lњ7w(ЬYєŽЌ GифРpU ц Pёp№№xEy„DA /$ђ"ЬM і„Zд€˜3Ф‡IцтуЕЕƒ#VњЯ_Ћ€GDDˆѓЏp€ДФ jvЈсv'ФŠV`G€Ь ћќW Vq;8мE”›лЫЫ vrТмl%й8^PИ@тqѓ„X~Е P;AўmˆУаЕƒКџэвйРНРnТрЕ‚8Л#‚<œ­!nФњeU€† ФљoВъпNР?лрђќ›юŸш_‰ Юƒ­Ќ`N.`gЈГ-Ръh(ЈсоpNийњьшCФƒ=СPGА%‚№Wё`€‚ДŒшёŸн­м .pw ;дёW—мПв 6ZойZцфq†ЛуќЊOъБBьМїПGьр ѓrіћm Юж6ПZБіpсжs†Кz@”хўa!L8ПmЖ8@ #т €x[йqџZDзЧђ—“ч—бG€Ÿ Ь`ƒhЕ ~pќмСžмЭрїЇуПРjXBlЁЮ8ПГ#Ь›П1BnPo€ !BшзчпfYУœ}~гџ:hnEeY§Їџ6§Џ[Fц №утИxљј‚џpі€#ЦA † чџЅ@ўžb5ˆ5дУщНЪp0b,Єmвцђ ўm†К+@Н!жšPИ•н_2љлЌїkьЁЮM˜;єзUртўЧ‡˜5+ФuтŽPч_.b”ў{Uyg+˜ѕЏ™у€нмР>8 „Јx~<ˆсД†xџЅg7аG„l`n8ПŽVXРmјЫєpƒ#„Яђ7p[§‹~еЪm§фpCў€Мn›? €ліШрЖћђ ‹ттљЭ@и @D%Ž@D)NП!BѕмФ"&і;;‚‹И‘џp#JsљэFФК ЎDgGˆ ќЗ•чып2ўYбтТpџыИ~'DtуіD”юўpџЮ€8FnИь7bЧ=ў€ˆF=CФ№r{џeљќ.Сѕ…И§ьПDaхс†Јўзќ"ѓќз­ xCЌpцf`VbaіuaэW5в”^\[#|ѕ.я=hљqт‘7€(дЩЪ)љ .„гѓф4э$ЊЁ"G$QЪЧ y9ˆШt1‰…Ё(ESыХеEёNАXЧNA)’уШ2_юЩњ|R:ІЋМ4b’”&≈?ЇО2ойuеР ЄЉ,ЊЦжиa!љђUCЩ1PKcj Sd™‰Ћве8~ЭЂbŒлxј§Qu‘ХєLЬчSŠ8№КKJЃr!бЮс.оvOŸt"Пч,‰yХВsЮY2№}N5%QТMH‹Є-рё!­TNaцh˜ЗѕB9^УЬХKrtŠ=Lt/ЫлЦ+ј ФNщk‚oОPљС@рЄыёKЂ‰.шФУкKѕXq’ˆeЦHйYƒ˜Qл=Ѕpщ–ІCђЫ{Чф-СфgцяШБnІгњрЋј8§AК*њ•;„GN\t7T ЙюI‹Ї`“"Њ#Ž1жœСнЇk3хtM„лyZРоi,sEгЂV=žfЦ'нUлo|"ъGеЦy8’Ы }Чп=Їёх3 ‘Ў&Пkc”H!6›Eо!Ÿ*Єљq:ЉТЉюЂУ' †юF5Ќдх98:ЦыTBh1юFКЏbѕiG“|ƒk•Y…У!Е}=fНРТl5kђи”Тzщ6zР04SиbddHY>š&МŒЯžѓr]92јГ$- —(МE=.%ЉТz€п$CЧмžxєРg_зŸЎІЪл4ѓг;кŽP.іКЊ…(џw["нјјšЂ8c=б^УŒС8СЧОЩЈШR{с ZLTШњ$;Э[JiP ЌшЮol+дЭOЪxˆФš~ЦYŒyЌсTпздЙ8†Ўџ-WџњВй>L"РъНоЗйфT?œ‰Lh=хшоЇЪ˜ей™УК;ЂЃЉd‹К(р"кZѕЕ}фС'pмNoЫOс"–Ђ—Bщі1ШъВюќљVцŒ2?T2ь7M‡7HмŠНщЂЦЦ,К?ДЬdеxё_љaфf– iМШr$UИbБЖтc84KSаАЉёЭЎКыЕžM2лЏxП!њn–ёsJ]і;БчFћGiїВž/›„Я<А“ —ю9pр™ФYКAщ‚C ЯєqA_ tшtВвkыZфјhВЯ:jђˆЌљЁ•DПђВ ЈфХ;шUФЎJ@хGNI и‚uсб# п›Зž…RtY™ЮАЈ‰Иz­ОЮ4 4Б 7['јxЛбўЈЌќў\НЃЅ*WЊёЎЂ[Ћ4*Ю!ЫM‚ЛйдІУiШ.пЭdxвzщ‹ѓЭУЁЈGчuѕяtAёa"œьGсД”*š`—у ‰ЬљB,2w&CN ›Нд ƒK­АГёKфR XSH№tЧaM›"г7Б›7{Ÿ'№Hfишлf]Ь;u­‡iмt„U7 чЛжЪ<vуlНŒQЭч4ЅЕZЬpЅГ%ѕљl:іВЋћRЎ„тЫVРЪŒRzВ>‘ЛбЮŒг№EЌUy Об?+,#ЧРМфaи7}(E@ЁaэtYю<<›7ь%Й[Йњєn-KcБ-ЛЬ›<;—‘ЋhžŸ kpмшћаWšbњ1JЪѓЄO?f=­ wЏ5‰єѕF4žК&яЗ+тW•5 OWX‹т5miЅцo_Џ/йЉ(№жНгGs Р;ШдК ЬS—i}ёхЇ7Э8ЭнЯ†-_~Œля"j2…ЎЯˆ$Х0V‡}e3nз8Ь.љђМ…MXŽо~Ј\О|ў­фŽwўсЋПЃK'UT ™zШBF`wŽ/az‡Їўн •Н-;ї`нѕb6–Т‰I‹i№ЎыГЦ$V"&ЫвлasЙŒк}YzЯ'ZD9>§цЅ—‹Y,Ÿ•щ@0 бmЬSцLmB-й*Ѕ-Џєznв‚ ]“=+Єvыd]Ћ8›„ Hš—ОРЪќBх'ЪhЯЦы:Эл^У(јk;xнiлoжCUяdV‰Єю№ЪЊПюZKw3ŠŒПдNіŒI^’яшЖЦъз$ m'yYддŽo7)(N§9МrЖ7'oМОAщѕ'q‘цaЂ0uЮжŠP`й1рOhгДb!&ћ†є’цEЎjє№6ёpсm Ÿ(RѕœQйYI8 NзщBЅPHпq#ˆzі.јЭЭ‘Кl4ыЄSёфѕв‡œZяY№qёИSFЬxЗ‰ ДіGЗXзм&Jl^"ЕяѕтZЉ“vO^-W(Ўљ<Ÿщнёє'Чm`fї4G'к0ѓЃ“ћЯVоїгт8 T –ƒ7р“ЈцбНІЊъЄfђ™ўiћХCўY9ђ7-КšƒЯxgиГЧЭЗ' eл]˜ˆk,‹GСwdŸYъ=НoЕЏљМх|Œ.lЎGаДщќЄєя§ОВу 7AђЫ!t|ЗFёъЧšѕыQMO6ж-Ы›Т1ВЇuЂzбgн6%С’КћЭсчљ™хx3њ%ŒАХhГRо,[dКыFBfŽXяы`љѓСбюъœїФѕ*e…"СUб тщљ†ЗS-ГmУпqпмфY1В,к^іќсЮмМ„sIњД%9‰7М]Л–"zœГђСtkя5*1ДOŸQ‰,юІу6љ6zЌYŠpkšxxл‰xЇQh]ЛqУЕPAЅзКЏRё4ШlŠі™§Д5$$UŸ]Е.6НШ oЉ|PГtуъл%_и4гsZwЮ&-znШ&Н яїTБЕ§ќmХn5 п`C%КXLg”яњcЃ)+fSuJdРd•ЉЬ&qидIтށ…Г№ц(“ЕїY0Џ?'*тa7лz+‰вМЄwљŽю{~`ƒПБЃ‰Tф–VЪHŒЛ‚>сGњ(OiК+]џїx-ў0pŒ+яЧщЙShыц>>GŠ’9џpej_Їн,х З<˜ф>жФю™ЙЉ+‹eeqWF‹BкЗ%ЪЄЭQў$BLEКѓnх›•šй–хкМ!by•нЭyиќДљs1гK&„<мdіп+5r­џ˜˜е2ДRƒуfОB•JЖЅфтТ1рKFЩйn}о);|pum=)!o^™-У69"lм рFrЃ4ВCJŸу8Wл*еЋˆ+зHnpхnљ(АЌHвf4Й'ШІЧЕ‚њ}Ќ“;ЃЩИ‹PНHуPХQїб…њћЛGQfЬР`Ћ;ЫЫ28uK .^O](8ќщ2G’h‰Тўс"U ђІˆ}№Э8qгXЫ64С†•вˆёДмt§n ѓ|d7šЇ|щЦ їЪ’Э#qєЭђжЫHTŽьXV5fŸЎ†Pjqї$шпfgL)ѕЩЕU*бDІPФ>Nпр {яу^Yє%ќяЎфI­ŠчRРъbф%j5ч^fпЖn:]хЋчР<Р6Ич)§@А)ˆЬрНѓИh- m,Фђ5Vџ’|іwWˆ?ќ*^šМ7Ujќ,Е0­kе уГ'гд‡9Є–Кe7Џw$ZД`ъ;ѕбмŸ{Л~Ћ“]­7”Y˜lTDEZ–ђœЪxhР>—\Nў )нЊѕƒќї”qГЈ~Kzдoмž~шѕлЄzпІKІšрЁ№yŠžцє@;;8їХ“YHˆW‚Pƒf,QK6eЙjЋяФ;МЯxЂw№фјyvЗw‡ђnšpjPiP2ЎщyЈW6šPЛЧfэОдч№рWЬЪ‹›Ъ+Џќ™&9ЌNpіђP…SюрёбЩЗю(1ИАмtSшpЋТчз=W<ы ЯBЅдЖА“ћ‰„ЄЪы{В3bсЁWЂ‡ІтйЛюg]gЉЊvW††MшљО~CЭŸEeе:h/†F†тєmяO%Б[п>0E“0ўдŽыA€{Сз_iЏ7}h|ёгCї€!_=0РЄ”ЊљдeyЌчJкŽд2л”Z Щ“RMмљБі†бОYвЈЙœpŒФnє”OљgёНКTЬsСњљйTхб/=;KС:Œ“щєLлДšЇiU”YУЗЦgШЁГO|‹ё­;[l 3OЫyћѕ;VОjјЬЦыˆ>wлВ*_-“RК?Щѕh 2*™я'‘Ј§F&јЭШ>љhЋЈ cAѓJп#XaжfцMw4ѕ№ѓЯЕkœ—нЖМ|ВС|Ÿd{пЗ“eЯаъ/(Mз„o\кDPФCБлмN‰†—Ю›ŠRЮ™›`­WаљбнЗM…ј^ЌtTN Ц}mDоJсуƒPЁїtDаTІP­к™” cф\j^NQ9E1ВКŽ~Ћф2хЕ^;\/ѓЪZeуЧС№HžхК!7б6Пk"іžЩ?Џл1iM>џ™ПСр™žY S~ю-6Щ•ВЂž480*j?IƒМb<М‹J”Дz@‡я9ёY\їющд;ЧЛйђ]й№ї іNƒgѕрРYљН~O‰Ф,k"пјRНЖ…ГСљМЧэCй $њƒ кљ9qже љз6x_VФок­ЄAіJЖмПe'ЃšўšХ%7;О2ЉЁ8$‘­Ч€6;‚uDd-в\Ÿ(ўбт мx-џALS—QмyніPЦu!Rџ‹&ОŽЃ№qnZ™˜\ДzR"ЭЭnИXPииЧ@Mwќ1:ъp+ІиыЯaН кeЕс1…s‡{8Жў5Іѕ>3ežo–жи0u#WˆЁѓ ~œW‘:h]t"sГXшUy{’^~ВФMsфЧ9шЏwM]‡­=~MƒT§R6ћё*iуyVzЙn‰ЬчW1‡пс Ф<…sЭјФ‰ќжЬ2ё^tЧЅ3D.ёД9#uyб=kы­ИуLнh2l ц„пїЦW qƒ“OKr~_KЙvс1*V}Oљ“ŸўiаŠH% [UNе‡Нљ]п(Y@Э†’+=|,ЯйOjЖќ-љSdМІdЄЯ3œ1У0a44Љ—8ДYє\ђЉі2tЪ—COоSк)†ьПй_“љNЪЩ)іЪKт ГзyЂхи|оNOЕO›5цУЋ XsКZ86 єЫ0ЕѕЊЬюёнU„)+дŽ)Њ€Уч0†qS.‚ЏЩ=hмGЇfkчoнŸГrWCšЉ{7Пbњ%™фрЎi'LЏ,Юs=ђЧнШ~eнСѕ ŽОl§„$ЏщћЊКэёx7-оќ@ і цъžTешp-Ь ›Ъ ХѕSжІBl y‘ŸoјнїмйЧ!Є†(^ƒI:ХИеЅ:%iЖэЧeКŸFЉХ’QѕНp+оbаё~4M1фюьŽNпžЏŽёVx№Ѓw1qIˆ 'Dрй@ДчЇрuU WНЁ|ФлeeЈжіАD•з‰rаЪЎЎGdб˜p Ё†@oaЖ[цCAќHRkЉzѓJjz/тUiNд‹ЗЪЕпцѕ7Љ@4уЈд˜ Ж™WŠсZj2ИАЮ[›-)fьвєЋk1U3Хче<šfД?Юf†и;19`7RXц8­СЊTпRЉЅэДЮUзЪsДНХэ˜x0]хMHиЫЯR№ Р$ШЫ”aHjм6Ь'СЗ:žљ­гЇЦФEОЋбL˜рОЛPsишм™q‰’EяшȘЙ&sœжЎrЃО7Б•;kЉмЮіØNћ 3a­­ГЦILи В0љkе‰tДн—:п~N"фEєuчkп‡АEUЧКK„Žp‡u цлй)NЌЦШQјFuЪuвОТSЎЎЦ(єј†ђН„nk^ЬйkеtЛф•Ў ŠТЪe­uЩЫ™—8ЕQh %s{‚VсИEО…ЗЏ›ђ-T2Я€В1г~азfбwєі&u§ю‰ C‚;єZђ,юЙцsГ${рЁiбnЉИгШv‰­іОIжCЯ—OUERоb@T•Јbyjr7ќj\‘ЬкёBBЬЯ8€kЂУAtЗ8˜g6XХАqњЄ}Jоcп<”œ^zpЎГ‰#œrЬСWЏ•Т?LnkYы‡’XЉ3sЪ)уўiь‡>6оЯrйяUѓgcЈЈъз rлЂ§`НОя ‹Tъѓon\іпЄНжћqlі5КПљm{м‹$ўŸДyQЇ11Ц„@фіЭPМbиXнШA'‰иkэ'аvEn=ZСCлacЪZJа;+‹ f_€ъ6гЛPх^sŸЇщ–œзAйƒСUKиvPC$іИ~б™ X/Oи!/žtIЬUsНёєІФpлyе‚С††ЫбтIпл;[П-#lGХ„ Щ{u€u§$QЛќ5jЙ &‰‰6v я=Ž~эOƒAA9rн.kкнЖУŽФаs!2M–т57shНЛхEтеє)„Цхм, Л‹р|@ЧbДЦ„I@7ЄЗбGG6м„ќ™JY˜cЏ„C’WЖBЕЬ!уBcјЬNIЁдЙ%Sl:ЗBDˆ<Y’3ЪS„;гУІœ*XжЧlЄ)CвцЭц’вКL;Љ9МldЊЎ}"|q@$†ьIЌќu€>ї;Й§љшW5ЕГa›C"ыйњљ[оC(ь}oЕ|љv_ЦКiˆ >јL<ќљHSa3Э7ш’€3D“И9ђЁ]ўк=ЏM;)9ШЦ№;кТ№[АяЅщZж?Д^ю’MЯšьхna–nzњ НвДR=WDoѕœAшќ’Э§” ЧёМШбWЬЭE*Wр—чxhгФИф 3#ЈИ!тDKГzќ]Чв>PуŸ<"˜w:хё—т=Ы{єŸК12ќ7.C†/ЭАЬ)hХЮл0иѕJІ#eцСwPч ћдs№єSbЂп‹ШAўФІqv Їс:! <'– ИІЉ/В„”ОвхpЈ>ˆtHŸЄч*ж‘ж]њMŒB“.АецЭHвћVІЇіагBЩjYvтlбмI&$Ѕ!Ю•іпMRUЅ^ыЖЛк9X_Дст-r“a6U`МЂя{@д–Лoluь`Z”щНAіe"єЕT|огuМ;“†rО&тŽїtb+/а{)x,чtN‰сm^UЛі су2зВ‡wCЂ‘КЅx%ŸQ|OЩeUд\Mћ­ѓ€З­њъr&!ьЧ  *}NћLЬIиzсБZР4(жНђіkљNежч ~$—"[”ZfцКm-њЭhDпІДавОš$Yж3AЙчeŸеЯJМQ"ЕЃzШЊI“D§@гѕуv%ГўˆвЕЉŒt]w‹9КЋm7ЗщcгxO0Nœоj•ax ; ћ†Wo уgrn 9ŒкфРLf:Aёг/{Ÿ$vТBЖ0zш[*Х $;˜“зOљЄъ5кЈћP/в›7Жу-ТїtpЙвѕ}Єž3†ВT§ ­'?}Хр(Uђ§`ЌlyоДвЫ/-–НDfаТAїЙž‚uR`qѕHЖCьpl!Ш­ыRш}џХ"@ І‰чQУБФиМт\QbWфDЌ53њЫ†хSхW‡„е+  АзPвЎЎ:YIbŸU;Екю)zoЦ­g*јЕN Љ‡]ћю˜О\ЦИ E›№А%0ь‚§Бhi5‰пKЁ@Tјj„ДЎЅQK&bяk!8сЈyбZ8ЊIњЊ†sќƒ\$хhЛ˜Ёj˜јЅ]2Юі‹c[Nr…Ц7{dњ”J^ŽйAГtыюѕЩ—ЅUh‘Вl—Ђѓц'"Cй™W‹СГN{Вќ"‰ƒшБ†Щ,Ш’ЦЏщ58С6X‘‹Б?J/9œоЬaЊ‚ЅU\|b[Ÿћn‡Mц_чЎOЎœd1э%зыЂЙ`В^†qh?d№ЦšоkVЇј+б с@Уc2Rаз]#ѓ3JЂ,ѓЦЌFL‚яЭ‚˜hь‹‘‚2ќešž>"гМЕrжЯсќ‰Сл}e†Бђс•NћUлви*‘ћ5ŸЇИ1 ‡гЪ5ЎяФ“rzЅЧM 3Хo‡ˆ\Пi]-%хЕ#Kв‰Hј~-™\r=3Й.ѕtБоW7W5ън}™щ,Т& Џœ]–ФV`‰MчmЃY^Х n;}sыЫ Ђ+%Gчc™oєщnЩлe-vищnыs… zЉс,„H$ŠйщhZиШНёдwMФЎwЩпjѓСiєў@1ˆњƒчРЛ)}ˆВ‹ЖI{іт8џ^RЉDAџ1œX™јЖhy ВЈЌ|R#З›žр|в9ћMEu‡ИцSѓdЙ ч.нUѓЫj+{‹ЂСфлHFЦђфёEЋ’уOдqЏНќ0р}ђЩ"?e–o.UMœ{qјтЪ>NЯЭќŒ(\]Љ? Дd ptU`Уо?eš дВщ~h$I\0$ЋsEЌу­9`Эё{щRTnzђчЭН;VfцBЎКЃ`ойU­КЬ'g5œ ЄЫЌbŒ6вžф&ъЈuFdВЋ‚ЏmzxLƒЎдSfну•ЈˆВјуscCRїЩ%žЄ–б<:ЄSБїёв48ŒЂ„тлЖ<˜›уv\чњсщnW'a­ѓжEСЉRЪђГ~ћSwлЫUЯ>jЛ G4Ќэу@9:!_qRœ€MЁwч‚v6ЬЛŒ3АWLІЈo?Kщ ŒlsYЈЁœП‘Ћw(7Qц79$ЊRЃљIФ|ьдT\Ќl}Hy#Эbьz"oџi"с{ДИ5п?l3KЃ‡aк~Є2^ЬeЌккЄ5>Г ДФёRЉёИЯK‘л;оN‰О}fFУ]Ў:Х7Юn!6„d<аЇ{•aЦжЈь[i*;Оk_.,ђЙёбŸhЧх­?` ћ фЧТь]‘§2xПмuD,Г•šTќySI=ЇІ†™žР§"эЦёРЦ%Ž';ƒЇ†у >DP”іknС'W+я<ЕяHЗЅя—qh „;і‘юяš{+R‹я Б,ЏиО”Ю[њiD[>ld^гЧжя#rщE~Фл—јюyэˆ ъы˜Ь•-БЪШБn­ШњЬЖnL›3ї8яКц-k“ЩЧ?МШŸbWЬідЮю7ьъўtUb Ј~дШR67;—gЋOkеї |7хGbKЧcгXгfЛэ[6OВИб“щQON{жt{.ўjјtT„Ё˜|чmё6#їusGyЧН –RO„я8ДjЪљШ3:и'ЙЖUЉЮŽ9аIяЇGЋшХс3Ш}рРTPѓSnHHD4’L0<ф-„(@цфдї1h,…ь›iпqФЇЎђрь&z [ю—fA€аHc‘~цž‡ЏФ–ЮКз@’dE#Яn#S‰0ЭпдR^KШВS<Зюhё33r[ч\у‹„ЁЈР’k_….=‹JЉљvр…xzW#wњ\Фi FZ}ЩЮvо!p к|-/ФE^'WnаnuGђ™ќОN#ќЊФD BWMrСЗо‹Ÿ@ВATќІIŸŸЯТЄщ\Ќ‰ €ПЯ5о№qКЫmЬ'>мУѓѕЮt‡МOGnJq>" ?ƘцњбЮњ;4ЛЯmK‚ЌUъќКЈќqі 1NU­œW7-›,S›–DVАX‹яX;\nœ;яh>ю№б Юв/КБ_Yм“гЛЬЪп‘ZР№ЙћzgтлMœAЩЉ˜g›Yќє€ЖTYs=§цћЈЊ#3ЁdЋWЙj_в“™]шйCoƒшHБhф,х]†КћЇ-Д%­šu_1ŒSFСюMб„Ў Ю%CIќЊ9mLуzТЙVŽаЭ tiGсG)‘2tr"*ьМЭw1_KэBЁ4`НычД(УzqyЗркsј„Q?=Эiёш’ –[.Я9оY'L\1ДŽШе0 {–A5G‹Н“,Ѓ8Ь#‘$_еœ%oдЯ\ј5<@Wюйъh№И&ш•эKсъщ“цЈвHš'мgKKзqijŸIф{pЅС/&ішŒ<Ћ$сJгЩ§rЫ‰єЈg‹­чMЕЦњёQ~'5BZя'!їj.пЅ _Uл‘Ь”ьО=ђy( Лob†сЋЈHhsœ2xЂОю9[ЇМьћžj.@н,:зU+ЦЄп†єUЖ5v‡ ЛћM гo˜'хЄ,эœв•fzSAšє.ВкДLфl§цV4ULHћй њЌ7>rХя{œdŠјЄєgŒЖЁž4|щ2ц{њц5у“§гш€gу>з™О|лА&C)4Ку\9сaаxxU-–1g№[|ЕdЇS5;Е/lнЭF†ю'XН|РІE–{y‡мЩЙ}‡}V-МшуЫO ^Еz@QИ‡ЖйZ…Ф§љЎ<^#YЎЛ|З™ѕ#zЅГI‹–ТХѓн'kXA_@ќ‹ѓP^Џ?е]xІжш†Fщ]yЌОенe-ЉЧP‚ˆ|‘0ЇbйъJЗЊП$™]W Б`Лќѕ™„*щЂшrg iy<8БЧЁХ€ЉœVюЁ™kФBжЊГP{™‰?ѕO‡GЯЈ‹Я……y%dn2#GRо+ВdђNG3УИaЬ№*s,ЉVфEw/9Ж[T”Ъ:ЊОЁˆlšЙŒ†RИ /?_uVjЬnЭFЌPЈšfQP[<с †iъшYpzхАП~!мікs0– VћДћ–ЕйЏтd|- QŸu~Vа>oѓœ‰Ў1”%@aEušZH†VљЉйIЈ—Гол„o*Ц.ZWˆгСd§н|хЋЇНЖ—‡X$–ъrŸаLу*І$с„іИA‹p)pg;О_ўШkHЎщГПZ6Т—ѕrэ:вљжЕЎ!?й‹BъœceOУ7ПЎЫ\&мТx вайPЯ…Ц Ї8v†sѓЭ‚ђНОКб"йКT OгойœYHП4ёљ…Рг?GsгЃШЈМ{|Ш№q!ъ˜,†QuЕЄž>ƒЯGы“;Ќom•чS2ЙJЦLOŸMП8”РeП2ЇЉњy>у  eqBUЇЕоu{Ќ>А<НeДЃ+єXЯsЙЮя4eI]y)о„1‘;e‹Nмlzžј4КM3ќ$*eBЅ 6 xљр[і“Сї8рЎŒЙм80ЇЪWЙчОІТ Ї†Ы ЇˆFПЫъˆЈFЇьemRЬн;' Ю`ƒV7щ+џзљЕЊ€xљc›ыЗžФЄ)dёBЉ;эj виЄ*ЏД+PƒЮ`ГИЧэGЎAтџE­—l—а&wŒ'WQЧпЄХм„,N–„™НкGібƒ1-Жtё-Дy77 ЗЮš ЛЧМ|$$Ё†InЛ#8J^§mЎь›хГ’­јчмЙWžweRLщЕ+FпЊЎУбQdтР/ѕ^ ЖJ%ЇeoъЭТ‰–ƒM'ŠыхЂ,ЌЙТL(ь)Й)Оз(ˆхёМcПэ_Ÿ-ЃiУ(тMФаЗгKrСЗ@ `№_‘(ЯМИв ЃэžЃ§Б“ЈН­A”итєщr0Љ‡ pLеpФУ]8єЧЭп/иЩ™ёв2љzCo i–"УжЂ~д=ршшР{љЩ›iA 'АиЁЁjOSе?EY\œёЅMь2-Я•%1LЃEqџлъ)e~…ЅОсб+:>ъh оˆУ˜9Ќf%ю-ЩZTќ рюЋћsѕh€} rpЬ^‘МLM>zЧCЕA•>б8†џЄї endstream endobj 782 0 obj << /Length1 1424 /Length2 6205 /Length3 0 /Length 7177 /Filter /FlateDecode >> stream xкxT”нк6в"нЭ€t‡twww  3Ш в)н%в! нJ HK#H(”€њООчœїќџZпЗf­™g_їuзозНgжА0ъђШ;Т@*0(‚G€—_ Јmh.РрчтхчФaa1#  Пq' ƒJќCбd@bJі$QhxAB Q ~~€ ?ПјпD˜Ї@ЩоьацhР  8‹"ЬУЯьь‚@цљћРфˆ‹‹rџvШЛƒ<С@{(@лсrGfкC†0 „№ћGv)ТC‚ЯЧЧ‡зоЮ ѓt–срј€.фщ rќj cяњг/ РШ џЫ`sBји{‚H‚ pЄ‹дф @fЊkt=@аПШZИ6 Р+№ЏpМC;л0w{Јъ pC@]-^„/‚`uќEД‡РaH{o{0ФоIј]К=@E^`ь№Op 'ич…ƒ!ПzфћЙЭЪPGE˜Л;Š€уќЊO ь "їняЯсКAa>а€ПWN`ЈЃгЏ6Н<јŒЁрЧ^ uЅ?$„ѓoЬ„ѓ‹‹ˆ @ _  пЏF~ пЦп0В‡ ˜Р й(ьB~рРэНA„Ї((р? џ\сС@Рф †тќ;:9§ЕFžП'и`Щ”Ÿ€џзы_OжH…9Т Пг1Ÿ‘ІЂŠЙзŸ–џeTP€љxХ<т"ќ€ЈЈ0 шŸqєьСъј_uЈ ўWЙШ}њЛdя?`џ3 €Цв!• Аџ[шVќТќ@ф›РџYюП]ў*џхњWЄтќЖГџEјьію`ˆпRЙ^фhУГ§oЊ)шЏбе9‚НмџлЊŽАGNƒ<дЉhGМќўТСpА/ШQŒКќЅšПpу_ѓCAz08јз ƒєтчџ/rШ€nШ[Ž”цo9CџЬЋ Т › АРоггоyжШ•0 @9•Ž ппb№ёBaЄ йcР ц‰ѓы`‘7ь „€€ПЮ ёЫњлРрsCНрџ‘€і@fў…§Ѓ  —Ї'r&ыYупыпф т,ЭУ€’ЎЏ"КЎыхi|x>cЎoєФ&›Ц#XžИhaхЊЮ5gdо@Œš[&{Zf{ЉOоЁ>'^)tХS}ѓлВLЬ§№сmўа`–аYБfHm ЉПcСXъ0YJОF+…UAјRБ2#™‰Њд=Šu ЭNtэћlёPgЪАWГГŽbшн'яZМaТѓв}kgДЖлyFпј№(лRc]ИыØXъQ.GГПд A ћбЩщ˜=+?ЕgaхWцZЈЫ-ёXOТ…l>OQ^л%фІZgHCФ†?ОPбƒа{Œ9™.пJeHЈYHєдбt]7МЦrѓ~}1Ў6cHƒ^ьЖНээ‹>1г‘Э„&›uч ьЇДЊ _О'2сTA4h.Рzm9’ ’fƒ аѕ:{T%-фФЇ˜’L„ŠŒˆŒДvPВuю›KDЪ‡Ьт“ИWвН\Ўyї\:ЌM:C,„џЩЪдЩ=%§У$Т†­њ}п0l’Аd~кGдxЃъqrйOћЄЃ–Ocиx…VІ"ін[Ohѕ#Ÿ™ЎШ[?yXoУё“ƒkгЧ4Jaкэ˜1цжЫЯЃкˆŠЭ“цо›щ)Ÿhн nй Ж?ЈmЏ„ЉeрPјЮP‘ŽьГѕvyQvТ№Ў/oLuш r•гЯЪŽrк“fQ/ОГІoeCT~’[kЁИМЄW)p8-Ћ тІр)^[ЪJWњиБ#hНц`с\N“”љкG AWYZ чZ гq­MАAЭgы*їЈmТїрђЭ*н‘™DFѕёЏf_}пЁќj@єУ1k*™гћю4{иKާa‚ѓ]9Щьучљ[_Пъй }RЉ€ eєœ‹љЂза`•Ь RеLх+њj7%—MжІ~р)vŒ’†›РГVМ; Seћг$гѓЄЧVeИ#†ЖЪЋ{Ќ˜ЊПЕdфRLax(f,–Ђчы+ЙрPсЯЪйr “хtЛ“'88AvфеЏѕlPЋs|–rIЪеGдќниWBсОп“щуFB Gѕд4'*Чсд‘ИЧуцu]EG|‡оo’&-‹кП/вЗiБшЩфЈ…GЅK­щБ%jМ[ іN™уbnbr1.з–Нh<нHѓрœѕЦ_ ^б€mЉЄЩ•шЄ лœeФ}jsъˆPћщ—E‡ЗыrD4с幋Ю~žaСМЁŠ[r“jрџ‚фќмi/ zЪ†HЩeѕBjЛ8 'gS!cl>шцѕаR\а‰MёмomГоvјхьK9k НXZ”Zє1[8еч{š1ЗмtЅ)Ž~TЫЭR+V!мє`ЪOз(>ЛЁОЯсФХ~ŒfЙЬˆyxuг:БИ;kы ГY`neџt~fM$ЩHкn…ЗГFDМсKомДсШe4њ4bwŽКQsМ4еИAкmШT$™Д›qыeƒb‹#/|–#Ђ MДRь ]Щ1кТЎЭIj˜ьbŠœОЊ$БцУч  ˆ™‘+œЭфzJ› ЦПwW ДŸ№€ŽЌl5Э~œ ЈТгЉ CљтТџVЕwR@i_иа)!лўTcВМ=1оk_™k}Б+;Ч‹ztц€(‚ЄeЛŠЄќдёюГ-Ч4и{з(žlАAг;bдїИКџ&™цЊнSфЊыdiЃEцnяаЖї"НИЎQ"yГZЊŸ‡$ЕвШТ Э•ъH JтФ ТКцCžƒПЊЂ,KX шCЉуnCцИHТXЉо.ѓчжv‰Ÿня9FК•.ю–:ВеєъЅсioС}+ˆТG3`9M Š^ъЅ‰_\ЅРu‹ЌГИЅ(жТ›|}Б”;ož„‘.ЁжФхiЉ•Ояа\Н8o)рШўŠѕИ€kahю—18оYZ˜w‡ФVћ]ќ\#?Б ц лEўdУдe%ТАbЄ„РQіCƒ: {ИyxфР•›ŽiГљы#•EЉ]… ЦЬ=ЗЦ•~Ќuƒ#іхЙIСEB~TљлЛCїˆN”ј ‚=H {8lіэaх#*§OdЕE~ЯHг’–НˆПp=I.)ЄHWn&ОЕ„–Њ=tАРW{IG~€XŒDЛUхF-щ)6эyыя0ЉŠс–тcX7 ЩS$ПŽOч мЉgпn7™;]S­Јˆ†i:б˜’њЏyкIWe `Ћz4eІ (cяЅьЯhˆњBхЯЗкиВф?ЃеoиЋt~шСЗ ~х#–8j У›Жsљсшь˜ЦЗT‹mђлщэoКž† ЕЛ"KЃP_ј„v1]Є^,gгsЈ2ЉЬЉЌХЧm9š’ўZM€CЛ" Ь”0еџ%Œ™ŸnёGhSuП‰,И—˜8жџ|Glh0АЗTЦёЇЋŸQnBhГ‰ћ№чЌ ЊЧхяœGЉRЮSО,ОюШН'юбљЩ(Fq-˜oёЄ#e0; ЃFЧy”%?ф99ЇўДцZg|ЄyIтыZдС{ŸsќšЫA ~ўе)nПzDIы‹ОšPшU‹vбuжЭ&5eоНŽ т9рЛЦ/ чT~˜х}ZKЬ АVЌ’aўІrпп™q*†ѓЌeУ5ю=ЮїаЃёвёZи™Xв ІОѓ‡|Nќ0ољИ˜g} ИZ&БO.оўМНvЧ#…иOрYГђ2•й%wVкОдoгSo{МОLЄХТ‚ЇЂ ћёš…'ЁбЮŒПф8§L[lTt„Rvщ( YXьV]§.ЮѕCpu16 ”пŸЂJѕ%нУуижЄћJS§=џˆYJWэ‹f%дХ}Bu?ўžМшГc-г–а…+=T~–ъсQЇТY]ёЕa-лћ‹ЇюЌуTњ „hЭI<œГŽцаLтkЯŽЬpWЎчјšъxYПx*Ћ}ЊЋ$]Y'є}ŽЉeљTчўzMЮ§P3Э>д“6џ%‹ѓwђtЫїЁЧ—“чŒКв‰њs’WД&жё5Оœэй(+ю,ЫN$рRЯVлћOIзŒЃoѓP2b~6‰8pš6ŽлЌtu;(§3>љ{ІOX7PЏsž+~ZNŸД§)‡ŽЫйC>„Лžћt kЕ 0‘тH˜hоз9мд/™uЭY‹Д„СМ{|*44#эcќХ™ƒќŽ8T^&ZЎ 5U/О^ШsаіМЛЧйБF4ЌIЎОa33єЇэЩОќLАPљІ>й^ЏНЩХцqхтђdWiœЇжВ€ънg>uЖТBWЅ*ЧЮГНž)фьnчЪWTot?~5y2FРАўzmњQ3V}tIђдБРK='ЪїїkЮЙч  E.ЖК0hŸ{–”[І|xуmїЗЋЙс{ХEoАя•*ѓЯBšˆв§Iо Ђі‰яв[+(V'{TЦsвѕ Й)aв”Еoœ)ю1pŽuWёbђэј`ФˆuАЫ--=ЭѕЧЖuЫѕыАЊЛg|x!cЦјж=t:*7!Ч7§Щ4cЂЈЖ{§LьНХ\ †”пuОŽž}:ж~iEї oйаT„NSщ@ D№a››МКu4…і5Ap‹aёчŸц™KаfъАLЬœЄ9ж N›DКсЖ[  С&х-kыH дњФ`IжU§4ѕQ=ёЯ§Ѕ*Ўt ~mH‹Tб?6їCИTŽё^ЈИЃmjЙ~зђзmЖ2<еІ/й2јЈƒуЏ]­›ˆЁчBf2EўВKJG!в:з‘їК xt )Ьйe˜–Ф8wŸіŒŒЛUј ]У6уЎQV!чБj[}xIJ>›эзж%!Ин4ЩdŽЯ”SЩFKћŸњ„.Qmфё2“™lьИP#ђ/§н˜н옭д‘ЁŸкŠnъ;бM3хЮЦЮП =ЛЬђ`€шз=Oгџœ‹юАQAЦчq~Џљќ9­Qку•i1tлsђDЉНа§їX?‹н5X§%Ѕцz 0CнЯЖ,СЂя&Щ›ђ_œВq’п=6 1К=CHбЬХЛёaЫV КSqŒM:]Дзell_ћ=dпЊГcYЈЂ!,gьвЇЯчуg…ЏћЖ_8э(TsеЬy>§ЂМўХ1НьЌЋI› џ‚љ†љ•4)ѕЧА…|й}G9! ЁЕPu&ўўэ Їvm?uЮ^iЄЂу‹lŒOnЊzRзЛB"jТо`$œ‘qЄЪvЕЉh•йсС^Ыq‰љ#п–!—Ј˜ЃaŽН§&ЏДљЖvNscоу!oж–Кб+ХѕOB:(-Z№F#=Џ€rxWЧd§Е^СS.žgЕ•EЦOГTО_ы1ujNDEqUwݘї€DIdљЋй3.БСŽ44ЙZM’ЮnXтoˆйЭеy’у!v/ПKкЭ‘э|–ŸТV“hzљ|У\ЮA ­yГSm8 Э'|иРЦ|:— Ÿч9ГJХћL5ЅЅ3jY3,ПщЌvRН5щЮАОс!…hЬЫЅЫ"UЭE=—Ц':M–mшъЃЖћ1!Šи'Fфўk3NїwюKЭfІЧп†оГ{„ќVV˜з`ыКлјРldp“ k9иЊ"„hSGаЭЉиўцЅ!*є,˜pПщЬ{cПї"XsХ4 _{vMHv!)ЁRћЬњ›„)•$)‘7Cr$a6†йІ$F„Cъ§иr3’$^Н uIйBFЃ’яƒV8љ!кЅБѕіЫ№TщiГИюR…›^Ч…x†h#dќЄыЂ8ЗBбzžирu#iф=Š l-зƒeЗчїЌ.Ў GhЕBQТ‹євXEдK/UIMчGЫчг є’­^L{’7Ћ†™}онc'З_Ÿ4Ъіj„wђЅЊ0‰ѓжѓЫь`Ђ^p­jъЯF№S1ЮVOK„žТїжŽТ}aж UŒя|nEt?№=-AŒ ›lŽU6rе•ЖждООЅk4†‡хОœЏђлљ4:†eTЏ(|ЋъщМiŒ9@(ќŽ9):+ž5А>ЉЙ7ћIЦеЊэEБ‚Ќ}МЂ:LmяOыьЎˆђ№­uощd1єє(ЯzТzPѕ)eЄюb uŒ;>oќ‹Фк“ћ–=Sй0)з‡ŸБА…э t д’,тП– b 8‰Дв~œg—X%5Ш^FFm‘Xф<ЂзŒqŽFЏм-щЋм! ‘‹Я7ЊIЬБй_2Б iкщk},~ЛuцЅ•Ÿ‹tЮr7 &Ю{7_оЙу@э­ф Vюх’Х.‹a…ˆ_˜ЕыЩLA/юЋЋьHШі!в“1 u'€CјЎ‚Šю–ЅЋuEeBнLoмJ‹+ЛQЧЬъиТ_г•‘чѕI—ПZаYг‚9КЎР№…ЃepsвPŸfN#иЬ2ЩФЙ”ENtЖ1БsуХ­ЯтнлŸёES=:%,ш\H$+uЄіІzjŽ…ižyљƒСцArБ—У˜Ѓ< їLTEF99рЊG ОyVЫ”їЦ9M!юYќФр’оqт…Є‚~’nešаЗ^N…Bс^аN4цжuѕ!ќ§Ÿ…Жʘ vяqВ™_Џл…ёˆ“щѓ ”~вn…Ш.ОйŸЉoОGOxшВfWцpв{џnЏsПкv_Pjњzк„%[k§еЈtХіЊЮЇgі*‰Xцk]сuНэŸ~лЉXeў8FЭ5ЁиЉ1&›OгпœџчopRb—є`’ў1ъ\рЭsS…Э)Ž„nХнз§vz`G<Š]ю‘šаЖ^Ё.BЁ˜ЉyЇˆЦчSџЬЋzuд№=ѓK§яєгŠZХч)mфОй>ї?і”бEЊД­хaАт=aŠиVN“ l‘ДC'ФѕўЮrЭА\gdyœЧДўBcRЭ2ІvMXЏЦŒ№‹;AxћЮIx9ъЇ{Yјй’О2rdJЋzсРЕѓF7ЪzRчћ‘MФчlKФь•"aЏ’&Н.е›hЇЫ§р'ё*пішmф…МkюoъцyЯдбЖоѓЦХёПљdдЖv3ЦПєдссeо=Ы<ПЩд9ft@ЭŠлœp–ЃќЁћ`Є\@В4†ŸЉLяIЬЖЬMJнŽŸмчСŸэЦ7иПџRшW“džHљ)8ˆVBY}“:N0ф*ЃпЩРцq,B_щікоЗBщG§Ь”|Хцu<HЦ(Г"єП)ЂПы…ЭмЫtJŽЙž€VнЄіzнљABƒŠО&пЗЛи 1њƒи> ЮS)›]w†wyL U<‡“KЩі†luП9+хŒ7cћБžnкИ­r˜r} жзЯ…2В!§ЃБУЋЯ,tЁGЛ|УзkKЏЋ˜(›НpВ•AЉТз\Kѕ№r‹36jlв†іђЏйwbє_Q_œдBˆ ]/ЩTдўXоT(„k!›OXxI4§­tH‹т"vnЗЎШ•їБИЗ@&‚3Dвк0RžP рАЩЧ‰jу%Сщ6™˜…ЗiLНњІЯУuяОNЇ<тдѕџоС l;wІW›ГоЎЏ..N’$юKˆЇ›Sц4]^П=йч–†ŽЊЏЋФe№хЫоО‹ЫйРГЖ‡ѓ6щpюМ2ъhL‹'џo‘•6ЂŸЁўШДыО ЏqОїмГъЬлёƒŽ/b`›н…[iэYiŸmEпЎ7ЮИп)-ЩFЖзо’Љ, нQ2Єњ%m kЪлjљgъ§vnD зP?п<Њу№С.со„ВYžїгДzПg?ВopЏ ‰1Ј,ОэЅЎ–и­~Ÿю|\ДRъэFвхn$ўЖг74?ы2V(c€IЇ) вЄ’#ŽaД t(Е›iхНŸOЈ…ац>K=4Ж•i™"W)буЫщ-C[gУOщнефƒяёЎ&™cђ1)Ь5аLшВа8ЩчжEБ0Ц­щy"иОНмЇЕ Њx­ёќђ$?GKPDБ$fQ]‚oЭз`9Юьэ3иаkх IќСАуXкeЋЄg› АeLŒk№Юp’Eђф‚*Qш‘ъ$ћ!Z*yRАEВъръЋк@ЃSЫі qXсsбЇЉЃƒЅрчg^!/НЦт!Љь V’Ѓ‡ib ;Sду8є: •zьc№ыMЁє…W/htЕO-\Чёy3є%6‰pѓЌиЫ(ДЯmJЌВqDец+Щ-/;ђ\ШOQ›к^чмєЏђ†КX>nШЛW[ЂЊПг(ЊЁ Wh?Кyџ&Н@#ќiжRMЪD›=њ‘›Gљ6A‚ˆшšAёZ=*аЧGcюЅѕУЖ$ПЈB8)їeѕ8 Яќ‰Ахˆ‘›ЇЇw5ї2ZЮw‡ЊкN 5оъqгу\EzоТcKАШІІ%[gєХŽНъu­$ ї)’Е•b(aѕ^јoшЅnў ЛшV endstream endobj 784 0 obj << /Length1 1371 /Length2 5904 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xкtT”яі.н(ЄƒТ0ДHHw#УCЬР0t7Rв%R вн !Hw7‚ ќЧ8чќчоЕю]Гж7пћьgяwяї}žEK—Gк a U@РQ< ^>1€ЌКЎ‘€O€—ŸˆM†r€ў…‰иєЁH.іПВH(…ЦфР(4OЈИ:@АHDŒРЯЧїш_DR vƒYдy*8д…ˆMсф‰„йиЂалќыРс€=yј; эEТ `8@ŒВ…:Ђw„€К ŠђќG q[ЪI twwч;К№"6’œю0”-@ъEКA­Пh€Ё&у%bшйТ\ўрКk”;   wAgИТ­ Hzs€ЎВ@г џCVћCxј{6/шпхўfџ*ƒџNC G'0мЗXУ M5^”ъ! ЗњE;И аљ`70Ьl‰&ќю Pж€бўЯ‚„9Ё\x]`ПFў*ƒ>eyИ•,Тб GЙ§ъO†„BаЧю ќsГіp„;мћяТЗВў5„•Ћ№)ць U–ћKACDџСl (€п#aaAQдѕ€и•зѓt‚ў‚~Сш |НNkєP_˜5§GфэvƒPHWЈЏїџќsEЌ`Рjƒ§Ї:†ZџYЃ/ ѓ˜№ЁЕ№§њ§ћЭ -/+мСѓ?єпї д2”QTRуў3ёПc22€7HРѓHёЃ"Ђќп–бУўЖСїŸ\eИ5№шOЗшcњWЧnРёзœ€жв@ U pќGфІ|B|єєџ-ѕп)џ7…џЊђџљ7Єрър№;Ьё;ў„СŽ0ЯПДh]QhЈ#а6€џ7ењЧДъP+˜ЋуG•Q`ДЄс6h1ѓ€yљџр0˜дJ †‚иў‘Ьќщ/Ћ9РрP-„ ьзЗХЧї_1ДП ішя‡ Z—ПCPД}ўЙЏ<‚Ањх3~!a‰{ёЁхФ/$№Ё iѕј­dŽ@ЁSш}ж$бЏkхapW—_(б?*C\‘HДУ~ НэПжПэ …z@!Dг“ШуЛЪЦяхв ю<ыCx‹ЫЭЯуŒК"„PьSЏМmе№гЧœežY•мHбњђ6ltв‡ырћА‡i[fрBВR CОkUцˆ'Зятk› ”й Ao3"’ђ|•ќ0^›щі3“‰“?CEк6K7ђЏš]6э…пШX’P1вйЭЛXQF,ЌЫЈ~#SВX ЄIЊЋžђг‘+Ќ(XьЙLc4н…чЊIlZџќ|ofwWŠРЩkеŽ2с’0J:*/–ь„:ъјL•Z vЁoВo“тюб8†Б/`;VN€Yc;щјEŒvвАЬЄцm•‘ъ†ЦбA~і^q–Ÿ^žxЏи$†n5"ѕ’4СXр^X dлГЈ?ОyЃљјЙbѕњтT’лpР.иˆ5+RЗчшЮР~;‡lЮ‚a”ѓ‘в- ЭЫШЅЭЖД8Ї иАй]эR!ЙQунYЕJmсyhtўgлЏІВt/((юШоs86м˜JW<онФ œ”ёПФgм5ШР-{€!ПiВЌnqЉЄ~1а!ќ–BЙl9у”НhlY#џ‰МХ? їpР1'ИVН=мџŠ$ZБ\w‰oЮєк8їѕг‰§kЕL??ь1?фЃd„яЦОŒeГN4V…їТњЛyЬJb]ЊNоъGД8ў§ѓР|їК†ХQqњћ5лй@“ё4С/ Ev^M^ЮKЃЬi”ё’ j‚fђhМvЪ<–Џ 1-Sy~h(Н  MЄщ?ЄI‘ЫrD‘Эћcќœ|УЊžLzx§`Їм5ѕ$уFЊˆc7Я“‚2ОЎjqќШъДšхв5‡‰ИЋ+{`ЏЃя*—1`юŽХ‹\Ri\eа/8ЛЭЉдWѕ§ЬœФ*еŠнўxŠ№nl\Ё]VхыбчiфэЕ8М’|(?њ№'X2"cWйе%’х§(мїGЅ†n“ Yƒ(ЎTAm'3љqЯЪ2^uѓѕk뇋%Ёi#žёнlЗ-__дЛ/џd рї'’F х­Џ9;озSБУ›OШ я„œіЏ™9eTjдrЫ#р9в7с л‹є,YC“е&bf+ј-ћ,XŠШ@іšAЙ‹/bяLu}&,e2 Ъ­B,UЕZоЮZї3KkЮХ?“і`Рсїp i›~5тсЋ1Wб“Н;3˜ q3й4;х=Й‡uq СqƒдБ.мOЛ٘<|œ&gИl:+ђ‰ЁLёX:[l"ЙРxGTBў–Ѓ0&ѕ%ј d_gp.ьdћ%н˜ЮкЫыD*RЕŸ˜jšю’5ТшЂFŒt>щ$kyy†Н1DprРћd}мrў1„4+A…J†|м§`н‡@Љ+2_Й`Л?IHЏБ„~JrRсЪаЛU‘ZyqЈЗЩGДуаЛ 9ЊНВPјСє]D^b^j•’`чŒр7% ЦЛ|r:Х І(№уeJ;Э§юPœЎCЌ ),?JгфШ!эй~њб7Ўў3з-gU`ч˘ЧФG8йфё&аWDш<"б2~ЃЛЈ=*AŒг D}Шюэљpt­2§Юм­эšGЉЅ ŒуoоŽmН Jн:Т а›ЇЁ,qЩСyd‹pfЬJдп_љІ‚‘MѕАЦ]'бbГA[яs1MВ№_Я ОЧаM[ПWLщЁЋ~RЈ8`ХwдЦ1еxыe=o 2C]џŽЬŒ­ЖзЇfЌЧ"gћ†Уt{и,Ÿї@—gGЎЌf 8бJ “OC„HмочРHžТCљг#L;ЈЫ[$„ ƒi—уійќgЌюneT+АŒЎeБ'Ш”_тvмVёћvЇрјOєяŸœNойA„IШ7оuвП+4Ч&[aовёщж1™о[xDѕW.g~С5іпќ4!§AР+Ј›/c]“™њд|зx"љсZu‘gœыycТЮгoВ rысЗ ˜>^„йj“{ЬQvЬпР%ga?щнЂˆи­yЮіЩ&зp№5ъxр[†ї8’u#цфvЩlTІP`„дРфНŠQ \:[ŠрЗ';~uє2Ž’0ш#+ЃзыЈK —˜}=ЯЗ;Є4Т’жх5~]ЁьPс&Ц›lRћЦ€ј5ЙЛ'Т_^ЇKа хARЈОі)О3 5МчЗГ0ЙШИЏ™ДУЅЕvјјБ}f“cое˜)г.ЭОпќEВЩEјВЫGgёyžVЕ†PпJИ№оИХ^sЁuvq8в„ЮIW 4ЗЫ=<8JЈяRі> 3ПѕМd‹Fих u žˆрЯХ Х№з.Š,ЙиуRczƒ*…&#fH,т0КЋsМNыhmwŽпtj”d'R.’vиOШІЮ3Ћм0Vl“lЉй0.i i^Љя˜ђW5fбЎи0p‹'јvJ­кљ<^ЩдєКЫиZmўвЖЋ{Ѕ5*­ ~HрKЋpЊhЄ‚Ÿ”ЕшЗKяг3Wл/lc‚ё+>-јЬ2ѓсЇxЫвА6ЛКq6mQ“ЎЫШ›š!’šH›]=я1Ёh'Пі(EЊYї‰Ъ~Эї„'t[жw щ>|P?[\ќ/Џ™Y@ћІŠ8|!Zk7ё}P”ІхуBLŸЮЪ>ŽSюOЕKЋ_пяXќ„UіISзЖ}95Џ2ЁрерЬ#a4Ю{М^5SАњ}фњgц€ЦW†Wd•ЪЃ•šNщB­Йр7Єa2Лlн_Нљ‘gЖcЬВ@§eц1РэЪџU69Ny j” –#Охж'ЖйТ.o8п[єžнт ЗчVв$;Ф-_М2*М‰<бSфЇ9єŒ–,u.цР_8zD/ˆ‡;ЦФaпŒ+ѓѕ2вМЁ3іmaашWС(ыЯ?ORyВ…НЯfOЈ^Мф[уќуcHёgџMЁ'PїкhFЉ ІЦѓŒiMŸКЪЧkЭЩ­=aKž Г{; ЃwЄGР)†лBCЛ ][їDz=ѕš•кvsjІЌД~ѓžЏ'ŽP,ЅW­ЉX[˜ра/Ožоa1ўвkп"ЩC#С€џJЙReƒGGšKыI-‹kЫѓЃš}ЮўйŽI73hbо‡Ћ+VЏЁЉ-qЅ ~ ‹3ЏУЋФПSШ“v‰ЉIИвШn(/žё5'Uўм–НлЙц5ггВѕ~RdфФ?zІƒЯmU‡офY}5sєЯѓ™.Юю1ŸЫoсŒЩ(‚J—XЯlP‘Ÿ+‘nvюsЃ^иГэi/ЄB‡ЗЂМЙRд;‘@Ž|п8ѕБщ }žЪ2ЎяVЮTУ&;‘ц#ЄSdkРiOZкЮxвйz АrqЃ7p љ УГЁFЙЗЛмНэ‡Ъс—_Vž7Gsh.ВbЧJ‡ЊъmeМЛЧЮЫЬdф§ЭfзT6*;sЩоBПrЋ(єЃbWɘЁQN=ѓHЇюnЪSG„ЙpS№ŠSm[2ƒ!ЇпС&fЮ(5Эрш˜ЧT F‚ДR 1^2ІsvѕC8jЂ%фљ<јHdLsдOоѓл…Ьœ4^Ёw~ДIОiЊћщ™ Fл* ŸWИёpв>KzXSзxsМy y•Nu2Р`cPЕJЉš Ю|Mvмєњfчig‰&’ik'’чћсkQ6Є›эE ЖŽ”ˆ–6EpуКрUкм(Bѕ с ќІiц /Œа;СUц8Rm+4шT`”юa‡?ЫbЧ€t7ЮзЌqГNІШо”э‘ћmФŸ=ШЁђYЊMвКGyшGв рЇЃNјpЂFЭ5}‘ЛЛN$ёоXvKД щэ@’~Txr6ЃЯя š<ƒЙЙ0гАЂŽ%фЧВ^ŸЭŸ?††ЬN№v›ўфщЧЈP:&БoeсТr#лњšM@ѕqК…R#?_ЋЫИRеўЇЙ;і7.p~Yц –хђbšz’‰Ш$šJЗ—}$Ќо^ђЉ:ДэPъEЧло~ѕьLі2чК]ноZћYНЅЏЛd~Ўoєa GА9fcU e98Жя іhпžОІ’XT­yДJn[$I‹ˆ§Ј{|r˜~а.•œФфEб]RЬѓvхw>]У!dЕ}S!2>ЧсtaМ$K$э8-,KюЈЬmжsгfэв‰Ф9ФчЊ}-˜Љ‘lгKдЪt*ЯЬV~ћTЇЕ<Й?Рz/–Л!)О9ДžдвУер>ќ>hРѓжћ”ѕ}œЂЪс0Юe_=xji6Ћšсj–?fГQ"vЖшн`>GГO<‘0lNZhИ.4Ђ(ЃоШсu†Ћ‰Я->;гц9ё’„Yт&•Иi{OHнO8;E;™-sф„3-œћJœ6[mо‹пG?фд›IЩћщљзsœ]OFP<ЈŽ|ІwйВВмŸђ&я^aЏє:Аh€.Ћюц2ЯъгќЦ6Ђнч0–ЕжЫ<­`}Яc**ђm\—IЪWrхжHпЋУ‹iJ&TмGКBЉф˜Хж˜ЎЊЬ'2Є„јГm mшЌїL}щ™Ъ­Џ•<_Њіž%zTшЫ§,fЧJ{цtHЬШ§№ѕVgХ Н&†Pё.І~…‚bѓjVSRЫоuQR$—ПъьЮМpгћ5ођ§3вe&‡|У*]ШЊђњ…‰йPъСmі№т(–№ы^УRTIцYгБ 2]•Q'АоBАfКKgŒи;/‘хю'6Šy^к`пEЂ)™~юСŽ…Д›е—?Кa3WЬў~ŸƒыХеE>L‡ѕ:МlпŸ‘pYУpєЭіmъфє„уНа{'*и@‰]Мц'аЅ'LіІЈшЖУЗЬё[ќˆšz–ю2Ђn чhvђŽZM2›ŒЁЎЖбm­№jТkF’f§тЬЖGKv 4З.`"єoї…˜EЈ22kIЦГтžее лсI’IзЖCџе“MЎ‡п€ЖUUZvЭоkЯшƒ‰[фdOн-(miOы€хNP% rІєЛ>NиQЛ§§uO‰ЭАŸ•А#юq к 4Iт'ЃqS™їОJ<RХi"Z<Љ‘ўфS…ЅШН 'ЕЅГq4L* 9y,Н*Sча>ъНстprјt.XЖяЃЗˆ‡ЎђPмФi‡i+hg|ІУЬ zy|Уkю”иЎХ žSнуЊЬЅZb“P/apФ k5)Ъ5УЉU nїтНg„О,&еBтхW‘XІ‚(yЩ)jeўбљ*=Rы/“_УеˆЯeякІЙЫ|%Инѕо* 9ђХч{ЕwFЏоКPЎ6bžПyПy7KJЋhгё)${–—g`ЄxнЬЁВЛЅяЄD4їF0ƒšъZ|Xk—GБhДѓ‰AЫqу№@ёб™y’§d%Dn|R]]=Пч‰мnлВ†N/чЕ[ŽГіqQ№gh7‰Юf1ыаG­~э•Г’5Ы ЊVшкQђzK•АD0”ЗŠюfQСІЅЂM^<ܘј‚ЅЧxѓљ)=}—зœД§ ™а§+Цэ>z"rщћЙV›Іkц’љБŽЦxнг ‚b,Žэыcœ§эш жX”яБ83‘ю% ЂpЯГжHвš7љЈ‡,сј­NЯJh1еЧЛvo }пQs“Хi•лЩѓцVM|7ЌЃ{U<`#ЊЊHeqРWХ8‰8ѕ*4ўЩ%hцбЮДзљnГ­ŠpwZРёИIјѕ9Йe—[?”КщъіNвAЭРН€QKУ9k]q!Ц•џ”№њхСгуљ8ЏNх*л‚|‰=хV•*b&ЂљЏ:?3[37 qiЙkh0ВJйbШ:'u@Ї^ХDxcrНbXД+6•Q'охF'ОA7’—Т‡ѓ›$ФнЊ)GкЖg$E_Кn ™ГLŠ:Ушžoх№š›C|Љy]Šо0-™Of*JоHW\ Ј ЎžBO‰G“ЧpЂНЙNvсндc^oмZ“i+†7^ іzЮОGi—Nn<žДи ОиФšЮюssVЕXЩjНчY*™ЕЏѓкШ{РГл‰]јжz&m:П[d9є;•žм9ѕчѕER$ЅшЋЉ^HLщЄ@вWop;Іђ Јй|н!ё+xЎєR6зnѓдњa‰7Дj(nT)ѕ(лMхНѓy†”gxхEа&]NНІє9>e}[u›тEšpnŸ2JУјN‘QЌwфКЊJ“Ќ%а%•BM43kКњ!Љ˜ь%Э_{Њ ~“!kF=jYWИ–=СЭu^M0в@240dпМWкм§3_И\ Жр Уf\34i’Эkѓ?Š2Iф endstream endobj 786 0 obj << /Length1 1674 /Length2 11132 /Length3 0 /Length 12204 /Filter /FlateDecode >> stream xкЗPк.ŒCq/Npw‡тююV$@ ЎХЅаbЅИ[q‡т^ ЗХŠЛ?Žм{ЯНџ?ѓоd&йпђЕзЗіLшЈ4Дй$­-rЮ`(;Ї0@ZUG‘‹РЩЩУЮЩЩJGЇ‚:џ%GЅгКA@Ю`сXHЛ- /2 ш‹ЁЊ3 фюртpё s srИ99…ўeшь& Б№YTйJЮ` •NкйХл dk}ЩѓЏ#€бŠ Р%$$РњЇ;@в шВВT- v@Ї—ŒVŽmg+ъ§_!пиAЁ.ТžžžьNvg7[1&V€'jаB€n@kР-д,œ€ЗЦŽJаБAўRh;л@=-м€€#Ш †МИИƒ­n€—ьmE€К ќ—БЪ_Ќ€П/РХЮѕяp{џўгйТЪЪйЩХь лl@Ž@€Кœ ;д Ъ А[џahсq~ёЗ№А9ZXОќYК@NR`ёвсп§AЌм@.P;фјG„yЙfYАЕДГ“ … ўQŸ Ш hѕrяозьь і§В­mўhУкн…C ru*Ъќmѓ"B§Ь№qrr r €Ў —•Ч tМ]€*ЙўПєряытьАyiшВОќ њB,<€Ј›;апїŸŠџFЈ\\k` ДQџ§E Дљ ПЬп ф0ц|Ё€ѓЯПOІ/ Гv;zџЧќЯsщшhjыГќнђП•RRЮ^_6>7'€‹‹› №r№џя8 Пыј‡Џ"иЦ єWЙ/їєЏ’=ўцуп ТјяXjЮ/ЬџCtN>NЋ—/ЎџgКџщђџЧђ?Ђќ_‰ўПЩЙ;:ўЉgќЫрџЃЗp9zџmёТ\wшЫЈ:ПьјMѕ­Ў*афюєПZEЈХЫ6H‚m_ЭЦХЫЮЩћ—‘y­5@P+ЛПXѓ—\ї}sЮа/Ь‹'чџш^–ЬЪсхМPѓO№e‡ў;Џ,иЪйњeуцуXИЙYxЃОЬњё|Й^Жвшѕ'™ь`gш‹ рЅG€ГъƒpXќ!њ 8,џƒ„VџFTЧa§Шрўr8lўy^у?Д/иіРaїШр§ОTёOп—2œў_(Юў|)Уљ№Ѕ —Р—Dnџ€/‰ џ€ќш?рЫ]ИџОфѕќф~Iф§'ќЏXЙЛЙНМFnЪЫtў…џ|њ€@/ ъТg+‘PћкаЖ›jIROЖэqn^ŒГш §-YbЭ`щ7Зч<љ1ѓ’]3ПbnзqИKž› 9ЬжќRc„ ълm,7Y§&qEя *юмП”;;ођ€­m ›ЕОy^HL3Нfu=нžЭи“Cп\y]awŒЬај›n<6™HP.Д]2ЃНRЊFrzІC‘r&1~˜H.Зw›к?ТЭїs`ё +,h#•tУEљ"c_ьѓn?‰ђлIР4нV,б§GЦр‹ЖаwŒ–Qmq‘LХ­Щ3…Г­XE-лf…Сuјўxщѕд'ыЏ$ГН,~š‰0wЪ”|^Hж)єссcјвSV&'*ї ­oў•мдяаZіle?•šЁЉ3Hrцtj!ыH:^Ѓ†іЙяз”еЋ‘˜З8ЋT;љf VLV,В§œЃљJ№ДFЗ ­KŽ +њєžт€&XЏ€ЬтhT^”K2zЯбЦРбђ 7уІцˆxАзњ.Чљзљ@ŸўHŒЙ|dпдžЈЌ tj xэЛOl%ХDyЖ;ўаГж _bњфвIУщЫЬЗQŠЈ!~Kyœ)ЭєcЫ&йH„щshнИH"Ÿ‡šп чєOŽ™'њ)ЯaфК5Ѓ6ёбheўЙЎБfVЌaхЩО‘u#ќ=ЧkтбJкЕ_њъ<.i“ъ.@uдДЇЕъяQѓв(Гѕ4уХ`VvQИaЮЪЪyјПИР–ŒŒПѕЧ­uШЏmƒљIQБ™џIшВsЛЗ†fLUДй†нїlњ[й&I`+†<Х4zгAщя­wЙ3дЪ”љЄИ‹wй_RŠЉ&juЬЛ'š9K‡Ь№ј"}ђМ$HијИФœFŒДу{Г$Ьњя!БO рЪWvOК"$…ь§”ƒпљр|US}vа:u6А’/э‹’Хƒ^їн“oЄ!™ЁЮЊиUTн+B §БЩSШ›јє;Ќ’7XZ—'ПеМп‚„T76'wvЅmАЃ5НЈ­оМO\\ PГЋˆІу<~Л!SБНЮчztКF‰ч8Н2hШ)ЩP…љ ƒюid] т9юб‹I§EЭBЫШ7‹щЧžЄu}їv^оИŒРkbžLUBп8(@фJ‡Т,:зxA—ј˜…т“ЏФ#'Iw ёб!'ю;хњљwkŽ И2г,лѓОwСм#WƒEoLюЃшжСњŒ!ј|юŠ„kєпW­ѓ_ишWЗAЫLSnM;іyИ)/с,ЯіJГѕ0сІД‚д/K+0vщ“о>юй­@ф%Љы6щvАтЦRЈЇьŽZп<7Фщ рVкбф$гІ"ыLLDчBбTЄa)l3gОji=ђф-љЋZљПэ9ћ_№ј.UОДЪ„Уn ьfњУЋNˆ6єко?~ВŸі6{Ћ cАѓЪКtRoУДВБ4пАDь„Йј}яx:мˆн[a[RMлД‚ dЈкњЇoBд-4…А2ЬЇДƒ_к2pz{›фJ„дa dБ}НЉ?fjJz^pœNrHXЄ|MЫ‡iфччŽзТvЃсnК„ {…Чrnzиб?ьAX^ћ~э`ОЏћIOд]ѓЕ`РшјжF,>`щь†7‚1ˆoG„ќœАГEФ~~S)ф‰хfОХ9“*fчK1“wЛй<”Љ§ьч3[5G=сг§PДх;Цќ;Ъ){ZіЗёxвKЏ‡ФОпXЛmсtцњє№$Щ˜QS2оЏ|ёN(џRЕt)ƒ ‡Ш„A+y)јШ•Щnnf\­ ѓŠѕ ?7јЏіi,(2BтЧfѕго5Œ"хЙм5Ы‡ћЃlѓ7ЏћMБ/пэЛUгk&ЯqwЄOIЊšfйЬќoє2ЅˆЕмЄў:ыŠнПЫ[Іn~dœъв'IcЧЧАрRA`ЏїlY„‡­*T”=э]гHЧВНЕ%y\iГТ„Њ“X++xё˜Ўш.‹т,.Gj‹6Э—к њџЁ“*шbRоа­7˜іGю/РqіЙЪVWџ ~Л`Ђ№=9шU†ЬЖY„ ћЭ‘уaU–ŸЃNщ‡љ uсќфї ~lг`я0‚|АРЭ™т$J ЮНlдФX-Яb faQYђMg_2˜ђkiG…иf*kьƒK# 7мhРњёDЇл“ˆ’HKкTфКwУўwoSvЎ[”M`о{Ю“’}\еvЈ0й‡wЖ]kЛr,NСћnIq‹}^6ДЖ4&xЃЫgмb>Йж=ХДwDuоИ~~lцš‰ХЖl‚У)z|э?"ї6ўGgчЕеNг8Ok9ЄKё*вЅоЄ->ъУч LЌгЖv={^€ЂŸ143•єју6 RХœЁ|ємЇЇy„mMFњДOЊšТmЃ]&G]уžEW­чіЭЂуЯыц*Щс…з_<{еО7#…њЫ-[ˆ ДФGyЦ ў:ЇћjЁZbе›xР‘wDvjiIЈЬBžЮэКZfcƒЃŠн§М‹Џ‚5чЬЮрЛƒ†RnЦЌ——dQ[R˜хмxzНAŽ™œ„хxФMЬTOФЛ#a™ЏЛюА}ЪOD{|ня ЊЕ­ЧbАщw­ѓl‚Юe(чЭоCЏ/щЇрrXпаР<2§4ќЬъѓљЖп'fВ3љWQUrЬ`Ncu]И>Е‹ћФ ЩщТBЫЋdmгэсЁOB:‚Э,Г кИёЌeЦY3І Х=іэФВ•ЊЛЇž]+О>–БЙЁZ_ѕ‹I(еœC…п~8Mdь|eнP" ё АLNt(г@Г%лф8!ЊEњu~ѕбмT†"ЇБ;йgŸ2]ч˜•VЏtJЧ~ьhЩh­стУ36љs пЯŽЕІbhшьˆІыhхсBъwyЋёЋ#п‚ЬW~ХZ_oсU`Ббv_˜т{HKкэв`1ђхz ‰ H :яcqм`Vљ•Ћ=Ќў ]вC\<&%)g­unГ%^Я"ъшaЙ:‘ '8фWћ­зЄнœЮїф{I=Н™"2AЦe5Іў^ЛіHW2іX/Ÿef:і›ŒzлЅќхУn&PдFХkРrШДюŒ“i&ћіЊщKгоВЂGющ‘Рq Žr[ Є5WЦ'‡rкXђдИЯЫвНибЕ-,& tЙгсјБаLo№73TИ’ЛЄЧ*Ё&тY†іt]:Cœ}T§Хч[лtё:сФОpі~Х!СJдg№фвbыVсэь[кзŸЎxћpюАP'bжqфЭ28 (њЯњSУ;уюd|Ь–§№ШDBj?‡рcыщgЊќ›h2™Q–Qм…‹юDpјн5HpgЭŒшvQyJІќ&uј6Ф ЃњFB{*84ЖВнACа†ИЌELМlїМ"lА­УЄЬбАБгЉмi‚!ЖFK›2Г0=7XЃЂ­†Сз#'КЪ5@E3' єšKœБ­IF2WЋќЁ зŒwЙ,L’[’YŒ˜‘ИdЂ+ља‡h§FТќѕp§Jх ъ†^ЈˆjЮъ8Ÿє NещјShрЉ])rnОЦєРфдНлЋ2Rœ{ЕaUЄк4•у –  X€/†™Wе˜пяžРpр/+œа)L иD%ššуЂS‡mРўрћШ"$;љ—[ЇyДљл/щњ“8ѕу№КYМЪщŒГя0ЖЗЂoN$жыИUxЬ:с;f‹СpfБ‚ыј n”VР}O)Њќ‹„ы{Ащ€ ‹"ŸЇЁЉ‚оrmЛˆ.ѕрgЪ‹ѕїjФDнЫˆИ-'Мgщс+Ь+H}—ЂОF™Пuљ?8ГЈа­ˆ>VпВш[ы<†Bpм§Ы\!еС]%Ќš?ЋхЊФЕ:ф,2;o–Aы$лYтошо–!^“6КЏU>~аЧбМ.Р з]fуЏ.э-Д|eQ$ЌH†žPщл{59IЊЖЉl\lЖР?ЭNЉ,ЉŸ\{+•k&2‘uiРТsУаО1lГc~ЅNQ0IŒ™qDљ\G( 6Fš юŠџ 8.pHЖХџЛRЄ F–ЁкIёз™йЗь-’yНŸГЎU,OPуuF_НјЉЎTrr]pUїДы–23-%>(HсађФ-AЄ“ŠpФzЇYdИѓJБх~/ДNJvQЉƒо­ЭШђсpЕКі€ШL€Ћœе7š›Ђ2+ЋтЏ?R;ЌU ,9>tтФЄ­кѕЭдj…р+ԘgфП Щ}X оє‘f:*Z8pX3ц#јѓ~ЄвџЬ“uJ9#ФВkЩo>I†kП„Т іьqЇъ“ћЁ*‹Єд —N*1ФрН>жпSнфХ Ђc ЉŽI^ІЮˆT]ЯFћcZ>oђ`tфqp/}ˆ„01™с•,#\ЎJ?­ЦdphѕЯ_'ˆњ? T’}ˆoоЅДхЅœЊхuфшю7а‚g™єSДБ ѕЭЕG—Э 6х 1ГІћ šRTIчАОn“š…еЂfV .4šiJБMЊZe~[/ўАє9ГP#cN0о#ЮШјі-жП#2›‚йЪ ФУT˜о—ыАъ[T“!>Y§Ђмƒ$Nl†6&еFТMTс Jђ'%)Љк‘~r’Н–w1ШšЩЙкЬ1i%йr'Э5ЇяDkЋ­4й NЩЩЫxю JO|ВљтIji*цїіљ,mtHВ#н(Г8“щЛх3™CиіЦхУ,Љ№I пы)g+3—їэ”Ы1W?ьеа/пZўt!FА9хбџеЅѕс^ьтI6г2ЬsШ„ЩїmkƒŽ lџJре;FG„,фАЌ‰(hˆС‘xнў Tчї7Й…Ш­wwi№US‹)–о@тдёŸPюї"ІЭЩŠ\ІSцп6Бђ‰йръ+ЧФMЦ?вnчђЦ6—{ mъ‘ЎнФѓ Ю‡Єžймх$TќHЋкRЧ?‹X.ѕdо—` І„ч7ь)О;H0}тЪС…џŒГпхЂп‚ћ :~мZюьэ4­;Nsэ{‹1юvHВйc™‡Єњ+шЛH*[ ЛŒї 1“ЁdкaŽ,г|}šь:ЮЌЬU?U6ШыЌ`%mNbw\[‘Б /П3ZS;рŽ-э*Яbтл€ ыfѕ\ЊT8QОЕ˜4нJG™ўšqƒ•кXƒі&З“LЇі_|wЕб„Ј\2‹т‡!:Ћєce’97zТzЯб'uЅЛсЫpœя„4L1.жХnЧ›2ХќееЗˆйjё™AlЌ*НкыВЛ@МW Ы я Ќё0‹Т jš(%­о h^ъ 4Y ‚С$ЁQвіkшСŒЊіюФБЏ–$›Уo7АРЖn"H]”й9Зіzђl€MˆИћDІЮј“ЁИ^ЪБ3\0Vlў,!Кжн3LЋЙЧ1ˆ,U, všRЗ­"ДTЃˆ—–SЙй?мГRЧУ€•vPђбЪ!œђŸ“g>˜l,­PБцЗ†ниuXSmѕІ›+•„UЦжзšX•E€UЙХiНŸ#Єкв&j|Ћљ^нB&QcЬiQФЧж ‘ИЁщВ”o œA.ЄNHŒ‡es†ˆbо-О!egІžЂkІ‡V}яЁ)4яД@Љ5Г0Ўъ_#ЁYИ[КЖTŒ=Џ[s%BЪ?NЏЩ§t+A‚.oJŽARщvяЭo%Žш]ўz:—С):‹›ж­DйЯs|ЩХfЈщwјFц"ђЭнќИЄ '‰"Lqž NВъD(jTэДМqоc˜ Њg~ЉGЎвНP]‹—–<"—82Bж3€ЧbbФ#Vv)vЙ™‹Ќ]˜ЯТHCыАgfСЃ ъ–їŸ7зыfиДqКi"czkЄуа^4gЌёm)џД=N+‚F§Uяc'Zbб}!њСЯЦGФЇГр‚–HпЩlRнР'ЊэьЗдкЋюэ>БiaнўщќтЪž­ЮšѕъŠЃЈПћYэZ‰кЛ"Я-–Я­MэњyDBЇЦDѕVФ ’Жk‡Љ4l•гэъОФm$,pczйCаS.UЭJg†Ы4U—m>§rdsF(HGnЇЬorБ(\)БTEї.њ?)t:Yk+ФD ‹_чЗ]<Х#ЭKJqYL NњfЋСшЮC:–†Ищm5;Ж\4ђ‘#­:щ u+eWq^ьЂaрЂэ‰ішgHaƒК,Z„ЕвЖ€%&ЄMє=\оˆmVlƒЗЭѕ{Ыя9ЄIЎЉм2У*&Б“ŠнМЬ0ŸUЎmТ7ImцЛчv‹‚”*M7wѓёПЉ^Ntј"ЕNУ9NА(!!у‘ŠЃ&CЋKэ‚y\п{S н‰BЄ5-А#zп”љЖН[ДeGdcйƒщtЖ“@ІсMывxV.Окq8СзЭpМЃZ€[Я~€fKЦчƒйЕHœ–/ц8Ї€ЁЭРАщV|#*ђˆœsƒ˜внќШzмOБО* K:o ОнбєЦ№n­1ТдP& ХE"u–‘зvяћLьiNGнˆfX‡@]б‘МŽЎQбѕKцююЅЂ~ыћnЕ“/‰‹-›чђЩgнбО Ж/[В CЋWл“ПБљkОЪсФ„Y…њM_i E]Wєй§<!йUІЉниE?ŸЦЖЙv0БЏї‚щ7Cз*dmВBQ‹оUwЯP›СК}yЋ%.iЁЭє”-iK…ЊtX(sц ‰Ÿ/~юиLМJP`ЌљPкуБ[BГќљ-хќgq§nМГЊщѕТ‚ћ$+*§ЊBК\$#tў 8ѕЁЋжёGсШЧ™]їhЩВrІпЭ•ТЇl'qаBИ$Б2XоEАI)Пw|\2RˆnІ Š'СЧrќфMšaкPц"Ё]gK’Яn‘6^bŠњшixmЯd6!ЉљYпЗМчСtgЖўИ?ЈЪsš“уОжsЖC QБЃiм ј–є]ШьEš р+явGЉ}MЙgЮGћk}Cх}rCЯQŠЬx?W?[‹Zz_‚ѓсn7<`€цАЙЕ"\ C!xsЋС3mŒЪ4­=лёціОDTцчО#щєтyph€97IНŸZ’ЌgMeZz­сhЦqv]+ЇVгЈCЙзлВ†нб OFІ˜ўйJл 2Ф›Лб‘F\Юh{Я6ЇЂJŸŸПЏЅ2ярзQK>/ШУєˆЁ])Щ0KЭlОП‹Щп—эoЎџЮкY A Тks"!xљ›Ёхyht$`1YI€5)rшС+_ŽћХ‘H˜­<…В_whгЂБЁ6 з˜ƒœ ЖknеmŒќГ0хXѓUXKъˆф)мŒ\Ч]Чgrž,Zт7ž7ŽmыОІ ияˆYЛЯG*OQw$ CO)RОЭ]ИцДGDл]”-цOfЖ=”З6/bEYЁаW•Шє7Ѓ|dЇыї wф‰Ёјэ‰Ќзežzи2—•тЎўv,ЏЏуЫЩёЦ ЗCьФхBй:ŠŸ*Лўу+yЁ#š~м3yrfэюqEюЭkЧУнœсяЊjЬE&УЧЬМпЏзЏџбмOБмZФ*WОН$т‡с$шЦŸы;ёЊь?Z’2dлYлЮЗщНЇGЏŸ$­[bё­Н6 дR,ЁТ‚МHЈѕIба>џsРЭЊt }ZІ‘†€ ПЩњUић`>дvДЅxЦ EйыкЩaтѕс~њч1UВЧN™Лu›†šИ+”@и4­Ж:цQ€ЬОЮ73ЉяЭwЁ%™i‡_њ*бТЄнє„€m)уІŒаФмЩ/.ф‚:–$•Bѕщb?$У‰eј‡ДU8ГXЖk:USѕ‡ ЇЂк(H qK^НM3(5WTUмФњ­”HўБS^Я‰ББOЅ?69›љrЖIѓŒе-,Š%цз[ щЈ..UЧЫЛЖЫwEзSч>.ЕԘq++CОyЮ@?ж_Ÿaaн\”^єобрЏёьЕиќфT‡o(ЧУШOсѕЄЬG—ЅKyгмq1 В/itќ]~ Дэ „&|,ІYж ххуьœ.‹,ЭKйЗJйЇk,='u;kІKшWYœИљэj§жр[Ъёx:ЭЊl™ыPХTi‰иuД’~OЖЅQ>ОMОeП4jО5#ѕjƒHеOЕ0ћ\<`еV•јб­ёJd э ўBэЧ(ј yлл‹“\$ЄКWDe0Э)яTNjHЪК.œqдс |=Ѓrљ<т$љ|K­СCРЄ…_ѕ˜^›ЎЯл}HuіЅцdpъrс PХч§:™!Џ@-щцбЇХ,U 4%БаЖјlЋяюи;ЇЃТ~лДœ;ЇUЗtjvS•_ЕМ ф­h ї ЋO­ћмЏЮauщrƒ`ЖнЙЕtїŽB§Љ]иЭIч\Rђ‰ьќiЉіљЁз.HDоo.Jн8Ўd— “1"b$Vўr'rй‹ЋŒs9ф“рё‚єэE yoЉIUцШ@K№›‡#ЄЉqrm"І}€%gОщ’qл!ќŽi$.Ќ|8уЂШ!sю+‰X8ЉoЇTy_pите…К’#Oе‚ѕi‡ˆ/1Ќwю“СчZVc;пd—’єЉ)оyiхfЄ›0#д:.Iїƒ š? —е/”™фНШuo  sЏП%Хунnь *Fkжцt |Ы@ЇБфРOЇўКRŽPœћy§б˜ ЖŠŸULщ§5ЩтБћDЈŽ„Ы‰T3“hѕт;щMYпТ`^(%y™сЕпUnР@ЈшњrКЇздбCњ":Ёq‚3_]ј№Щ!S iи[ СйpќеЊ™5БШїwкс6Pt,yц;buјЋ›K=˜›U~AыХ:[Ъ#Аa•ля•i_ЙчєІИКX‚}f0[yХІGеSˆО#юѕП‚ЗUи7Ž™ѕJэЧА‡NБ‹ ЂWєД­™€кGrЮj ƒK&Љ'ъ!ѓ7|"lЎњЫ4ЎЄƒъЩь?АУ…Bˆ15FЭ№Л*Hз’~чK—bѕМMgb‚ЎUд•3БRPS9xяЬS~Ž2lOфe5(Ih‚Ћму€›EіЗk"‹кйѕn‘’_№˜|Gk…яЏoZ*ШнзQШУЂH „Ѓ J›|иm[>Щ3!‡иєN˜~‚Ы9јувc„и_rЏow№Ё2•WtЏ­ЈŸZ>Јтсэ’šD˜ –Ћ0 5§LR1~TЗм.ўм{<ї•ЯR‚ШB^шмжD27ёс=d98SОiЯм6‚В"•VžEВзЅўМwP“ъфЪ6 tА$Ђ:P–+њЪ№”3$ю+3ЖЎЄкbЭQ]пщИT^eЫzъ†њ#"‰n2kМФё[cЏ<ŠЉiЉр Њђ(ŠqlвGE9вa”fVЂиMїњŸЂTŸы!xЇП—ь.‰"‹HД}9Q8aft&”ЩГVЂBeбVьвАƒ†Œ§ЈЯАГ0Q‚3ћQ9ь.]}Ќѕ<оK“Šіzw0$ёН‡Кл9Кvіж+ž˜У‹i Џњ „ЎnŒУінŽjы„ѕљ<}\eQњ˜хЪ ‡.Igjv?*яX}ќ5ŽђPšr|в5–™+šбšЧK)п—эЈЉyVЬМнй„ОижА˜‹’bWО^|DД/…8ŠŸŽХjr65“TIћŒР”ТкЛЈІХлEУIЃIпыФU oй4cyƒh(P+•I—š8—фŒ—іеЎЄ$п›Ђюдїзr0ИГа–еk–MrотcМѓДд!ќtR`>e&лЯйтеЮи§QЄ`gаa?K‹Фй~ЕЭ)”ƒвЗZєA\гK§ѕ%ъљ!BєPлЎйГ<ІѓsŠ‘˜,!ЇЁc yоšкl№oъАЛˆžpC”ЏќНппЌ`GЏ‹О6Cekп'Ÿ+V`зЪ(‰K!(`сЭ" Œ‘gHІUыѓќ{a ыљчл‰пѕ+–+ У’!пэЗё B<˜1Щ`MКгYмПН‹њЪFfк8<ИsvВX.VЮѓŽxРыUХ’ШиЂєљъdЏзQ„‡yž({‹ђљ<ѕџ8ЕzгЊдіћ|F‹ŽБХIуitwбЖиьЛЫЉЪ \ФАы ЮE иwи‘(5НЇАD?(млЂ&vЭеfЖ‡?MOЬRчŠ|2t` Hj€OJ=эУŽ@=ОћоXэnвџKkђ.‰ЖФЋ№Ђпc ‰яЇЮ…A†w2Иu&Х&Н-й=e3œ7ŽPШъk="FЩД%ѕ„bŽwє#W”C пЕ"›јBLt=—я­PY6UЙЬw6z˜їaДСёв5Ѕаs­‹ЈБјVJњА™ЁoMœ­9–ЌфT?‘№дтЅу_вw#мУ!ЅЪеM“dЉЉ{PžСVkжЋњљб ˜9 ХСšдЗ3еLм}эTI'>Љю8љvnŒ™дt8эв-?aћƒ™эЬкыЂоИєЕmП!ИьЫgЂ~ыešлЅпkdTŸтЖфO#ЮйН Ё1:jНVљнй^J’ …яїеФ v*гдЅЮTпoxНGƒYWмm)D]45z§JЖИ endstream endobj 788 0 obj << /Length1 2819 /Length2 20095 /Length3 0 /Length 21699 /Filter /FlateDecode >> stream xкŒЗPк-ŠЎ!ирюnССн ЮƒЛ{ююœ СнƒЛKАрмэMЮ9ї{џЏzЏЈ‚YнНЛWл2ƒАБ!PмЦк‘…‘™ *ЋЂТТ `ffcdffEЄ P9Zџ#GЄPк;€lЌyџАЕ8‚eя С†В6ж)'K €…“—…‹—™РЪЬЬѓC{^Р{g1@– ec t@ЄЕБuГ™š9‚уќч#€кˆРТУУEџзq€Ааdd` 5p4Z#X”mŒ@@GЗџrAЭoцшhЫЫФфттТh`хРhcoњŽ†рr4(€іЮ@cРя”rVРRcDЄЈ˜ўV(л˜8Ки`%Шhэ>тdm Д€Ѓ”%eђЖ@ыПeў6 ќS #ЫПюў9§лШњЏУFF6VЖжn kS€ Ш—attuЄXџ64АtАŸ7p6Y‚ ўЂnV€3ќ'?#{­ЃЃШђwŽLПн€Ы,fm,jceДvt@ќЭя=ШhЎЛг?ЭЕАЖqБіј2Y›ќNУиЩ–Iеdч”|џ X„ј"3:8˜™™ЙйX@;аеШŒщw7[р_J–пbp^Ж6Жp@/ ќбУСРpДwzyќЉјo„ШТ09 І kФя`1афo юП=Ш Э ?ѓяŸ?щ€'ЬиЦквэХќЏ3ЩЋЫKhШг§“ђПJW€;€• РСЦрфсx§За?,ў8)imbрљ›,ИJџ!ьќЯPџГ4€џі%gž[ €њeЬ?2s0Бќ?ћ_GўџfќЗ—џы˜џ/#q'KЫПєдќєV KЗ,РsыфоY№&XџЏЉ:№яХ•ƒœЌўW+щhоakSЫ rЙ@ŽFfЭЦпbеп{f В*и8€~п,fцџб—ЫШ|{8€Gђ/М;џQЬкШЦјї’Бrp ьэ м™С“ФЪС№`oЃ1аѕЏ!01Zл8‚РйyLlьЗ”“Р$ќ[є7т0‰М .“ш т0НA<&Б3€IќБ˜>М V“Ф b0IО v“д s‘~A`.2/ЬEіЙШН 0љ7˜‹Т sQ|A`.J/ЬEљЙЈМ 0ецЂі‚Р\д_8КцПˆ]ы- ^8‚ƒdВ7rВњWЮТЪљТdi ќWЮЮњ[ EƒХ‹pъ†/lbh`dс`iр`і‡Cіпbћ3p эСv@№;gтј"gћWўїЂўЋ'eє/тЧ4ВБЯшПдиKЌЌ^’ћ=МLЦџB6pJЦ6––`п_L/йЧ• ј_A9ыэœР—РП^РќРУki№GБ˜С)›Мx[˜€œџpћ[mуєgXА‰щKАоєї ќгœЮKљиСН7sГ5Zџa–ў€`ђц@pŸ-ў€рzН$С .Œхя~бƒЋћGFрЫšщ%и—5xї_Šmэdeјћж5§ƒјaВy! іiѓЧ)pЂЖ/jp [№[o§_§ggљGњпн?LЖ@{№›ў‡)ч_2ЭKйС…ЕЕtњ#1№ї!&Л—Ф#' У_ЗлПОй mЦ†/%њымoЁшЏЋѓХ!ињ>Б€KёŽœВа єпЃЩёлшќGѓ8РNРЏщПМСщ§ЯТА€Г{ЩќN19šйџ˜*pљ]lў8ісєВ.р˜}qr0ВБџ“>xœџ€`Т.l)иЉыеэюŸћ gА'w §п ўы0rВ7аёЏGќ<ќџѕ t!.Ькё˜WДмT уЛ0l LQlЉ'г0x,иЗ:нЁР'аTЄћЏк_ ' tЁ-oŠQ_ -?z4жР5Х)6п{>шХ(Ml5#Юуєхы%D `Pкі|ДѓTѓГ€n„l—ЂШЖsтFQШХМqщљрњ­Зdi8pvKqЛ‚SњѕCЩ$C„jјGПТiŠУŒ™7ЄpŽ „Џh1N\QЇ/ЏІ0ВЦž‰ЅbшН#иђ=ДжX#ogмWОЊА:tр‘уiН!„ОФž єйM”Тѓ(*_˜ЫdІa„Xю%іj'9те–‘ФРeЖД_рљ0LюеќЩOЃ !}KYп–Жкіeю ‰‹‹ј‡\љ†‚нэў „ы`{:cYч(x97эѕ˜KЭƒKщƒЃъ1mїAm“ Ф ьхz‘•їAv^XВpлмžyцiХфUнцc‡ЖSЎлЎЪ­}ЅbПœPсѓRPб0ѓRыИ(b.Ћ0й?"T№4B |ьЄбР[W]bД;н~b?ЪжJц–Оwwq!ЈuГŒ+ф0ФЈ'67Š9вТў …’JЧ••7;P"]Х{C&$Еd\.4б,~9"ДsнЉW’soŒNfJW}w PПћю fZ+#ШРЇЁ>I Tю+T‚C“iq“_ЋК/o7/'Ј7_l$_{h”2;BђuћюЬѕrјOИDд7fЖ&ѕСrкeщ8"ƒgт]‚ІJ)вХпtBFЂљ•Їќ:žQЃОц \–lhtЧ-шT’y'kMujЭЛ КіW„WU}їSЇ|Џ3Е‘F‰QЛе4УGЪCаќYСыжЋ-fЕН{ТрrжœQяq4"{qH‚ИvХz;BwџІЯ%j`JЖ~ŠжеЊag[Г< kјнс22Ѓ§цзh[цїžœBЅ;Y{|:ћLmfžcуŒ7…JТ0?*ЅЇЁ­в-Џt—)е—}qУVО{ечžDvбlэNLЭмЪ`mбvŸL\ќ^“.hv‘к`˜ОўDЛ@Eю‹hм—ЏJPјŒє9-„зд?ћД˜&ВиSuтИЏј мюЖѓ}mžу кДqRWaЖРзДtŽ‘ѓ:ќКМ_ц\ Ёч$œ Ь~t<Ш‰р!&ˆqЛрЗЊЫут{Uзб,ёŽbcў“ѕ+ЙBШЙОИ,xн_ЊХu•22ЮК ьpрuгIюУЁhYL]ЎwX;rи™ ВГик…J7>VrЙ/ИяOАьб„д3ЎЅœœћ…‰ЙњkR5ѕ—\яs‹љX›ЗБnДЮРЭaэFЛА E<м яВљfIъЅ‡vК5TѓFџD6™Э)^о‹лк?-И/21=ЄhЗЭЙчЫQSyGЭTЁИ”>)o+гЈИп?ŸMрo|cэиі"К/ѓ™)В™ŠhŠ9Тд…љд™єKЋ юѕСТ3UBtY ЄМЧ„xrHЗСzšzПп§ЭЧJzž‚•№t?]Жкм ћЪр—и4#т 7њlК*(ˆY Юˆ”o++7;їПЦш\+)Ѕ•ˆц‹ТшVp<ђ]­г ~9 пYўNГ/[Э[H­NЕMё$вћЁ С>vX%'0aGф ƒ Bo‘]ДC‰ц3Z*FšцtкМ ЙvWЌќ}BWŸЂ†:ЁlŠ Ю*хŽ№Е4ЊєЦ2еЛ,єtБ59z^й]PeЖЌJ(BœГжNftq4"Ј|—v/}ФqэЬ’ЛaЏ5ёГЮю-§ JŠ\†фЪUmG ѕЫЪ.6ReyЊр~ъaI™NКl$! З8єј ЊLЦC”Ня€6єрUЗ#бёѕхИ4Чщ?яцУР‡SmuщЏ™щТu!ЉЈDI–ZK„-жхЂЗŽФžE^wgыcЌ\Эnњ%ћ^Э­ЈŠˆlƒWQЈ`J5YЗЏJCВUл'О1ЪпСЊ RшSxPП‘юхe=HѓфЖЛJє2`:oˆ=LГЛъqoEe/4=„Ііа_doXrPЎиб'J\1фу*wЙ{зффЌЏЕz>œСТл9еЏš•‡jЛш4Нп›6f‚†b„З9ђІэiMФXojClbйо е"ВќЊіВAѕ•†8ЄN<і~;ю ЛIЈ/@GЪЌђТCѓФ8KЧ€Р(в\,ЄО_diwЮ’…дx˜6&Qƒ9џdС!АпG™І™s"Zp9ђФ-z“ш,ZІtп‡ЉњБЇ/ўiC ^žЄЃєЩН/ч{ї1Fю/ТщŽњtIЃ6ћ ћёЏЪЫ}?Йcщo“x>љ”а–яЈОކЇat”$0Г‹™{ &Ђe†ЮЖћхлTх[ёn'@ћЛ*B/[qдj/Мc6›gФ ‡=3єyЃmпќг§<7ќj‚z2н{™ож–Hх#§jЌИ~c—x|ЯЙфRЯюLѕщЛTmZф! )ѓВЃyмyk‘Q}ZhУС‘yЏјЙV=*dl w_ЋбP`bЌяZ .Г} 8LQБЩ{ЕіbWЏѕlп_щбlлЉЊѕЬ#V’5;§Ё|н)†gёнšО ž]л“оКїŠыFb”ђgЯtтЙЏ‚ЇŒN§"Ў& Х]дљю?Їиаw рц‹ШXXHзzРѓ˜М25} ‡Дмѓ,ЅlСї|ƒ"лo@ћešќ*„Ан™lЙюн!—ъЁбžЯHw|)U=VuƒъxЪ(KxъNњОв'јЂ…gЕeЄтd9'8:žчETv.є0ЗЈд]OЋЋШE~Ш]ЁЄeюƒ(6ђ]zёž_ДžмEђЖ? еkљ ЏДнЎ |К&nс FяМ#ХN€|€зьј|ќ+}7dOЅРTЄЦs!‚GѕQ|_ЊBCлVЇыѕ"ь эЈYј|gіhGlбi *ЗяиLœ{ЮЮ6™@СoОwPqИМDвa|х—w9ъЯУё—0фѓAМИ†<Ж›5тКЦЉ"ЃDГRJдœк *ДGь$щnšњTВЕдаЏЫ^U Ъb–*“ѕ™ФјЊš„“ТЏ“ž4 )c•кzФОМж)b•ёньр„A:4ЃсІЦf1@3љt•G‚лФ\{тˆV/Ып­С щоЪВJЮIŽ]яuяЇЮПЪbОкртмy$ocЏBVж|ьЫlб;цЈ8)юк4ђЎœ œzжŠе Qo*03ЦЕWDВќ ym|і‰ь|Pn„ЏйWAЃu іДG В§)сa7ЁIš>žД_0-#ЮяjгP$klДџaŽлsyщУXц•у|MHˆж}ыpFЌСЋЎФЃpXй,$‚Мkиыш‰[h8ŽdDнk8‚з ІЁЪэ@mїд,рФg/РрЊMвнћC$hs†ЛЯЏzх8/нђЂ… ?!„ѕ"€\kŒњVєэ—0(э;vQ$їс0Ђ№ЂѕоЁПђCfQоW6†Н€xГЅIўыГ>M^WйхDЯ›9^иPœ_э ш:Џo”0tЦХ%ЫU,\OвЬM 3%тŒ_1Rѓ"vn—І0†C%QфйкЕ—\МУёљњNwЯн•~бC7vФHЧ>mƒгІМ>АЖё2ЇџЧWG‰8•eбЧБ9@‚<пИн†Ÿї-9–[CНHАŒ=ВЏ‡€IGнWr*€јMЏэх'Š[к0ŒЛ’;Gc‡\œ4QH9wЃКцдТ{Žо#>ѓ] ™@Р>kсДq)dшІŽЁƒ;U{?яж˜КpMIЪ;і7tˆPNЋRD*gweqСимEšыѕ8ж ˜уcU ~Ј-7wЏ2Ÿ'Ну{Аs Ѕ\П%pЯѕO),­3т~єдwZyжЦЦ'Ў-М иkdы ŽzјЬеѕqЦок?PNŠИvџ)lь,х1[МЬтkѕыoАgmђцэI­oЫWЗщjреogЦŠegд’ТhJn’Я;зрKЄN5еN‡вИk;X:сŒЩЄdXp1ekњ1I{г ‡;QŽлMŒъЧЇВьkZ+^ѓ›ZzG'ХphVH ј)oъ# чљъСsЬH8Ќљп_.cїэ3m4… [ЈЌ8m›ўє‰Ь ›§…цEХn™0П%t[бЎ'/ЙкШ…—6Цф­ уюЦ`l?ђЦй?Їu˜јƒKjubіє&`nЊуКF9Ѓx“*ы-ОЛ^уamў”‘…‚с+я>?ˆyDцœЊЎю›‚wќMЩЉ2’d•O aJ%фSєљDўE‡LйЛ"y‡~”bЩpмпRО?Ш"ИЈ^ЇВ'Э/іаЇЏ ‚4ѕWiѓ:štvВ1yДѕоMјюЫMќ?мќTЗEЧ…“4ПтgНзiZЕrЪхМї’пУcT1ЌеBŸiєNEзc UЫ­љ…— WƒЯЎДGEˆ“W=^ЛВŽ‚‚\l(•ЉоIйŽншЉЎE}А?.!ƒ0 Д4Ъe,п§e{0РN=,а ц ЏbЙ 7“з—о™ˆ–T–Ž(йmonУœGNђ#lrG„йЬ *УЧИалŸ2D†гиєІђжTми§%eх$ИoХІЉјŸ>Гр‚6г}Ј№Ю Дњ–;ES_ЏИnIsF }U&…Iёу]lGЭгАуfЬ4XЎПёQ]УжшиЁђQŸћмur|шxфFг‹6е}OЌ‡`œDgYЊBъAтЌдsЖW“_ТЩ |m—И“х_bіiе”)ХЕ9ЇRnтЈoJ•U№ЬTє–Ђ_)™-Ђ—І$МДЖџmo0}лдЕpђБ’Т01М‚ˆџZ]r+./yэ@?иqT>8VЁ/еr8ъJХƒі#ГЪы"Š~‘Х­lЙlЄjAXцј$[МчЃ'™“šxš*фХЗяу фрЖојaиЗАЯХЭснЗ•$uЦя8Wp`}ƒкoJчbїМ7QЂЋ7PA=;”.iФp>ЅN[Y…љІ.ё‰•UШьїшЄKx–)ЧuUVеШ.ћлсл On†k Зv*;šћPK,wP.ЋёoS6§зEgЪœ(8ЗЁл'РМ_э$lОЏD4ULб’aрсЊМpTrT ’Gƒ§ƒГJЧ LАгІMГ šЇŸN4 єшуYrXi„gQЭUfЧ”Й+а*')Я)mгяXЪсЮGbšcAЙД:щѕBП!`^}У–Џзnе-ЭДЛъЃxzёЭЩфb#ё”JA&ЗyCpгЮМф4…q0ђ uЊš.Г.GућсИ}юFs1'ЅФxМ(ЯЌ•=Ќg7—}5Цљ‡[ о 3)ћЇ:ўдЅІtЛzjОyWИ*ьСщњJoќ˜ЦУэ\гМгќќ~(ŽєІ!žKаЄž‹(i1uе Н1VcшЇЭn№лC:еЪg 'зЅw–ы x[ь,м` Ы qј89ДљЪ ‘GЮ0і3ГШhлaфЇ”Џ Ђ‘–g]',ЙhПі(txђщѕ$щ5Ф}ѕZ[п[6OсwёuMі+uјye‰СdЉѕТЬ=яg,ŠєBCэvtyСюг^>ь,%— еЦяbe_I3еЗ<}љfЪ%9E@Хk@Q}4н•ОНp№b ЧѓPІqy+ЕяЏБ‰ bs WТ`ƒRIГуˆ1є$ђ>И‹хпcНярТ3іњь—•ђ6_FcZžsчž  JŸ—xlњДЊІН&ІˆЈ ћ”л4\’ќђ}ТѓАЌО›з‡§‚tмAAЃиeич‰ЉЯ\ывЏIИE[#-!—‘ l.‰Цpjgœ‚Ѕы”G˜ЕјK[Юdu3mФ жgу‘љ5‚ €вШКопзъ}щHPкжј­>4:GИ™2ѓМ+Ќ!%bй+8њX§*Y‡Єь€> "ЉR>3э|†Бм­Э!FPjЖpЖ$ї,]2лйžД"*КBLилlJм)Kqv?нIы§t ^8eв/њ> ,6МNn,UЃЊ0p=С&BъЂ]СAјžйь&Л%*z‘RЩ -ћkђІЉХ€”7fН trжМОAА“О-\!ъЮшЦ++КшЮqšIЛGhг“OД`BЧРžssFу9@НЊE4,Bч*Dё0DSПhG_JOЄbШЌpкюt“‰„o€ёlь;~;mOЛŒьѕзяЧ;i†эёВвxI†6вi’лжЊ6 ј.3І„glБ3ž1Jmv„‚ш'ЅTwХЈлЪwГ6’Гj{р—t@Г*І§aкzЋZЕz‡цх_žт9ђ*ŠЈфИ]Peƒ)рщФxУCI ІJŽ‹}жу \qјЦ4‘"ѕПY!]Wі#ЮŽ‹I ж@vяш{оjYvЅБmw…Ч‡ЉѓЋLћцmю А[ф‡JЗѕЯYЕOЫ_я`+ВЈ 7ЄxЬKи ќMXхbkyйDEЃљфбIљ}pњП ђДOФNНщїРКЛ“j­ЛЂє’йЖvЪ(№y“ЯО”ЅІ=МFטЋїйpПˆмёЊ4šeŸБЮk`іћTЇбФC…ЧЯR~ў4чУых†Uœaїй‹ ўЛз#Ї‰§у_V x†эс~МЉѕ#M7єwЌKL&wл/™ЭQ;шЈ'Ощšœ~їee“:§в‡X!O$Ж^–PKt /-T>s_йЯс€љлžяŒAn“џшlGм–r@ЧhТ5ƒWˆџЋщ>œ†Ю4ZмIбђ(–ўЦ@сафU­оo?сЫёьхcЈ?Мz§ж:ƒs“Ћ%*—ДЩБjˆўўQюКš˜ˆЪEІ r‹Ѓкœ4aBнљ››ьЈЁ‰sZcо-%§L |yр'Д‰К–кў&ŸzА)уŠ:\j(%1оЄІ<фEЈQ‡’Вwнy§ЕНЉфћwяfa&tjrv$-Ын.ŒУЇД‰ §б›м'\~ђM˜Aхѓ$Vьi )sbxdФ Ьdh~•bЗРvh<Ё"ЗЇKsL} кцЂ  YЕЂ “QVœFо”сŠЃ)ћfzх[я8w3SGЪмбђlFK{Єн@D­Ф•Мђчх"ЈИ4k•– TBRKUгŽХжшŠеƒЯЏmјѕГцWH6оuєŠnŠCгo–n’ЌG7X\o=жд0їФŠШІ#џЂ:йС7u‡%ЖXЏ.4Пmo19сЧ яуШў{ёц‹ч‰‰a6Ло`Š)fрСЛ3єк-яїŠтxѕй™Цqj-•ђ$р”tF]n>Ё%ац3Ф[v)ћŠ?Eјоaщ­J8”$qЗГщr`ŠХ{]—“3b‘K.”ѕРi†‚ЅоwO/“еŸ,тLьВЇ<>ѓ~"Ÿсы”схNTейгc+`Їі&5+Kй=_ђС+†e} \зиk'„к{Ж[Eъш­\aц›ЯёЗыПA>АВЇM •ПƒZ§AЕB˜ЛHфŸ•ѓЎZв Љ‡ЁйŽZЎ{4HxъT_И\џcc­ѓEЖч|tћдEЩЃЕО=tŽКgсE~mkеŒА<_ЌЩ)щŸ Хm€:–){ЛT_Ÿћ46_Iб5’kуХGНеЋЈ^W2Ш2п{’ œsД5є­*"fЛвыє7|еАлщnїQ№b*Убj ъз7“p˜ke&ЦДЏr_юуC F늘ч1вkoTх™‰Щ^зСЏЊkЛnБЋAdѓ™ПM7@иЅuЇсс~L"mыnЗZЧЬБлыžёN&”ЄACEq– ‘Ћ(сќvЙвљФ—$ЁЈŸgP‰g5њЁЅSGР’uЫЃŠиэОіp}tђ˜eгЪЋ-Я2едй~SФЌHˆ.цˆ\mE GqD яч№sџ)-МуgН1С7|жH9ўŸ$х|‘ГВї—Л$_‡‰бјъЂtœkZ—нЈФј#ђРx‡?O~B№4ciК`юo%єs|iMюхФ7!ЭЬ§T8‡ЫЇ[ƒшд€ОdЫT:!ˆл;RW‹r€ГЌЛ `ЄjWЂ_ Н4Ё}G?ЇЇxkВ'Ь.3њкИSjLbфQВЫћfmм=ЃDFЏiЅэЇ˜ТSF­”žз‡КsАчФРTхеBж$Т-Щчƒ(О&љ&rTІvgФ1s:7ћиЏЖdУЃHDŒАvљЌЈXФНiЋZ”AКМQЊDЕtгu6ЎпыGWЎˆF>вёBbКЭnMWƒhВ™бš‚˜;œЇЫЏ—mШНќо\'єИ~,{7лфУЁјЎ!А‚иј6эШх-МLКэYovGЬрЭxc 0"ѕіч^аŽm^ЁbЉBh‰3ѕзКŒЌ’A 8$Їђ‹Dq >ѓFšNЧ:ггЅ•АкWЄ}s;0qЎыu:ТpcЅ=„‰_юžХЕЈzй‹Шќг#žХЩючOhKд]< GWЛ ОеуKпЧ,fжв Р ЗBwˆ1О п6Љ†D€‰ЦУѓžзУli‡iб Рф?yF‡pmЖЧ/qŒЗ-ЯЎЦf=Ÿjс+БKSЧ;#/w\4јВДЕЎЌ€ќšЂгІ™Ю›g^йV.SœmJЂќЌ)€яќOu&SЋk:˜QUГN№ Bpй1[E|ЇВ§ФЋс #rФ I1Ўы“пюmUЛІvz^їU1 є=-•i“‚!юVŸ`Ј‰™тчвмХШСWsЬIh9Xі ’YЇЗ_zmŸjsѕkP‘n…ьМйƒN6СйXэk%Lчг€DœЗh№{e љ‡Ћнq‚0„Щ4ztW)PmSНrЫŽф9я$gШЯч~O>ГzB“"Q‹бiў:БМ…лВ  Ћ<^В З= KЖщњу[ьUc‰ОсcІлђЉ&љсўfYэЎ†^*шоDЯбK>ŽG—&эЇ‘WъїƒX‹Є.АU у”0.…М]§ЫЁу)sпIˆcЄZ‘}Њ•…z„‡€GФЁ[CОФHИ~@ŠљУLч4f]ЮRdбЁ$cЕ%єкзŸqКw“еъoЌІQю“ЬЖоakkO•дqПсkѕ]еЯP6я2сЇHЫ†ю(ИѓyžU"У‚6Дп[зм єžЕіZeжaS9-‰оѕyŽЎZЯњ•вТrФy“їмЏOР‰D; „Ић&Ыт}cŸu]їm}ёДЄaи$‹ёбшS шб„Š‘ZщЙпœl€rѓщвLќпAлЩЖђ‹ШѓЬ'ј)CУ5—lОЎЏƒ‘Uф™:ZЏW>лџЎoЏtыидЊ%ЃF›ВдE#yY=ЌIі$sІˆСZPЫš9кЁюoРишЫ~Iv…Єїё‚‘"Нли,AћФ Йt5Шgќ ž(Вё‹{ЇИЅЈjэ У™К“sіI#4&3›чЊ3њфЎО|vцќ AћзШ‘ 1WBR§‘ŸЁГœЬ=1Ž MйuхGхXŒjкM‹„7NC—Ўф'ІьЋž‹У2э4ъ7Ыg™аштАб. лД)qухтБк‘ЏяOˆ`˜9І]ь“QZ ЌN@і{ѓœЦъu6ђŽqјђ­эПЭЃŒ‡)4ИБиRи”^8”–=А]ЬкtŠгdЧРфpЄCХfZЈ,%p<ЩЕШ.йїh’4>у%-“хoXгМ’_/ЮrЏоб.ЃщЕ[ORЁт+ч‹rAš:‹ѕаС‹пŠž ЬРЌГ1XFЭTŸќ)™ЩЮ*˜ѓ‰iє =Ђт+<–Op}кРИ„VГЈёНтвї{ЧcI‰‡ѓци”АЂ•Хs%GOК‰ХЮИdtё*нПl‹ЧW2ФiЎuлCр~ёє,ЁXёЉAдњD— ь8гLэžш(‰ќ!Си)шъШЯ(,5Ÿ{^ /’ёœў5?іШЬB#r…oTі'1MЗYщвщШГfПDХ"ѓqМrOцЋюuзвкSŸŽK‰ВqIѕCVK`СЩ”‘е‹тZrИkљОuсн0Ы![KтПfэ\щеЎфЎl"‰і-жь5š7рЖдэўФљ(QhŠB‰кˆпCKvпH2 ''С.ГcфўB 1IЗЏлG*>ƒпЋŒˆПѕ†N>ABіЁJо^l2мƒwо?l‹ГQУљ!uСћ|PgNТєщЊЊљQl’гVЃ%=г›KœдиЛ`§uОQ: 1vФСJгщ~ђНЏјzcЭђuГЯgZ %!>ы—ЫЗЪt*]ЗQ†pЗ–ЎоšбШгUзmŸъъ?ХЦž)Оaь3хfЛ?‡МзuёYЙмщ,‹с`ўˆlF€ЈНh‰)^эрL+Ђєф}ОЖ)Ъ&šGщђї7-ЄјšзгВиЂ&MВŽъ ыŒоЋ /:{Лlf)ОЁc$‹hЈ`7LШ0М'\bTлG…ЈчЎВYd?Ёa]ЙўzХ2ц [W Яфzp ъШиЯ+FД_Л:ѕЪS‘Бs*8wЮhбh?-ЬЮЅBR6АбІ№пЬ5ˆЩ(-sK~щ€ѕАНбЖbІ:VЬ1?ыО9њDžCRЙ#RЏш—тлF ЕШ\ВkvњyFИЩ§\™8ЃЯьрњаS:ТЪ5>Ь‚…ЗіЃc4ubЛЉjlN N•ŠЅj2k‚ Ћ8"[p™Ѕ#a’еЯgІ\эyT],ŒЏ7FhƒŠ‚GsЯdКy}щЛяЫT2љЏ-{#т_…ЕC^KYŽЫљ>q ЃэД‘žЙЃдЁК–1pяPŽDВї08 ю%ѓŽI0MaZhЮњ—' ФЬЛlЖэ>мТ3єа‘6мŒЙєW;|‡SJ(OЉнЩY-аE>ŸЛm<#їbBБмd=> їУПA5}ŸЫжнœbCtрb†ЧЛ€ŠЂјCдŠЦё;9sЗфZŸTљЅѓWžкB?2E.а‘|ˆ˜И™F<‹šCЕ7GJВй`Ўэ.aŒДэДD(П)A,9ыcYЙъ,тWВщжAk-\l’ъ‚\k˜ѕQƒYkХШе {™ЉРЎ>a§еEіїЮ•‘БДЉц$ЄXтVЛFщ’щJYљ‘кщІOJжЕ‚Дcm'rЗЉ‡œњчW‘Aгk жўgvLяhе^з%ZМЭjз“;1Bг|/ЕXэVџ ™%ˆЇюнL‹r*)РЧлєйzаAЕЁіA™2—$,хёвЋ‡‡’ bљЈ}ЕЪB2АCдЩ=U?ttЛ=ВbnІЉЮŠф=iS\jCаКH_ VБRАЎ RдЮ/bГ6жuц-ЗžcVvЮњлnGCLИSA$ЧjЋВAСЂсрHъњБ*р{œCЖѕѓш6?зЩ-sхiBи Э†Геf‘‹Gэ‡;лљЖ‰hzнщгTмо[@1Л*&AЦВ™ЙЎЯ>н^Pvш&о]„нчНg~Š–mZˆчтуѓœeP$иЎІY{q§(AЇт Hэ.у’ТН:†hєбАWУ—4Я“ЭA=Z;šlЇЧhч№Ы;QQ<ЪъiИ6KТqйУ?­іг œЕЁ’œs/яON*(H/Ќ]пfўšяб‰Љш?oщдќЄ˜џоц’с'уgETСфEЏ|5ЏjUє ОŸ(ŒJQ/˜Ћ>їŒЂа]У EwAgr.iY\ЮЌрtтЎ,2‹Ѕќд7š7С{іN*ТLyипZƒ'—xСAіfб)КЩ"˜jпЋYsмnQ‹А(*pGž>=4“Ÿ_з#Щ~мYЁЊž’WЂeъ+_rz2С‡Мˆ-N)?˜&шќ65лOЗœœљ‘vИ“—RГhШчгJšv†˜лсо)Г!=ЋЌ…}юф†пН;Ž6nЫ~Ы2д2љпdLГYNвnBЃ’—#тBœпWIYD‰ ~WДТ ,К`5ќдаБ-H[н™mМќ3[Љ _L‘LlKФэkдЊ‰oаЖQoДUŽжТ–_y+ 1Џ6œ˜Wи<Ќл~О_YG ыўBа$ШЊ"O•_ЊƒYАЌ ž+m.ж;7/ˆЗдД —#|–VЕгpљVV7dъf˜bў’vес %хљ:6ы‰з1Ідyзн ы ЧbjГўТТћЎЧИѓŠ ‰Ї Њ НЏH„fнŸ“/њ YнEsЄklДйхWйjИ€%nљКЃ!и?дч~ПЛ…щюД~ѕѓ4Г|ЫGЉ†шй*ЁГvю™ ўG?ќlZС<ТФ$€к/яЊЬю tёч@\ƒ fЄJVЇКј["ИмїAЩ!МгўœВа rЎ8љИt‘Њ2ѓsкуšP5ЏўbжЗв^шпЊЗ',Fы NpчУЌNкжAYЊ{)0tѓшуЌйжEк”ЉљшsЈШ•'žG~BMЇЇфGЛ"ЪsУб v5eleЈS<ЧаЗcіъКv1ЉЄL3ut†вkаyxXƒJv~p ЊcЏЗVЇ8T<>y)3$ђт•n\Iе"\уysЁ”G0*“Ѕ FЙр?ыЛmЧЙЮоМ•<r†дQ[!Bˆ[Pр-ф.БТІњ^/RчhJњ6Ѕ}cЭ,ћиФžц\]fšХˆŸb~P†Lц‡Од:2HЈ• af 9ЧПh№3ќЏ#Ы0=›Œ~Ід>ЏMV~иќёх€э%дЋ~Л|јA0|ЈЅЈ9\ЊоyEШ{ёхЫтимP…!љ…рŸŽЈLЂ )Qixтnb›ђнЙX]ІмНпКшЪcѓt)bрg Pt(CП^г‰ЉE˜vŠ6Žx;YњzКЈа•ЯUЂm#ЂИІ no~|ъм"”Geљ1ЯL-њш‘›Г%'\Б aЕ“mR/ŒЎр!‰`Еия їƒкй5xвХ‹}#.JбЭљCМqУ”oц7Б!sGўЬ‹Š)ЅYj!я>ЇУ)wМ‹;IkЅxн†­Д”tнŽфЫеЭE (ЕФЉ‘ЖАЅЙ‚сo}а•ну„^>‡jGgЩ?ZVsн ж9Њ‚Žхе‚/—`єЄWѓpЗцОcй~нЗ•аŠЛXЎ\Ы„ |ЦЛЏ"%Їи#Q™žДIzЯ"•}§$ћЫe~mЂЯИЧ gYй8ь3ЪVјЫ&ЮšгDUџљAŽQgˆVІZз@@&šjтМЮђзгяи;”NJкBym'ТKс,Џˆ_“n0†п*#oмkєЦFQj~rХRьimы ј&кmƒЄийr/рWV/ћVА3n +jЖСJ?=Моw‚ўYЂрмѕІЧІ улэШ97 і™Ot:‡:ѓбіWЖкЬЅЋјPZŒŠжbЖŠŠ,КиžЧЬ$>_(ыŽ*Ё•‚ЇhУОїД]дBЅ: ьІ>шЃі\WHDЙАVь'DЖЉ\МњЉЭд{Ш ЩIд\ёЮоŸkA3™хž–5ЏƒгgkZ=ЙЭTшкZпГ2йMS`пSŸšщ8*З‘_N-uё“ЃА‡Щm6"ъ‡Ыэ4џ;і_;i+dYS3(Ж†zїС2)7њР%R™^эqнV†#гŽы@u§Ф8WіќWРЬ­o7фї~8i˜гу.,„y тл9Нц'LМ 9k 7 ;ьdэ”m}Ј\ч№лbм}Ю7_ОI}ŽЕ‚еђйяФъ€р&ЙхI~xlŽ 4сю|eНоЩܚژhЕцљц#, єЏ @!-q_]Ѓчиър–D+˜ыѕ \•EX'ИЫW=ЉСЖ# а.ƒі?ЙХэŸ<[žгBdr™љ еl.їЎLЯ1 p{ бœ8W№šФКАRq‚"X]Ч=щћм{6О U•žЬ†Iб*нвOG д:˜/АР•XЖ>WѕиЖžъў<;ё2П›нвЋљjyр]sA’ё ёšхаЁЗВЦЙTэ 4Е7^jpщ9B‹“„9."!›кGЏ†KЮfГ!&†СбћшŒНчTTc˜BњњФ[ нФC]оПБƒeЧj(!‹WЁњ9СWЃџЪ•­с`ХCƒ[ЧЇ^ю+Юк|„ЊЇЗJэОњDэHeГFGNЭКGоS хk6™С6CЄGћ\K‘%]i5Љ>?C*œ<™F їxWK=іЕ†фcдї ё[в0NЏћЅІ}СД }TяЗ|ŠŠ<{bнГuЗ STнt*Qx”э94=rØз=g•|96s(Шhbи'ŸX>ќЈЗ„e, љuu/aЅy|dƒqДsК ;!tšО'Эd№B†0Ц=(ђ:жPР!VЩAїHEВ%k‹ёРЧџKДнdwa—Е[/ulц4UqЁHД_oіђи9ЈY&јЛФ~tž;™ьš\э˜sžD/…tзМwWЁЦЭЯЋACєФк.>ЕŽgлТiИиКЙї?HDiжœƒ ЈлШ'…ёѕю_2КаѕP5RD=нЧPT/ђё+—ŠФ|‡ќ*Тl4ю‚5ХП6+ПЖ;Jі6фй DTтŸ2„teЪп0nЭL4№t‘g{Xn§%!ЃЌuаъz:џFЪЕЇѕ€nž$Эo2.њЊ|WLQ+†ЩFфUЩщ}kфu]K&e9„,СцјѕR•њ[ЊP„FЏьч{Е-(МŠљДЃЎшЛjЮОOжЂž’бЈ$E˜;хшцоЈPxј№ +кNѓуи˜мШЊ§ˆ@h[юбM–Г‡)Х9­Лsв„Ћ0уіџ5ЮmI’ˆƒИGЈщŽŸ VfNд §ЋГšЈ^TQ›Q0JыGР›сMcwлФqУIТјWЯО#СQзДЧŸ§rKмГ Ь`Уq&ЪQ˜_Л|LЧpБWИ2ТЙБ”Б4›Іf8yЃ&yЊ?Ц›дДМЦ[:XMж™M6NŸЬQ ЌИяœ^ѓoАљ\TVzK­pZк‹ЙПпˆЧъjNЮ}?ІТ_wj…™Ї‚.@%щэQvaѓ›Ž^ї™v­и‡')šДЎЙТ]‚—–ўЩяЁgхh­^”Т"ѕ~]€о\ћ–_HшёЭ'#+ЛйО<ЗЯо5IљwA&Ўb>Йž0TХзѓтK­gTn;8QLwiМhˆх%ž~удНы8Шёg<]є§‘лц§\ N^шPžСюСr†$"{jлDmєŒЦešу вФШOяYЂхs‰ŠER"МЗ ќž€ў#вуŠЄW_5_­и“ё@ о;~_MКf†›)ьnВ-)–Бe™CЂћЩ…d1Д/#оЯan?ŒЋ];ЅАЮ„ыПŽЕя,Ќkѕй#Œœё;^=ѓŒ1 A+АBvЯa>юˆ(ЦT№>Šoа .БЯ‹љƒГъб@0FУWиўџЪ5эПІѓМ•ј{Jmq"жЬєŠ6…Дƒек~јы+ЭЂпЁ„E4,Х.ъ?a7хњ4 НЩЕ‘ы!З.4j&l‘Л‰Фф`,•tўОNЃ#ДЉњiДэY ЮЇ"й­И6ыХќЃЗeˆюFEМвоfЕџйтЮЧCM6Ь;ве8–wЏmА}CЎё7Ф5’ˆо$и:œ-r6dХL— „’u Ъ]VеH+njцˆи‡њьЬиЁ?“r9/dŽЦA”0oФ ˆ\sЦн зєВўЭ. Ииr~k[V”jѕ„Œ‹mJпЃеОuЌІлjZ’i 5­ h[б]k–ЄЖ”Ј€р'№ФвэфJkЎкШ”А=Ф€j]*h зоЉї~–дь—4r•\|(jўtUSЩ$лкCр5(аnBКЉ‘J„œСу™тЩї $Рs{ƒXџ7$4ƒЊйu‰­Г2ГœqTŠМфдХclp5А…j˜ ш,aCV{ˆЮ„&§(n€_П—БЖбqYEŽ…5цјЌлЊfёFћh}м)ЅџЫxЃCЯ:ц}+eJƒ.•рeˆ1С`ЛЧI…Fz_ˆљгЂŸp›ЫKкнjv56ЪŸЅž„‹.]rXКџzлќ~Д™Т;]Kf3є”ю8…F5иЈв‰ЌЏК~ф Pя0‰ŠX^э=РтЂdDЭ]К‹iо6„QуБвP№?|{Ўв.@М1Ÿў ‚_э лЫP|ЧјњNѓdsИр э’Ўжхf18ёx:’(_нД8АЋh о[ъїЫбТk}жу …хUќ9NRл%ЭЊ“оХЃn›lojвъXєВšР~жС›ШёШ§пЎR§Ѕѕ.’rш’‰єх•Ѕ'ЇcБъ`УЬЮ:sмYл… яЏА–№o>jy•ПШc'f0лJtIѓиЧ…ыэiшˆћЁтыЧ1’ЖЇИТ“Ll‰On Ъ•Д.ф~ bUš*БќЪ‚ƒхAќн‹фБw—†ƒЮFsм†т„Z,ъ!–YюЬЁA6Ъ *_)…гЋ13 яbP8 —к€kpМ’qЕбз~ ёЕIЈНE Ч ^жAЦ;ђвеГiSCМѕLУcФžФ\ЬсCЃејКWŒФњPљsAI$ўsЃИqЌъНєж:цЮЦxљsGЂdыа{Ж‰ЙxqЭŠВЖЧК“ jїFџbм!T/‘ќЄњ&ТXJН[ФQпФём…Ж|b,у—Сё2ОМoГН‰ŠYТxЉў%Џ;ЁŒЃXnУ|=ƒšNуЈS=ю;8pˆжŸцKщI<ПZN1ћz—СоЈ0юБВ„еКUFх§|Яп\Ž+@Иж•_“œWEг›ољJФwмnЏБ„–ƒЇu†`ЂF?Є?YгХПqS-7&У7z[’ЁФцЫИиЦ™Є%L‚™†дšŽ_н“МжWЇзc_Ѓ8жWмbоBўD˜%›л^€јqJ.~‰Bƒ§еЩАѕя–8 $щЙюЗˆ„e]’ѓёWЋРд–2yЇѕRŸ]:UaЦњK зjяЅV:P—“ћZвMvWEЫ%тИ„‚CЈDAy%Я7oф5ЂБ„u-рм])ЉлізчЅ˜ЧSTЧ‡№Sa'hЯеnLџ€Њ{HЮJ=СђЯСљњс‰`™У+§*єK"†ЫєVbЉtb HMЈЩih5№F\ЁЈЗЊсЕ[к­.w?џU2ЃhЧŒ–ђиЋйy‰Ќк2ДdgE_`W^У<‰Хˆў›*Ž9ЙдŠHЧььеFфaЅ00"ЦЦzќaqUˆа"uqtјЉЬzоS?ЖиReТ4EWѕSљвZ0Њs_й§ŒтNgхіИхpНЄ­LŸкмre!;}WЈtYP6лЌЮšыаNQЕ•ˆРХЕžќKwХˆвхџ—OЂjžєјг>‚iтЎНЙЌ9ІˆИРеEк~xт•№LйлumўBJ1 ^ЪsяŸ7и`sћЃћ]•~‰CŒJя…Шш"=Prv‚2Š•8ƒШПIт70ј„€њЈЧŒF“Яг ]кРйW†Ѕ~ЗI’7Кщ8 пJ•?WЧЂ‘‚б$M+ІpvlWGЛt †пW„эŒЛˆ KЕЫZH˜O•FСs—‘ьœЖd?ЌЩУPЊжGКNэe“лъјWћDBР$вkK(юЇ;TLЧp–ёЫШМ~ѓ/”’+гВЬm[{ЩBєH4EZmзй[0˜5 6д]›™"Цсd9ДizйБ+KеЎ„„@ІuŸAф ђЙВјёЇM-уɘ(ON.Пцсn) Шч %Чє˜Б5–ў'у‰џЊC‘z0Уп­1Э~@ЛѓныоYlНРЛ Š"6ејЙр[КXGЇ$+УœWдPW3G\a~GГTLVб&ў­rы% с*ћ•\Т5ђ$Ъ  шФЃи}оуч–›miІFŸ ГтЯoVхAƒŒєИ^\|˜й.ХјЭ>шjWЩƒ> €ЕЈjfЦЌ7;QmыenТчDrœDa+|“<›#ГиƒЫЕ“ИПЖЂФ†ыУдrV7vњvp\o"ИТкJ)РqnННИЌо›ачЦ/клPюf2vЎPЦ/SЩњ|vќ5`/ДќЏЌ|&ќlЧ=vDлeЂиˆd )Шє‰œv["‚:Д~х џh †\r‡нюДЗ4ЄЗbh(№€>БЂa}Ўh.m№Йя§§dХqЖžЎ ˆ–ВУ+“ГmУOџЋ•ЪHDюdыeЋKщjIС ЕйцЯ}жрhoЪЧsE^WšŒ;ур›Л.К@VітСкЇПн›,J>Еƒ›Јїсп…Š{t– =# яAфДЄ†a<~АмkŠеŽ1ЫoйЖ–Ю‘i% m{I!7rОрьЏ€ГхЂ@:Ь`pћƒF!ЕSлн­ 2ABŒмй0„ŸН ЗЪ]v↧%xАЁŒEmНmкЅšзФЅм8]QB№ОЌUЯBЈ5wЭ›1ЋB)~ЦИБHЕ™L ленI§Tљ?ЄŸ>еt1 XшРXђУ7{ЪыXдВюYЊIћњ“йА[’‚ Хdю SŽ‘Ђ>„ў{;† gУ6;ѕW,n[GwбЙ уЎк{z 1vЯ‚ћu,пW‹АСR8ИT€s^Щ'8?eЗW Al О)пHЕw3З…ћ%ФЄ#фб92O0\]ІњfД>Fš Ю=ЙС–NѕЊqG‘&ИћˆKAš"•] ШЌБEБpлХ>Œ"с_(.г†­fe”В&{ФŸшёа(Aўќwg*ozјЗC^1AA"ƒ[d\N­,ooбєCх}­6ƒЋсєAЛ&рІ†аЉ1oђѓ)ьИЄшОЗ‚J+fїУ‡ЊоЗфђ‡-ББ˜™Dіп4yИΘ,Y…'ЅMŸоgm \ћdжHтт%PEaќд2LŒЮ[В9є{щчCбCZ|…- й_nЗСSќˆЗљиœo' БџoћŠЉїљAђhН„‹њSдyП\[{wќЗOл.ћiжUЬž‹SЉсНњ[­Pрч§9б%“ш„pkii`e ‡э–СН0Аey`ЛNЈbjhNћчІ‹Вv4GPКхN6.$зŽл%iІ Ÿq1жђNHдяЕИХE*Ah?Щ-ќaеЬelVЗЅЦWЗ–‰>Œ4ЙЅšцЮtxT"їџўˆиžмрTЙлЄч…rЊŽЭk‡6^Tqž–œнЭ|€—FNхэ:+Є;Љт‘iЋ/MdMдЫ$ЫПуоФ''бт‘…=MЊH№t2Ў[м‘UJš2рˆŽe8aљЇ!ЧСЋЄ= #вЗ+Ыф%›”%WЊЎWЫ`KAOПЪЦКвЋŠE^Œx уm›~ѓƒ2Љ]„ &l‘ЃYяыЇКgHЅЬŽK?ВŸ-@d<юЩ<Џ"ЗўОŒ€ uš?Jй—ТMfнШ)˜05|ёЬ4}i<0Ін˜AŸ*!дцх–^ЃmN–{еažе,ЖйSьВrЩёж*уЁ8Jћ4Н yu~–}мwТ‚I[l qGаИў э‚})б/ъ— €`Вє<Ќ“м§Cи0™:<е?g 6њvјrs „ЅŒ o‹MjЉVeп Кѓa€ьО/Gы5ь(РˆЏбЋЩqrІз`KZDќИЗЉu!^l`гЫгcупQ„ъ‰џfE\`#^ќ-qLТˆ^ˆŠю<єљN+Usњ‘2ф?ЭЕоoгєdЕЬ"Ѓы•/вžгzЉ+aU5FІљž|=wƒЁъTс!YіМ@вЋ&’ЈxГC§gЙа'{ ПЯцлu@„Чи#Мtr„к‹С^9Оhб€=‡њЭF[ оиђˆьШ (dћFяFp=S0sF6М^НlNxMxСscwqсљ87НgПZнШ栘\Ч$ъ•oнjCћWtм•ЭŒŠ№cч/ШЎƒ[у0Q\ Ї2еяІUЂŸпзђнˆЛЙ!ѕП‘Щ{БДV‘U>3”0ˆТU<+wJsБъЙ_œЮœР5*œУ,УУМЌŽn’юиДˆЄ @еєзџ†јЫвлEІ!ыcёŸŠум81 ёzСHj№џ>Д›МУ]c(Лh"йЭШЦЙіz(ж†Г|єЛхВСЪŒјчЙѓ)МXБХћ&n*ТnОРТr„obп\т{fЇДl_ЗR>іђ˜OziY]Я_‘q„|ШЋЇгІыфhДkKVCњ—@%mмЯ ŸSˆ \тg'o}eУcњw‹сxZЌє%Р8Јхаb–PћZє~[Y•ЭGлєKeв)KП8U4б›qвнs=sѓІЈЪййФwdŸu'žU“ fOцyoйНШuР>†! oъFПу2оЎ( endstream endobj 790 0 obj << /Length1 1503 /Length2 2358 /Length3 0 /Length 3316 /Filter /FlateDecode >> stream xкT 8”mлЎTjB!‘хэQТ,ЦšdЌй‰"K3Я№0ž‡YЬxЅ’Q^KЉовbэW$$yi…KEd йЪR}i{Пџ8ўџ˜у˜™ыКЮыКяѓОЯѓVRttж QаYxMœ`jчт‚'8œ–&GР()Й@,:ј=Qк2˜ќ‚0e€dš3#ГP жl:€з№:x] рpњпУ0#‡@TРNАF`‰Q2E‚BЏ ]чћ_@…Ђ рѕѕuечлR Ш€(dА#ГќР@tE ™8#d…ў6BХаХ 2Рb9Ž&9Љ‰0|TеФђvLR9Ъ€=9\ І‰Q\ќ цЗ‚3BcqШ @tˆТLД… SA€Ў8[йA ќ lћ  ,€зФџЗа=7‚ч›Щ D†C!и AtpААеdqYъІЮЩt&‚і“CШьƒцЗN,HNeИРIa@A,І&ЂЯqФЮAйІš" Ьbbціg1@ zюЁи…Ы €і=ЂA0•6GƒЪТю†Ё`6heЖ€AS˜Ÿ9_hуp8=-- @.Х;З€Kh8_ФЯЅQсaAH@Ci€с D0aLrАl0<ьзТяЈ…ј€ОŒљ9MƒДo1zџ ˆ xрPљсммчЧ?/TaTІ‡ў„Я_1жЩvЇ…­ЩжЪ?Š&&гР-" M :њк@јяSЩаТ.p?;­`шл,zJп7В •{ЈПЯВGPн‚€ЪO™{тДqє џџћ|ЫџІёЙ)џЇЬџН# 6>_WљјЏ:9Ђ‡. PнВYЈьд №ПЁЎр7укTˆјяЊ‹Œzћв$ФД€И еbQќцЕё-Н{Юgt&4їВxю_5д\”єѕ`Ђ’œ/Јw~_бІ д9“Дu2ƒAХрP%ДЕ0<ъF*Ш1€е„к ьТТРЬ])‘`ЩL”.Ф ˜ЋЬ'ёЈFА>dЦQРњ…љЁС ЭA?C<РўЌЕlЭќЅŽТ u,ы—PРВчУпиQи jёyЂдПЧѓя rA цUBйЦѓ/р•}Ъ'Щq4zj DбЊёС зnѓѕ!яœŽ˜NMhЅЧО$нkшz+ёžpхы­ЗuИ€}э’b жН**[FѓщR?P/Б}њ=г–MшЕЙ{зн[ ІњЎ)龘#0цЋJЋѕ4žяЗ4T.Щћ˜ы7"МЅxPSdIm|ЌАŒžž–Ш^9щ|yžЩ ПсŽеfцИqэаi‹ўЉЄЪ‚vgеыѕХPG’мР€hрќ€бЙО:В6оѕ_ЉћЙЬL‚ЪA/BХ‡љд1!“(KsПѕ>“эА‘С(*шоYwѕЁыХЫЎA]žšЏЧЩЭеЏmMVф•v2Х+UЪ їj˜Gз4ёЭ{і!sЧІНLуKVanwЧЖќQлдМЛ^EU+!Љ0ДЋ‘В!J?5&NЫ_з1>§ђРєх уTkЫТтЎъеЈХЦ'Ч7нЋюИ4гІђ‚лЙЬgя9mdУ Зii­—БюjљƒYnEžќЉ(CёЎŒE­ќ 2ѕLjг‘`3ЦFЕsœэqћ cЎяZ‹Иjч(чС[“3чœ6—LМQ›A&јЂ–9’нKNхOЖŒ5†_0jіП)9Кя_Љ$WєіŸ­gB…Ќ{еБ}+суœЊoПWЙGQpWSфЕьлж‚5wЂG„mХ‹ЇS;ѓSмЎЫЋ“iY|ьЌпŸСюў™’= MйyKžЇuяї[[хљVСaO ЖбDе<ѓ7њŸлв;œиєхЙQў&вfМуbVc"ŠGKцЏ:мL‰Nsnгя[mрўaKЪэlОиsJћк•яюиїоќ,ШоӘlэaЏh’ЕНЈяС—ЛІВRљ8ужaл‚ЂmŸ;2JТЩ[#`N„‹3fQкѓaUь…–ГЪЭцEыПыЗ њH^T?—жr}7И*qrк:]м`8ƒџќНUУВ{cБЁTоTДC"vЊ*ЈВѓR„ч†G=ЄЪ3‡FeOемI§‡Імn`ЋqЃВwЈмŒm’ ^‹ЪЩ^у,ѕКъТјэЁЏ лЌЯœ<ЕГ”D 5\dбх|Jšћ8чfЅsšс#їGпmnŸКfйэ(/fpГm%|•ЁOТЭќ›юFг„цбУ*™эИ„Јœ†GGnХhзЦпСЈЎЪ]UпЬќC-@Bq 1Щз‰iЮHіxэщlvєp=ЙкhŸlйю\ у?УеЂŽЏLз=ќN‰П^ЊEАš>6`Єѓr…е1В&.I5Њ%щU9зЃ6eпЎећ4ЈLь,Ю)yЇЙЕY№Жіъ—ѕ6І /­–КЛ6бі–n;З=–кž›ЊІр:а‹[„БЉš8€НхСyуђ$з.СwBgcейсRй=йkЯ?ЅcИ ŠчMЊщн7sёЮВ:БДёъ‰"Y=ЊЧkZX qЋК‡%ћvЇ*ДН П кмuЃ(\Ы<№ЮIŠЪс­(ЎПaхdМHfЉbŠtђйHЃм‘ЄЃїпХ-Dzц” Ф7ёж…‘–Lžтч{И:&\шљJ гЈуd§ещЮеТѓ­ЩeјwqКF›ƒїfдЎ‡Du<ŒШЄ%{\їЯ,‘З‡‹§kSё6ВЁ7Ќ‘]Кs№„аŸ4§У‹[[;кО,f+Хœ+HА4oT>э~ЊKуmG,‡гНЯшШpRNgzяИПщƒ‡DŸШ 6иK'ђŠКJ0ЖДrђ№•Y­?ˆЅЫяхw>8КyciqЖр“#иb7ѕЌъЋžcaДЧI3…ZьxˆСЧй(‘ю ЋУŠл„œ^ |–ВйП6аЕ^%ќе“ЇKq, 1K‘9k_3{l­ЂёД.]ІА2РF7,&PЌ-И,?ефgџмыƒѓWЅКЅг™ŒД›-БхRœфШ`eqЭ‹ИtлGЗи3FЛ:д<тc|‹ЅœŽш~UчљЩіak]vЃЦ@RbпчІ}ƒсJ•5џ„xот,KщКЅ0оК}Ня ƒђDmŽроІЇ3JЉЫЯ9ЏєФJоvИэaЕчC‚зЬЉJ“єgќRыjLйzЉЂ‹ЕѕІЬу'фx›о'—и?Nю ъE­хзох9Tœн“ЗЮЦщrЦЫ Угu7Ц[t4-ЉЋэДЯК"цжуѕьYЁЄ.! .щ”ьGZqZцюœ;Оаw`іџЦ}]&jц/–кY1Ё>Ћо–„а$4Rѓ‚Њ>њЊТw™dŽOЫ№Ц1+†яD6>`6ЉYэ—NьяNIЖл{Г9kћЄ+9ЌPъ#H0‹Sп|4.?Ћ†VШ•—ДyУЌЇ6ьщŸ’eАi;/ M•jLxщуIŒ˜e$?ЩsйFo=tЉƒџZ.ну˜б MЯš‹|{БkHбWђ-nx5)1iЈЄу‘c=ьњП›Bя†ЛмZCOЬŽ‰вяzt~ig.†•Y&sћБФУ@ў(RсщмТе1j“ќА‰:Y-vЁЌr’mьHч—О•ѕG,ЊГ7•“Ѓѓ3ГW‘З3З mŽЭ‹oЪ№КуК>2<Ця—O[ЖдzећbEљ~Њў'ЩТГГ":Ћю+ФЖЯRє•г#С”ўх”UЏ…‘гŠ7ЊяsўЦх §юђќSъЊzЂ8ЭuTŽ—єР-NЗЫ>S#!‡шч›I.,я•{­тшхHєpџЇоi™Уi1§Ž>9}bЬМ0Мcѕžђ<ЯOШвФ2ЄТа9евгр|єb™'1Wу…ЏQНcФ>Ъ]‰mnSл^R™niИoz’–Ђћ"– }Eъг3—–Т†rŠЯ%tь ядьа$|XчЉfўVЧЧИЈBVЃQѕјMћi п›9ЯМ vпїnМN{—$рЉyЏБ=njК”F‘-”г‘џjцМ;ЁПcvуг”C{Ў„ОKо*_БІЂˆд`LЬ.n‰‡ЄЈ/ЎзJiœ4џТьбвj“:Ы№ьˆ UтЇ<$0Д…ф‚ХЄПтŸ?ЭчŽіI}ŠнЈ—$іw<м’f]wЫ$Z*/y›ЋN<8ЊфGЎ›Ъ оЅЗЁѕAzBЧЧѕaчFВ–‰ДлЏІЬ>ШК„—’ШЖrў*Dн endstream endobj 792 0 obj << /Length1 2279 /Length2 13602 /Length3 0 /Length 14958 /Filter /FlateDecode >> stream xкЕP•mл.LЇДt-КЛЄDКЛArБшююFI‘ююю”юююA`Џ'ОWпяџgіf€уь8ЮыІ"SRe6Б3Iий:3Б1ГђDхедxЌЌЬЌЌьHTTjЮж ХHT G' ;[О? DAFЮ`™˜‘3иNоЮ уb `уАqѓБё№БВиYYyџЧаЮ‘ fфjagШий‚œЈDэь=-ЬЬСiўч_-РЦЫЫУјЗ;@ифh4ВШ9›ƒlРFжU; ШйуПBа ˜;;лѓБАИЙЙ1й81л9šНЇcИY8›T@N GW рЏ† F6 :cFЂЈ™[8§#WЕ3uv3rРk Шж ьсbkr€“TЅхŠі лŒхў1`ќ;3лТ§ы§W лП€@;{#[ [3€Љ…5 (!ЧььюЬ0В5љЫаШкЩьoфjdamd 6јЛr#€„А2РмрПэ9-ь˜,Ќџj‘хЏ0р)‹лšˆкйи€lўЊOЬТнƒхŸЭZйкЙйz§ L-lMLџjТФХžEнжТС$-іЏ X„є[frpБВВОу`€ w 9Ы_се<ьA+џƒ;№ёВЗГ˜‚›љX˜‚РМœŒ\AgGзŸŠџFHll  3Рdfa‹є;:X 2§ƒ—яhсаes РњзЯўггЫФЮжкуЗљпћe‘аQ–гbјЇуџшDDьм^Lм&v';€›їРчПƒ(Yќ[ыoOi[S;я?Е‚‡є?ѕКўЛ~кOƒ№пБьРœhSќ#++ќ‹эџ™шЛќџёћЏ(џ7Šџя‚$\Ќ­џVгў­џџЈl,Ќ=ў5SжХLy;№иўoSMа?'+2БpБљпZig#№лšYџgŒNю % g љпФјGЌўз‰Y[и‚”ьœ,ўzSLlЌЌџKО+ јнpѓёo|6џQмhgђз}БsqŒ<XС4bчтxБбфў7ƒ,ЬЖvЮ`И;€Љ#в_ хцАџ%њqXD~#‹шoєР"іФУ &лoФ`‘ќ8,вП8ІмoŽЂ№єEщ7ћЉўFœЕп\ЇњoŽЉёФ Ўгш7ћ9-,€Ž@›џШСЌЫС‹ЕpВњm .Чј?ˆьklфј[Э `ўŽж‚4›пЙўк‹Щ<а x!,џАх$рыc/УкШцp]І@А‰йœгќwр)˜{и›ƒпуп`™Х< Ћ? ИAы? ИЁ?rГЫџ#јUbБћ l ўh§ЁWjџ[ іЕ8l­AІП;фdћWъј_s‚GaНняaq‚ЕЗvqњ#>Xт№›o!гпЗёŸ…pџ%Дs§WRоЅџ” <<Ч? xRПгqœ@6@;ы?p‚Ччdmфdў‡8чя рŒХймєч\Р>.ПKgљћћщДsќг М з? 8НлЬOг§Ютё7ќЏkК8‚Gыќїs ~ ўџ§iмA@ЄЅy; АeMpлC•0ЁгоИр еžf2“з’cЛЫ#*|"]ezр†уpтPњъŽ8ээ‡eвgЏ“ц:јА–хж'я_q*S{­H‹“8п'ђO„kћ‰‰˜д>ь{?;xkXA7CvЪPe;ИМCUЪХzpы“tЏэ/Y пSоЏф–EўU2ЭєY§гЧ€oГT9ЦsxфpЮLФє˜юhГЗw3˜YЏЄ2q H>ЇŸ9 Мt6йЃЮyЎ•ЉБ;uсSтырCпbŽNQ{‰~•С]№**ќД!ИЩJЧ Бhл{!bЂЧR@ЦЮ$ЙРр{Uh<СS Px Жz1p‚КMоЂВуjМрPhz›„QЊђžЋ3~б>ЉdХ†•ЋщМ;ЈfPю6hVЪ0s8;$Гј˜iОсžЯ/Т№Ћ^Ћ™z5‹ЮЯЎ&щЉМУHњвВ PјѓVwˆA?`:Ад$#EoщДјƒSД=YяЪBчЯN†_›ч`‘|š:€оІ Г{:.—“пŽ2ŠTН.HјEœОќ—Д$Rм-і0М sYЋzо яФУнrEВоў;2”$UЃЄo­љ8ЅGфƒwЄгœяФ5PоЇ(№Ї4ЬРgЎюнЕыђŽ&ч[DЭ„RBЈLЭуЮ%O™ѕ_#Мr‰v/šб7?•ЃфP‚J^9{;НфбŠЪ•^і–БгŽ|’‡&ќ …юL Іv’э­щЎVюЊSЅ‡1їие6Ѓo'Ѓс—0yыёШ‹т*СмтоC­Йъ;q0 Œе>ъ(ДМ)G ZНDЉйPKg2ЗlJž…щŠGр›Џ95іЯфКўє4#БТƒaѕKеЯгљЊ7^TG§‰ƒУьг%ЧўБ› ћ=LWДНШЇtщQXд>п‡2 дЭЃР5}<ˆ iqС њ)™IцrЗаiр9 GЦќ;ТSэъyf6tKYaЇЯќЭ}­бї†у*њГЄЂЪœ­сбыƒЈ{oЈН№]b.”Э$&ё \­k”r~4WхŽvw! ƒњ%=Ќнмѕ\ѓ[0"сђЈ;1ьxM—-”льыzњзЇ<рm”g-p,cG$ W>ŽuЉУcŠ@И” ђ9‡•Їx№œьцТЗХdЈаьЉЕУGД†LBMzгY.ŒO#=M]F=n›жПУу1Ш>›/ћfœpютђЪšfЪпб&y&~2ѕ$Ѓx. q]гqiл€ай'зшUЪzt+xfК$‚јаъЗ8‚ТiXВь>I3$#ЋЃvV+}}-ьрзjpƒкOˆгКЮ-#@ УКѕ]<—ИwLњ–ёЙлК?о.у#˜EDWёFЁGp”ПYь љŽ+VмMџ3<HѕІКi1eХЃRFTАиіјЫ.ЦДЎ3Р5%хЫpёћ@§~Ž"›”з ^мюР‹ AMћТp†ыљ˜nл…0RГь" žя|УЪxнъ•|Ї™N]>ЬT‹§ајHшЄZЯџтЮ$SQ6RAc“y…дт!4њЃ/:t‹yѕSЅ2VJR;лyЦ%эшу Ў\К%еГiYњ8ДћРбЉ*\ќђ'ЧгЕеŽЂЗЌ/ќ‚™жќUЛНўйђSвяэЂGѕфHˆ6пзkcZoJЄѕљ†БН;]˜ѕЗЇ0\Ў внŒ OЇx[Иозф?Ќ#˜ШШ„МЉъЛ`=ЛЙжŠ-М"ЖПЫ‚бwО^лФ"r9$еЇZ,М2$ІЙEbUѓЫy#э…HТm)˜ƒџ5ъЙˆ8д^аЙа:вЯŠџ0˜ќм7БrŠеџs™ЯыБ№m1кmVK˜ЕT][ нUвСЛХ гќ\-[ЦШZ’ф‘$ЅTЈv ‹—Х!=-jдФ3‘'w/‚d.т2S"ёŽ№ѕŠ1BчЭЯy^л‘’ў>@кŽ3т.чЇp˜—al4ЦlћЪмюдЯо$?њŠ8Ѕ|91Я?Щ№‰nІ фІMі”О­RкŸ„Lшіqё<ьёЮИ7ыХ€tdТIХр#Ш>tй…МЮСПйдэ;ќШаК]5t#˜a!‰’6з›ЊRаѓиЁxГЏl5ўzЕЧоЂЦ!FъА'ї‹,XЅ˜“”C Jdм‘hgк}іAшN.Чzšйњ?Bwѓl&>ј€ T1I2ƒh9Иў™Хh ž–gчхВЋ[Ж§іnVYš ˆMщTљuFхЧчЇbє„‘1ц#з“Ћf=Œд;щ ?еb4 Іd&бHsЕw TЄD"gЪ“Рќ|Ќ‰УѓФw*чђ™ №ЌьћiыжŸЋєѓЌ*фљJЫбхHi—gЩхzgпМ’ FоgЊ:Z>Ё'^"?{AѓйМzeA.mрк)ioYІЃF,bАБѕЙ,§‹Ы&[уS(ž%ы•зV‚є9uхП~—Œ< Афm№4dNьЙbiйц”Р%нMЭЬЭ/Xй@§"Ьѓ„ ЃъK‹ЗpрнгфжŽAэЎN јPыjS_` пп˜ I'Я#‡ „Њ|ощЏ g#žžЈёўта4K “ŽїЬЧEzйп.YяtѕљKVџтаo№f=e”P2„lD$%е^? KрWђwБlя\"jћš'ЈЕрЁ$A{М ДУvСЕHŽKБНWзЃСЏхзЋlHпOŒрT„lХО]‰њП#@ d›ш~эšgG*”9!uжѓmЖТ‘XuЉm‡ьЫ Х2—‘rєЭэ„)j9K(ќђyw:W9;ѓl ОŠqТo9}R2› Ж”ž•ЌщфtъХ'ХЄрРV}лђ Д.йиВ= [ЂГфнF'ЮЫKЩ]tV№эQAЌг%Ћsœ—яzš]]Йr+Fхš8ѓBИkЎрИod"zње ц‚wЧјRpН‚(C]эё^СВЯ+1ЦУ”F_п4l,–№v шzc М§итkЇЉЗ›<’э#hЯЏ$ЅШƒŒЁQ8бЎеv EЉZ Dq`ёМІzc^љНЙЬjБN%sKS”ц<н UDЉ­jnё[N|$ђ`вХТУЕ§ƒЛ}З{вx$TјŒ~\уЧaжзѕŸЛT –B— Т(*AŸŽ>јyЩv)§Dчf GПђЏfвмЯHЬ8K>ЧдOZ{ЋГ+ЭФ›7пџ9[Љв џ‹EpBМє…іЮЖ#i)ЊЂ|5зКуk)Y˜ t–йижЄП;ЃO0у§ ЮYnЊ„”­x;IcЊ‰љЯTНьШgkJjЬЭзvfэї>˜йеЦъOвxЊ^)Cь<Ы‚—аХгЇ№o$DвЌ‚зi ќaаЬОф}ƒ~7ЛЮYgŠxžL*Oh‘ћK:cКIIq дг;Cцb/їоUТЪ’ЂRО4‘M†FŸЇ‚vи›яМэВпУКРLRGГ>7oД~с…VАВщiŒ#єГ‹ђгЃk SГCDћdи0YВІф*5_P’ЕVC5љљ“АФˆЗН>Рoя–!хDН‹ЊћЭ‚ЈкДKIy™?Х]е Ѕ]уЅBЖ‚"j&ќчP{•Ію~Hs2њPd{@ˆ/†ЅмщQЉО}КXЦєaьVEЬ'ѓЃїыfОЮƒ˜ьšьМ7ЩzMŒЋ‹Џи˜зCZ­ѓPЊн†:wzћU5]uЖ„k.гšс=ъXtDu“5wхžz…vЫbšђЂŸЙіT0№?Ћ~щщѓYБњёŒ;a9Іk\] >ОХФ$Y‘Ѕ†Vиf<оВF}PˆЃ‡РХrђ™хђфАй\LНbљ~[TY[–…_g€qэлy4)iz+yZ—Рљ%Б <ъXАыщ*gЙYoWЁРГЋРе‚‚–wЎ№р/IЋќQdfx%эђяS3$ŠќE­э"*щDtхХveGЧUНЊ/ћ}ЩќF§Ъ$lŸ\о8FЮИЈэˆП>у@oѓГЙЦШYїТŸ.+ACy“њ6З›%Uќ”‡A•аА~–ЇGx6y(œ%7Ы7=>WДї)ВQ:эš‹NЕCk‰дU!В”ž2ˆ(2]бiуббgР6ЯщќЋџђ,ћ~ж:‰еэы+‡Ќ’кіЯе‰Я˜хЃНЫ gк<DЧ[•„щQРи?›eЌ’ђH"вЕ;oWщnjDL)фt,Ој(ъ†%|šE!†r5Œ,§хj8fƒ†дЎ•mоTєœєоЇК“/ˆDШІzЃ zКI м_| z6њі–’ДЇQ-GŽ=rBTqэ—F(K0ёa@ŠgЫ%/ б &еЫ=%q™ђ”BчЪЂƒm8ЌФ:йЅЗAп[љ)3ЇJn"иI?)eOЗŠ€8Q4ќsал„з‹З†вхs‰š&§а"?qƒ;Ј9wAЦРЄSvВСhВ^тašSdу:›ІчŒјТCLhИŒ`WЗˆЏї%RSЊ ГъlSzЭ—FIСАEеEФ‡’1уЧ\тŒмньюuЃрЃšM-Ћ ЁњьтWы€фp5E[gќ<юyr­‘ ЂЛ‡Ж=БhSжa'^!тОЬTƒд˜}[)Усс ›щд|ЄљеђЃјЙ_!?[šкŽЊ/ЎЄ|ъЭLk6ЪsndљДzаЗпqхКВКАБЌф@$NЉ ЄoАhђѓаЕКщю9šZ„Ј.рЅгЛЈЕаm:€Э›ѓ&I„jцЕса44WГќ3ЙIз7‚2МДQћ§tF(jП8ѓ–@‡j†EњЯю$ЌЙ:Ќ9†њLфQЊЩ~mC~ԘЄШ .В0Y;9еж$…9’ј;s%ѓ]Б‹х•И<ІŽрŠfеЋЃ§ЈрƒV!Ф€ЋТНЙ|еwO0Є‘d%IŒУ8ШСЅЎ ИD5КаmУ!rxЃ§јЎyвŠh|Зј#M*mыˆ_\>–КРї:Eќ Y‰n/ŠlЏщ3Ÿa!3$Ќds|еЦм7›†Ю:…фoшёq•EЉeр\Ќ‡geSНбЙ ,ж)УХч%ДЬЬЦ;6Ј]‡Ѕ ЄK щjжфT№ЖшЃЋ a•{Ь†Д*!\R5'уЩKЈ b‹‰cхЦƒѓЩ9]W› z–Š]§{[unЩ`‘іцFЯŸ6Д?<ШEFМѕђuнh‰c€W зЦIapАа{@8gб—Ѓл!‰Ќ‹$Ž'Дёи`#М“=ЎЧŠFIЉєѕВЈwіšЖ]Ђ cЏ1!`ЌпmOטt ?wŽлЈКџrЧд&БR^ˆ™.a,‡шmњ}_BHўап 7pоЈуы'ТцEЈОnЎЙ–н™іФžOd­ey&пPиQЃvЦгP-‹мXШ'јL5ЏШЃ“є*vX)1Ьь‚Ti^чИл0џЫYщb~Шєты4!ї~lФsxаSђ…П Ї†ЗrцПЩБђч^ Fu ‚Ђj™CбзbŸ’ћdІ—џ@x2ЊaSйXY(oю~П›ЅD§ƒvв+‹pџ*аь)wR>w№Б/6~ФћЌК…ідФjp ѓ”%g|ЕхГ”џьh‡ З2‘ѓ<чŠvТoўI~™fŠk†ŠейРй›ц„7гeщЏY’Ч0žъа+šRкЬbkxuюX]wEтoH4e“ќv•уєŒxб&К4˜ЪхAЦњоыўy„y]ф}њЃ джXйоG1NЧfЏSЪ‚ Є]˜GЗŽ30{]bќi>HG9к™Іы`#­žєд^iыњRPфУЬГПлїvœ)h! ›@QuПаКЧE”_qѓ1‰ќжў]@~}Сo%їm,Ут'›!”Њіs„ˆ„j]№И€7,ЬВТтcШ$ћм_cа.Ы GŽ{ Ч”Хp…'J&‰iцm Йaр‹ž%Їw(ЗФЦтoHu•[о9 (ˆq'›ёU*$љФМ‹kwI№Щ3B@иеnв:Ох|}CzхЬћГcйЅŠ\ЉЗХ)міШ.žLж'ѕлшНR›д|Žє+[с”9ъ#F;­ENРMУ‚p^рЪибФtчЦfяr‚mZ}ЉоvяnуГJ{Юj;œі‹gkЛT5Џ†зЄ oќ=Ё G…ч0|=-ЗЮпxmBцwF#Ќж‰а…œ^ h2nr‚^1 М”…ˆqТD‡DCJˆЛ˜SWd4и…P x–фр3o*dгyndŸ?эNНц5‹ЌУ`_(иuŽ­œпvX'=ЙмфеuЬWяTRђ{.А˜л єбХN/˜ЩK\Щю‹XOVѕZг3ЉЁ__=žыUІИ‹˜Ют=ЬQJЄфф`м+Fї(~Б0Їь–œQX˜Зњ\{тЯ‹~Зџ3ы‘S8T`ˆŸж?Ћзь\|з'ЌнGУ™ivЃZd‚ЭK`˜ъы\/НрSЫ0/1OЦз)0NыXпц:‹џд*9Йˆ|ёvгм;љ™СІb•Ѕ:Oшт"язЭRЎ›*Ѓ-№bSwєёЩl4d2QFМ[U0 v‹Rо“Ђhf=: у#@ЃЇZ \“(vUšє%`’]7hžГљ1ьˆ%ьё%<тѓмKœkBЦнKйЊJіыfљШЬдuCЂЯѓšыА•ЫзЧЊЈXцcЃkіцЊЎgfv|"“Ы№WhˆеО^H]ё'~ЙyћžuЙЁ:FHЋY ЎbэuYЧ[•^рэ•lиЋZpёa>т"g_Љ­<ћˆгЬА•RШbАГУ„Œ=7Вp‹–?:+$‡*›ЌўўЖŒЋ”/Ј9Ф„V~3гŠƒэx\ aхCwhУГ0nCЂ|ЙГкM'J!Y iŽъS†ЅЧ хљC–Fѕkї ?Ю*tHPВвxWQˆЩг’ўHп[“71tВ‰н)~м}F4& 0ца$ ŠГЧ\,ЛОЮŠЂВ<щ]ušrЉšкbšu†иœЅMЧОЋ‡_ž`ф–ъˆ”зSnъ0•жм[е7Ќ-0aЪЃŸ%оrN>јй“ve%‹УŠTЧгП™bpщuуI‘рћ?ŸгыKQ}:.<лЯшŒŽ№ƒfюgТтyв ДMБХ?иЎ/Eѓљ‰n1–РN4­4blџy2–//Уђ”X~І—ЗСcžRž>т†тЬЁ.rтKRAџЮг>^Ёцh–tn’U`=Ў^ЊPщEАџМэF„L]Wу‚|ŠNС@nАkЉ]<еYY\Е"•ЇщћŒTГт§ќ’"г­K˜ч+ˆ2IПЋ?•ыjF˜НЬš-ђ ДЗЎbxxиБlЅGc‹?}JЖwgЩОўєЫЛ‘йy‡&ЙїЦ\ ъйfsъйЌн“wН“дЖKНTDВžЩНфИGёlУяb‰щэ+<ЖИYщ“.ЋN1ФхЖlEд6Yѕ#о,кeŒчшИЄ@ED[aљ™N ,lSОРgэ9*:wс0f7Ё „‹г’oт‘ 4uZ!г2§a0lЉї/Їњ“•:ми‘›УTкoЭ8”!DЕЊ‡ЛLpsЋЦaž=sЌ8ђl%Ј~ёїћж#wЈИ~ >}%LvTю(?š$…м%MSРA7{ГN>P^БA„bšлЛМНfhАŸR,IБLyќR™l“‰ƒGЄ>ЋЪдDfэ8c–щK:жІЈEуЙЁ*ЊанСB:CЗn+8 ]fr=н)к0V9е˜“@9@рZzfђЖЗЧzХdm?чŒі#zмљ‹ Хt V„сŽў#фЧ”і-”Їбќ.щ{IљVїVxІiшЃ!"‚йї"dб0Xš‰кr“Ћш­|‡0ю˜kV_QбЃгШd b3wЮyN^ƒ'\•Мљ P['ЧdЁKyЄЙ#^(N-{‡ЕoзДа& ЂЩЊПdьЪа‡F‹‰јањj—жьп~ЬžFЎŠ5аP†ЦуCКzC—}ѓЪи}™yЇШb-}е““БН=sї:|щщ›xIпЅM!NWzЈDTqЉм3GБƒ‘Ђ@ЋŽ=m)"КЪЈЩщќDЈn5,пв[Э(LЧ[Жєbpшt§У8—х<{Ђ]Tу”ы /Ќ™ЗъН]Ц(~&ѕ*Е‚0#0‰”ДО3…оЙ™ь{_ї›Oн&М‚ ‘1)щРєДєœŒлгрœзє7,ž‚-‚Џе?,.В[:Ё"Ђ№њ`Н?7бьi˜&!9И*о­”S%Їєчœ8эќŒƒ_Щ+Ї˜7ќˆ{puж2бt›\FЕФ|Ќ}ДяEЌВЛŠ[јђŒ;…–в .‰ьзC4ОKJn e54sПЂ э>NА1ѓIhd0э0ІьвЃН]ŠЩ GSl‘Ўmzэ  #жы(дЎIяSЮ”!—зрTJъZž3I&ˆїc"0%sеeLxVdR;ЋїЏ{№s{їЂЙЄK‘8ч$єC7$–о@­ЬyЬП§†У?№%А?ЇђЋ—№|–'ћ<œMGHЎГ/Яj1Œrsƒ5ЁOЧ{oЏ5§јƒ|ќGЗд–NwA&ЌЫ lbиЃ–ВщЙ‡ŠєРЭ7m_‘кк‚зМј%}ЏсЗ>эC јoЮйSѓ™RpW‡Є$S0!рOлyѕЋє—Їq ј|Рsš)›) ОHьі8_•Тџоtfua.•­ ЛJ9Ч ’PYЛЂjƒЛŽbйvЌDё+ЬћЦыџ"Ko€74єXИ0ЎI•ЦfƒЮдpюИ` S{X*ыщ\ŽFзЭІuf§Š@ЅбЪbњТю/ДžЧы}Ќт"WFУ"'D; ѕTђЂ=lЩє†˜bЇ#хj;!ПжŒ”'ŸŠ]вzёИт–Ј; Є“Х1Ёѕ^<‘*@+H>Ÿ6~GrЫЋ я4N9\h›Џь№Ёљ17;pHли ХЬŠс kЉДЋŸу]л{лC8ЉаeџO\уmБЊБ]Љ–фЋšn.ы*bыbB\в%O"а%/ІšВžр5QчЏsљцТЋВ бПД~ЃЂŠЦPpтыМ}Ѕ ŽѕСЉ+Oа$&ЪВpпВD3ОЂˆnEцlŒрlЙI”:†Ы—њ\эНy-MетKЋhѕx” “.0\сЩчRZz•ё›ч­W 4oА'€/gъ•IтдLњгл izp"ГВч0ЬіЬž­ЈМьч:џбњ}†ciСЊ:А™•dHЧ„>.V 7нД"ЈbнчСІCћАяXіˆвRQЈІћГ™аjd?_)]ЄЂ[+/1ШЄ›LЕ /‚ќ@KћОєŠr!œђўт0~$Д{ЅЄ КвEm<~_P_Мћ›М™E Mрћяd•14x˜†б'Z‡d[ЎXжхoYо/Xщ3ХK§Ї.H&(Dn"ˆѓ ц|вw•рВozbЖk;6'MЛ™Ш‡#8%УтјёщЈ8‡+Њч(…рkі#‚#эл9љ­žuЂ-gЩŸќћi!у™ЊоаЮѓэіЫ-1™ПyБpљчМ…4ЪХ=*д№>ЋUn<Эw@uŠH‰­,ЂЫsž.Aш!s~ђО Ж…VDoок^ољС:oЯ33Щ gъZйUŒˆ”>ў_Џ?кw 0Bое+ŒnбƒN_CшrаЊmАП@MPH5oПЏ‰ўfKjFџ4ЁїЦЛDŸоK™Ю)?{{Oєqб˜ŸИV›ф‘э-fЄм 3H^6ќэˆісЇЙWЌЉFЮрTќ@QжС‡щ%щгqою)Ю”F‰):ЛњЪ@п№Z•ЛіvaЪ:вUіšР<ˆFEИО‹єІ“l†‰@чЩ”A…*єћUцAZ™е†Nя _ТIƒсuбMmВ-Эx’ф`a&дт<˜ЏЫ …џtЗDo_()Š*Ѓa+7 BF‘~mѕЉŒtzƒšВ5wаЧA†kшНYˆѓ9њё ЭЅкІƒЏ=єT.;є 9фк„ˆ aяЛ—3›§7ЎЪЅђKŽш”ј3ьГ+эŸš$vБ@fіGЪK ebФЏdФћсЃ&,ƒŠ$/„Œa[jzМёЩ žніљVЛяЄ БчpFGДЯqщќя‡ [”qђТ8$L_Њ€qTХп„сe„)ЮkйЯkŸ!y…сђхЙ6бќ бНC€ &J‘уmИ*ДРf"‚ьвзm€fЛWw„f™Š­EвVRл,ж#Џаpiњѕќ ВŽB1)ДЁЛВXPдgВТД zQ–Šэ+Ч‘D@AжЅXцЫ…ђіj\"Ы tЉП›JFhŸЎЂѕйŸ„JP8ьё ?“v1!Ъъƒ>К<ьмЉ|йF$Мх?БE)ЅMђТЗГ-ŽŸ“YˆТІ‹J0mЦEЙk:ŽbдЌЫЃбќ2`ь опJ›ёŽ +9Œ’hiŒD,nю9i‘p)ЬГ~є-S№Дчlбm<[№ј}u Ь 8И€ƒ+ЙŠае}Б‚ЯmЪ…ЬФњЪ|)z;Заh{ИўБzŒПкъъ‘ц4ќLѓ_Ѓ)Щ„z…‰‘wНдїФї яeЃQ2E?6ъ p  oљ@|Џи,pтЪMTND"Џ+К<Ъс\„х„ЌHВ^аz/t˜ц˜.;)v)r+vаuлFИVЪ„{:f™fХ1uђlc аьў‡3€^НhgnqцщЬЌHМAЩЄО…ЇѕуЗА@ХnšgФЕЦšЅD/ќб/j:P‡ЯTvZ%Й>SОљ^}$їOEyЈvЧщХ7z#fэ(Х$љыВ_йL)xŽц№TИЅО;ЊЉ жT`ФŒ!œsПч-‹ы<щWN0Ž˜)і-їяZг_ЮЛqe"ЯУS#iД€Ьјы§ W*§Н0ўлЎUЧ УћiЋl”&.D"Дщй6’gы‰P/ђЙг)жйIЕзАќЖБ ЕёDЈsЊsЮ u2М{Ø гŠ”6ЗррИ`пA]љ…—ЧYй H!ЉpwMЉќ5™;UСбjћо0ƒ–кtaтрј К+ž(ФŒe@јHгd№уœЌ•oѓгI•[ќBьЂє™ЉwЮу}ЁWwдHё—JŽР%˜їОQE“]Єыrzp$ŽиС'УщRЂк‹„нtфжaT$bgзƒлВжщБ)9мpzЪ2Ÿ4{Ём1 Tю/(щтŽлT>l6b лr9ѕЁниL{)ю$…h$Ht/pЋўсйPОyЩфyђ лоВ;\ІpЦКТи3IМ[0‡МF:Y™SсCMд5ЮЃcќ@§6ГsщqŒЎ>hYёэЫ%†ЇьdРщю:ћ8ЫQ*ЂdбcиZ+'Јmъd›}єUЌО^Oхe!y %лHf ;Њ+Œц;ŸZbМwЋђ§—oН@Ћ8mлїїa0зgг)KkёOЦƒ1Bx!њWЩ Ъ§ФїьОB‡ & Б_МwpbИ ѓ”sђ<1pН'kЅЉѓŒЩ(ˆњ™І;ЙŒ6хZЌяДИ*х­Йft^pяёШˆэ-jаi]*Ђђ2щ4“Хгл{jЙm[*йЮК_n†m/‚гcл!ЩЗНтЎWќбVЎhесн"dд qЛ‡}ўлiщмЭ•ЌЂ  •F‘вЭqХE”ЩыЄЯоіњЭ„IU ї+5эї†#е}љpЋ Ћ+…§—%Ћ>ЋэeЋэ№iuwfgщ$Ѓ{Ге0RVj yЃЖN•ФШGѓЖ!№яеŸІ‚a%@,ђчЃзЪУ ,jwЖЫ)јЇдВиюаа?Іа S„„­gI-b|&мFм>НSоfžЧu1уяŒS>Ю)ђaPСVоИXћФˆљIHrяєо\7Џ№Л RAиAёгвдŽFG"Ўа—у1fЧЈ/А cњrk;Џ˜пS(нНˆќ‚Ъ˜‡sYолiŒzЙЫZЪъ@ъу‘›ю]юцЅ,sЋnИЭ@ ђ‚€Ж]<НюлMфН7дэ…j№ыФrк—DйЃјыrEЃXcцйЛЋoP .„Х'[š[мр БpЊчвЎЕ€’>ещдІЫ‡=62ЁtЅгхr#*\vboвѓКJaбИw‚zЪ„uG‚ ыJ˜5фА,^№—™ТѓŽКтылУB!U Џжfg‹Ј3cрЁ‰aпўlЃ•эЙФ&лгy1ХГІЪŠЧYlЧгђЃZ‹ї WО@'ц,T%†їЌ*Я”k9yNв†РќT—­TЩѕсЏ!бЄДУM9бпмФ<ыVЉ}Ё)ъџ–Fcь}§Ё1ШGєoHb~bВlМ}SM$S'Э{n=ЩэїЛ”2Ўцђ,st&"чs%OS2c_V44Y›šГ&kWЈu5Ђˆhv5lоЃ8Ўт˜Ь%Ђx4eкїЖеQ$ЌœW ЂлSQœœ=Ѕ^ї& N,CІЏЎЄћ†žъІe/A&хф;f$  8уЄчЅŒS яХ#‰h§eПЕ—}"iќuќ$А6мuМЁі]ŒlЈ]ќd•dEГ1#Р_вiП—л|Pš‹‹ž‹ Ѓ љь%­Ь…F,—?^ЄzХ8YХЂС~я)ь"…&G : чЎ ЬЩгoъ ZlхS%”eиtяЏЗъvX,•5яu†noJjИщзиЋчИоВT$h[Ћ ЪSыбy†ъL.[Œ[”jЊыwh]x Жu`|зTЌudёђіѓŽ’ЕŸКQsе48 УbqГ'я/cТОФЄbН4o—№EЈ%rНп„м‹D?8Ј|УМ2ђР/єє€{‡ !›НфR*iЧг Ьmгр2і#Ё—CЩw›ДэЧо.ЕѓeФ§\ї|В4њАGžŸyЕ›WО}@XЛCяaФ"„нИD<Юс&ЈлЮх€QЊсY8Кˆ нжTщ<пс f“aFQ^ј Е#O@LамЮJ@б|*uєЋхЛцaьќ|gлEЏќхёDКГ dmЧЎF]Тњi!кеh—5сwУЂѓЃцљ+JЩнfCсЯБёьјПiRюФљыsд.A„*–šСО/iО-jЏцsWœrэŽ‹њXЬl=[Prvh]вŽOЖє3щ1%О‡x’yўX`рХdMz2ŒA­gж™BeѓЅэМœіЭˆ„fŽ Q›ЕЏ ЧД5РmСc™eџWm2 4m|8#1Œ ЌЦШ eŽс…&’зШCЎi2emФЊЬЈOXTmњžLd19>xЃўи\/xm XџPх%љКœїЂK’i4DуѕЧ0з˜ХЦ.еrУPО…сЄЬ§bЕkъ"эEzЖЙwƒЛ{oƒBС$CqŒ}0e3$‚YdЫ–иАХq8тЃmЌВяNр[ˆ5 ’G zс?Qю6š#AqSр­А(9уџіyHлЈN;Lƒ .ЅžЙ)фщћ<4}:vч‘ыr-WO)Г§иVT­ЬJГE}Ы}+ Zбо†ŒlІƒз„[ц[ЊЗ?>Ії+Ѕ><3yЄј^Rе(Ф"oœkFе”p‡ЭдЅш сž*жѕЈlА>:so?юѕaL™ЁўrЅFОэ;шуНa§N‹E”š$ц“^?qоюХsSn]PЧŠн{S‚r,(›Y1Ў*!ЁєНшѕ"ŽѓжюЈЦ’жщ„ IкsІмЇЂ[)'С„Оd.dЛ{оь-ZЃцJ]•з<77ЛЬаЯћЎ}xл;Нјш#\FзqпM‰…р rR2 [w<š‰ХЬnАlіЃ›„IЕБU/9?Єы: ­*Ё=sЕ:P”DaјЦЂcŠЙЇ9jс?лБВк ‘CŸ)Э лU.№vзa…ХћkŠЖњ.рSкM&sEs)šЌё…JЂхиmВ=Нѕx–‘<їћчйŸО ЩћЪќB M: А‚}хт)‘pћШЌ#эљ—1гtЉpі‰ѕр5EыЈ'qЗS ПžвмЎtаŠГВФжaэЙDМŽЎЃо 6х xO•Oџ˜№œtBИ…p3ˆш™Ќ€‚‹žЂEнВНо~Ћй"Ž№s+„Їˆ^9YF•SHн"MhЕюјвеdлгQ_ш/€жЭ:vј™т nиЋ­L”JJŽDG^ZV#Єе>ODМsћаѕvFъыЈА[6lЭhоНот:}з§w(wqТ Хѕ­*7ьЮэ/нlНsd7 БR№8ЏЉ‡Љъјшљ1щ'“ћ>hyєОh Q~E†ІR6/іЂЊ+s ѕы“ИРа§d‚ˆQ9RжъŒjі§ƒgќ‰AОЎ%ъЩ1Љ0r&_yТмq‘SІIPс-#{ФƒѕqЎћё %’+ЂЎ_™ќс.ЗYew(gТ=]NKе2ШВFbЂ…DдЭ=фВIѓy™X`R/ža;БЇеšUДј)Дъvyеъ+Ѓ|.ФЋУу\ы^ZюSJ”Fљij*M ёчwЕ,йЬЗ?о/WЈб˜gЮiKЅgW;зБJЊC{ М”‰’KЈG.=sЧ@j7Ї`НCеЂF`ИŸѓTљJЈ.{хцeO„QžЖ5c–q-@`Ѓ(aОЛXЇ*‡c№!JЏУРcјu9”€2Ж,RЏ$т$Кe3œ.аmQ!GLџQ}І/RЮЕЈ'”р[AKіЇЉЈ~Ќ,шЏш„уЇЄГZ.о Ж†й3|жrюƒ№е1YщЊ™36‚‚Йх„RїЊю'ЧN<,eTJX˜С‰ФіhŸxЖЊ6%ўоИCƒ–€ЂXЈ)п“/$А"Є.Њ;ЮЏ?ьЕ$5–сг еЈTрžgН_\ЅД^ ~MRБLon|єcБФЪаљЙa$+˜ЄЃ^“ќ.l"/B4jЊЛЏЫtДl(cмŽЌ'CњTщѕ%$ŒШZД•`ојеТ+фfЇЋ.зПj ЃsЬй­mДђ8Œ\X$УXйЇ”:ŒЎ%ХБz ФJЂUЖЖpє-ЁŸї:§u„‚h’›‘пl T™Л?ЄшпgюŒћ_ЇФ-ЫБВЌБ†(І˜tKФс=;MЖz'€ћЬСЭоŽы4З$Ѓ8]YпhT'ёѓrCœюTtЗ–-‚ЧГ-ђ[X•/8e^ЖлK‹$—ѓ.•…?t8­ёeџцY endstream endobj 745 0 obj << /Type /ObjStm /N 100 /First 940 /Length 4181 /Filter /FlateDecode >> stream xкэ[[sгJ~їЏауžкТsПUQЇ*Т=@€:&Ф‹cлсРљѕлн3ВFВфФСьVэR•ŒFЃ™О~гн#лN‰‚NЩBWUHiсЊ Ѕ\MЁЕ‡Ћ-ŒХyЎАNРЦ<^Cсƒ,œц…р\œж@)iaŠЖ…ч8ш  (ЌТN(„3@Ъ№B*ЃЁ# IФaR$1ЊPNиƒЧZСDgP&Ž[hвPiEP-Tс€Ÿё(Б…5 Г0*v Юуg*`Дс:АРKдлЉТ;У™"pL+‚Fе](J‡vСAЏР9o Їƒ8Js‡вzP–А† dф`… ‰Р4Тƒє`>‰a!5Ј!DћEАšt dБчР-єˆ$AЁ(Ё€šPZщР)JsА?ˆЃ ˜TsьY\К хA0М0 <šƒ tZ*9fB+P]z|Ј ти3и“ †ЖиGэА‡Šk=ЭЎиS(Ч˜ =p(є@Р Р |ЖАжhъсS#С,СaЯйB‚)„Б {8Я=ЄчР—Б6iPп@…l ЫЙДАч` ]Xр(‡V %№ X \8”h1ЋСFm` Ќ“Wшс ‹юИТi3Ј‡ѕ7рп vр@$h?ЧARRі(нIAOр_‘DЧ‰>Žk‡Zу cЬріэ;њ~Qlo:-ьхх‡%нŽЇŸl6?-чХ{;šџ9`/Ъ“eё4j) Та˜/C9ИdhД„y{Хэл{YАћГЃYСюџ0ППџ>€П›Бдz Wа‚~рCeХOeчФаУ–"v. е?•pЕ‘  §9ьфŠ5rhЕŒьŒэB';хwЄ>Љ'ьТm'?Йv` h'nЙЙNnnGмП[Мw€/^М(иёлwя 'y1НœLўЌцЬІKЂr`0!бмˆ)NЄОЇ„ћ8\ъBќФД‚7@‰=›ЯN^– pСžн=(иQљmY“їPN ияГ§њџO§ЃХ…ТWjc‡>ѕм*1хСъ)”CЧ4Є–tяaЁчѕЬј\s*< Ї–.{pЊиGўЦ !мPы•‚'Б•Ю4ŠгS(XкџT‚ZEМwR‚ЬŽVс}рz‚“XqXf-‘ Fu/ŸЅМ‡uБ%ђљГLР.бњўхš‘Њv(zlу–ЦT•ZЕАžƒЪ˜Аз`TœщuX™?ЎЖрм€Б;в‰cД6QWWЩ}ЊАБš—+і№o’Ўmї2БфЌŸљF^•5ф гœg@-Њ@ЕŠєЂCВЇQиЇ0Б[шЋpœї18ƒЇжa 2ЕУU€kІЖ@лsЖа: œŸBС д,б Прє аЄPџˆj­ЈЬŽ‹2Т|KЋѕa-аЧ"p7с3™vMо&чЄ $дЌL#мqаJтHV№дrт…vRmЉ%(­ТД Лme!№CѕŽ;Z 'ІEKi‡ДрPFДђ#9Lр а=:уžЦDw<žЉ(FФ6‹"б =mєKŠHq„ЂFюСЬй+чnSRxЪњљЬмИ9@вS*хд~ЄЭeЫЉЁЏRG$AЙ•во$˜СЙ ЁШIšЇаШвƒSЙУвŠ€6‰tтКH9ЖЋЈЇ-Р b„к|Шём ы§†‘ў;™Єš[#цW5БЫ*СS”і=|ŒФ7”Ђш+b ъnНq|'Ѓ() J<дІSZ˜;‹3$ХїШСфцХz‹QГъšЃ9f…иFŠљSebЮ‰д6Iz6бЬкШ+ŸGœІЂ‚S`‰:CљlЇЬBIмaЦ‰ѓ”9 m€z`Ж€ќ2JD5ЎO$ECK)wWрпeO6ЗК_ЉўЈдШЯт–J kWgйьПоAыІ/ўЏз П^'Д^'d˜HЁЦЦwвDЫ(Й5rŒЖT‡G?б5жЯ™qДсѕ€m‰^ЁuЋЙё9ОWСЗ6 сUЯЂgбBБŸZD]§ЩОŒП[.Nцу‹хl_Ю?У“ЇїюМypџŸwя &ЃO‹BЧћћГoХћ[FЗшTЁЈМФЯ'хt‰ЁvРюŒ.”уOgpыэ€!|vKрУ‡Ыбd|В7§4) >`/—хљkќp{РŽг"и*@уl4ЧЗќџ`{lŸнawй=vРюГь!;dйі”=cЯй і’БWь5{УоВ-–х|МјЬ>Аv2›ЬІь”•Œ(ГђлЩdtЮ>В№7†ПЏ%ћ8ЛœГOьŒ}П8+ЇlЬ>Г ;gS6OK6c3h/иPВ/—хb9Ђ_.gЫrR~\ЦоœшЯй‚-ЪЏ@e1ўЦ–ly6/KЖќkЦ.йWіћЦОГПйпх|і[ДчСЌе4~ИбќфІп?ю§ё№Щ№Яу‡‚wћGIє†эЏ№кфŸ[BWr2sM’+NСАЩLc6?k)ЉЗQђўГН'GЧQЩ*Q)I_уи…’жє*kjdЗбшѕѓННчбmЁ[!*…№УЏнxMї*t›хCх/fS5ПjНлџуT{бHЭ+еxјеVУ† pŒётn9YŽВЈё{д9Ž!vМ#ƒ|˜N>—KкйЉїvMNfччЃ<ІœŸŽgЌœЦЫ—Ыб$Š0)ШL:тЬПz"Эh^N‰?ѕ"ї*ќДащ‡Iƒр&Nо›ЮЧQ‹:J-&(їЕc•ул уэўгW/^#2\ц]†r'Рp§Рˆў" ЅЃ @сІ~[ХтУ{^юЃ~={Z­іДВЛбO_ ќђ9р+ИЧ4Гc ЩлCxk_L.„тн€їњАн*ћМ98|єюИѕхa_DГr\ѕCС:\ЙЩƒ/Щ{Ч+џЁчЈŽљT;$Кc^јBF[жfiкcЋмѕрўл/Ш=8ЗU2ё”іуц№§‚ і­ЉвV9ыўУ;ЏН!•ŽŽњœ,1m)|Гщ@›)%DC)М])%ЅьSjCк:nxЕБЫ*Їnи^ЋД^эк эНрЗ сGюМ=DCНэ5Й€п^„C~лЕЖ сf…‹цН†:ЯO&хЩьтћ|ЩЮЧS(ч—“хјbв„Ип*’?;оПџ Њй“Њ„-ёаƒ' О -ћс@Š5ѕй*„Н;:zўё}дJ0ЋІwU@ћ ›6‹YxЎЊ`ѕW+Pљ­ег7O?E­{їДŽ[кЈквлЂз+Ac:ZœŒЧˆ№Ыѓи_Ž'Їe~Њ§5iЌй>Œцз/WOg“ Ь_хzJђѕy8; š—#рЖ^ЉNЪХЂЮігЫѓх|1ў4Н2ёЃ з €V;‹1ZwЋZѕrz bœЬцхІќяЗJЯPY0ъ9}bОSјХwќZ„љqѕŸ§ЦЭ$џXqЅ­d—0š~{З‰†ЪЕ9‘dgщ~xКЪ(Џ2nЬ•rђ>ј“юh№dрxќ s_AЫУЄmBY2BkбгЫхd<Хu‹’Ц@њ 8н­­жŽ—p“UМ3St\)RнЯЫЏєђ> endobj 798 0 obj << /Type /ObjStm /N 37 /First 316 /Length 1501 /Filter /FlateDecode >> stream xкX[oл6~ЯЏрcђDМHЂ€Ђ@—4УА,)švУАѕAЕ™”Ј,ВœДћѕћuh[—И}(x;ќ.‡‡Ќ™‘™&"SBšLШ›€Ѓ€ •ъXЁЄIб)„2 •cнBŒ*4Э(ИЩ:ZhЃ‹ Н:+ fRЁ­Ѕ˜ N3šЩ…I ИрЭШRAl”ТŒBTšœМzurёСw•CўRdё§ЩХtUп}WЖЎюBjУјж}Ѓ‘ ЃзЏЛхnЗБƒн9б[їђ|€•1гЕo7mњсMЙй]\6[рœЋЅЩї”f(8’є”FЭЦйяv'Чvы`”з uБtvЫ Ацtщ§1hukp(zюPєўP”=†ЅВ–™СRћlЋЃйVj€•ЬaэsЏ^Ш}П[Эe[юГ-ГЃЅ&e› J-ЪьK5–Z>ІмŠд#СrNЂкХ'Х1‰I~(1šg‰rpтˆ%Ъebї”щQJ= œ“Ÿ˜=–<‚U‡Pьe•DЈнЮo懛oЫ•лˆNЯх™ш_qzЎЮ„Е}ŸІSю&gxРЙљўEAсY§„ њ•я" -}3IpУ[ њ>E?у~v&Дж<ШiѓРb`ф˜@imЪV•їBЇЪ™A‘іЈ UЇ,I!JGkJгРNиJk6?:gнŠ м‡Ё<с>ќфœGEvl lЎЦd„IK2hS–15ьрП"РOЁa'gk;rЮЖjЯ{ШEYФЪ” VŠH+FВd /{б№Rpт4Ќ,Li6aтщ “‘‚ѕј(XЏcјР tš”ЉŒЁ[7€5Y2f#TZ›в‘™XfL<%ci•ІCЪ•†‘NиJkЖ”F2[N† А#esЁЂkhH9гTЧ_x:So–KпљІ.ЋёСsг,ЪЪџWв РљЅ\|}.лх†b.›еŸ}хЛяg‚ОŽњ ­ЏКs_SЬѕЖ^ЦыёrbпЊЌ—ЦзŽк‡€$лЌ+П(;‚>жОЃіэЗuы6F3\B—лOж”™”Ь1Sћ“\\•]дћЪKiN9Э.7Aђ§їК+Пa1хгПrОіѕ#-оКчЈœДZ9вдм—э 0Fћ7~к7•‡ŠŽЗх0њяfяžыCр|ђиŽ<ўd’ЅЗѕ“o›z…џ0(ъЯВ Йтt\{W…ућЫ/Л/XqЁ*)0žіuгЎЪ€pПv џ@пW]ТзѕзлAiыBцЏšХ–HCXŸ™…ЋЉ‚T|‘Ћ—.œЭфžЭё‡ПеkK№гa•ЊШёд|=8#Js|ЛCЅ‘ Ѕ&іїIк8§јШ—eЕиVeМ,ё”ЩeS?Йvw&oёœо—&voЗЋЯXЄИrshKБ-Иж/BilЛѕ6ЄА??*G6uЗ†ˆЎiУNЎќЛю‹k_,ћј8оAл“wЯx9ыw їьћ+w3Н/“Мфс8в$ј‚Zј }UљfPпЛЭЖ"гё#уН+—ПfїлѕКi;z‘јјяЗЋ^Rџь]љ‡Go ГЭУ й|ђм*$rлКщйЇ|ѕБiб,GЌzRѕvцЖLьЧ7ЇbMЦ<џ Ы|ИJяUЈdЙŸvG/§A`$w–ў%€јп§›ѓўЛ7ќђя[Щ­тVskfП?Эаі_ьс}›skЙeB9џ 1z[TВ*ЩЊ$Ћ’цЇ.ѕЯхТђ‡ƒ•,]цГž„vхp”с/‡П!ОЏИИФŽЊyЄ_(Мрпjxш:l~J„кВrї“ыб§:pЃ ћœ+’Г endstream endobj 822 0 obj << /Type /XRef /Index [0 823] /Size 823 /W [1 3 1] /Root 820 0 R /Info 821 0 R /ID [<7F0B35BC1CE294430DCF7CCD96087081> <7F0B35BC1CE294430DCF7CCD96087081>] /Length 1928 /Filter /FlateDecode >> stream xк%—[h^Y†зЗѓџM“І9Дi“Д9Ÿ“žгЄMгCкДMђїє&=Єiš\ИQQeE…ЧofФгХ8Wеa z!тU™BёЛQPp@7xИщ…  џѓіцa}якљЛїzпѕ­еBјŸ…а,dЯЊ(/…,„zеВіGе2+ƒурŒ…і/J;Ч#5 ГPW'эeьЕ`'Јѕ`hЛA#hЭ ь{A+иіƒ6а:Рpt‚.а z@/ш§`Œ€APВа0ЂOрХgРQpЄЊ%N'_”Ю€Kр*Иnƒ{рx’Ћd Д‚Cр˜чРUp ,ѓ‚10У€зЈ? ށу` Yh}Ёз/Џ€`ГŠXu€зˆћС&Ÿф%ЋŸ_г­ŸShЃhВBцF›@“Gг@ŸMцЭ€Г”2T98Я#3hrњ˜EгsŠРE EœCS6цРeДy4…ц а:/ )Mѓ`э&Z‰rTаю )‰зРuДUДŒЗъoЂ­Ё)йKв:š–ѓЋ›ф`›ђИЫъж mQЎ€{h-hO)WСк>4­ј} gД{žP>аŽ mPЎƒЧhh)5ЁHBг#њбЇhчбH]Н^hmŸOе]ћ^_”Œ‰&PВЉэ:я—XЩTFЛЖF‰ Љэп–p0‘ЋЪm4хїг.Д{hЌK"4i7к*к]J—šаЂБІ‰ЭžZаžЂiййіi/‰-ЃсGЂЄ}h;аd­ ЕЁеЃсeЂ)Є4™"Лiщ к4эZEъBkCSThЉMяB†Э#б7в eЄ!Р^M}z?Ѕ†wLƒ) йА‰MœЦ-}GVАБ“&ŽX˜њБ4Е›“@Л‡-™Ž[И№;Эj#NYXVЩ.KгVЧUjoЗАёОJі[в>Кhсп‘ЦўHW,|ю5НЉбЗiС*Оєe=Ї5аbЫ­e _[д„Вbс›…J…‹tІоz)№Ї ?иTЉ$*uЪе–…wЗЅо`жьн Rс*[јYЪ ьД№ЫeiЪš‚ДЫТѓ_Ik ваhсХw5бpПBУЋьЕ№С4б к,|ј7•„Ёr€wЙШЈєƒ^аeсЏЏ~Џ‡G&СYЪ!PѕќefСУўћŽ&FР88 ЦЬv<зФqp3kЙ$э4˜4ыyЉХЙD9ІЭНЁGЮ€ рЌйщ+вє\u%ч>RЉяИ СœйѕBWРMP1[}ubыŸМ–ЬЖџ)mŽRыЎй'_шoе ю›НіЪ Аnіе_ЈЄUEЖРГ7'(#ЦGњK”Плfo§D™e'š5ТаишqЇйГџш5ј„ЈНп`іѓkzЇЃі>ўЦVГчпг„іt‡йЏUx;Э>Ќ•І-оzЬўќК4LŽ˜ћЭўёЖ4ўЌUФМ8dія.M ƒ1Р)G-ЫогўFќ‡-kœ•v`rфLŽЛу$р№ЇФi€ЕЛ# ‹\ тy€нq`mФюˆGQ+Є7х чСРјX\+тupр~\ЫрИ ˆ@фT‹м"gY\ф оœ[ё! qШxТЋ'S–у[n y аНsкu^ v‚:@ЛЮwА4‚&а шо9э:п ZGjОаГѓvаиЩљAа К@7`џцН єœЮС#`ШiђYжє‘Оmр9'vNЯЮnУ9э?Їщчєёœ–‘sфлљiРсŸм1ѓГррЯ/€Yp\sр2ИЎŽїœЃ<_p p”чœнљMА–gwЮaпwСИфљЖeнoъSW,[квшрœЮu№lЯѕ(чЈЬЗ@ЕщgЮп:apТр„С ƒ' Nœ08apТр„С ƒ' Nœ08apТр„С ƒ' Nœ08apТр„С ƒ' Nœ08apТр„С ƒ' Nœ0јР}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Ч}Чn_мЭœЫ˜+ Ћ–Э|AnщrwеВ?Љ$N6œ8p"рDР‰€'Nœ8p"PЈ‚К0BЗ9]пˆ@A "PШ§;–­}[[oхOПЏ‰(HDA" QˆB—;нцHDA" нИIDЁ+‰(HDЁƒў e{ІэДьЇuYілW'bѕџŠѕXMгч5ъЕšЯЮkдg5пкдЈпjўђwЌд]вhаJч‡5ВвЧW5ЖвПзhФJ?lвhдJП™дhЬЪ#ŸбhмЪ“дˆ„КМыЂŽПEХЪЏ?№“&а ZРАД‚}`?hэ A'шн є‚>аР •Пђ`хЏсџ,яnѕ endstream endobj startxref 362473 %%EOF units-2.12/winmkdirs.bat0000664000175000017500000000664212313010047014556 0ustar adrianadrian@rem create Windows installation director hierarchy for units, @rem a program for units conversion @rem @rem for Microsoft Windows(R) without Unix-style utilities @rem tested with Windows XP SP3 @rem @rem version 1.0 12 March 2014 by Jeff Conrad (jeff_conrad@msn.com) @rem @rem Copyright (C) 2014 @rem Free Software Foundation, Inc @rem @rem This program is free software; you can redistribute it and/or modify @rem it under the terms of the GNU General Public License as published by @rem the Free Software Foundation; either version 3 of the License, or @rem (at your option) any later version. @rem @rem This program is distributed in the hope that it will be useful, @rem but WITHOUT ANY WARRANTY; without even the implied warranty of @rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @rem GNU General Public License for more details. @rem @rem You should have received a copy of the GNU General Public License @rem along with this program; if not, write to the Free Software @rem Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @rem @rem @rem The units program was written by Adrian Mariano (adrianm@gnu.org). @echo off SetLocal EnableDelayedExpansion EnableExtensions path %SystemRoot%\System32;%SystemRoot%;%SystemRoot%\System32\Wbem @rem basename of this script set ProgName=%~n0 set Errors=0 if "%cmdextversion%"=="" ( echo %0: you must enable command extensions to run this batch file goto :eof ) set args=%* if not defined args ( echo %ProgName%: missing directory echo Usage: %ProgName% ^ [^ ... ] goto end ) @rem protect parens, e.g., 'Program Files (x86)' set args=%args:(=^(% set args=%args:)=^)% @rem separate directory pathnames into components for %%i in (%args% ) do ( @rem strip quotes call :mkdirs %%~i ) goto end :mkdirs set installdir=%* if not defined installdir goto end_mkdirs if "%installdir:~0,1%"==":" ( echo %ProgName%: pathname '%*': cannot begin with ':' goto end_mkdirs ) @rem tag leading '\' so it can be preserved if "%installdir:~0,1%"=="\" set installdir=:#%installdir% @rem tag spaces so we can restore them later set installdir=%installdir: =:@:% @rem split pathname into components set installdir=%installdir:\= % @rem restore leading '\' set installdir=%installdir::#=\% call :mkpathcomp %installdir% :end_mkdirs goto :eof :mkpathcomp set drive=%1 set drive=%drive:~0,2% @rem protect silly stuff like '()' set drive=%drive:(=^^(% set drive=%drive:)=^^)% if "%drive:~1,1%"==":" ( if not exist "%drive%" ( echo %ProgName%: drive '%drive%' does not exist set Errors=1 goto end_mkpathcomp ) ) set pathcomp= set pathargs=%* set pathargs=%pathargs:(=^^(% set pathargs=%pathargs:)=^^)% for %%j in (%pathargs%) do ( set pathcomp=!pathcomp!%%j @rem restore spaces set pathcomp=!pathcomp::@:= ! if "!pathcomp!"=="\" set pathcomp= if not exist !pathcomp!\ ( mkdir "!pathcomp!" if errorlevel 1 ( echo %ProgName%: cannot create directory '!pathcomp!' set Errors=1 goto end_mkpathcomp ) else ( echo %ProgName%: created directory '!pathcomp!' ) ) set pathcomp=!pathcomp!\ ) :end_mkpathcomp goto :eof :end if %Errors% NEQ 0 ( echo. echo %ProgName%: one or more directories could not be created ) @rem needed to handle invocation with command extension disabled :eof EndLocal units-2.12/README.OS20000664000175000017500000000177010232761052013345 0ustar adrianadrian ======================= | units 1.81 for OS/2 | ======================= I have just compiled the source from the Unix version by adding a small Makefile.OS2. To compile yourself you will need some GNU utilities (like rm, cp), gcc-3.0.x from Netlabs, GNU make, perl and GNU groff. Then you should be able to do "make -f Makefile.OS2 dist" to have everything sitting in the dist directory. I have substituted the 'col' command using 'sed', so there is now nice OS/2 readable documentation in units.doc. If you have 'less' installed, you can view the file units.less as well which then shows colored and highlighted text. To run you will need the EMX.DLL which you can find on the OS/2 ftp sites like http://hobbes.nmsu.edu or ftp://ftp.leo.org/pub/comp/os/os2. Unzip everything into the same directory and run makeobjs.cmd to make two program objects on your desktop. Please send any comments about the OS/2 version to me. Peter Weilbacher (os2@Weilbacher.org), 25Jan2003.units-2.12/units_cur20000775000175000017500000000757412574147140014125 0ustar adrianadrian#!/usr/bin/python # # Version 2 # 9 July 2013 # # Modified to use xml format output from timegenie instead of text file # # Version 3 # 7 March 2014 # # Added checks for unicode currency names # # Version 3.1 # 23 June 2014 # # Added test for non-unicode strings to prevent a runtime warning # import sys import urllib import os import xml.etree.ElementTree as ET import codecs from datetime import datetime from unidecode import unidecode outfile = 'currency.units' outstr = '' if len(sys.argv)==2: outfile = sys.argv[1] elif len(sys.argv)>2: sys.stderr.write('Usage: {0} [filename]\n\n'.format(sys.argv[0])) sys.stderr.write('Update currency information for \'units\' into the specified\n') sys.stderr.write('filename or the default location, \'{0}\'.\n'.format(outfile)) sys.exit(1) try: currencies = ET.parse(urllib.urlopen('http://rss.timegenie.com/forex.xml')).findall('data') except IOError, exc: sys.stderr.write('Error connecting to currency server. {0}\n'.format(exc)) sys.exit(1) # print codes here codes = [x.find('code').text for x in currencies] names = [x.find('description').text for x in currencies] values = [x.find('rate').text for x in currencies] # Sometimes currency rates are missing from the xml file # Delete such currencies while True: try: none = values.index(None) sys.stderr.write('no rate for "%s" (%s)\n' % (names[none], codes[none])) del codes[none] del names[none] del values[none] except ValueError: break # Precious metals are showing up with weird prices (per gram?) # Delete them metalcodes = ['XAG','XAU','XPD','XPT'] for i in xrange(len(metalcodes)): try: badind = codes.index(metalcodes[i]) del codes[badind] del names[badind] del values[badind] except ValueError: break names = [x.lower().replace(' ','') for x in names] foundunicode=False for i in xrange(len(names)): if names[i] == 'anguilla(ecd)': names[i] = 'eastcaribbeandollar' if isinstance(names[i],unicode): # this test needed only for python2 ascii = unidecode(names[i]) else: ascii = names[i] if names[i] != ascii: if not foundunicode: foundunicode = True outstr += '# Unicode Currency Names\n\n!utf8\n' outstr += names[i] + ' ' *(23-len(names[i])) + ascii + '\n' names[i] = ascii if foundunicode: outstr += '!endutf8\n\n' outstr += '# ISO Currency Codes\n\n' outstr += '\n'.join([x + ' '*20 + y for x,y in zip(codes,names)]) usd = codes.index('USD') euro = codes.index('EUR') usdval = values[usd] values = ['1|' + x +' euro' for x in values] values[euro] = usdval + ' US$' del names[usd] del values[usd] # print rates here now = datetime.now() outstr += '\n\n# Currency exchange rates from Time Genie (www.timegenie.com)\n' outstr += '\n!message Currency exchange rates from www.timegenie.com on '+now.strftime('%Y-%m-%d')+'\n\n' maxlen = max(map(len,names)) + 2 outstr += '\n'.join([x.ljust(maxlen) + y for x,y in zip(names, values)]) # precious metals prices outstr += '\n\n# Precious metals prices from http://services.packetizer.com/spotprices/\n\n' try: spotprices = ET.parse(urllib.urlopen('http://services.packetizer.com/spotprices/?f=xml')) except IOError, exc: sys.stderr.write('Error connecting to spotprices server. {0}\n'.format(exc)) sys.exit(1) metals = ['gold','platinum','silver'] for metal in metals: outstr += '{0} {1} US$/troyounce\n'.format((metal+'price').ljust(15), spotprices.find(metal).text) try: if outfile == '-': info = codecs.lookup('utf8') outfile = codecs.StreamReaderWriter(sys.stdout, info.streamreader, info.streamwriter) else: outfile = codecs.open(outfile,'w','utf8') except IOError, exc: sys.stderr.write('Unable to write to output file. {0}\n'.format(exc)) sys.exit(1) outfile.write(outstr.replace('\n',os.linesep)) # In python3, open(outfile,mode='w',encoding='utf8') should work # and then the explicit newline handling won't be needed units-2.12/configure.ac0000664000175000017500000000664312603104446014357 0ustar adrianadriandnl Copyright (C) 2006, 2014 Free Software Foundation, Inc dnl Process this file with autoconf to produce a configure script. AC_INIT(GNU units,2.12,adrianm@gnu.org) AC_PREREQ(2.59) AC_ARG_PROGRAM AC_SUBST(DEFIS) AC_SUBST(STRFUNC) AC_SUBST(UDAT) AC_SUBST(HAVE_PYTHON) AC_SUBST(PYTHON_VERSION) AC_SUBST(MKSFIX) dnl Hack to set correct CFLAGS for cl compiler while still dnl allowing user to override the CFLAGS setting saveCFLAGS=$CFLAGS AC_PROG_CC(gcc cc egcs cl.exe) AC_PROG_CC_C99 if test "$CC" = cl.exe -a -z "$saveCFLAGS" ; then AC_MSG_NOTICE([setting special CFLAGS value for cl]) CFLAGS="-O2 -W3 -nologo" fi AC_C_CONST AC_PROG_INSTALL AC_PROG_MKDIR_P dnl Checks for libraries. AC_SEARCH_LIBS(sin,m) dnl Check for readline with various possible required support libs AS_UNSET(ac_cv_lib_readline_readline) for termlib in "" -ltermcap -lncurses -lcurses; do if test "$ac_cv_lib_readline_readline" != yes ; then AS_UNSET(ac_cv_lib_readline_readline) AC_CHECK_LIB(readline,readline, [LIBS="-lreadline $termlib $LIBS";DEFIS="$DEFIS -DREADLINE"], [],[$termlib]) fi done if test "$ac_cv_lib_readline_readline" = yes; then AC_CHECK_DECL(rl_completion_suppress_append, [], [DEFIS="$DEFIS -DNO_SUPPRESS_APPEND"], [[#include ]]) fi dnl Checks for header files. AC_CHECK_HEADER(string.h,[],[DEFIS="$DEFIS -DSTRINGS_H"]) AC_CHECK_HEADER(stdlib.h,[],[DEFIS="$DEFIS -DNO_STDLIB_H"]) dnl Checks for library functions. AC_CHECK_FUNC(strchr,[],DEFIS="$DEFIS -DNO_STRCHR") AC_CHECK_FUNC(strspn,[],DEFIS="$DEFIS -DNO_STRSPN";STRFUNC="strfunc.$OBJEXT") AC_CHECK_FUNC(strtok,[],DEFIS="$DEFIS -DNO_STRTOK";STRFUNC="strfunc.$OBJEXT") AC_CHECK_FUNC(setenv,[],DEFIS="$DEFIS -DNO_SETENV") AC_CHECK_FUNC(setlocale,[],DEFIS="$DEFIS -DNO_SETLOCALE") AC_CACHE_CHECK([for locale and UTF-8 support], am_cv_utf8, [AC_TRY_LINK([ #define _XOPEN_SOURCE 600 #include #include #include ], [wchar_t *out;char *in;char *res; res=setlocale(LC_CTYPE,"");res=in; mbsrtowcs(out, &res, 2, NULL); wcswidth(out,2);], am_cv_utf8=yes, am_cv_utf8=no) ]) if test $am_cv_utf8 = yes; then DEFIS="$DEFIS -DSUPPORT_UTF8" fi AC_CACHE_CHECK([for isfinite], am_cv_isfinite, [AC_TRY_LINK([ #define _XOPEN_SOURCE 600 #include ], [float a;a=1;isfinite(a);], am_cv_isfinite=yes, am_cv_isfinite=no) ]) if test $am_cv_isfinite = no; then DEFIS="$DEFIS -DNO_ISFINITE" fi AC_CHECK_PROG(mkstoolkit,mksinfo,found,no) if test $mkstoolkit = found; then if mksinfo > /dev/null; then DEFIS="$DEFIS -DHAVE_MKS_TOOLKIT" echo 'using MKS Toolkit' MKSFIX=".POSIX:" else echo 'mksinfo failed... not using MKS Toolkit' fi fi AC_PATH_PROG(PYTHON, python, no) if test $PYTHON = no; then HAVE_PYTHON=no echo ' Units will work without python but the currency update' echo ' script, units_cur, will not be installed' PYTHON='' else HAVE_PYTHON=yes fi dnl Check for path search option AC_ARG_ENABLE([relocation], AC_HELP_STRING([--enable-relocation], [look in program directory for units data files (default is NO)]), [if test $enable_relocation = yes ;then UDAT="" echo relocation enabled else UDAT="$datadir/units/" echo relocation disabled fi ], [UDAT="$datadir/units/"]) AC_CONFIG_FILES(Makefile) AC_OUTPUT units-2.12/getopt1.c0000664000175000017500000001030412301221017013572 0ustar adrianadrian/* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ #ifdef HAVE_CONFIG_H #include #endif #include "getopt.h" #if !defined (__STDC__) && !defined (_MSC_VER) || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #else char *getenv (); #endif #ifndef NULL #define NULL 0 #endif int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST #include int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == EOF) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ units-2.12/unitsfile.ico0000664000175000017500000005372612314123647014576 0ustar adrianadrian00Јf ЈhЖ00 Ј%  ЈЦB hnS(0`чччцццхххфффшшшууулллрррйййнннжжжЦЦЦХХХФФФУУУЧЧЧШШШооодддееећћћЯЯЯТТТџџџЩЩЩПППЊЊЊбббдЩШНННІІІаааОООЅЅЅЮЮЮРРРтттЪЪЪСССЉЉЉЬЬЬЎЎЎЂЂЂЈЈЈЖЖЖвввїїїЫЫЫЁЁЁ‚‚‚yyyzzzЙЙЙјјјЏЏЏ   “““ŒŒŒ‰‰‰™™™АААѓѓѓзззкккЭЭЭДДДЋЋЋЃЃЃЕЕЕмммсссКККМММпппгггыыыъъъЬ‹sЬŠrЬ‰qЫˆpЫˆoЫ‡nЪ†nЪ†mЪ…lЪ„kЩ„jЩƒjЩ‚iШ‚hШgШ€fЧeЧ~dЧ~cЦ}bЦ|bЦ|aЦ{`Хz_Хz^Хy^Фx]Фx\Фw[ФvZУvZУuYУtXТtWТsVТrVТrUСqTСpSСpRРoQРnQРnPПmOПlNПlMПkMОjLОjKОiJНhIНgHНfGМfFЛdDЛcCЛbBЛbAКaAМdEК`?Й_>Й^=К`@И\;Й]<ЗZ9ЗZ8љљљњњњЖX5ЖW5ЕV3ЕU2ЕT1И\:И[9ЗY7ЗX6ЖV4§§§ўўўќќќŸ     ŸŸŸŸŸŸ Ё      ”””   “   “““Ÿ›‘’œœ•–žž—˜™™™™™™˜˜—ž–••œ’‘‘›šŒ‹š›‘‘’œ••–ž—˜˜™™™™™™˜—žž–•œ’’‘›š‹Œšš›‘’œœ•–žž—˜™™™™™™˜——ž–•œ’‘›‡ˆ‰Ž‹‹Œš›‘‘’œ•––ž—˜™™™™™™™˜—ž––•Š……†‡ˆ‰‰Ž‹Œš››‘’œ•–ž——˜™™™™™™˜——‚ƒ„‡ˆ‰ŒŒ‘’’––™™™€€Š…†ˆ‰ŽŒ’—˜|}€‚ƒ„Š…†ˆ‰ŒŒ‘’’•–”xy|}}€ƒ„„…†ˆ‰‹Œ‘’““”uvxyz|}~€ƒ„Š…ˆˆ‰Žqruuvyyz}}~ƒ„Š…†‹Œnoqrsuvwyz{}~€‚ƒ„…†‡ˆˆ‰jkmnoqrsuvyz}}ƒ„…†ggjkknoovwy~‚ƒ„cdfghjklmnqrsuz{€_`abccdefgghijkklmnoopqrsuvwwxyz{{|}~]^^^_`aabcdeefghiijklnoqrstuuvwxyzzYZ[\\]^^__`abccdefgghkklnoopqrsttuvwVVWXYZZ[\]^^^_`aabcdeefghiijklmnnopqrrsRSTTUVWXXYZ[\\]^^__`abccdefghhijkllmnopOPPQRRSTUVVWXYZZ[\]^^^_`abbcdeffghijjkl%MNHH%K @LL GHA&!IJ @AB$CDE9E(FG.'89:;<2=>? 0-12345367) *+,-./&'()$%# !"#     џџџџџџџџџџџџџ№џ№џ№џ№џ№џ№џ№џ№рррррррррррррррррррррџ№џ№џ№џ№џ№џ№џ№џ№џ№џ№?џ№џ№џџ№џџ№џџ№џџ№џџ№џ( @чччцццхххфффшшшсссќќќжжжтттдЩШЧЧЧџџџлллШШШиииЭЭЭЊЊЊ•••КККђђђкккДДД›››………щщщпппвввЩЩЩТТТюююяяя№№№эээЪ„kЩƒjЩ‚iШ€gШ€fЧ~eЧ}cЦ|bЦ{aХz_Хx^Фw\Фv[УuZУtXУsWТrVСpTСoRСnRРmPПlNПkNПjLОhJНgIНfHНeFЩhЧ~dЧ|bХy^Хx]УtYшЫСпИЊЫ…mОiKМdFМcDШfЦz`ФvZТqUСpSєщхщаЧРlOтОВыгЫНfGЛbCЛaBоооЯ{ЧfРnQПjMётмывЪПkOЬ‰qЛ`AК_?зЃ‘б”щЭФіяьфСЕї№ээибћњљЯ‘{єшфщЮХсМАьжЯЪ„lјђ№шЬТК^>Й]=ѕѕѕжЂа’}шЭУуРДфСЖжЁŽќћћхХКщЮФЮzіюьѓчтд›ˆуТЖіюыЪ†nпЖЈѓчуИ[:уПГУsXїяьёслъбШоЖЈюмеиЇ–ПmOИZ:ЗY8іііеŸЯzчЫТтПВћљјшЭФ№рлъаЧНgHчЩПњіѕЗW6їїїеž‹в˜…тОБњїїМdE№ркв—„ЛbBг›ˆдœ‰ЖU3рррјјјЭ‹t№оиуСЕсНАњїішЬУчЫСьеЮѕьщеŸŒћћњоДЅфФЙЪ…lљљљхЦЛьзЯйЉ˜иЅ”нБЂК`@хФЙмЏ Й\<К`?цЧМљєѓлЌœЖV4ЖV5њњњЙ^>Й\;ЗX7ЗX6ћћћИZ9§§§ЪЪЪЫЫЫеееўўўьььееееййййй ееееййй        к жжжжжжжжжзжззззий;I<>?JKЊbФtuЧ‰дбвЭ­­­ЬЁв”“аЧ е9:;<=>?ЇWЊbctuа“дбЁЭ­­­ЬЁбд“\89]I<=VJЇWXbcЯЧа“”бЁЬ­­­ЭвбЎгP6ПРСЕ<ТUJKПУФХЦЧЌpШЩЪЫЬЭЎЮ4АБВk…;ГД>?ˆЕЊ‚ЖtЗИЙГКЛМН­ЎО2ЃЄ6j…9ЅІ<=ˆyЇˆsbЈŽuAЉЊЋЌ­ЎЏN–—O˜…\™š]Im›VˆyWœcžŸ 4ЁЂD|l3sPŠ‹:Œn<ˆyJŽX‘’“”•-wx1yg4z{|}~;m€‚ƒ„…†‡ˆ7‰v+de/fg2hijkl9mnopqrstuvA*+MC./N124Z[6\89]^_=V`aAXbcY(LAB+MCD/NE34OPQRSTUI<>VJKWXY&@()AB,-CD01E34FG78H:;I<>?JK$%&'()*+,-./0123456789:;<=>? !!"#              џџџџџџџџџрџрџрџрџрџрџрџрџрџрџрџрџрџрџр?џр( ЩЩЩфффŸŸŸћћћЙЙЙііішшшдЩШРРРКККХХХдддЕЕЕЃЃЃПППэээщщщхххчччЩƒiШ€fЧ~dЦ|aХz_Хx]ФvZУtXСpSРnPПlNОjKОhIТrUНfGМcDК_?И[:ЗY8њњњЛaAЙ]=ЗX6ЗY7И[9Й]<К_>јјјўўўџџџќќќ§§§оооЄЄЄЅЅЅ4566722311111'011/ "#($)%&*+,-. #$% #$%&' #$% ! "#   рррррррр№(0` &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& VsssssssssssssssssssssssssssssssV&§§§џўўўџўўўџўўўџўўўџўўўџћћћџћћћџћћћџћћћџћћћџћћћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&§§§џ§§§џ§§§џ§§§џ§§§џ§§§џћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&ќќќџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџћћћџдЩШџдЩШџдЩШџдЩШџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџўўўџўўўџўўўџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&ћћћџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџдЩШџћћћџдЩШџдЩШџћћћџћћћџћћћџўўўџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&&њњњџњњњџњњњџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџўўўџўўўџўўўџџџџџџџџџџџџџџџџџџџџџџџџџ&&љљљџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџўўўџўўўџўўўџџџџџџџџџџџџџџџџџ&&љљљџљљљџљљљџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџ§§§џћћћџћћћџћћћџћћћџџџџџ&И[9џЗZ9џЗZ8џЗY7џЗY7џЗX6џЖX5џЖW5џЖV4џЖV4џЕV3џЕU2џЕT1џЕT1џЕT1џЕT1џЕT1џЕT1џЕU2џЕU2џЕV3џЖV4џЖW5џЖX5џЖX5џЗX6џЗY7џЗZ8џЗZ9џЗZ9џИ[9џИ\:џИ\;џЙ]<џЙ^=џЙ^=џЙ^=џЙ_>џК`?џћћћџћћћџћћћџ&Й]<џЙ]<џИ\;џИ\:џИ[9џЗZ9џЗZ9џЗZ8џЗY7џЗX6џЖX5џЖX5џЖW5џЖV4џЕV3џЕU2џЕU2џЕT1џЕT1џЕT1џЕT1џЕT1џЕT1џЕU2џЕV3џЖV4џЖV4џЖW5џЖX5џЗX6џЗY7џЗZ8џЗZ8џЗZ9џИ[9џИ\:џИ\;џИ\;џЙ]<џћћћџћћћџћћћџ&К`?џЙ_>џЙ^=џЙ^=џЙ^=џЙ]<џИ\;џИ\:џИ\:џИ[9џЗZ9џЗZ8џЗY7џЗY7џЗX6џЖX5џЖW5џЖV4џЖV4џЕV3џЕU2џЕT1џЕT1џЕT1џЕT1џЕT1џЕT1џЕU2џЕV3џЕV3џЖV4џЖW5џЖX5џЗX6џЗX6џЗY7џЗZ8џЗZ9џИ[9џћћћџћћћџћћћџ&ЛbBџЛbAџКaAџК`@џК`?џК`?џЙ_>џЙ^=џЙ^=џЙ]<џЙ]<џИ\;џИ\:џИ[9џЗZ9џЗZ9џЗZ8џЗY7џЗX6џЖX5џЖW5џЖW5џЖV4џЕV3џЕU2џЕT1џЕT1џЕT1џЕT1џЕT1џЕT1џЕT1џЕU2џЕV3џЖV4џЖW5џЖW5џЖX5џЗX6џћћћџћћћџћћћџ& МdEџЛdDџЛdDџНhIџЫ‡oџУtWџКaAџКaAџК`@џК`?џЙ_>џЙ^=џЙ^=џЙ^=џЙ]<џИ\;џИ\:џИ[9џИ[9џЗZ9џЗZ8џЗY7џЗX6џЗX6џЖX5џЖW5џНgHџЦ~cџМgGџЕU2џЕT1џЕT1џУuYџЦ|bџНfGџЕT1џЕU2џЕV3џЕV3џћћћџћћћџћћћџ& НgHџНfGџЦ~dџіяэџћћћџћћћџоЗЈџчЬТџћћћџв˜„џЛbAџк­џћћћџчЫРџЙ_>џЙ_>џЮxџћћћџђхсџИ\;џМgHџћћћџћћћџСrVџЗZ8џЦ~cџљїіџћћћџћћћџИ\;џХz`џђхсџћћћџћћћџћћћџцЩПџИ[9џЕT1џЕT1џћћћџћћћџћћћџ& ОiJџОiJџъгЪџћћћџњљјџьжЮџњљјџјѓђџћћћџвš†џЛdDџлЎžџћћћџчЫСџЛbAџКaAџЮzџћћћџђцсџЙ_>џНhJџћћћџћћћџУtXџИ\;џсМЏџћћћџіяьџюнзџЛcCџіюьџћћћџѕьщџъвЪџљѕєџћћћџпЙЋџЕV3џЕU2џћћћџћћћџћћћџ& ПlMџПkMџїѓёџћћћџжЄ‘џОiJџЭvџћћћџћћћџгœˆџНfGџлЏŸџћћћџчЬТџМdEџЛdDџЯ“}џћћћџђцтџЛbAџОkMџћћћџћћћџУvZџЙ_>џцЪРџћћћџк­œџИ\;џа–џћћћџѕэъџКbBџЗZ8џЫŠsџћћћџіяьџЖX5џЖW5џћћћџћћћџњњњџ& РnQџРnPџћњњџћћћџЫˆoџПkMџПkMџі№юџћћћџд‰џНhIџмАЁџћћћџшЭУџНfGџМfFџа•џћћћџђцтџЛdDџПmOџћћћџћћћџХy]џКaAџчЫСџћћћџиЇ–џЙ_>џЙ^=џК`?џФy^џМcCџЬ‹tџцЩПџћћћџїђ№џЗZ9џЗZ8џљљљџљљљџњњњџ& СpSџСpRџћћћџћћћџЫ‡pџРnPџПmOџѓчуџћћћџдŸ‹џПkMџмБЂџћћћџшЮФџОiJџНhIџа–џћћћџѓчуџНfGџРpRџћћћџћћћџХz`џЛdDџчЬТџћћћџйЉ—џЛbAџКaAџСrUџфУЗџњљјџћћћџћћћџћћћџфУИџИ\;џИ\;џћћћџћћћџћћћџ& ТsVџТrVџћћћџћћћџЫ‰qџСpSџСpRџѓшфџћћћџе џРnPџнГЄџћћћџщбЧџПkMџПkMџб—ƒџћћћџѓчуџНhIџСrUџћћћџћћћџЦ|bџМfFџчЬТџћћћџйЊ™џЛdDџЛcCџёуоџћћћџћћћџћћћџљієџрЛЎџНgHџЙ_>џЙ^=џћћћџћћћџћћћџ& УuYџУtXџћћћџћћћџЬ‹tџТrVџТrUџѓшфџћћћџжЁџСpRџнДЅџћћћџяпкџРnPџПmOџжЃџћћћџѓчуџПkMџТtXџћћћџћћћџЧdџНhIџшЭУџћћћџкЋ›џНfGџЧ€eџћћћџњљјџтПВџЭŽwџТrVџОiKџЛbAџЛbAџКaAџћћћџћћћџћћћџ& Фx\џФw[џћћћџћћћџЭŽwџУuYџУtXџѓщхџћћћџжЃ‘џТrVџоЕЇџћћћџћћћџжЁџТsVџъвЩџћћћџюмеџРnPџУvZџћћћџћћћџШ€gџЩƒjџэйвџћћћџуСДџЫ‰qџШhџћћћџєъцџРnQџОkLџчЬТџћћћџмБЂџЛdDџЛcCџћћћџћћћџћћћџ& Хz^џХz^џћћћџћћћџЮyџФw[џФw[џѓщхџћћћџзЅ“џУtXџпЖЈџћћћџђцтџћћћџћћћџћћћџћћћџпЙЋџСpRџФx\џћћћџћћћџЩƒiџшЯХџћћћџћћћџћћћџїђ№џПlNџђхсџћћћџћћћџћћћџћћћџћћћџЫ‰qџНfGџМfFџћћћџћћћџћћћџ& Ц|bџЦ|aџюлдџюлдџЬ‹tџХz^џХy^џшЭУџэкдџг›†џФw[џиЇ•џэкгџиЇ•џлЏŸџї№юџћћћџхЧМџФw[џТrVџХx]џэйбџэибџЧeџпИЉџі№юџћћћџѓшфџщбШџПmOџЧeџшЭУџћћћџћћћџђхрџг‰џОiJџНhIџНhIџћћћџћћћџћћћџ& ЧeџЧ~dџЧ~cџЦ}bџЦ|bџЦ|bџЦ|aџЦ{`џХz_џХz^џХz^џХy^џФx]џФx\џФw[џФw[џФvZџУvZџУuYџУtXџУtXџТtWџТsVџТrVџТrUџщаЧџћћћџмА џСpRџРoQџРoQџРnQџРnPџПmOџПlNџПlNџПlMџПkMџОjLџћћћџћћћџћћћџ& ШgџШ€fџШ€fџШ€fџЧeџЧ~dџЧ~cџЧ~cџЦ}bџЦ|bџЦ|aџЦ{`џЦ{`џХz_џХz^џХy^џФx]џФx]џФx\џФw[џШeџћћћџћћћџЫ‰qџУtXџцЩПџћћћџмВЂџТrVџТrUџСqTџСpSџСpSџСpRџРoQџРnQџРnPџПmOџПmOџћћћџћћћџћћћџ& Щ„jџЩƒjџЩ‚iџШ‚hџШ‚hџШgџШ€fџШ€fџЧeџЧeџЧ~dџЧ~cџЦ}bџЦ|bџЦ|bџЦ|aџЦ{`џХz_џХz^џХz^џЩ‚hџћћћџћћћџЬ‹sџФw[џЦz_џуТЖџнГЄџУtXџУtXџТtWџТsVџТrVџТrUџСqTџСqTџСpSџСpRџРoQџћћћџћћћџћћћџ& Ъ†mџЪ†mџЪ…lџЪ„kџЩ„jџЩƒjџЩƒjџЩ‚iџШ‚hџШgџШ€fџШ€fџШ€fџЧeџЧ~dџЧ~cџЧ~cџЦ}bџЦ|bџЦ|aџШeџрКЌџрЙЌџЩƒiџХy^џФx]џФx]џЦ}bџФw[џФvZџУvZџУuYџУuYџУtXџТtWџТsVџТrVџТrVџТrUџћћћџћћћџћћћџ& ЫˆpџЫˆoџЫ‡nџЫ‡nџЪ†nџЪ†mџЪ…lџЪ„kџЪ„kџЩ„jџЩƒjџЩ‚iџШ‚hџШ‚hџШgџШ€fџШ€fџЧeџЧeџЧ~dџЧ~cџЦ}bџЦ|bџЦ|bџЦ|aџЦ{`џХz_џХz^џХy^џХy^џФx]џФx\џФw[џФvZџФvZџУvZџУuYџУtXџТtWџћћћџћћћџћћћџ&Ь‹sџЬŠrџЬŠrџЬ‰qџЫˆpџЫˆpџЫˆoџЫ‡nџЪ†nџЪ†mџЪ†mџЪ…lџЪ„kџЩ„jџЩƒjџЩƒjџЩ‚iџШ‚hџШgџШ€fџШ€fџШ€fџЧeџЧ~dџЧ~cџЦ}bџЦ}bџЦ|bџЦ|aџЦ{`џХz_џХz_џХz^џХy^џФx]џФx\џФx\џФw[џФvZџћћћџћћћџћћћџ&&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџ&&ћћћџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџтттџыыыџъъъџшшшџчччџфффџуууџсссџсссџтттџуууџчччџ&&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџоооџчччџфффџпппџйййџзззџгггџбббџбббџгггџжжжџмммџ#&ћћћџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџлллџсссџкккџбббџЪЪЪџУУУџОООџКККџМММџПППџЦЦЦџбббџ&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџзззџкккџЭЭЭџРРРџДДДџЋЋЋџЃЃЃџ   џЃЃЃџЉЉЉџЕЕЕџмммб&ћћћџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџћћћџвввџбббџСССџЏЏЏџ   џ“““џŒŒŒџ‰‰‰џџ™™™џАААєѓѓѓ&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџаааџЫЫЫџЖЖЖџЁЁЁџџ‚‚‚џyyyџzzzџ‚‚‚џЙЙЙџјјјуЫЫЫ2&ћћћџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџћћћџЬЬЬџХХХџЎЎЎџЊЊЊџЂЂЂџЈЈЈџЖЖЖџвввџїїїџџџџџЪЪЪT&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџЪЪЪџСССџЉЉЉџуууџџџџџџџџџџџџџџџџџџџџџЬЬЬ„&ћћћџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџШШШџРРРџІІІџтттџџџџџџџџџџџџџџџџџЮЮЮЋ&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџЦЦЦџОООџЅЅЅџуууџџџџџџџџџџџџџЮЮЮХ&ћћћџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџћћћџћћћџћћћџћћћџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџдЩШџћћћџЦЦЦџНННџІІІџуууџџџџџџџџџааан&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџЩЩЩџПППџЊЊЊџџџџџџџџџбббяzzz&ћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџЯЯЯџТТТџШШШџџџџџдддї3&ЦЦЦџХХХџХХХџФФФџФФФџУУУџУУУџУУУџУУУџУУУџФФФџФФФџХХХџХХХџЦЦЦџЦЦЦџЧЧЧџЧЧЧџШШШџФФФџоооџдддџШШШџцццџеееј3цццџцццџхххџхххџфффџфффџфффџфффџфффџфффџфффџфффџхххџхххџцццџцццџчччџчччџшшшџфффџрррџйййџнннџжжжє“““2 чччџцццџцццџхххџхххџхххџфффџфффџфффџфффџхххџхххџхххџцццџцццџцццџчччџчччџшшшџцццџуууџчччџлллзˆˆˆџрџрџрџрџрџрџрџрџрџрррРрРРРРРРРРРРРРРРРРРџрџрџрџрџрџрџрџрџрџрџр?џрџрџџрџџрџџрџџрџ( @ &&&&&&&&&&&&&&&&&& VssssssssssssssssssV3§§§џ§§§џ§§§џ§§§џўўўџўўўџўўўџўўўџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&3ќќќџќќќџќќќџќќќџќќќџ§§§џ§§§џ§§§џ§§§џўўўџўўўџўўўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ&3ќќќџдЩШџдЩШџќќќџќќќџќќќџдЩШџдЩШџдЩШџдЩШџќќќџдЩШџдЩШџдЩШџдЩШџќќќџќќќџќќќџќќќџџџџџ&3ќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџџџџџ&        3сссџсссџсссџсссџсссџсссџсссџсссџсссџсссџтттџсссџтттџтттџтттџтттџчччџьььџќќќџџџџџ&&&&&&3ЪЪЪџЪЪЪџЩЩЩџЪЪЪџЪЪЪџЪЪЪџЪЪЪџЪЪЪџЪЪЪџЪЪЪџЫЫЫџЪЪЪџЫЫЫџЫЫЫџЫЫЫџЫЫЫџеееџцццџќќќџўўўџ&ПjLџОiKџОhJџНfHџНeFџМdFџМcDџЛbBџЛ`AџК`@џК^>џЙ]=џЙ\<џИ[:џИZ9џЗX7џЗX6џЖV5џЖU3џЖU3џЖU3џЖV4џЗW6џЗX6џЗY8џИZ:џЙ\;џЙ\<џтттџќќќџ§§§џ&ПlNџПkNџПjLџОhJџНgIџНfHџНeFџМdEџЛbCџЛbBџЛ`AџК_?џК^>џЙ]=џЙ\;џИZ:џИZ9џЗX7џЗW6џЖV5џЖU3џЖU3џЖU3џЖV4џЗW6џЗX7џИZ9џИZ:џсссџќќќџќќќџ&РnQџРmPџПlNџПjMџОiKџОhJџНgIџНfGџМdFџМdEџЛbCџЛaBџЛ`AџК_?џЙ^>џЙ\<џЙ\;џИZ:џЗY8џЗX7џЗW6џЖV4џЖU3џЖU3џЖU3џЖV5џЗX6џЗX7џрррџќќќџћћћџ&СpSџСoRџхЦЛџќќќџьзߟ銘џшЬУџОhJџиЅ”џыгЫџМdFџМcDџхЦЛџнБЂџК`@џхФЙџмЏ џЙ\<џдœ‰џќќќџьжЯџК`?џцЧМџќќќџљєѓџлЌœџЖV4џЖV5џрррџќќќџњњњџ&ТrVџЭ‹tџќќќџ№оиџуСЕџћњљџіюыџПjLџсНАџњїіџНfHџНeFџѓчуџшЬУџЛbBџѓчтџчЫСџК^>џьеЮџѕьщџеŸŒџсНАџћћњџоДЅџфФЙџќќќџЪ…lџЖU3џрррџќќќџљљљџ&УtXџеž‹џќќќџв˜…џСoRџэибџіюыџПlNџтОБџњїїџОhJџНgIџѓчуџшЭУџМdEџѓчуџшЬТџЛ`Aџ№ркџъбШџЙ]=џЧ~dџв—„џЛbBџг›ˆџќќќџдœ‰џЖU3џрррџќќќџјјјџ&ФvZџеŸџќќќџЯzџТqUџчЫТџіюыџРnQџтПВџћљјџПjMџОiKџєшфџшЭФџНfGџѓчуџшЭУџЛbCџ№рлџъаЧџК_?џНgHџчЩПџќќќџќќќџњіѕџТrVџЗW6џпппџќќќџїїїџ&Хx]џжЁŽџќќќџЯ‘{џУsWџшЬТџіюьџСpSџуПГџќќќџУsXџПkNџїяьџщЮХџОhJџѓчуџшЭУџМdFџёслџъбШџЛaBџоЖЈџќќќџюмеџиЇ–џПmOџИZ:џЗY8џпппџќќќџіііџ&Хz_џжЂџќќќџа’}џУuZџшЭУџіяьџТrVџуРДџќќќџфСЖџжЁŽџќћћџхХКџПjLџєшфџщЮФџЮzџіюьџѓчтџд›ˆџуТЖџіюыџЪ†nџпЖЈџѓчуџСnRџИ[:џпппџќќќџѕѕѕџ&Ц|bџзЃ‘џќќќџб”џФw\џщЭФџіяьџУtXџфСЕџї№эџэибџќќќџћњљџЯ‘{џПlNџєшфџщЮХџсМАџќќќџќќќџьжЯџЪ„lџјђ№џќќќџќќќџшЬТџК^>џЙ]=џпппџќќќџѕѕѕџ&Ч~dџЧ}cџЦ|bџЦz`џХy^џХx^џФw\џФvZџУuZџУtXџТrVџЯ{џЧfџСoRџРnQџРmPџПlNџПjMџётмџывЪџНgIџНfGџПkOџЬ‰qџЧ~dџЛaBџЛ`AџК_?џоооџќќќџќќќџ&Ш€fџШfџЧ~dџЧ|bџЦ|bџЦz`џХy^џХx]џФw\џФvZџУtYџУsWџТrVџТqUџСpSџєщхџщаЧџРlOџтОВџыгЫџОiKџОhJџНfHџНfGџМdFџМcDџЛbCџЛaBџоооџќќќџќќќџ&Щ‚iџЩhџШ€fџЧ~eџЧ~dџЧ|bџЦ{aџХz_џХy^џХx]џФv[џУuZџУtYџУsWџТrVџшЫСџпИЊџСnRџРmPџЫ…mџПkNџПjLџОiKџОhJџНfHџНeFџМdFџМcDџпппџќќќџќќќџ"Ъ„kџЩƒjџЩ‚iџШ€gџШ€fџЧ~eџЧ}cџЦ|bџЦ{aџХz_џХx^џФw\џФv[џУuZџУtXџУsWџТrVџСpTџСoRџСnRџРmPџПlNџПkNџПjLџОhJџНgIџНfHџНeFџсссџќќќџќќќџ"3ќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџюююџяяяџяяяџ№№№џэээџхххџшшшџ"3ќќќџдЩШџдЩШџдЩШџдЩШџќќќџдЩШџдЩШџќќќџќќќџќќќџќќќџќќќџщщщџпппџиииџвввџЩЩЩџТТТџжжжџ3ќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџкккџДДДџ›››џџ………џџшшшз3ќќќџдЩШџдЩШџќќќџќќќџќќќџдЩШџдЩШџќќќџдЩШџќќќџќќќџќќќџЭЭЭџЊЊЊџџ•••џКККџђђђ§йййT3ќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџШШШџџџџџџџџџџџџџџџџџиии˜3ќќќџдЩШџдЩШџдЩШџќќќџќќќџдЩШџдЩШџќќќџќќќџќќќџќќќџќќќџЧЧЧџџџџџџџџџџџџџлллЯ3ќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџЧЧЧџџџџџџџџџтттђ3ќќќџдЩШџдЩШџдЩШџќќќџќќќџдЩШџдЩШџдЩШџдЩШџќќќџќќќџќќќџЧЧЧџџџџџсссђuuu3ќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџќќќџжжжџтттёuuu3чччџцццџхххџхххџфффџфффџфффџхххџцццџцццџчччџшшшџцццџсссЕџРџРџРџРџРџРРџРџРџРџРџРџРџРџРџРџР?(  оооЎЄЄЄ„ŸŸŸˆˆˆŸŸŸˆŸŸŸˆŸŸŸˆŸŸŸˆŸŸŸˆŸŸŸˆЅЅЅ„ŸŸŸˆќќќџќќќџћћћџћћћџћћћџ§§§џџџџџџџџџџџџџџџџџџџџџ ŸŸŸˆњњњџдЩШџдЩШџћћћџдЩШџдЩШџдЩШџдЩШџўўўџџџџџџџџџ ŸŸŸˆјјјџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџћћћџ ОjKџОhIџНfGџМcDџЛaAџК_?џЙ]=џИ[:џЗY8џЗX6џЗY7џИ[9џЙ]<џК_>џћћћџ ћћћџћћћџћћћџОhIџћћћџМcDџћћћџК_?џћћћџИ[:џћћћџћћћџћћћџћћћџћћћџ ћћћџСpSџћћћџПlNџћћћџОhIџћћћџМcDџћћћџК_?џћћћџИ[:џЗY8џћћћџњњњџ ћћћџУtXџћћћџСpSџћћћџПlNџћћћџОhIџћћћџМcDџћћћџК_?џћћћџИ[:џћћћџ ћћћџХx]џћћћџУtXџћћћџћћћџћћћџПlNџћћћџОhIџћћћџћћћџћћћџћћћџћћћџ Ч~dџЦ|aџХz_џХx]џФvZџУtXџТrUџСpSџРnPџПlNџћћћџОhIџНfGџМcDџћћћџ ЩƒiџШ€fџЧ~dџЦ|aџХz_џХx]џФvZџУtXџћћћџСpSџРnPџПlNџОjKџОhIџћћћџ ŸŸŸˆћћћџдЩШџћћћџћћћџдЩШџдЩШџћћћџэээџщщщџхххџчччџŸŸŸˆћћћџћћћџћћћџћћћџћћћџћћћџћћћџдддџЕЕЕџЃЃЃџПППюŸŸŸˆћћћџдЩШџдЩШџћћћџдЩШџдЩШџћћћџРРРџКККџХХХџоооpŸŸŸˆћћћџћћћџћћћџћћћџћћћџћћћџћћћџЙЙЙџіііџшшш™ЩЩЩџЩЩЩџЩЩЩџЩЩЩџЩЩЩџЩЩЩџЩЩЩџЩЩЩџфффГzzzрррррррр№units-2.12/currency.units0000664000175000017500000003301412607610576015011 0ustar adrianadrian# Unicode Currency Names !utf8 icelandkrУГna icelandkrona polandzХ‚oty polandzloty tongapaт€™anga tongapa'anga venezuelabolУ­var venezuelabolivar vietnamФ‘сЛ“ng vietnamdong !endutf8 # ISO Currency Codes AED uaedirham AFN afghanafghani ALL albanialek AMD armeniadram AOA angolakwanza ARS argentinapeso AUD australiadollar AWG arubaflorin AZN azerbaijanmanat BAM bosniaconvertiblemark BBD barbadosdollar BDT bangladeshtaka BGN bulgarialev BHD bahraindinar BIF burundifranc BMD bermudadollar BND bruneidollar BOB boliviaboliviano BRL brazilreal BSD bahamasdollar BTN bhutanngultrum BWP botswanapula BYR belarusruble BZD belizedollar CAD canadadollar CDF drcfranccongolais CHF swissfranc CLP chilepeso CMG sintmaartencaribbeanguilder CNY chinayuan COP colombiapeso CRC costaricacolon CUP cubapeso CVE capeverdeescudo CZK czechkoruna DJF djiboutifranc DKK denmarkkrona DOP dominicanrepublicpeso DZD algeriadinar EGP egyptpound ERN eritreanakfa ETB ethiopianbirr EUR euro FJD fijidollar FKP falklandislandspound GBP ukpound GEL georgialari GGP guernseypound GHS ghanacedi GIP gibraltarpound GMD gambiadalasi GNF guineafranc GTQ guatemalaquetzal GYD guyanadollar HKD hongkongdollar HNL honduraslempira HRK croatiakuna HTG haitigourde HUF hungariaforint IDR indonesiarupiah ILS israelnewshekel IMP manxpound INR indiarupee IQD iraqdinar IRR iranrial ISK icelandkrona JEP jerseypound JMD jamaicadollar JOD jordandinar JPY japanyen KES kenyaschilling KGS kyrgyzstansom KHR cambodiariel KMF comorosfranc KPW northkoreawon KRW southkoreawon KWD kuwaitdinar KYD caymanislandsdollar KZT kazakhstantenge LAK laokip LBP lebanonpound LKR srilankanrupee LRD liberiadollar LTL lithuanialita LVL latvialat LYD libyadinar MAD moroccodirham MDL moldovaleu MGA madagascarariary MKD macedoniadenar MMK myanmarkyat MNT mongoliatugrik MOP macaupataca MRO mauritaniaouguiya MUR mauritiusrupee MVR maldiverufiyaa MWK malawikwacha MXN mexicopeso MYR malaysiaringgit MZN mozambicanmetical NAD namibiadollar NGN nigerianaira NIO nicaraguacordobaoro NOK norwaykrone NPR nepalrupee NZD newzealanddollar OMR omanrial PAB panamabalboa PEN perunuevosol PGK papuanewguineakina PHP philippinepeso PKR pakistanrupee PLN polandzloty PYG paraguayguarani QAR qatarrial RON romanianewlei RSD serbiadinar RUB russiarouble RWF rwandafranc SAR saudiarabiariyal SBD solomonislandsdollar SCR seychellesrupee SDG sudanpound SEK swedenkrona SGD singaporedollar SHP sainthelenapound SLL sierraleoneleone SOS somaliaschilling SRD surinamedollar STD saotome&principedobra SVC elsalvadorcolon SYP syriapound SZL swazilandlilangeni THB thailandbaht TJS tajikistansomoni TMT turkmenistanmanat TND tunisiadinar TOP tongapa'anga TRY turkeylira TTD trinidadandtobagodollar TVD tuvaludollar TWD taiwandollar TZS tanzaniashilling UAH ukrainehryvnia UGX ugandaschilling USD usdollar UYU uruguaypeso UZS uzbekistansum VEF venezuelabolivar VND vietnamdong VUV vanuatuvatu WST samoatala XAF centralafricancfafranc XCD eastcaribbeandollar XDR specialdrawingrights XOF westafricanfranc XPF cfpfranc YER yemenrial ZAR southafricarand ZMW zambiakwacha ZWL zimbabwedollar # Currency exchange rates from Time Genie (www.timegenie.com) !message Currency exchange rates from www.timegenie.com on 2015-10-14 uaedirham 1|4.175642287901 euro afghanafghani 1|71.834 euro albanialek 1|139.44 euro armeniadram 1|539.16766610698 euro angolakwanza 1|151.63 euro argentinapeso 1|10.844411979547 euro australiadollar 1|1.5722 euro arubaflorin 1|2.04239 euro azerbaijanmanat 1|1.1998964405441 euro bosniaconvertiblemark 1|1.95583 euro barbadosdollar 1|2.282 euro bangladeshtaka 1|87.075 euro bulgarialev 1|1.9558 euro bahraindinar 1|0.429016 euro burundifranc 1|1751.9 euro bermudadollar 1|1.1410 euro bruneidollar 1|1.5949 euro boliviaboliviano 1|7.7365 euro brazilreal 1|4.4198 euro bahamasdollar 1|1.1410 euro bhutanngultrum 1|74.1465 euro botswanapula 1|11.805 euro belarusruble 1|19563.011314186 euro belizedollar 1|2.282 euro canadadollar 1|1.4816 euro drcfranccongolais 1|1038.5 euro swissfranc 1|1.0901 euro chilepeso 1|779.31758530184 euro sintmaartencaribbeanguilder 1|2.04239 euro chinayuan 1|7.2435 euro colombiapeso 1|3351.2415349887 euro costaricacolon 1|598.07 euro cubapeso 1|1.1203 euro capeverdeescudo 1|110.265 euro czechkoruna 1|27.113 euro djiboutifranc 1|202.779661 euro denmarkkrona 1|7.4612 euro dominicanrepublicpeso 1|50.666 euro algeriadinar 1|118.84 euro egyptpound 1|8.9318551668023 euro eritreanakfa 1|17.115 euro ethiopianbirr 1|23.439 euro euro 1.1410 US$ fijidollar 1|0.4076849051416 euro falklandislandspound 1|0.74180 euro ukpound 1|0.74180 euro georgialari 1|2.7114148200866 euro guernseypound 1|0.74180 euro ghanacedi 1|4.3690406121248 euro gibraltarpound 1|0.74180 euro gambiadalasi 1|43.753 euro guineafranc 1|8122.2 euro guatemalaquetzal 1|8.9649758454106 euro guyanadollar 1|232.13 euro hongkongdollar 1|8.8429 euro honduraslempira 1|25.137148662377 euro croatiakuna 1|7.6280 euro haitigourde 1|60.612 euro hungariaforint 1|311.04 euro indonesiarupiah 1|15534.04 euro israelnewshekel 1|4.3949 euro manxpound 1|0.74180 euro indiarupee 1|74.1465 euro iraqdinar 1|1361.2 euro iranrial 1|0.0229 euro icelandkrona 1|141.94177822682 euro jerseypound 1|0.74180 euro jamaicadollar 1|136.32690541781 euro jordandinar 1|0.808969 euro japanyen 1|136.48 euro kenyaschilling 1|117.51 euro kyrgyzstansom 1|78.121502797762 euro cambodiariel 1|4566.3 euro comorosfranc 1|491.96775 euro northkoreawon 1|145.7 euro southkoreawon 1|1308.96 euro kuwaitdinar 1|0.34321648936739 euro caymanislandsdollar 1|0.95083333333333 euro kazakhstantenge 1|312.7142459655 euro laokip 1|9131 euro lebanonpound 1|1720.0575 euro srilankanrupee 1|0.0062118176400539 euro liberiadollar 1|97.466 euro lithuanialita 1|3.45280 euro latvialat 1|0.702804 euro libyadinar 1|1.5236 euro moroccodirham 1|10.972653362897 euro moldovaleu 1|11.23895 euro madagascarariary 1|3590.6 euro macedoniadenar 1|61.538 euro myanmarkyat 1|1469.900990099 euro mongoliatugrik 1|0.0344 euro macaupataca 1|9.108187 euro mauritaniaouguiya 1|327.17 euro mauritiusrupee 1|39.715 euro maldiverufiyaa 1|17.241 euro malawikwacha 1|622.16 euro mexicopeso 1|18.8927 euro malaysiaringgit 1|4.8055 euro mozambicanmetical 1|47.523 euro namibiadollar 1|15.3094 euro nigerianaira 1|222.94 euro nicaraguacordobaoro 1|30.781 euro norwaykrone 1|9.2400 euro nepalrupee 1|118.6344 euro newzealanddollar 1|1.6938 euro omanrial 1|0.43871116579514 euro panamabalboa 1|1.1410 euro perunuevosol 1|3.7050162216122 euro papuanewguineakina 1|0.30504551766703 euro philippinepeso 1|52.447 euro pakistanrupee 1|0.0083800303495282 euro polandzloty 1|4.2378 euro paraguayguarani 1|6325.8 euro qatarrial 1|4.15324 euro romanianewlei 1|4.4145 euro serbiadinar 1|119.86551198234 euro russiarouble 1|71.9750 euro rwandafranc 1|850.31 euro saudiarabiariyal 1|4.27875 euro solomonislandsdollar 1|0.10707708972739 euro seychellesrupee 1|14.633 euro sudanpound 1|7.0481 euro swedenkrona 1|9.2716 euro singaporedollar 1|1.5815 euro sainthelenapound 1|0.74180 euro sierraleoneleone 1|5395.9 euro somaliaschilling 1|722.71 euro surinamedollar 1|3.697 euro saotome&principedobra 1|24504 euro elsalvadorcolon 1|9.8137 euro syriapound 1|247.23 euro swazilandlilangeni 1|15.3094 euro thailandbaht 1|40.533 euro tajikistansomoni 1|6.9076147042565 euro turkmenistanmanat 1|3.9790232072366 euro tunisiadinar 1|2.2257871064468 euro tongapa'anga 1|0.40393652523326 euro turkeylira 1|3.3500 euro trinidadandtobagodollar 1|7.1318205 euro tuvaludollar 1|1.5722 euro taiwandollar 1|37.087184611541 euro tanzaniashilling 1|2431.1 euro ukrainehryvnia 1|19.241014210086 euro ugandaschilling 1|4136.7 euro uruguaypeso 1|32.337 euro uzbekistansum 1|3011.9120996918 euro venezuelabolivar 1|7.2032993692382 euro vietnamdong 1|25596.551724138 euro vanuatuvatu 1|0.008155099515314 euro samoatala 1|0.33965181537052 euro centralafricancfafranc 1|655.957 euro eastcaribbeandollar 1|3.0807 euro specialdrawingrights 1|1.9241014210086 euro westafricanfranc 1|655.957 euro cfpfranc 1|119.33 euro yemenrial 1|240.74 euro southafricarand 1|15.3094 euro zambiakwacha 1|13.544 euro zimbabwedollar 1|353.62 euro # Precious metals prices from http://services.packetizer.com/spotprices/ goldprice 1184.00 US$/troyounce platinumprice 1002.00 US$/troyounce silverprice 16.15 US$/troyounce units-2.12/units.c0000664000175000017500000050233012607610474013400 0ustar adrianadrian#define VERSION "2.12" /* * units, a program for units conversion * Copyright (C) 1996, 1997, 1999, 2000-2007, 2009, 2011-2015 * Free Software Foundation, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * This program was written by Adrian Mariano (adrianm@gnu.org) */ #define _XOPEN_SOURCE 600 #if defined (_WIN32) && defined (_MSC_VER) # include # include #endif #if defined (_WIN32) && defined (HAVE_MKS_TOOLKIT) # include # include #endif #include #include #include #include #include #include #ifndef NO_SETLOCALE # include #endif #ifdef SUPPORT_UTF8 /* Apparently this define is needed to get wcswidth() prototype */ # include # include # define UTF8VERSTR "with utf8" #else # define UTF8VERSTR "without utf8" #endif #ifdef READLINE # define RVERSTR "with readline" # include # include # define HISTORY_FILE ".units_history" # if defined (_WIN32) && defined (_MSC_VER) # include # define isatty _isatty # endif #else # define RVERSTR "without readline" #endif #include "getopt.h" #include "units.h" #ifndef UNITSFILE # define UNITSFILE "definitions.units" #endif #ifndef LOCALEMAP # define LOCALEMAP "locale_map.txt" #endif #ifndef DATADIR # define DATADIR "../share/units" #endif #if defined (_WIN32) && defined (_MSC_VER) # include # define getcwd _getcwd #else # include #endif #ifdef _WIN32 # define EXE_EXT ".exe" # define PATHSEP ';' #else # define EXE_EXT "" # define PATHSEP ':' #endif #ifndef EOFCHAR # ifdef _WIN32 # define EOFCHAR "Z" # else # define EOFCHAR "D" # endif #endif #define PRIMITIVECHAR '!' /* Character that marks irreducible units */ #define COMMENTCHAR '#' /* Comments marked by this character */ #define COMMANDCHAR '!' /* Unit database commands marked with this */ #define UNITSEPCHAR ';' /* Separator for unit lists. Include this */ /* char in rl_basic_word_break_characters */ /* and in nonunitchars defined in parse.y */ #define FUNCSEPCHAR ';' /* Separates forward and inverse definitions */ #define HELPCOMMAND "help" /* Command to request help at prompt */ #define SEARCHCOMMAND "search" /* Command to request text search of units */ #define UNITMATCH "?" /* Command to request conformable units */ #define DEFAULTPAGER "more" /* Default pager program */ #define DEFAULTLOCALE "en_US" /* Default locale */ #define MAXINCLUDE 5 /* Max depth of include files */ #define MAXFILES 25 /* Max number of units files on command line */ #define NODIM "!dimensionless" /* Marks dimensionless primitive units, such */ /* as the radian, which are ignored when */ /* doing unit comparisons */ #define NOPOINT -1 /* suppress display of pointer in processunit*/ #define NOERRMSG -2 /* no error messages in checkunitlist() */ #define MAXHISTORYFILE 5000 /* max length of history file for readline */ /* values for output number format */ #define BASE_FORMATS "gGeEf" /* printf() format types recognized pre-C99 */ #define DEFAULTPRECISION 8 /* default significant digits for printf() */ #define DEFAULTTYPE 'g' /* default number format type for printf() */ #define MAXPRECISION DBL_DIG /* maximum number precision for printf() */ #define HOME_UNITS_ENV "MYUNITSFILE" /* Personal units file environment var */ #define LICENSE "\ Copyright (C) 2015 Free Software Foundation, Inc.\n\ GNU Units comes with ABSOLUTELY NO WARRANTY.\n\ You may redistribute copies of GNU Units\n\ under the terms of the GNU General Public License." #define NOERROR_KEYWORD "noerror" #define CO_NOARG -1 /* Key words for function definitions */ struct { char *word; char delimit; int checkopen; /* allow open intervals with parentheses */ } fnkeywords[]={ {"units=", FUNCSEPCHAR, 0}, {"domain=", ',', 1}, {"range=", ',',1}, {NOERROR_KEYWORD, ' ',CO_NOARG}, {0,0}}; #define FN_UNITS 0 #define FN_DOMAIN 1 #define FN_RANGE 2 #define FN_NOERROR 3 char *builtins[] = {"sin", "cos", "tan","ln", "log", "log2", "exp", "acos", "atan", "asin", "sqrt", "cuberoot", "per", 0}; struct { char *format; /* printf() format specification for numeric output */ int width; /* printf() width from format */ int precision; /* printf() precision from format */ char type; /* printf() type from format */ } num_format; struct { /* Program command line option flags */ int unitlists, /* Perform unit list output if set */ oneline, /* Suppresses the second line of output */ quiet, /* Supress prompting (-q option) */ round, /* Round the last of unit list output to nearest integer */ showfactor, /* */ strictconvert, /* Strict conversion (disables reciprocals) */ unitcheck, /* Enable unit checking: 1 for regular check, 2 for verbose*/ verbose, /* Flag for output verbosity */ readline; /* Using readline library? */ } flags; #define UTF8MARKER "\xEF\xBB\xBF" /* UTF-8 marker inserted by some Windows */ /* programs at start of a UTF-8 file */ struct parseflag parserflags; /* parser options */ char *homeunitsfile = ".units"; /* Units filename in home directory */ char *pager; /* Actual pager (from PAGER environment var) */ char *mylocale; /* Locale in effect (from LC_CTYPE or LANG) */ int utf8mode; /* Activate UTF8 support */ char *powerstring = "^"; /* Exponent character used in output */ char *unitsfiles[MAXFILES+1]; /* Null terminated list of units file names */ char *logfilename=0; /* Filename for logging */ FILE *logfile=0; /* File for logging */ char *progname; /* Used in error messages */ char *fullprogname; /* Full path of program; printversion() uses */ char *progdir; /* Used to find supporting files */ char *datadir; /* Used to find supporting files */ char *deftext=" Definition: ";/* Output text when printing definition */ char *digits = "0123456789.,"; #define QUERYHAVE "You have: " /* Prompt text for units to convert from */ #define QUERYWANT "You want: " /* Prompt text for units to convert to */ #define LOGFROM "From: " /* tag for log file */ #define LOGTO "To: " /* tag for log file */ #define HASHSIZE 101 /* Values from K&R 2nd ed., Sect. 6.6 */ #define HASHNUMBER 31 #define SIMPLEHASHSIZE 128 #define simplehash(str) (*(str) & 127) /* "hash" value for prefixes */ char *errormsg[]={"Successful completion", "Parse error", "Product overflow", "Unit reduction error (bad unit definition)", "Invalid sum or difference of non-conformable units", "Unit not dimensionless", "Unit not a root", "Unknown unit", "Bad argument", "Weird nonlinear unit type (bug in program)", "Function argument has wrong dimension", "Argument of function outside domain", "Nonlinear unit definition has unit error", "No inverse defined", "Parser memory overflow (recursive function definition?)", "Argument wrong dimension or bad nonlinear unit definition", "Cannot open units file", "Units file contains errors", "Memory allocation error", "Malformed number", "Unit name ends with nonzero digit without preceding '_'", "No previous result; '_' not set", "Base unit not dimensionless; rational exponent required", "Base unit not a root", "Exponent not dimensionless", "Unknown function name", }; char *invalid_utf8 = "invalid/nonprinting UTF-8"; char *irreducible=0; /* Name of last irreducible unit */ /* Hash table for unit definitions. */ struct unitlist { char *name; /* unit name */ char *value; /* unit value */ int linenumber; /* line in units data file where defined */ char *file; /* file where defined */ struct unitlist *next; /* next item in list */ } *utab[HASHSIZE]; /* Table for prefix definitions. */ struct prefixlist { int len; /* length of name string */ char *name; /* prefix name */ char *value; /* prefix value */ int linenumber; /* line in units data file where defined */ char *file; /* file where defined */ struct prefixlist *next; /* next item in list */ } *ptab[SIMPLEHASHSIZE]; struct wantalias { char *name; char *definition; struct wantalias *next; int linenumber; char *file; }; struct wantalias *firstalias=0; struct wantalias *lastalias=0; /* Table for function definitions */ struct func *ftab[SIMPLEHASHSIZE]; /* Used for passing parameters to the parser when we are in the process of parsing a unit function. If function_parameter is non-nil, then whenever the text in function_parameter appears in a unit expression it is replaced by the unit value stored in parameter_value. */ char *function_parameter = 0; struct unittype *parameter_value = 0; /* Stores the last result value for replacement with '_' */ int lastunitset = 0; struct unittype lastunit; char *NULLUNIT = ""; /* Used for units that are canceled during reduction */ #ifdef READLINE char *historyfile; /* Filename for readline history */ int init_history_length; /* Length of history read from the history file*/ int init_history_base; void save_history(void) { int newentries; int err; newentries = history_length-init_history_length; if (history_max_entries > 0){ newentries += history_base - init_history_base; if (newentries > history_max_entries) newentries = history_max_entries; } err = append_history(newentries,historyfile); if (err){ if (err == ENOENT) err = write_history(historyfile); if (err) { printf("Unable to write history to '%s': %s\n",historyfile,strerror(err)); return; } } history_truncate_file(historyfile,MAXHISTORYFILE); } #endif /* Increases the buffer by BUFGROW bytes and leaves the new pointer in buf and the new buffer size in bufsize. */ #define BUFGROW 100 void growbuffer(char **buf, int *bufsize) { int usemalloc; usemalloc = !*buf || !*bufsize; *bufsize += BUFGROW; if (usemalloc) *buf = malloc(*bufsize); else *buf = realloc(*buf,*bufsize); if (!*buf){ fprintf(stderr, "%s: memory allocation error (growbuffer)\n",progname); exit(EXIT_FAILURE); } } /* Look for a subscript in the input string. A subscript starts with '_' and is followed by a sequence of only digits (matching the regexp "_[0-9]+". The function returns 1 if it finds a subscript and zero otherwise. Note that it returns 1 for an input that is entirely subscript, with the '_' appearing in the first position. */ int hassubscript(const char *str, int length) { length--; while(length>0){ if (!strchr(digits, str[length])) return 0; length--; if (str[length]=='_') return 1; } return 0; } /* replace various Unicode minus symbols with ASCII hyphen-minus U+002D */ void replace_minus(char *input) { char *unicode_minus[] = { "\xE2\x80\x92", /* U+2012: figure dash */ "\xE2\x80\x93", /* U+2013: en dash */ "\xE2\x88\x92", /* U+2212: minus */ 0 }; char *inptr, *outptr, *ptr, **minus; for (minus=unicode_minus; *minus; minus++) { inptr = outptr = input; do { ptr = strstr(inptr, *minus); /* find next unicode minus */ if (ptr) { while (inptr < ptr) /* copy the input up to the minus symbol */ *outptr++ = *inptr++; *outptr++ = '-'; /* U+002D: hyphen-minus */ inptr = ptr + strlen(*minus); } } while (ptr); /* if no replacements were made, the input isn't changed */ if (inptr > input) { while (*inptr) *outptr++ = *inptr++; *outptr = '\0'; } } } /* Replace all chars in badchars with a space */ void spacechars(char *string, const char *badchars) { while(*string){ if (strchr(badchars, *string)) *string = ' '; string++; } } /* Fetch a line of data with backslash for continuation. The parameter count is incremented to report the number of newlines that are read so that line numbers can be accurately reported. */ char * fgetscont(char *buf, int size, FILE *file, int *count) { if (!fgets(buf,size,file)) return 0; (*count)++; while(strlen(buf)>=2 && 0==strcmp(buf+strlen(buf)-2,"\\\n")){ (*count)++; buf[strlen(buf)-2] = 0; /* delete trailing \n and \ char */ if (strlen(buf)>=size-1) /* return if the buffer is full */ return buf; if (!fgets(buf+strlen(buf), size - strlen(buf), file)) return buf; /* already read some data so return success */ } if (buf[strlen(buf)-1] == '\\') { /* If last char of buffer is \ then */ ungetc('\\', file); /* we don't know if it is followed by */ buf[strlen(buf)-1] = 0; /* a \n, so put it back and try again */ } return buf; } /* Gets arbitrarily long input data into a buffer using growbuffer(). Returns 0 if no data is read. Increments count by the number of newlines read unless it points to NULL. Replaces tabs and newlines with spaces before returning the result. */ char * fgetslong(char **buf, int *bufsize, FILE *file, int *count) { int dummy; if (!count) count = &dummy; if (!*bufsize) growbuffer(buf,bufsize); if (!fgetscont(*buf, *bufsize, file, count)) return 0; while ((*buf)[strlen(*buf)-1] != '\n' && !feof(file)){ growbuffer(buf, bufsize); fgetscont(*buf+strlen(*buf), *bufsize-strlen(*buf), file, count); (*count)--; } /* These nonprinting characters must be removed so that the test for UTF-8 validity will work. */ spacechars(*buf, "\t\n\r"); return *buf; } /* Allocates memory and aborts if malloc fails. */ void * mymalloc(int bytes,char *mesg) { void *pointer; pointer = malloc(bytes); if (!pointer){ fprintf(stderr, "%s: memory allocation error %s\n", progname,mesg); exit(EXIT_FAILURE); } return pointer; } /* Duplicates a string */ char * dupstr(const char *str) { char *ret; ret = mymalloc(strlen(str) + 1,"(dupstr)"); strcpy(ret, str); return (ret); } #ifdef SUPPORT_UTF8 /* The strwidth function gives the printed width of a UTF-8 byte sequence. It will return -1 if the sequence is an invalid UTF-8 sequence or if the sequence contains "nonprinting" characters. Note that \n and \t are "nonprinting" characters. */ int strwidth(const char *str) { wchar_t *widestr; int len; if (!utf8mode) return strlen(str); len = strlen(str)+1; widestr = mymalloc(sizeof(wchar_t)*len, "(strwidth)"); len = mbsrtowcs(widestr, &str, len, NULL); if (len==-1){ free(widestr); return -1; /* invalid multibyte sequence */ } len=wcswidth(widestr, len); free(widestr); return len; } #else # define strwidth strlen #endif /* hashing algorithm for units */ unsigned uhash(const char *str) { unsigned hashval; for (hashval = 0; *str; str++) hashval = *str + HASHNUMBER * hashval; return (hashval % HASHSIZE); } /* Lookup a unit in the units table. Returns the definition, or NULL if the unit isn't found in the table. */ struct unitlist * ulookup(const char *str) { struct unitlist *uptr; for (uptr = utab[uhash(str)]; uptr; uptr = uptr->next) if (strcmp(str, uptr->name) == 0) return uptr; return NULL; } /* Lookup a prefix in the prefix table. Finds the longest prefix that matches the beginning of the input string. Returns NULL if no prefixes match. */ struct prefixlist * plookup(const char *str) { struct prefixlist *prefix; struct prefixlist *bestprefix=NULL; int bestlength=0; for (prefix = ptab[simplehash(str)]; prefix; prefix = prefix->next) { if (prefix->len > bestlength && !strncmp(str, prefix->name, prefix->len)){ bestlength = prefix->len; bestprefix = prefix; } } return bestprefix; } /* Look up function in the function linked list */ struct func * fnlookup(const char *str, int length) { struct func *funcptr; for(funcptr=ftab[simplehash(str)];funcptr;funcptr = funcptr->next) if (length==strlen(funcptr->name) && 0==strncmp(funcptr->name,str,length)) return funcptr; return 0; } struct wantalias * aliaslookup(const char *str) { struct wantalias *aliasptr; for(aliasptr = firstalias; aliasptr; aliasptr=aliasptr->next) if (!strcmp(aliasptr->name, str)) return aliasptr; return 0; } /* Insert a new function into the linked list of functions */ void addfunction(struct func *newfunc) { int val; val = simplehash(newfunc->name); newfunc->next = ftab[val]; ftab[val] = newfunc; } /* Free the fields in the function except for the name so that it can be redefined. It remains in position in the linked list. */ void freefunction(struct func *funcentry) { if (funcentry->table){ free(funcentry->table); free(funcentry->tableunit); } else { free(funcentry->forward.param); free(funcentry->forward.def); if (funcentry->forward.domain_min) free(funcentry->forward.domain_min); if (funcentry->forward.domain_max) free(funcentry->forward.domain_max); if (funcentry->inverse.domain_min) free(funcentry->inverse.domain_min); if (funcentry->inverse.domain_max) free(funcentry->inverse.domain_max); if (funcentry->forward.dimen) free(funcentry->forward.dimen); if (funcentry->inverse.dimen) free(funcentry->inverse.dimen); if (funcentry->inverse.def) free(funcentry->inverse.def); if (funcentry->inverse.param) free(funcentry->inverse.param); } } /* Remove leading and trailing white space from the input */ char * removepadding(char *in) { char *endptr; in += strspn(in,WHITE); for(endptr = in + strlen(in) - 1;*in && strchr(WHITE,*endptr);endptr--) *endptr=0; return in; } char * strip_comment(char *line) { char *comment = 0; if ((line = strchr(line,COMMENTCHAR))) { comment = line+1; *line = 0; } return comment; } /* Print string but replace two consecutive white space characters with one space. */ void tightprint(FILE *outfile, char *string) { char *p; int printedspace=0; for(p=string;*p;p++){ if (strchr(WHITE,*p)){ if (!printedspace){ fputc(' ',outfile); printedspace=1; } } else { fputc(*p,outfile); printedspace=0; } } } /* Checks whether the input string is a function name, possibly surrounded by white space. Returns the function structure if one is found, or null otherwise. */ struct func * isfunction(char *str) { str = removepadding(str); return fnlookup(str,strlen(str)); } #define readerror (goterr=1) && errfile && fprintf #define VAGUE_ERR "%s: error in units file '%s' line %d\n", \ progname, file, linenum /* Print out error message encountered while reading the units file. */ /* splits the line into two parts. The first part is white space deliminted. The second part is everything else. Removes trailing white space from the second part. Returned items are null if no parameter was found. */ void splitline(char *line, char **first, char **second) { *second = 0; *first = strtok(line, WHITE); if (*first){ *second = strtok(0, "\n"); if (*second){ *second = removepadding(*second); if (!**second) *second = 0; } } } /* Returns 1 if the input consists entirely of whitespace characters and returns 0 otherwise. */ int isblankstr(char *str) { while(*str) if (!strchr(WHITE,*str++)) return 0; return 1; } /* see if character is part of a valid decimal number */ int isdecimal(char c) { return strchr(digits, c) != NULL; } /* Check for some invalid unit names. Print error message. Returns 1 if unit name is bad, zero otherwise. */ int checkunitname(char *name, int linenum, char *file, FILE *errfile) { char **ptr; if (strchr(digits, name[0])){ if (errfile) fprintf(errfile, "%s: unit '%s' in units file '%s' on line %d ignored. It starts with a digit\n", progname, name, file, linenum); return 1; } for(ptr=builtins;*ptr;ptr++) if (!strcmp(name, *ptr)){ if (errfile) fprintf(errfile, "%s: redefinition of built-in function '%s' in file '%s' on line %d ignored.\n", progname, name, file, linenum); return 1; } return 0; } int newunit(char *unitname, char *unitdef, int *count, int linenum, char *file,FILE *errfile) { struct unitlist *uptr; unsigned hashval; /* units ending with '_' create ambiguity for exponents */ if (unitname[0]=='_' || unitname[strlen(unitname)-1]=='_'){ if (errfile) fprintf(errfile, "%s: unit '%s' on line %d of '%s' ignored. It starts or ends with '_'\n", progname, unitname, linenum, file); return E_BADFILE; } /* Units that end in [2-9] can never be accessed */ if (strchr(".,23456789", unitname[strlen(unitname)-1]) && !hassubscript(unitname,strlen(unitname))){ if (errfile) fprintf(errfile, "%s: unit '%s' on line %d of '%s' ignored. %s\n", progname, unitname, linenum, file,errormsg[E_UNITEND]); return E_BADFILE; } if (checkunitname(unitname, linenum, file, errfile)) return E_BADFILE; if ((uptr=ulookup(unitname))) { /* Is it a redefinition? */ if (flags.unitcheck && errfile) fprintf(errfile, "%s: unit '%s' defined on line %d of '%s' is redefined on line %d of '%s'.\n", progname, unitname, uptr->linenumber,uptr->file, linenum, file); free(uptr->value); } else { /* make new units table entry */ uptr = (struct unitlist *) mymalloc(sizeof(*uptr),"(newunit)"); uptr->name = dupstr(unitname); /* install unit name/value pair in list */ hashval = uhash(uptr->name); uptr->next = utab[hashval]; utab[hashval] = uptr; (*count)++; } uptr->value = dupstr(unitdef); uptr->linenumber = linenum; uptr->file = file; return 0; } int newprefix(char *unitname, char *unitdef, int *count, int linenum, char *file,FILE *errfile) { struct prefixlist *pfxptr; unsigned pval; unitname[strlen(unitname) - 1] = 0; if (checkunitname(unitname,linenum,file,errfile)) return E_BADFILE; if ((pfxptr = plookup(unitname)) /* already there: redefinition */ && !strcmp(pfxptr->name, unitname)){ if (flags.unitcheck && errfile) fprintf(errfile, "%s: prefix '%s-' defined on line %d of '%s' is redefined on line %d of '%s'.\n", progname, unitname, pfxptr->linenumber,pfxptr->file, linenum, file); free(pfxptr->value); } else { pfxptr = (struct prefixlist *) mymalloc(sizeof(*pfxptr),"(newprefix)"); pfxptr->name = dupstr(unitname); pfxptr->len = strlen(unitname); pval = simplehash(unitname); pfxptr->next = ptab[pval]; ptab[pval] = pfxptr; (*count)++; } pfxptr->value = dupstr(unitdef); pfxptr->linenumber = linenum; pfxptr->file = file; return 0; } /* parsepair() looks for data of the form [text1,text2] where the ',' is a specified delimiter. The second argument, text2, is optional and if it's missing then second is set to NULL. The parameters are allowed to be empty strings. The function returns the first character after the closing bracket if no errors occur or the NULL pointer on error. */ char * parsepair(char *input, char **first, char **second, int *firstopen, int *secondopen, char delimiter, int checkopen, char *unitname, int linenum, char *file,FILE *errfile) { char *start, *end, *middle; start = strpbrk(input, checkopen?"[(":"["); if (!start){ if (errfile) fprintf(errfile, "%s: expecting '[' %s in definition of '%s' in '%s' line %d\n", progname, checkopen ? "or '('":"", unitname, file, linenum); return 0; } if (*start=='(') *firstopen=1; else *firstopen=0; *start++=0; if (!isblankstr(input)){ if (errfile) fprintf(errfile, "%s: unexpected characters before '%c' in definition of '%s' in '%s' line %d\n", progname, *firstopen?'(':'[',unitname, file, linenum); return 0; } end = strpbrk(start, checkopen?"])":"]"); if (!end){ if (errfile) fprintf(errfile, "%s: expecting ']' %s in definition of '%s' in '%s' line %d\n", progname, checkopen?"or ')'":"",unitname, file, linenum); return 0; } if (*end==')') *secondopen=1; else *secondopen=0; *end++=0; middle = strchr(start,delimiter); if (middle){ *middle++=0; *second = removepadding(middle); } else *second = 0; *first = removepadding(start); return end; } /* Extract numbers from two text strings and place them into pointers. Has two error codes for decreasing interval or bad numbers in the text strings. Returns 0 on success. */ #define EI_ERR_DEC 1 /* Decreasing interval */ #define EI_ERR_MALF 2 /* Malformed number */ int extract_interval(char *first, char *second, double **firstout, double **secondout) { double val; char *end; if (strlen(first)>0){ val = strtod(first, &end); if (*end) return EI_ERR_MALF; else { *firstout=(double *)mymalloc(sizeof(double), "(extract_interval)"); **firstout = val; } } if (second && strlen(second)>0){ val = strtod(second, &end); if (*end) return EI_ERR_MALF; else if (*firstout && **firstout>=val) return EI_ERR_DEC; else { *secondout=(double *)mymalloc(sizeof(double), "(extract_interval)"); **secondout = val; } } return 0; } void copyfunctype(struct functype *dest, struct functype *src) { dest->domain_min_open = src->domain_min_open; dest->domain_max_open = src->domain_max_open; dest->param = dest->def = dest->dimen = NULL; dest->domain_min = dest->domain_max = NULL; if (src->param) dest->param = dupstr(src->param); if (src->def) dest->def = dupstr(src->def); if (src->dimen) dest->dimen = dupstr(src->dimen); if (src->domain_min){ dest->domain_min = (double *) mymalloc(sizeof(double), "(copyfunctype)"); *dest->domain_min = *src->domain_min; } if (src->domain_max){ dest->domain_max = (double *) mymalloc(sizeof(double), "(copyfunctype)"); *dest->domain_max = *src->domain_max; } } int copyfunction(char *unitname, char *funcname, int *count, int linenum, char *file, FILE *errfile) { struct func *source, *funcentry; int i; if (checkunitname(unitname, linenum, file, errfile)) return E_BADFILE; funcname = removepadding(funcname); i = strlen(funcname)-2; /* strip trailing () if present */ if (i>0 && !strcmp(funcname+i,"()")) funcname[i]=0; source = fnlookup(funcname, strlen(funcname)); if (!source) { if (errfile){ if (!strpbrk(funcname," ;][()+*/-^")) fprintf(errfile,"%s: bad definition for '%s' in '%s' line %d, function '%s' not defined\n", progname, unitname, file, linenum, funcname); else fprintf(errfile,"%s: bad function definition of '%s' in '%s' line %d\n", progname,unitname,file,linenum); } return E_BADFILE; } if ((funcentry=fnlookup(unitname,strlen(unitname)))){ if (flags.unitcheck && errfile) fprintf(errfile, "%s: function '%s' defined on line %d of '%s' is redefined on line %d of '%s'.\n", progname, unitname, funcentry->linenumber,funcentry->file, linenum, file); freefunction(funcentry); } else { funcentry = (struct func*)mymalloc(sizeof(struct func),"(newfunction)"); funcentry->name = dupstr(unitname); addfunction(funcentry); (*count)++; } funcentry->linenumber = linenum; funcentry->file = file; funcentry->skip_error_check = source->skip_error_check; if (source->table){ funcentry->tablelen = source->tablelen; funcentry->tableunit = dupstr(source->tableunit); funcentry->table = (struct pair *) mymalloc(sizeof(struct pair)*funcentry->tablelen, "(copyfunction)"); for(i=0;itablelen;i++){ funcentry->table[i].location = source->table[i].location; funcentry->table[i].value = source->table[i].value; } } else { funcentry->table = 0; copyfunctype(&funcentry->forward, &source->forward); copyfunctype(&funcentry->inverse, &source->inverse); } return 0; } #define FREE_STUFF {if (forward_dim) free(forward_dim);\ if (inverse_dim) free(inverse_dim);\ if (domain_min) free(domain_min);\ if (domain_max) free(domain_max);\ if (range_min) free(range_min);\ if (range_max) free(range_max);} #define REPEAT_ERR \ if (errfile) fprintf(errfile, \ "%s: keyword '%s' repeated in definition of '%s' on line %d of '%s'.\n",\ progname,fnkeywords[i].word,unitname, linenum, file) int newfunction(char *unitname, char *unitdef, int *count, int linenum, char *file,FILE *errfile) { char *start, *end, *inv, *forward_dim, *inverse_dim, *first, *second; double *domain_min, *domain_max, *range_min, *range_max; struct func *funcentry; int looking_for_keywords,i, firstopen, secondopen; int domain_min_open, domain_max_open, range_min_open, range_max_open; int noerror = 0; if (*unitname=='('){ if (errfile) fprintf(errfile, "%s: unit '%s' on line %d of '%s' ignored. It starts with a '('\n", progname, unitname, linenum, file); return E_BADFILE; } /* coverity[returned_null] */ start = strchr(unitname,'('); end = strchr(unitname,')'); *start++ = 0; if (checkunitname(unitname,linenum,file,errfile)) return E_BADFILE; if (start==end) /* no argument: function() so make a function copy */ return copyfunction(unitname, unitdef, count, linenum, file, errfile); if (!end || strlen(end)>1){ if (errfile) fprintf(errfile, "%s: bad function definition of '%s' in '%s' line %d\n", progname,unitname,file,linenum); return E_BADFILE; } *end=0; forward_dim = NULL; inverse_dim = NULL; domain_min = NULL; domain_max = NULL; range_min = NULL; range_max = NULL; domain_min_open = 0; domain_max_open = 0; range_min_open = 0; range_max_open = 0; looking_for_keywords=1; while (looking_for_keywords) { looking_for_keywords = 0; for(i=0;fnkeywords[i].word;i++){ if (!strncmp(fnkeywords[i].word, unitdef, strlen(fnkeywords[i].word))){ looking_for_keywords = 1; /* found keyword so keep looking */ unitdef+=strlen(fnkeywords[i].word); if (fnkeywords[i].checkopen!=CO_NOARG){ unitdef = parsepair(unitdef,&first, &second, &firstopen, &secondopen, fnkeywords[i].delimit, fnkeywords[i].checkopen, unitname, linenum, file,errfile); if (!unitdef){ FREE_STUFF; return E_BADFILE; } unitdef = removepadding(unitdef); } if (i==FN_NOERROR) noerror = 1; if (i==FN_UNITS){ if (forward_dim || inverse_dim){ REPEAT_ERR; return E_BADFILE; } forward_dim = dupstr(first); if (second) inverse_dim = dupstr(second); } if (i==FN_DOMAIN){ int err=0; if (domain_min || domain_max){ REPEAT_ERR; return E_BADFILE; } err = extract_interval(first,second,&domain_min, &domain_max); domain_min_open = firstopen; domain_max_open = secondopen; if (err) FREE_STUFF; if (err==EI_ERR_DEC){ if (errfile) fprintf(errfile, "%s: second endpoint for domain must be greater than the first\n in definition of '%s' in '%s' line %d\n", progname, unitname, file, linenum); return E_BADFILE; } if (err==EI_ERR_MALF){ if (errfile) fprintf(errfile, "%s: malformed domain in definition of '%s' in '%s' line %d\n", progname, unitname, file, linenum); return E_BADFILE; } } if (i==FN_RANGE){ int err=0; if (range_min || range_max){ REPEAT_ERR; FREE_STUFF; return E_BADFILE; } err = extract_interval(first,second,&range_min, &range_max); range_min_open = firstopen; range_max_open = secondopen; if (err) FREE_STUFF; if (err==EI_ERR_DEC){ if (errfile) fprintf(errfile, "%s: second endpoint for range must be greater than the first\n in definition of '%s' in '%s' line %d\n", progname, unitname, file, linenum); return E_BADFILE; } if (err==EI_ERR_MALF){ if (errfile) fprintf(errfile, "%s: malformed range in definition of '%s' in '%s' line %d\n", progname, unitname, file, linenum); return E_BADFILE; } } } } } if (*unitdef=='['){ if (errfile) fprintf(errfile, "%s: function '%s' missing keyword before '[' on line %d of '%s'\n", progname, unitname, linenum, file); FREE_STUFF; return E_BADFILE; } if (isblankstr(unitdef)){ if (errfile) fprintf(errfile, "%s: function '%s' lacks a definition at line %d of '%s'\n", progname, unitname, linenum, file); FREE_STUFF; return E_BADFILE; } /* Check that if domain and range are specified and nonzero then the units are given. Otherwise these are meaningless. */ if (!forward_dim && ((domain_min && *domain_min) || (domain_max && *domain_max))){ if (errfile) fprintf(errfile,"%s: function '%s' defined on line %d of '%s' has domain with no units.\n", progname, unitname, linenum, file); FREE_STUFF; return E_BADFILE; } if (!inverse_dim && ((range_min && *range_min) || (range_max && *range_max))){ if (errfile) fprintf(errfile,"%s: function '%s' defined on line %d of '%s' has range with no units.\n", progname, unitname, linenum, file); FREE_STUFF; return E_BADFILE; } if ((funcentry=fnlookup(unitname,strlen(unitname)))){ if (flags.unitcheck && errfile) fprintf(errfile, "%s: function '%s' defined on line %d of '%s' is redefined on line %d of '%s'.\n", progname, unitname, funcentry->linenumber,funcentry->file, linenum, file); freefunction(funcentry); } else { funcentry = (struct func*)mymalloc(sizeof(struct func),"(newfunction)"); funcentry->name = dupstr(unitname); addfunction(funcentry); (*count)++; } funcentry->table = 0; funcentry->skip_error_check = noerror; funcentry->forward.dimen = forward_dim; funcentry->inverse.dimen = inverse_dim; funcentry->forward.domain_min = domain_min; funcentry->forward.domain_max = domain_max; funcentry->inverse.domain_min = range_min; funcentry->inverse.domain_max = range_max; funcentry->forward.domain_min_open = domain_min_open; funcentry->forward.domain_max_open = domain_max_open; funcentry->inverse.domain_min_open = range_min_open; funcentry->inverse.domain_max_open = range_max_open; inv = strchr(unitdef,FUNCSEPCHAR); if (inv) *inv++ = 0; funcentry->forward.param = dupstr(start); funcentry->forward.def = dupstr(removepadding(unitdef)); if (inv){ funcentry->inverse.def = dupstr(removepadding(inv)); funcentry->inverse.param = dupstr(unitname); } else { funcentry->inverse.def = 0; funcentry->inverse.param = 0; } funcentry->linenumber = linenum; funcentry->file = file; return 0; } int newtable(char *unitname,char *unitdef, int *count, int linenum, char *file,FILE *errfile) { char *start, *end; char *tableunit; int tablealloc, tabpt; struct pair *tab; struct func *funcentry; int noerror = 0; /* coverity[returned_null] */ tableunit = strchr(unitname,'['); end = strchr(unitname,']'); *tableunit++=0; if (checkunitname(unitname, linenum, file, errfile)) return E_BADFILE; if (!end){ if (errfile) fprintf(errfile,"%s: missing ']' in units file '%s' line %d\n", progname,file,linenum); return E_BADFILE; } if (strlen(end)>1){ if (errfile) fprintf(errfile, "%s: unexpected characters after ']' in units file '%s' line %d\n", progname,file,linenum); return E_BADFILE; } *end=0; tab = (struct pair *)mymalloc(sizeof(struct pair)*20, "(newtable)"); tablealloc=20; tabpt = 0; start = unitdef; if (!strncmp(start,NOERROR_KEYWORD, strlen(NOERROR_KEYWORD)) && strchr(WHITE,start[strlen(NOERROR_KEYWORD)])) { noerror = 1; start = removepadding(start+strlen(NOERROR_KEYWORD)); } while (1) { if (tabpt>=tablealloc){ tablealloc+=20; tab = (struct pair *)realloc(tab,sizeof(struct pair)*tablealloc); if (!tab){ if (errfile) fprintf(errfile, "%s: memory allocation error (newtable)\n", progname); return E_MEMORY; } } tab[tabpt].location = strtod(start,&end); if (start==end || !strchr(WHITE,*end)){ if (!strchr(WHITE, *start)) { if (strlen(start)>15) start[15]=0; if (errfile) fprintf(errfile, "%s: cannot parse table definition %s at '%s' on line %d of '%s'\n", progname, unitname, start, linenum, file); free(tab); return E_BADFILE; } break; } if (tabpt>0 && tab[tabpt].location<=tab[tabpt-1].location){ if (errfile) fprintf(errfile,"%s: points don't increase (%.8g to %.8g) in units file '%s' line %d\n", progname, tab[tabpt-1].location, tab[tabpt].location, file, linenum); free(tab); return E_BADFILE; } start=end+strspn(end," \t"); tab[tabpt].value = strtod(start,&end); if (start==end){ if (errfile) fprintf(errfile,"%s: missing value after %.8g in units file '%s' line %d\n", progname, tab[tabpt].location, file, linenum); free(tab); return E_BADFILE; } tabpt++; start=end+strspn(end," \t,"); } if ((funcentry=fnlookup(unitname,strlen(unitname)))){ if (flags.unitcheck && errfile) fprintf(errfile, "%s: unit '%s' defined on line %d of '%s' is redefined on line %d of '%s'.\n", progname, unitname, funcentry->linenumber,funcentry->file, linenum, file); freefunction(funcentry); } else { funcentry = (struct func *)mymalloc(sizeof(struct func),"(newtable)"); funcentry->name = dupstr(unitname); addfunction(funcentry); (*count)++; } funcentry->tableunit = dupstr(tableunit); funcentry->tablelen = tabpt; funcentry->table = tab; funcentry->skip_error_check = noerror; funcentry->linenumber = linenum; funcentry->file = file; return 0; } int newalias(char *unitname, char *unitdef,int linenum, char *file,FILE *errfile) { struct wantalias *aliasentry; if (!strchr(unitdef, UNITSEPCHAR)){ if (errfile) fprintf(errfile, "%s: unit list missing '%c' on line %d of '%s'\n", progname, UNITSEPCHAR, linenum, file); return E_BADFILE; } if ((aliasentry=aliaslookup(unitname))){ /* duplicate alias */ if (flags.unitcheck && errfile) fprintf(errfile, "%s: unit list '%s' defined on line %d of '%s' is redefined on line %d of '%s'.\n", progname, unitname, aliasentry->linenumber, aliasentry->file, linenum, file); free(aliasentry->definition); } else { aliasentry = (struct wantalias *) mymalloc(sizeof(struct wantalias),"(newalias)"); aliasentry->name = dupstr(unitname); if (!lastalias){ firstalias = aliasentry; lastalias = firstalias; } else { lastalias->next = aliasentry; lastalias = aliasentry; } aliasentry->next = 0; } aliasentry->definition = dupstr(unitdef); aliasentry->linenumber = linenum; aliasentry->file = file; return 0; } /* Check environment variable name to see if its value appears on the space delimited text string pointed to by list. Returns 2 if the environment variable is not set, return 1 if its value appears on the list and zero otherwise. */ int checkvar(char *name, char *list) { char *listitem; name = getenv(name); if (!name) return 2; listitem = strtok(list,WHITE); while (listitem){ if (!strcmp(name, listitem)) return 1; listitem = strtok(0,WHITE); } return 0; } #ifdef NO_SETENV int setenv(const char *name, const char *val, int overwrite) { char *environ; if (!overwrite && getenv(name) != NULL) return 0; environ = (char *) malloc(strlen(name) + strlen(val) + 2); if (!environ) return 1; strcpy(environ, name); strcat(environ, "="); strcat(environ, val); /* putenv() doesn't copy its argument, so don't free environ */ #if defined (_WIN32) && defined (_MSC_VER) return _putenv(environ); #else return putenv(environ); #endif } #endif #ifdef _WIN32 # define isdirsep(c) ((c) == '/' || (c) == '\\') # define hasdirsep(s) strpbrk((s),"/\\") #else # define isdirsep(c) ((c) == '/') # define hasdirsep(s) strchr((s),'/') #endif #define isexe(s) ((strlen(s) == 4) && (tolower(s[1]) == 'e') \ && (tolower(s[2]) == 'x') && (tolower(s[3]) == 'e')) /* Returns a pointer to the end of the pathname part of the specified filename */ char * pathend(char *filename) { char *pointer; for(pointer=filename+strlen(filename);pointer>filename;pointer--){ if (isdirsep(*pointer)) { pointer++; break; } } return pointer; } int isfullpath(char *path) { #ifdef _WIN32 /* handle Windows drive specifier */ if (isalpha(*path) && *(path + 1) == ':') path += 2; #endif return isdirsep(*path); } /* Read in units data. file - Filename to load errfile - File to receive messages about errors in the units database. Set it to 0 to suppress errors. unitcount, prefixcount, funccount - Return statistics to the caller. Must initialize to zero before calling. depth - Used to prevent recursive includes. Call with it set to zero. The global variable progname is used in error messages. */ int readunits(char *file, FILE *errfile, int *unitcount, int *prefixcount, int *funccount, int depth) { FILE *unitfile; char *line = 0, *lineptr, *unitdef, *unitname, *permfile; int len, linenum, linebufsize, goterr, retcode; int locunitcount, locprefixcount, locfunccount; int wronglocale = 0; /* If set then we are currently reading data */ int inlocale = 0; /* for the wrong locale so we should skip it */ int in_utf8 = 0; /* If set we are reading utf8 data */ int invar = 0; /* If set we are in data for an env variable.*/ int wrongvar = 0; /* If set then we are not processing */ locunitcount = 0; locprefixcount = 0; locfunccount = 0; linenum = 0; linebufsize = 0; goterr = 0; unitfile = fopen(file, "rt"); if (!unitfile) return E_FILE; growbuffer(&line,&linebufsize); /* coverity[alloc_fn] */ permfile = dupstr(file); /* This is a permanent copy to reference in */ /* the database. It is never freed. */ while (!feof(unitfile)) { if (!fgetslong(&line, &linebufsize, unitfile, &linenum)) break; if (linenum==1 && 0==strncmp(UTF8MARKER, line, strlen(UTF8MARKER))){ int i; for(lineptr=line,i=0;iMAXINCLUDE){ readerror(errfile, "%s: max include depth of %d exceeded in file '%s' line %d\n", progname, MAXINCLUDE, file, linenum); } else { int readerr; char *includefile; unitname = strtok(0, WHITE); if (!unitname){ readerror(errfile, "%s: missing include filename on line %d of '%s'\n", progname, linenum, file); continue; } includefile = mymalloc(strlen(file)+strlen(unitname)+1, "(readunits)"); if (isfullpath(unitname)) strcpy(includefile,unitname); else { strcpy(includefile,file); strcpy(pathend(includefile), unitname); } readerr = readunits(includefile, errfile, unitcount, prefixcount, funccount, depth+1); if (readerr == E_MEMORY){ fclose(unitfile); free(line); free(includefile); return readerr; } if (readerr == E_FILE) { readerror(errfile, "%s: cannot open included file '%s' at line %d of file '%s\n", progname, includefile, linenum, file); } if (readerr) goterr = 1; free(includefile); } } else /* not a valid command */ readerror(errfile,VAGUE_ERR); continue; } if (in_utf8 && !utf8mode) continue; if (wronglocale || wrongvar) continue; splitline(line, &unitname, &unitdef); if (!unitname) continue; if (!unitdef){ readerror(errfile, "%s: unit '%s' lacks a definition at line %d of '%s'\n", progname, unitname, linenum, file); continue; } len = strlen(unitname); if (unitname[len - 1] == '-'){ /* it's a prefix definition */ if (newprefix(unitname,unitdef,&locprefixcount,linenum, permfile,errfile)) goterr=1; } else if (strchr(unitname,'[')){ /* table definition */ retcode=newtable(unitname,unitdef,&locfunccount,linenum, permfile,errfile); if (retcode){ if (retcode != E_BADFILE){ fclose(unitfile); free(line); return retcode; } goterr=1; } } else if (strchr(unitname,'(')){ /* function definition */ if (newfunction(unitname,unitdef,&locfunccount,linenum, permfile,errfile)) goterr = 1; } else { /* ordinary unit definition */ if (newunit(unitname,unitdef,&locunitcount,linenum,permfile,errfile)) goterr = 1; } } fclose(unitfile); free(line); if (unitcount) *unitcount+=locunitcount; if (prefixcount) *prefixcount+=locprefixcount; if (funccount) *funccount+=locfunccount; if (goterr) return E_BADFILE; else return 0; } /* Initialize a unit to be equal to 1. */ void initializeunit(struct unittype *theunit) { theunit->factor = 1.0; theunit->numerator[0] = theunit->denominator[0] = NULL; } /* Free a unit: frees all the strings used in the unit structure. Does not free the unit structure itself. */ void freeunit(struct unittype *theunit) { char **ptr; for(ptr = theunit->numerator; *ptr; ptr++) if (*ptr != NULLUNIT) free(*ptr); for(ptr = theunit->denominator; *ptr; ptr++) if (*ptr != NULLUNIT) free(*ptr); /* protect against repeated calls to freeunit() */ theunit->numerator[0] = 0; theunit->denominator[0] = 0; } void logprintf(const char *format, ...) { va_list args; va_start(args, format); vprintf(format, args); va_end(args); if (logfile) { va_start(args, format); vfprintf(logfile, format, args); va_end(args); } } void logputchar(char c) { putchar(c); if (logfile) fputc(c, logfile); } void logputs(const char *s) { fputs(s, stdout); if (logfile) fputs(s, logfile); } /* Print out a unit */ void showunit(struct unittype *theunit) { char **ptr; int printedslash; int counter = 1; logprintf(num_format.format, theunit->factor); for (ptr = theunit->numerator; *ptr; ptr++) { if (ptr > theunit->numerator && **ptr && !strcmp(*ptr, *(ptr - 1))) counter++; else { if (counter > 1) logprintf("%s%d", powerstring, counter); if (**ptr) logprintf(" %s", *ptr); counter = 1; } } if (counter > 1) logprintf("%s%d", powerstring, counter); counter = 1; printedslash = 0; for (ptr = theunit->denominator; *ptr; ptr++) { if (ptr > theunit->denominator && **ptr && !strcmp(*ptr, *(ptr - 1))) counter++; else { if (counter > 1) logprintf("%s%d", powerstring, counter); if (**ptr) { if (!printedslash) logprintf(" /"); printedslash = 1; logprintf(" %s", *ptr); } counter = 1; } } if (counter > 1) logprintf("%s%d", powerstring, counter); } /* qsort comparison function */ int compare(const void *item1, const void *item2) { return strcmp(*(char **) item1, *(char **) item2); } /* Sort numerator and denominator of a unit so we can compare different units */ void sortunit(struct unittype *theunit) { char **ptr; int count; for (count = 0, ptr = theunit->numerator; *ptr; ptr++, count++); qsort(theunit->numerator, count, sizeof(char *), compare); for (count = 0, ptr = theunit->denominator; *ptr; ptr++, count++); qsort(theunit->denominator, count, sizeof(char *), compare); } /* Cancels duplicate units that appear in the numerator and denominator. The input unit must be sorted. */ void cancelunit(struct unittype *theunit) { char **den, **num; int comp; den = theunit->denominator; num = theunit->numerator; while (*num && *den) { comp = strcmp(*den, *num); if (!comp) { /* units match, so cancel them */ if (*den!=NULLUNIT) free(*den); if (*num!=NULLUNIT) free(*num); *den++ = NULLUNIT; *num++ = NULLUNIT; } else if (comp < 0) /* Move up whichever pointer is alphabetically */ den++; /* behind to look for future matches */ else num++; } } /* Looks up the definition for the specified unit including prefix processing and plural removal. Returns a pointer to the definition or a null pointer if the specified unit does not appear in the units table. Sometimes the returned pointer will be a pointer to the special buffer created to hold the data. This buffer grows as needed during program execution. Note that if you pass the output of lookupunit() back into the function again you will get correct results, but the data you passed in may get clobbered if it happened to be the internal buffer. */ static int bufsize=0; static char *buffer; /* buffer for lookupunit answers with prefixes */ /* Plural rules for english: add -s after x, sh, ch, ss add -es -y becomes -ies except after a vowel when you just add -s as usual */ char * lookupunit(char *unit,int prefixok) { char *copy; struct prefixlist *pfxptr; struct unitlist *uptr; if ((uptr = ulookup(unit))) return uptr->value; if (strlen(unit)>2 && unit[strlen(unit) - 1] == 's') { copy = dupstr(unit); copy[strlen(copy) - 1] = 0; if (lookupunit(copy,prefixok)){ while(strlen(copy)+1 > bufsize) { growbuffer(&buffer, &bufsize); } strcpy(buffer, copy); /* Note: returning looked up result seems */ free(copy); /* better but it causes problems when it */ return buffer; /* contains PRIMITIVECHAR. */ } if (strlen(copy)>2 && copy[strlen(copy) - 1] == 'e') { copy[strlen(copy) - 1] = 0; if (lookupunit(copy,prefixok)){ while (strlen(copy)+1 > bufsize) { growbuffer(&buffer,&bufsize); } strcpy(buffer,copy); free(copy); return buffer; } } if (strlen(copy)>2 && copy[strlen(copy) - 1] == 'i') { copy[strlen(copy) - 1] = 'y'; if (lookupunit(copy,prefixok)){ while (strlen(copy)+1 > bufsize) { growbuffer(&buffer,&bufsize); } strcpy(buffer,copy); free(copy); return buffer; } } free(copy); } if (prefixok && (pfxptr = plookup(unit))) { copy=unit; copy += pfxptr->len; if (!strlen(copy) || lookupunit(copy,0)) { char *tempbuf; while (strlen(pfxptr->value)+strlen(copy)+2 > bufsize){ growbuffer(&buffer, &bufsize); } tempbuf = dupstr(copy); /* copy might point into buffer */ strcpy(buffer, pfxptr->value); strcat(buffer, " "); strcat(buffer, tempbuf); free(tempbuf); return buffer; } } return 0; } /* Points entries of product[] to the strings stored in tomove[]. Leaves tomove pointing to a list of NULLUNITS. */ int moveproduct(char *product[], char *tomove[]) { char **dest, **src; dest=product; for(src = tomove; *src; src++){ if (*src == NULLUNIT) continue; for(; *dest && *dest != NULLUNIT; dest++); if (dest - product >= MAXSUBUNITS - 1) { return E_PRODOVERFLOW; } if (!*dest) *(dest + 1) = 0; *dest = *src; *src=NULLUNIT; } return 0; } /* Make a copy of a product list. Note that no error checking is done for overflowing the product list because it is assumed that the source list doesn't overflow, so the destination list shouldn't overflow either. (This assumption could be false if the destination is not actually at the start of a product buffer.) */ void copyproduct(char **dest, char **source) { for(;*source;source++,dest++) { if (*source==NULLUNIT) *dest = NULLUNIT; else *dest=dupstr(*source); } *dest=0; } /* Make a copy of a unit */ void unitcopy(struct unittype *dest, struct unittype *source) { dest->factor = source->factor; copyproduct(dest->numerator, source->numerator); copyproduct(dest->denominator, source->denominator); } /* Multiply left by right. In the process, all of the units are deleted from right (but it is not freed) */ int multunit(struct unittype *left, struct unittype *right) { int myerr; left->factor *= right->factor; myerr = moveproduct(left->numerator, right->numerator); if (!myerr) myerr = moveproduct(left->denominator, right->denominator); return myerr; } int divunit(struct unittype *left, struct unittype *right) { int myerr; left->factor /= right->factor; myerr = moveproduct(left->numerator, right->denominator); if (!myerr) myerr = moveproduct(left->denominator, right->numerator); return myerr; } /* reduces a product of symbolic units to primitive units. The three low bits are used to return flags: bit 0 set if reductions were performed without error. bit 1 set if no reductions are performed. bit 2 set if an unknown unit is discovered. Return values from multiple calls will be ORed together later. */ #define DIDREDUCTION (1<<0) #define NOREDUCTION (1<<1) #define REDUCTIONERROR (1<<2) int reduceproduct(struct unittype *theunit, int flip) { char *toadd; char **product; int didsomething = NOREDUCTION; struct unittype newunit; int ret; if (flip) product = theunit->denominator; else product = theunit->numerator; for (; *product; product++) { for (;;) { if (!strlen(*product)) break; toadd = lookupunit(*product,1); if (!toadd) { if (!irreducible) irreducible = dupstr(*product); return REDUCTIONERROR; } if (strchr(toadd, PRIMITIVECHAR)) break; didsomething = DIDREDUCTION; if (*product != NULLUNIT) { free(*product); *product = NULLUNIT; } if (parseunit(&newunit, toadd, 0, 0)) return REDUCTIONERROR; if (flip) ret=divunit(theunit,&newunit); else ret=multunit(theunit,&newunit); freeunit(&newunit); if (ret) return REDUCTIONERROR; } } return didsomething; } /* Reduces numerator and denominator of the specified unit. Returns 0 on success, or 1 on unknown unit error. */ int reduceunit(struct unittype *theunit) { int ret; if (irreducible) free(irreducible); irreducible=0; ret = DIDREDUCTION; /* Keep calling reduceproduct until it doesn't do anything */ while (ret & DIDREDUCTION) { ret = reduceproduct(theunit, 0); if (!(ret & REDUCTIONERROR)) ret |= reduceproduct(theunit, 1); if (ret & REDUCTIONERROR){ if (irreducible) return E_UNKNOWNUNIT; else return E_REDUCE; } } return 0; } /* Returns one if the argument unit is defined in the data file as a dimensionless unit. This is determined by comparing its definition to the string NODIM. */ int ignore_dimless(char *name) { struct unitlist *ul; if (!name) return 0; ul = ulookup(name); if (ul && !strcmp(ul->value, NODIM)) return 1; return 0; } int ignore_nothing(char *name) { return 0; } int ignore_primitive(char *name) { struct unitlist *ul; if (!name) return 0; ul = ulookup(name); if (ul && strchr(ul->value, PRIMITIVECHAR)) return 1; return 0; } /* Compare two product lists, return zero if they match and one if they do not match. They may contain embedded NULLUNITs which are ignored in the comparison. Units defined as NODIM are also ignored in the comparison. */ int compareproducts(char **one, char **two, int (*isdimless)(char *name)) { int oneblank, twoblank; while (*one || *two) { oneblank = (*one==NULLUNIT) || isdimless(*one); twoblank = (*two==NULLUNIT) || isdimless(*two); if (!*one && !twoblank) return 1; if (!*two && !oneblank) return 1; if (oneblank) one++; else if (twoblank) two++; else if (strcmp(*one, *two)) return 1; else one++, two++; } return 0; } /* Return zero if units are compatible, nonzero otherwise. The units must be reduced, sorted and canceled for this to work. */ int compareunits(struct unittype *first, struct unittype *second, int (*isdimless)(char *name)) { return compareproducts(first->numerator, second->numerator, isdimless) || compareproducts(first->denominator, second->denominator, isdimless); } /* Reduce a unit as much as possible */ int completereduce(struct unittype *unit) { int err; if ((err=reduceunit(unit))) return err; sortunit(unit); cancelunit(unit); return 0; } /* Raise theunit to the specified power. This function does not fill in NULLUNIT gaps, which could be considered a deficiency. */ int expunit(struct unittype *theunit, int power) { char **numptr, **denptr; double thefactor; int i, uind, denlen, numlen; if (power==0){ freeunit(theunit); initializeunit(theunit); return 0; } numlen=0; for(numptr=theunit->numerator;*numptr;numptr++) numlen++; denlen=0; for(denptr=theunit->denominator;*denptr;denptr++) denlen++; thefactor=theunit->factor; for(i=1;ifactor *= thefactor; for(uind=0;uindnumerator[uind]!=NULLUNIT){ if (numptr-theunit->numerator>=MAXSUBUNITS-1) { *numptr=*denptr=0; return E_PRODOVERFLOW; } *numptr++=dupstr(theunit->numerator[uind]); } } for(uind=0;uinddenominator[uind]!=NULLUNIT){ *denptr++=dupstr(theunit->denominator[uind]); if (denptr-theunit->denominator>=MAXSUBUNITS-1) { *numptr=*denptr=0; return E_PRODOVERFLOW; } } } } *numptr=0; *denptr=0; return 0; } int unit2num(struct unittype *input) { struct unittype one; int err; initializeunit(&one); if ((err=completereduce(input))) return err; if (compareunits(input,&one,ignore_nothing)) return E_NOTANUMBER; freeunit(input); return 0; } int unitdimless(struct unittype *input) { struct unittype one; initializeunit(&one); if (compareunits(input, &one, ignore_dimless)) return 0; freeunit(input); /* Eliminate dimensionless units from list */ return 1; } #if 0 void showunitdetail(struct unittype *foo) { char **ptr; printf("%.17g ", foo->factor); for(ptr=foo->numerator;*ptr;ptr++) if (*ptr==NULLUNIT) printf("NULL "); else printf("`%s' ", *ptr); printf(" / "); for(ptr=foo->denominator;*ptr;ptr++) if (*ptr==NULLUNIT) printf("NULL "); else printf("`%s' ", *ptr); putchar('\n'); } #endif /* The unitroot function takes the nth root of an input unit which has been completely reduced. Returns 1 if the unit is not a power of n. Input data can contain NULLUNITs. */ int subunitroot(int n,char *current[], char *out[]) { char **ptr; int count=0; while(*current==NULLUNIT) current++; /* skip past NULLUNIT entries */ ptr=current; while(*ptr){ while(*ptr){ if (*ptr!=NULLUNIT){ if (strcmp(*current,*ptr)) break; count++; } ptr++; } if (count % n != 0){ /* If not dimensionless generate error, otherwise */ if (!ignore_dimless(*current)) /* just skip over it */ return E_NOTROOT; } else { for(count /= n;count>0;count--) *(out++) = dupstr(*current); } current=ptr; } *out = 0; return 0; } int rootunit(struct unittype *inunit,int n) { struct unittype outunit; int err; initializeunit(&outunit); if ((err=completereduce(inunit))) return err; /* Roots of negative numbers fail in pow(), even odd roots */ if (inunit->factor < 0) return E_NOTROOT; outunit.factor = pow(inunit->factor,1.0/(double)n); if ((err = subunitroot(n, inunit->numerator, outunit.numerator))) return err; if ((err = subunitroot(n, inunit->denominator, outunit.denominator))) return err; freeunit(inunit); initializeunit(inunit); return multunit(inunit,&outunit); } /* Compute the inverse of a unit (1/theunit) */ void invertunit(struct unittype *theunit) { char **ptr, *swap; int numlen, length, ind; theunit->factor = 1.0/theunit->factor; length=numlen=0; for(ptr=theunit->denominator;*ptr;ptr++,length++); for(ptr=theunit->numerator;*ptr;ptr++,numlen++); if (numlen>length) length=numlen; for(ind=0;ind<=length;ind++){ swap = theunit->numerator[ind]; theunit->numerator[ind] = theunit->denominator[ind]; theunit->denominator[ind] = swap; } } int float2rat(double y, int *p, int *q) { int coef[20]; /* How long does this buffer need to be? */ int i,termcount,saveq; double fracpart,x; /* Compute continued fraction approximation */ x=y; termcount=0; while(1){ coef[termcount] = (int) floor(x); fracpart = x-coef[termcount]; if (fracpart < .001 || termcount==19) break; x = 1/fracpart; termcount++; } /* Compress continued fraction into rational p/q */ *p=0; *q=1; for(i=termcount;i>=1;i--) { saveq=*q; *q = coef[i] * *q + *p; *p = saveq; } *p+=*q*coef[0]; return *qfactor = pow(base->factor,exponent->factor); else if (errcode==E_NOTANUMBER) { /* Base not dimensionless */ if (!float2rat(exponent->factor,&p,&q)){ /* Exponent must be rational */ if (unitdimless(base)) base->factor = pow(base->factor,exponent->factor); else return E_IRRATIONAL_EXPONENT; } else { if (q!=1) { errcode = rootunit(base, q); if (errcode == E_NOTROOT) return E_BASE_NOTROOT; if (errcode) return errcode; } errcode = expunit(base, abs(p)); if (errcode) return errcode; if (p<0) invertunit(base); } } else return errcode; return 0; } /* Old units program would give message about what each operand reduced to, showing that they weren't conformable. Can this be achieved here? */ int addunit(struct unittype *unita, struct unittype *unitb) { int err; if ((err=completereduce(unita))) return err; if ((err=completereduce(unitb))) return err; if (compareunits(unita,unitb,ignore_nothing)) return E_BADSUM; unita->factor += unitb->factor; freeunit(unitb); return 0; } double linearinterp(double a, double b, double aval, double bval, double c) { double lambda; lambda = (b-c)/(b-a); return lambda*aval + (1-lambda)*bval; } /* evaluate a user function */ #define INVERSE 1 #define FUNCTION 0 #define ALLERR 1 #define NORMALERR 0 int evalfunc(struct unittype *theunit, struct func *infunc, int inverse, int allerrors) { struct unittype result; struct functype *thefunc; int err; double value; int foundit, count; struct unittype *save_value; char *save_function; if (infunc->table) { /* Tables are short, so use dumb search algorithm */ err = parseunit(&result, infunc->tableunit, 0, 0); if (err) return E_BADFUNCDIMEN; if (inverse){ err = divunit(theunit, &result); if (err) return err; err = unit2num(theunit); if (err==E_NOTANUMBER) return E_BADFUNCARG; if (err) return err; value = theunit->factor; foundit=0; for(count=0;counttablelen-1;count++) if ((infunc->table[count].value<=value && value<=infunc->table[count+1].value) || (infunc->table[count+1].value<=value && value<=infunc->table[count].value)){ foundit=1; value = linearinterp(infunc->table[count].value, infunc->table[count+1].value, infunc->table[count].location, infunc->table[count+1].location, value); break; } if (!foundit) return E_NOTINDOMAIN; freeunit(&result); freeunit(theunit); theunit->factor = value; return 0; } else { err=unit2num(theunit); if (err) return err; value=theunit->factor; foundit=0; for(count=0;counttablelen-1;count++) if (infunc->table[count].location<=value && value<=infunc->table[count+1].location){ foundit=1; value = linearinterp(infunc->table[count].location, infunc->table[count+1].location, infunc->table[count].value, infunc->table[count+1].value, value); break; } if (!foundit) return E_NOTINDOMAIN; result.factor *= value; } } else { /* it's a function */ if (inverse){ thefunc=&(infunc->inverse); if (!thefunc->def) return E_NOINVERSE; } else thefunc=&(infunc->forward); err = completereduce(theunit); if (err) return err; if (thefunc->dimen){ err = parseunit(&result, thefunc->dimen, 0, 0); if (err) return E_BADFUNCDIMEN; err = completereduce(&result); if (err) return E_BADFUNCDIMEN; if (compareunits(&result, theunit, ignore_nothing)) return E_BADFUNCARG; value = theunit->factor/result.factor; } else value = theunit->factor; if (thefunc->domain_max && (value > *thefunc->domain_max || (thefunc->domain_max_open && value == *thefunc->domain_max))) return E_NOTINDOMAIN; if (thefunc->domain_min && (value < *thefunc->domain_min || (thefunc->domain_min_open && value == *thefunc->domain_min))) return E_NOTINDOMAIN; save_value = parameter_value; save_function = function_parameter; parameter_value = theunit; function_parameter = thefunc->param; err = parseunit(&result, thefunc->def, 0,0); function_parameter = save_function; parameter_value = save_value; if (err && (allerrors == ALLERR || err==E_PARSEMEM || err==E_PRODOVERFLOW || err==E_NOTROOT || err==E_BADFUNCTYPE)) return err; if (err) return E_FUNARGDEF; } freeunit(theunit); initializeunit(theunit); multunit(theunit, &result); return 0; } /* If the given character string has only one unit name in it, then print out the rule for that unit. In any case, print out the reduced form for the unit. */ void showdefinition(char *unitstr, struct unittype *theunit) { unitstr = removepadding(unitstr); logputs(deftext); unitstr = lookupunit(unitstr,1); while(unitstr && strspn(unitstr,digits) != strlen(unitstr) && !strchr(unitstr,PRIMITIVECHAR)) { tightprint(stdout,unitstr); if (logfile) tightprint(logfile,unitstr); logputs(" = "); unitstr=lookupunit(unitstr,1); } showunit(theunit); logputchar('\n'); } void showfunction(struct functype *func) { struct unittype unit; int not_dimensionless, i; if (!func->def) { logputs(" is undefined"); return; } if (func->dimen){ parseunit(&unit,func->dimen,0,0); /* unit2num returns 0 for */ not_dimensionless = unit2num(&unit); /* dimensionless units */ } logprintf("(%s) = %s", func->param, func->def); if (func->domain_min || func->domain_max){ logputchar('\n'); for(i=strwidth(deftext);i;i--) logputchar(' '); logputs("defined for "); if (func->domain_min && func->domain_max) { logprintf(num_format.format, *func->domain_min); if (func->dimen && (not_dimensionless || unit.factor != 1)){ if (isdecimal(*func->dimen)) logputs(" *"); logprintf(" %s",func->dimen); } logputs(func->domain_min_open?" < ":" <= "); } logputs(func->param); if (func->domain_max){ logputs(func->domain_max_open?" < ":" <= "); logprintf(num_format.format, *func->domain_max); } else { logputs(func->domain_min_open?" > ":" >= "); logprintf(num_format.format, *func->domain_min); } if (func->dimen && (not_dimensionless || unit.factor != 1)){ if (isdecimal(*func->dimen)) logputs(" *"); logprintf(" %s",func->dimen); } if (!func->dimen) logputs(" (any units)"); } else if (func->dimen){ logputchar('\n'); for(i=strwidth(deftext);i;i--) logputchar(' '); if (not_dimensionless) logprintf("%s has units %s",func->param, func->dimen); else logprintf("%s is dimensionless",func->param); } logputchar('\n'); } void showtable(struct func *fun, int inverse) { int i; logprintf("%sinterpolated table with points\n",deftext); if (inverse){ int reverse, j; reverse = (fun->table[0].value > fun->table[fun->tablelen-1].value); for(i=0;itablelen;i++){ if (reverse) j = fun->tablelen-i-1; else j=i; if (flags.verbose>0) logputs("\t\t "); logprintf("~%s(", fun->name); logprintf(num_format.format, fun->table[j].value); if (isdecimal(fun->tableunit[0])) logputs(" *"); logprintf(" %s",fun->tableunit); logputs(") = "); logprintf(num_format.format, fun->table[j].location); logputchar('\n'); } } else { for(i=0;itablelen;i++){ if (flags.verbose>0) logputs("\t\t "); logprintf("%s(", fun->name); logprintf(num_format.format, fun->table[i].location); logputs(") = "); logprintf(num_format.format, fun->table[i].value); if (isdecimal(fun->tableunit[0])) logputs(" *"); logprintf(" %s\n",fun->tableunit); } } } void showfuncdefinition(struct func *fun, int inverse) { if (fun->table) /* It's a table */ showtable(fun, inverse); else { logprintf("%s%s%s", deftext,inverse?"~":"", fun->name); if (inverse) showfunction(&fun->inverse); else showfunction(&fun->forward); } } void showunitlistdef(struct wantalias *alias) { logprintf("%sunit list, ",deftext); tightprint(stdout,alias->definition); if (logfile) tightprint(logfile,alias->definition); logputchar('\n'); } /* Show conversion to a function. Input unit 'have' is replaced by the function inverse and completely reduced. */ int showfunc(char *havestr, struct unittype *have, struct func *fun) { int err; char *dimen; err = evalfunc(have, fun, INVERSE, NORMALERR); if (!err) err = completereduce(have); if (err) { if (err==E_BADFUNCARG){ logputs("conformability error"); if (fun->table) dimen = fun->tableunit; else if (fun->inverse.dimen) dimen = fun->inverse.dimen; else dimen = 0; if (!dimen) logputchar('\n'); else { struct unittype want; if (*dimen==0) dimen = "1"; logprintf(": conversion requires dimensions of '%s'\n",dimen); if (flags.verbose==2) logprintf("\t%s = ",havestr); else if (flags.verbose==1) logputchar('\t'); showunit(have); if (flags.verbose==2) logprintf("\n\t%s = ",dimen); else if (flags.verbose==1) logprintf("\n\t"); else logputchar('\n'); /* coverity[check_return] */ parseunit(&want, dimen, 0, 0); /* coverity[check_return] */ completereduce(&want); /* dimen was already checked for */ showunit(&want); /* errors so no need to check here */ logputchar('\n'); } } else if (err==E_NOTINDOMAIN) logprintf("Value '%s' is not in the function's range\n",havestr); else logputs("Function evaluation error (bad function definition)\n"); return 1; } if (flags.verbose==2) logprintf("\t%s = %s(", havestr, fun->inverse.param); else if (flags.verbose==1) logputchar('\t'); showunit(have); if (flags.verbose==2) logputchar(')'); logputchar('\n'); return 0; } /* Print the conformability error message */ void showconformabilityerr(char *havestr,struct unittype *have, char *wantstr,struct unittype *want) { logputs("conformability error\n"); if (flags.verbose==2) logprintf("\t%s = ",havestr); else if (flags.verbose==1) logputchar('\t'); showunit(have); if (flags.verbose==2) logprintf("\n\t%s = ",wantstr); else if (flags.verbose==1) logputs("\n\t"); else logputchar('\n'); showunit(want); logputchar('\n'); } /* end showconformabilityerr */ /* determine whether a unit string begins with a fraction; assume it does if it starts with an integer, '|', and another integer */ int isfract(const char *unitstr) { char *enddouble=0, *endlong=0; while (isdigit(*unitstr)) unitstr++; if (*unitstr++ == '|') { (void)strtod(unitstr, &enddouble); (void)strtol(unitstr, &endlong, 10); if (enddouble == endlong) return 1; } return 0; } int checksigdigits(char *arg) { int errors, ival; char *nonum; errors = 0; if (!strcmp(arg, "max")) num_format.precision = MAXPRECISION; else { ival = (int) strtol(arg, &nonum, 10); if (strlen(nonum) > 0) { fprintf(stderr, "%s: invalid significant digits (%s)--integer value or 'max' required\n", progname, arg); errors++; } else if (ival <= 0) { fprintf(stderr, "%s: number of significant digits must be positive\n", progname); errors++; } else if (ival > MAXPRECISION) { fprintf(stderr, "%s: too many significant digits (%d)--using maximum value (%d)\n", progname, ival, MAXPRECISION); num_format.precision = MAXPRECISION; } else num_format.precision = ival; } if (errors) return -1; else return 0; } /* set output number format specification from significant digits and type */ int setnumformat() { size_t len; if (strchr("Ee", num_format.type)) num_format.precision--; len = 4; /* %, decimal point, type, terminating NUL */ if (num_format.precision > 0) len += (size_t) floor(log10((double) num_format.precision))+1; num_format.format = (char *) mymalloc(len, "(setnumformat)"); sprintf(num_format.format, "%%.%d%c", num_format.precision, num_format.type); return 0; } /* parse and validate the output number format specification and extract its type and precision into the num_format structure. Returns nonzero for invalid format. */ int parsenumformat() { static char *format_types = NULL; static char *format_flags = "+-# 0'"; static char badflag; char *two = "0x1p+1"; char *valid="ABCDEFGHIJKLMNOPQRSTUVWXYXabcdefghijklmnopqrstuvwxyx.01234567890"; char *dotptr, *lptr, *nonum, *p; char testbuf[80]; int errors, ndx; if (format_types == NULL){ format_types = (char *) mymalloc(strlen(BASE_FORMATS)+4, "(parsenumformat)"); strcpy(format_types,BASE_FORMATS); /* check for support of type 'F' (MS VS 2012 doesn't have it) */ sprintf(testbuf, "%.1F", 1.2); if (strlen(testbuf) == 3 && testbuf[0] == '1' && testbuf[2] == '2') strcat(format_types,"F"); /* check for support of hexadecimal floating point */ sprintf(testbuf, "%a", 2.0); if (!strncmp(testbuf,two,strlen(two)+1)) strcat(format_types, "aA"); /* check for support of digit-grouping (') flag */ sprintf(testbuf, "%'.0f", 1234.0); if (strlen(testbuf) > 2 && testbuf[0] == '1' && testbuf[2] == '2') badflag = '\0'; /* supported */ else badflag = '\''; /* not supported */ } errors = 0; p = num_format.format; if (*p != '%') { fprintf(stderr, "%s: number format specification must start with '%%'\n", progname); errors++; } else if (strrchr(num_format.format, '%') != num_format.format) { fprintf(stderr, "%s: only one '%%' allowed in number format specification\n", progname); errors++; p++; } else p++; dotptr = strchr(num_format.format, '.'); if (dotptr && strrchr(num_format.format, '.') != dotptr) { fprintf(stderr, "%s: only one '.' allowed in number format specification\n", progname); errors++; } /* skip over flags */ while (*p && strchr(format_flags, *p)) { if (*p == badflag) { /* only if digit-grouping flag (') not supported */ fprintf(stderr, "%s: digit-grouping flag (') not supported\n", progname); errors++; } p++; } /* check for type length modifiers, which aren't allowed */ if ((lptr = strstr(num_format.format, "hh")) || (lptr = strstr(num_format.format, "ll"))) { fprintf(stderr, "%s: type length modifier (%.2s) not supported\n", progname, lptr); errors++; } else if ((lptr = strpbrk(num_format.format, "hjLltz"))) { fprintf(stderr, "%s: type length modifier (%c) not supported\n", progname, lptr[0]); errors++; } /* check for other invalid characters */ ndx = strspn(p, valid); if (ndx < strlen(p)) { fprintf(stderr, "%s: invalid character (%c) in width, precision, or type\n", progname, p[ndx]); errors++; } if (errors) { /* results of any other checks are likely to be misleading */ fprintf(stderr, "%s: invalid number format specification (%s)\n", progname, num_format.format); fprintf(stderr, "%s: valid specification is %%[flags][width][.precision]type\n", progname); return -1; } /* get width and precision if specified; check precision */ num_format.width = (int) strtol(p, &nonum, 10); if (*nonum == '.'){ if (isdigit(nonum[1])) num_format.precision = (int) strtol(nonum+1, &nonum, 10); else { num_format.precision = 0; nonum++; } } else /* precision not given--use printf() default */ num_format.precision = 6; /* check for valid format type */ if (!*nonum) { fprintf(stderr, "%s: missing format type\n", progname); errors++; } else { if (strchr(format_types, *nonum)) { if (nonum[1]) { fprintf(stderr, "%s: invalid character(s) (%s) after format type\n", progname, nonum + 1); errors++; } else num_format.type = *nonum; } else { fprintf(stderr, "%s: invalid format type (%c)--valid types are [%s]\n", progname, *nonum, format_types); errors++; } } if (num_format.precision == 0 && (num_format.type == 'G' || num_format.type == 'g')) num_format.precision = 1; if (errors) { fprintf(stderr, "%s: invalid number format specification (%s)\n", progname, num_format.format); fprintf(stderr, "%s: valid specification is %%[flags][width][.precision]type\n", progname); return -1; } else return 0; } /* round a number to the displayed precision; indicate in hasnondigits if a number will contain any character other than the digits 0-9 in the current display format. */ double round_to_displayed(double value, int *hasnondigits) { int buflen; char *buf; double rounded; if (!isfinite(value)){ if (hasnondigits) *hasnondigits = 1; return value; } /* allow for sign (1), radix (1), exponent (5), E or E formats (1), NUL */ buflen = num_format.precision + 9; if (num_format.width > buflen) buflen = num_format.width; if (strchr("Ff", num_format.type)) { int len=num_format.precision+2; if (fabs(value) > 1.0) len += (int) floor(log10(fabs(value))) + 1; if (len > buflen) buflen = len; } /* allocate space for thousands separators with digit-grouping (') flag */ /* assume worst case--that all groups are two digits */ if (strchr(num_format.format, '\'') && strchr("FfGg", num_format.type)) buflen = buflen*3/2; buf = (char *) mymalloc(buflen, "(round_to_displayed)"); sprintf(buf, num_format.format, value); if (hasnondigits){ if (strspn(buf, "1234567890") != strlen(buf)) *hasnondigits = 1; else *hasnondigits = 0; } rounded = strtod(buf, NULL); free(buf); return rounded; } /* Print the unit in 'unitstr' along with any necessary punctuation. The 'value' is the multiplier for the unit. If printnum is set to PRINTNUM then this value is printed, or set it to NOPRINTNUM to prevent the value from being printed. */ #define PRINTNUM 1 #define NOPRINTNUM 0 void showunitname(double value, char *unitstr, int printnum) { int hasnondigits; /* flag to indicate nondigits in displayed value */ double rnd_value; /* value rounded to displayed precision */ rnd_value = round_to_displayed(value, &hasnondigits); if (printnum && !(rnd_value == 1 && isdecimal(*unitstr))) logprintf(num_format.format, value); if (strpbrk(unitstr, "+-")) /* show sums and differences of units */ logprintf(" (%s)", unitstr); /* in parens */ /* fractional unit 1|x and multiplier is all digits and not one-- */ /* no space or asterisk or numerator (3|8 in instead of 3 * 1|8 in) */ else if (printnum && !flags.showfactor && strncmp("1|", unitstr, 2) == 0 && isfract(unitstr) && rnd_value != 1 && !hasnondigits) logputs(unitstr+1); /* multiplier is unity and unit begins with a number--no space or */ /* asterisk (multiplier was not shown, and the space was already output)*/ else if (rnd_value == 1 && isdecimal(*unitstr)) logputs(unitstr); /* unitstr begins with a non-fraction number and multiplier was */ /* shown--prefix a spaced asterisk */ else if (isdecimal(unitstr[0])) logprintf(" * %s", unitstr); else logprintf(" %s", unitstr); } /* Show the conversion factors or print the conformability error message */ int showanswer(char *havestr,struct unittype *have, char *wantstr,struct unittype *want) { struct unittype invhave; int doingrec; /* reciprocal conversion? */ char *right = NULL, *left = NULL; doingrec=0; havestr = removepadding(havestr); wantstr = removepadding(wantstr); if (compareunits(have, want, ignore_dimless)) { char **src,**dest; invhave.factor=1/have->factor; for(src=have->numerator,dest=invhave.denominator;*src;src++,dest++) *dest=*src; *dest=0; for(src=have->denominator,dest=invhave.numerator;*src;src++,dest++) *dest=*src; *dest=0; if (flags.strictconvert || compareunits(&invhave, want, ignore_dimless)){ showconformabilityerr(havestr, have, wantstr, want); return -1; } if (flags.verbose>0) logputchar('\t'); logputs("reciprocal conversion\n"); have=&invhave; doingrec=1; } if (flags.verbose==2) { if (!doingrec) left=right=""; else if (strchr(havestr,'/')) { left="1 / ("; right=")"; } else { left="1 / "; right=""; } } /* Print the first line of output. */ if (flags.verbose==2) logprintf("\t%s%s%s = ",left,havestr,right); else if (flags.verbose==1) logputs("\t* "); if (flags.verbose==2) showunitname(have->factor / want->factor, wantstr, PRINTNUM); else logprintf(num_format.format, have->factor / want->factor); /* Print the second line of output. */ if (!flags.oneline){ if (flags.verbose==2) logprintf("\n\t%s%s%s = (1 / ",left,havestr,right); else if (flags.verbose==1) logputs("\n\t/ "); else logputchar('\n'); logprintf(num_format.format, want->factor / have->factor); if (flags.verbose==2) { logputchar(')'); showunitname(0,wantstr, NOPRINTNUM); } } logputchar('\n'); return 0; } /* Checks that the function definition has a valid inverse Prints a message to stdout if function has bad definition or invalid inverse. */ #define SIGN(x) ( (x) > 0.0 ? 1 : \ ( (x) < 0.0 ? (-1) : \ 0 )) void checkfunc(struct func *infunc, int verbose) { struct unittype theunit, saveunit; struct prefixlist *prefix; int err, i; double direction; if (infunc->skip_error_check){ if (verbose) printf("skipped function '%s'\n", infunc->name); return; } if (verbose) printf("doing function '%s'\n", infunc->name); if ((prefix=plookup(infunc->name)) && strlen(prefix->name)==strlen(infunc->name)) printf("Warning: '%s' defined as prefix and function\n",infunc->name); if (infunc->table){ /* Check for monotonicity which is needed for */ if (infunc->tablelen<=1){ /* unique inverses */ printf("Table '%s' has only one data point\n", infunc->name); return; } direction = SIGN(infunc->table[1].value - infunc->table[0].value); for(i=2;itablelen;i++) if (SIGN(infunc->table[i].value-infunc->table[i-1].value) != direction){ printf("Table '%s' lacks unique inverse around entry %.8g\n", infunc->name, infunc->table[i].location); return; } return; } if (infunc->forward.dimen){ err = parseunit(&theunit, infunc->forward.dimen, 0, 0); if (err){ printf("Function '%s' has invalid units '%s'\n", infunc->name, infunc->forward.dimen); return; } } else initializeunit(&theunit); if (infunc->forward.domain_max && infunc->forward.domain_min) theunit.factor *= (*infunc->forward.domain_max+*infunc->forward.domain_min)/2; else if (infunc->forward.domain_max) theunit.factor = theunit.factor * *infunc->forward.domain_max - 1; else if (infunc->forward.domain_min) theunit.factor = theunit.factor * *infunc->forward.domain_min + 1; else theunit.factor *= 7; /* Arbitrary choice where we evaluate inverse */ if (infunc->forward.dimen){ unitcopy(&saveunit, &theunit); err = evalfunc(&theunit, infunc, FUNCTION, ALLERR); if (err) { printf("Error in definition %s(%s) as '%s':\n", infunc->name, infunc->forward.param, infunc->forward.def); printf(" %s\n",errormsg[err]); freeunit(&theunit); freeunit(&saveunit); return; } } else { # define MAXPOWERTOCHECK 4 struct unittype resultunit, arbunit; char unittext[9]; double factor; int errors[MAXPOWERTOCHECK], errcount=0; char *indent; strcpy(unittext,"(kg K)^ "); factor = theunit.factor; initializeunit(&saveunit); initializeunit(&resultunit); for(i=0;iname, infunc->forward.param, infunc->forward.def); printf(" appears to require a dimensionless argument, 'units' keyword not given\n"); indent = " "; } else if (errcount==MAXPOWERTOCHECK) { printf("Error or missing 'units' keyword in definion %s(%s) as '%s'\n", infunc->name, infunc->forward.param, infunc->forward.def); indent=" "; } else if (errcount){ printf("Warning: function '%s(%s)' defined as '%s'\n", infunc->name, infunc->forward.param, infunc->forward.def); printf(" failed for some test inputs:\n"); indent = " "; } for(i=0;iname); printf(num_format.format, factor); printf("%s): %s\n", unittext, errormsg[errors[i]]); } } if (completereduce(&theunit)){ printf("Definition %s(%s) as '%s' is irreducible\n", infunc->name, infunc->forward.param, infunc->forward.def); freeunit(&theunit); freeunit(&saveunit); return; } if (!(infunc->inverse.def)){ printf("Warning: no inverse for function '%s'\n", infunc->name); freeunit(&theunit); freeunit(&saveunit); return; } err = evalfunc(&theunit, infunc, INVERSE, ALLERR); if (err){ printf("Error in inverse ~%s(%s) as '%s':\n", infunc->name,infunc->inverse.param, infunc->inverse.def); printf(" %s\n",errormsg[err]); freeunit(&theunit); freeunit(&saveunit); return; } divunit(&theunit, &saveunit); if (unit2num(&theunit) || fabs(theunit.factor-1)>1e-12) printf("Inverse is not the inverse for function '%s'\n", infunc->name); freeunit(&theunit); } struct namedef { char *name; char *def; }; #define CONFORMABLE 1 #define TEXTMATCH 2 void addtolist(struct unittype *have, char *searchstring, char *rname, char *name, char *def, struct namedef **list, int *listsize, int *maxnamelen, int *count, int searchtype) { struct unittype want; int len = 0; int keepit = 0; if (!name) return; if (searchtype==CONFORMABLE){ initializeunit(&want); if (!parseunit(&want, name,0,0) && !completereduce(&want)) keepit = !compareunits(have,&want,ignore_dimless); } else if (searchtype == TEXTMATCH) { keepit = (strstr(rname,searchstring) != NULL); } if (keepit){ if (*count==*listsize){ *listsize += 100; *list = (struct namedef *) realloc(*list,*listsize*sizeof(struct namedef)); if (!*list){ fprintf(stderr, "%s: memory allocation error (addtolist)\n", progname); exit(EXIT_FAILURE); } } (*list)[*count].name = rname; if (strchr(def, PRIMITIVECHAR)) (*list)[*count].def = ""; else (*list)[*count].def = def; (*count)++; len = strwidth(name); if (len>*maxnamelen) *maxnamelen = len; } if (searchtype == CONFORMABLE) freeunit(&want); } int compnd(const void *a, const void *b) { return strcmp(((struct namedef *)a)->name, ((struct namedef *)b)->name); } /* Ideally this would return the actual screen height, but it's so hard to code that portably... */ int screensize() { return 20; } /* If have is non-NULL then search through all units and print the ones which are conformable with have. Otherwise search through all the units for ones whose names contain the second argument as a substring. */ void tryallunits(struct unittype *have, char *searchstring) { struct unitlist *uptr; struct namedef *list; int listsize, maxnamelen, count; struct func *funcptr; struct wantalias *aliasptr; int i, j, searchtype; FILE *outfile; char *seploc, *firstunit; list = (struct namedef *) mymalloc( 100 * sizeof(struct namedef), "(tryallunits)"); listsize = 100; maxnamelen = 0; count = 0; if (have) searchtype = CONFORMABLE; else { if (!searchstring) searchstring=""; searchtype = TEXTMATCH; } for(i=0;inext) addtolist(have, searchstring, uptr->name, uptr->name, uptr->value, &list, &listsize, &maxnamelen, &count, searchtype); for(i=0;inext){ if (funcptr->table) addtolist(have, searchstring, funcptr->name, funcptr->tableunit, "", &list, &listsize, &maxnamelen, &count, searchtype); else addtolist(have, searchstring, funcptr->name, funcptr->inverse.dimen, "", &list, &listsize, &maxnamelen, &count, searchtype); } for(aliasptr=firstalias;aliasptr;aliasptr=aliasptr->next){ firstunit = dupstr(aliasptr->definition);/* coverity[var_assigned] */ seploc = strchr(firstunit,UNITSEPCHAR); /* Alias definitions allowed in */ *seploc = 0; /* database contain UNITSEPCHAR */ addtolist(have, searchstring, aliasptr->name, firstunit, aliasptr->definition, &list, &listsize, &maxnamelen, &count, searchtype); free(firstunit); } qsort(list, count, sizeof(struct namedef), compnd); outfile = 0; if (count==0) puts("No matching units found."); #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif if (count>screensize()){ outfile = popen(pager, "w"); } if (!outfile) outfile = stdout; for(i=0;i=0; if (!valid) printf("Error: %s\n",invalid_utf8); } #else fputs(query, stdout); if (!fgetslong(buffer, bufsize, stdin,0)){ if (!flags.quiet) putchar('\n'); exit(EXIT_SUCCESS); } #endif } #ifndef READLINE # define getuser getuser_noreadline #else /* we DO have readline */ void getuser_readline(char **buffer, int *bufsize, const char *query) { #ifdef SUPPORT_UTF8 int valid = 0; while (!valid){ if (*buffer) free(*buffer); *buffer = readline(query); valid = !*buffer || strwidth(*buffer)>=0; if (!valid) printf("Error: %s\n",invalid_utf8); } #else if (*buffer) free(*buffer); *buffer = readline(query); #endif if (*buffer && **buffer) add_history(*buffer); if (!*buffer){ if (!flags.quiet) putchar('\n'); exit(EXIT_SUCCESS); } } void getuser(char **buffer, int *bufsize, const char *query) { if (flags.readline) getuser_readline(buffer,bufsize,query); else getuser_noreadline(buffer,bufsize,query); } /* Unit name completion for readline. Complete function names or alias names or builtin functions. Complete to the end of a prefix or complete to the end of a unit. If the text includes a full prefix plus part of a unit and if the prefix is longer than one character then complete that compound. Don't complete a prefix fragment into prefix plus anything. */ int checkmatch(const char *text,const char *unit) { return strlen(text)<=strlen(unit) && !strncmp(text,unit,strlen(text)); } #define CU_ALIAS 0 #define CU_BUILTIN 1 #define CU_FUNC 2 #define CU_PREFIX 3 #define CU_UNITS 4 #define CU_DONE 5 char * completeunits(char *text, int state) { static int uhash, fhash, phash, checktype; static struct prefixlist *curprefix, *unitprefix; static struct unitlist *curunit; static struct func *curfunc; static struct wantalias *curalias; static char **curbuiltin; char *output = 0; #ifndef NO_SUPPRESS_APPEND rl_completion_suppress_append = 1; #endif if (!state){ /* state == 0 means this is the first call, so initialize */ checktype = 0; /* start at first type */ fhash = uhash = phash = 0; unitprefix=0; /* search for unit continuations starting with this prefix */ curfunc=ftab[fhash]; curunit=utab[uhash]; curprefix=ptab[phash]; curbuiltin = builtins; curalias = firstalias; } while (checktype != CU_DONE){ if (checktype == CU_ALIAS){ while(curalias){ if (checkmatch(text, curalias->name)) output = dupstr(curalias->name); curalias = curalias->next; if (output) return output; } checktype++; } if (checktype == CU_BUILTIN){ while(*curbuiltin){ if (checkmatch(text, *curbuiltin)) output = dupstr(*curbuiltin); curbuiltin++; if (output) return output; } checktype++; } while (checktype == CU_FUNC){ while (!curfunc && fhashname)) output = dupstr(curfunc->name); curfunc = curfunc->next; if (output) return output; } } while (checktype == CU_PREFIX){ while (!curprefix && phashname)) output = dupstr(curprefix->name); curprefix = curprefix->next; if (output) return output; } } while (checktype == CU_UNITS){ while (!curunit && uhashname)>1){ uhash = 0; curunit = utab[uhash]; } if (!curunit) { checktype++; break; } if (unitprefix){ if (checkmatch(text+unitprefix->len, curunit->name)){ output = (char *)mymalloc(1+strlen(curunit->name)+unitprefix->len, "(completeunits)"); strcpy(output, unitprefix->name); strcat(output, curunit->name); } } else if (checkmatch(text,curunit->name)) output = dupstr(curunit->name); curunit=curunit->next; if (output) return output; } } return 0; } #endif /* READLINE */ /* see if current directory contains an executable file */ int checkcwd (char *file) { FILE *fp; char *p; fp = fopen(file, "r"); if (fp){ fclose(fp); return 1; } #ifdef _WIN32 else if (!((p = strrchr(file, '.')) && isexe(p))) { char *pathname; pathname = mymalloc(strlen(file) + strlen(EXE_EXT) + 1, "(checkcwd)"); strcpy(pathname, file); strcat(pathname, EXE_EXT); fp = fopen(pathname, "r"); free(pathname); if (fp) { fclose(fp); return 1; } } #endif return 0; } /* return the last component of a pathname, and remove a .exe extension if one exists. */ char * getprogramname(char *path) { size_t proglen; char *programname; char *p; path = pathend(path); /* get rid of filename extensions in Windows */ proglen = strlen(path); if ((p = strrchr(path, '.')) && isexe(p)) proglen -= 4; programname = (char *) mymalloc(proglen + 1, "(getprogramname)"); strncpy(programname, path, proglen); programname[proglen] = '\0'; return(programname); } /* Find the directory that contains the invoked executable. */ char * getprogdir(char *progname, char **fullprogname) { char *progdir = NULL; char *p; #if defined (_WIN32) && defined (_MSC_VER) char buf[FILENAME_MAX + 1]; /* get the full pathname of the current executable and be done with it */ /* TODO: is there way to do this with gcc? */ if (GetModuleFileName(NULL, buf, FILENAME_MAX + 1)) progdir = dupstr(buf); #endif /* If path name is absolute or includes more than one component use it */ if (!progdir && (isfullpath(progname) || hasdirsep(progname))) progdir = dupstr(progname); /* command.com and cmd.exe under Windows always run a program that's in the current directory whether or not the current directory is in PATH, so we need to check the current directory. This could return a false positive if units is run from a Unix-like command interpreter under Windows if the current directory is not in PATH but contains 'units' or 'units.exe' */ #if defined (_WIN32) && !defined (_MSC_VER) if (!progdir && checkcwd(progname)) progdir = dupstr(progname); #endif /* search PATH to find the executable */ if (!progdir) { char *env; env = getenv("PATH"); if (env) { /* search PATH */ char *direc, *direc_end, *pathname; int len; FILE *fp; pathname = mymalloc(strlen(env)+strlen(progname)+strlen(EXE_EXT)+2, "(getprogdir)"); direc = env; while (direc) { direc_end = strchr(direc,PATHSEP); if (!direc_end) len = strlen(direc); else len = direc_end-direc; strncpy(pathname, direc, len); if (len>0) pathname[len++]='/'; strcpy(pathname+len, progname); fp = fopen(pathname, "r"); if (fp){ progdir = dupstr(pathname); break; } #ifdef _WIN32 /* executable may or may not have '.exe' suffix, so we need to look for both */ if (!((p = strrchr(pathname, '.')) && isexe(p))) { strcat(pathname, EXE_EXT); fp = fopen(pathname, "r"); if (fp){ progdir = dupstr(pathname); break; } } #endif direc = direc_end; if (direc) direc++; } free(pathname); if (fp) fclose(fp); } } if (!progdir) { fprintf(stderr, "%s: cannot find program directory\n", progname); exit(EXIT_FAILURE); } *fullprogname = dupstr(progdir); /* used by printversion() */ p = pathend(progdir); *p = '\0'; return progdir; } /* find a possible data directory relative to a 'bin' directory that contains the executable */ char * getdatadir() { int progdirlen; char *p; progdirlen = strlen(progdir); datadir = (char *) mymalloc(progdirlen + strlen(DATADIR) + 2, "(getdatadir)"); strcpy(datadir, progdir); if (isdirsep(progdir[progdirlen - 1])) datadir[progdirlen - 1] = '\0'; /* so pathend() can work */ p = pathend(datadir); if ((strlen(p) == 3) && (tolower(p[0]) == 'b') \ && (tolower(p[1]) == 'i') && (tolower(p[2]) == 'n')) { p = DATADIR; while (*p == '.') /* ignore "./", "../" */ p++; if (isdirsep(*p)) p++; strcpy(pathend(datadir), p); return datadir; } else return NULL; } char * findlocalemap(int checkonly) { FILE *map = NULL; char *filename = NULL; char *file; /* Try the environment variable UNITSLOCALEMAP, then the #defined value LOCALEMAP, then the directory containing the units executable, then the directory given by DATADIR (relative to the directory with the executable), and finally, the directory containing the units data file. */ file = getenv("UNITSLOCALEMAP"); if (file && *file) { map = fopen(file,"rt"); if (!map) { if (!checkonly) { fprintf(stderr, "%s: cannot open locale map '%s'\n specified in UNITSLOCALEMAP environment variable. ", progname, file); perror((char *) NULL); } return NULL; } else filename = dupstr(file); } if (!map) { file = LOCALEMAP; map = fopen(file,"rt"); if (map) filename = dupstr(file); } if (!map && !progdir) { if (!checkonly) { fprintf(stderr, "%s: cannot find locale map--program directory not set\n", progname); exit(EXIT_FAILURE); } else return NULL; } /* check the directory with the units executable */ if (!map) { filename = (char *) mymalloc(strlen(progdir) + strlen(file) + 2, "(findlocalemap)"); strcpy(filename, progdir); strcat(filename, file); map = fopen(filename,"rt"); } if (!map && strlen(DATADIR)) { /* check data directory relative to the units executable directory */ if (!datadir) datadir = getdatadir(); if (datadir) { if (filename) free(filename); filename = (char *) mymalloc(strlen(datadir) + strlen(DATADIR) + strlen(file) + 2, "(findlocalemap)"); strcpy(filename, datadir); strcat(filename, "/"); strcat(filename, file); map = fopen(filename, "rt"); } } /* check the directory with the units data file */ if (!map) { if (filename) free(filename); filename = (char *) mymalloc(strlen(unitsfiles[0]) + strlen(file) + 2, "(findlocalemap)"); strcpy(filename, unitsfiles[0]); strcpy(pathend(filename), file); map = fopen(filename,"rt"); } if (map) { fclose(map); return filename; } else { if (filename) free(filename); return NULL; } } char * findunitsfile(int noerrmsg) { FILE *testfile=0; char *file; file = getenv("UNITSFILE"); if (file && *file) { testfile = fopen(file, "rt"); if (!testfile) { if (!noerrmsg) { fprintf(stderr, "%s: cannot open units file '%s' in environment variable UNITSFILE. ", progname, file); perror((char *) NULL); } return NULL; } } if (!testfile && isfullpath(UNITSFILE)){ file = UNITSFILE; testfile = fopen(file, "rt"); if (!testfile) { if (!noerrmsg) { fprintf(stderr, "%s: cannot open units data file '%s'. ", progname, UNITSFILE); perror((char *) NULL); } return NULL; } } if (!testfile && !progdir) { if (!noerrmsg) { fprintf(stderr, "%s: cannot open units file '%s' and cannot find program directory.\n", progname, UNITSFILE); perror((char *) NULL); } return NULL; } if (!testfile) { /* check the directory containing the units executable */ file = (char *) mymalloc(strlen(progdir)+strlen(UNITSFILE)+1, "(findunitsfile)"); strcpy(file, progdir); strcat(file, UNITSFILE); testfile = fopen(file, "rt"); if (!testfile) free(file); } if (!testfile && strlen(DATADIR)) { /* check data directory relative to the units executable directory */ if (!datadir) datadir = getdatadir(); if (datadir) { file = (char *) mymalloc(strlen(datadir) + strlen(UNITSFILE) + 2, "(findunitsfile)"); strcpy(file, datadir); strcat(file, "/"); strcat(file, UNITSFILE); testfile = fopen(file, "rt"); if (!testfile) free(file); } } if (!testfile) { if (!noerrmsg) fprintf(stderr,"%s: cannot find units file '%s'\n", progname, UNITSFILE); return NULL; } else { fclose(testfile); return file; } } /* Find a personal file. First checks the specified environment variable (envname) for the filename to use. If this is unset then search user's home directory for basename. If home directory cannot be found, returns NULL. Otherwise if the file exists then returns its name in newly allocated space and sets *exists to 1. If the file does not exist then sets *exist to zero and: With checkonly == 0, prints error message and returns NULL With checkonly != 0, returns filename (does not print error message) */ char * personalfile(const char *envname, const char *basename, int checkonly, int *exists) { FILE *testfile=0; char *homedir, *filename=0; *exists = 0; /* First check the specified environment variable for a file name */ if (envname) filename = getenv(envname); if (filename && *filename){ /* environment variable exists */ testfile = fopen(filename, "rt"); if (testfile){ fclose(testfile); *exists = 1; return filename; } if (checkonly) return filename; else { fprintf(stderr, "%s: cannot open file '%s' specified in %s environment variable. ", progname, filename, envname); perror((char *) NULL); return 0; } } /* The environment variable was not set so identify the user's home directory. Under Windows if HOME is set we assume it's meant to override HOMEDRIVE, HOMEPATH, and USERPROFILE */ homedir = getenv("HOME"); if (homedir) { filename = mymalloc(strlen(homedir)+strlen(basename)+2, "(personalfile)"); strcpy(filename,homedir); } else #ifndef _WIN32 { /* If not running Windows there is nothing else to try */ return 0; } #else { /* If running Windows try a few other places */ /* try HOMEDRIVE and HOMEPATH */ char *homedrive, *homepath; if ((homedrive = getenv("HOMEDRIVE")) && (homepath = getenv("HOMEPATH"))) { filename = mymalloc(strlen(homedrive)+strlen(homepath) +strlen(basename)+2,"(personalfile)"); strcpy(filename,homedrive); strcat(filename,homepath); } /* finally, try USERPROFILE */ else if ((homedir = getenv("USERPROFILE"))) { filename = mymalloc(strlen(homedir)+strlen(basename)+2, "(personalfile)"); strcpy(filename,homedir); } else return 0; } #endif /* _WIN32 */ /* With home directory in hand we now look for the file */ strcat(filename,"/"); strcat(filename,basename); testfile = fopen(filename, "rt"); if (testfile){ fclose(testfile); *exists = 1; return filename; } if (checkonly) return filename; else { if (errno==EACCES) { fprintf(stderr,"%s: cannot read file '%s'. ",progname,filename); perror(0); } free(filename); return 0; } } /* print usage message */ void usage() { char *unitsfile; /* nonzero argument suppresses error messages */ unitsfile = findunitsfile(1); printf("\nUsage: %s [options] ['from-unit' 'to-unit']\n",progname); printf("\n\ Options:\n\ -h, --help show this help and exit\n\ -c, --check check that all units reduce to primitive units\n\ --check-verbose like --check, but lists units as they are checked\n\ --verbose-check so you can find units that cause endless loops\n\ -d, --digits show output to specified number of digits (default: %d)\n\ -e, --exponential exponential format output\n\ -f, --file specify a units data file (-f '' loads default file)\n", DEFAULTPRECISION); #ifdef READLINE printf("\ -H, --history specify readline history file (-H '' disables history)\n"); #endif printf("\ -L, --log specify a file to log conversions\n\ -l, --locale specify a desired locale\n\ -m, --minus make - into a subtraction operator (default)\n\ --oldstar use old '*' precedence, higher than '/'\n\ --newstar use new '*' precedence, equal to '/'\n\ -n, --nolists disable conversion to unit lists\n\ -S, --show-factor show non-unity factor before 1|x in multi-unit output\n\ -o, --output-format specify printf numeric output format (default: %%.%d%c)\n\ -p, --product make '-' into a product operator\n\ -q, --quiet suppress prompting\n\ --silent same as --quiet\n\ -s, --strict suppress reciprocal unit conversion (e.g. Hz<->s)\n\ -v, --verbose show slightly more verbose output\n\ --compact suppress printing of tab, '*', and '/' character\n\ -1, --one-line suppress the second line of output\n\ -t, --terse terse output (--strict --compact --quiet --one-line)\n\ -r, --round round last element of unit list output to an integer\n\ -U, --unitsfile show units data filename and exit\n\ -V, --version show version, data filenames (with -t: version only)\n\ -I, --info show version, files, and program properties\n", DEFAULTTYPE,DEFAULTPRECISION); if (!unitsfile) printf("Units data file '%s' not found.\n\n", UNITSFILE); else printf("To learn about the available units look in '%s'\n\n", unitsfile); puts("Report bugs to adrianm@gnu.org.\n\n"); } /* Print message about how to get help */ void helpmsg() { fprintf(stderr,"\nTry '%s --help' for more information.\n",progname); exit(EXIT_FAILURE); } /* show units version, and optionally, additional information */ void printversion() { int exists; char *unitsfile, *localemap; if (flags.verbose == 0) { printf("GNU Units version %s\n", VERSION); return; } printf("GNU Units version %s\n%s, %s, locale %s\n", VERSION, RVERSTR,UTF8VERSTR,mylocale); #if defined (_WIN32) && defined (HAVE_MKS_TOOLKIT) puts("With MKS Toolkit"); #endif if (flags.verbose == 2) { if (!fullprogname) getprogdir(progname, &fullprogname); if (fullprogname) printf("\n%s program is %s\n", progname, fullprogname); } /* units data file */ if (flags.verbose == 2) { putchar('\n'); unitsfile = getenv("UNITSFILE"); if (unitsfile) printf("Environment variable UNITSFILE set to '%s'\n", unitsfile); else puts("Environment variable UNITSFILE not set"); if (isfullpath(UNITSFILE)) printf("Default units data file is '%s'\n", UNITSFILE); else printf("Default units data file is '%s';\n %s will search for this file\n", UNITSFILE, progname); } unitsfile = findunitsfile(1); if (unitsfile && flags.verbose == 2 && !isfullpath(UNITSFILE)) printf("Found data file '%s'\n", unitsfile); else if (unitsfile) printf("Units data file is '%s'\n", unitsfile); else puts("*** Units data file not found ***"); /* personal units data file */ if (flags.verbose == 2) { putchar('\n'); unitsfile = getenv(HOME_UNITS_ENV); if (unitsfile) printf("Environment variable %s set to '%s'\n", HOME_UNITS_ENV,unitsfile); else printf("Environment variable %s not set\n", HOME_UNITS_ENV); } unitsfile = personalfile(HOME_UNITS_ENV, homeunitsfile, 1, &exists); if (unitsfile) { printf("Personal units data file is '%s'", unitsfile); if (!exists) puts("\n (file does not exist)"); else putchar('\n'); } else puts("Personal units data file not found: no home directory"); #ifdef READLINE if (flags.verbose == 2) { historyfile = personalfile(NULL,HISTORY_FILE,1,&exists); if (historyfile) printf("\nDefault readline history file is '%s'\n", historyfile); else puts("\nReadline history file unusable: no home directory"); } #endif #ifdef _WIN32 /* locale map */ if (flags.verbose == 2) { putchar('\n'); localemap = getenv("UNITSLOCALEMAP"); if (localemap) printf("Environment variable UNITSLOCALEMAP set to '%s'\n", localemap); else puts("Environment variable UNITSLOCALEMAP not set"); if (isfullpath(LOCALEMAP)) printf("Default locale map is '%s'\n", LOCALEMAP); else printf("Default locale map is '%s';\n %s will search for this file\n", LOCALEMAP, progname); localemap = findlocalemap(1); if (localemap && !isfullpath(LOCALEMAP)) printf("Found locale map '%s'\n", localemap); else if (localemap) printf("Locale map is '%s'\n", localemap); else puts("*** Locale map not found ***"); } #endif printf("\n\n%s\n\n", LICENSE); } void showunitsfile() { char *unitsfile; unitsfile = findunitsfile(1); if (unitsfile) printf("%s\n", unitsfile); else puts("Units data file not found"); } char *shortoptions = "VIUvqechSstf:o:d:mnpr1l:L:" #ifdef READLINE "H:" #endif ; struct option longoptions[] = { {"check", no_argument, &flags.unitcheck, 1}, {"check-verbose", no_argument, &flags.unitcheck, 2}, {"compact", no_argument, &flags.verbose, 0}, {"digits", required_argument, 0, 'd'}, {"exponential", no_argument, 0, 'e'}, {"file", required_argument, 0, 'f'}, {"help", no_argument, 0, 'h'}, #ifdef READLINE {"history", required_argument, 0, 'H'}, #endif {"info", no_argument, 0, 'I'}, {"locale", required_argument, 0, 'l'}, {"log", required_argument, 0, 'L'}, {"minus", no_argument, &parserflags.minusminus, 1}, {"newstar", no_argument, &parserflags.oldstar, 0}, {"nolists", no_argument, 0, 'n'}, {"oldstar", no_argument, &parserflags.oldstar, 1}, {"one-line", no_argument, &flags.oneline, 1}, {"output-format", required_argument, 0, 'o'}, {"product", no_argument, &parserflags.minusminus, 0}, {"quiet", no_argument, &flags.quiet, 1}, {"round",no_argument, 0, 'r'}, {"show-factor", no_argument, 0, 'S'}, {"silent", no_argument, &flags.quiet, 1}, {"strict",no_argument,&flags.strictconvert, 1}, {"terse",no_argument, 0, 't'}, {"unitsfile", no_argument, 0, 'U'}, {"verbose", no_argument, &flags.verbose, 2}, {"verbose-check", no_argument, &flags.unitcheck, 2}, {"version", no_argument, 0, 'V'}, {0,0,0,0} }; /* Process the args. Returns 1 if interactive mode is desired, and 0 for command line operation. If units appear on the command line they are returned in the from and to parameters. */ int processargs(int argc, char **argv, char **from, char **to) { extern char *optarg; extern int optind; int optchar, optindex; int ind; int doprintversion=0; while ( -1 != (optchar = getopt_long(argc, argv,shortoptions,longoptions, &optindex ))) { switch (optchar) { case 'm': parserflags.minusminus = 1; break; case 'p': parserflags.minusminus = 0; break; case 't': flags.oneline = 1; flags.quiet = 1; flags.strictconvert = 1; flags.verbose = 0; break; /* numeric output format */ case 'd': if (checksigdigits(optarg) < 0) exit(EXIT_FAILURE); else /* ignore anything given with 'o' option */ num_format.format = NULL; break; case 'e': /* ignore anything given with 'o' option */ num_format.format = NULL; num_format.type = 'e'; break; case 'o': num_format.format = optarg; break; case 'c': flags.unitcheck = 1; break; case 'f': for(ind=0;unitsfiles[ind];ind++); if (ind==MAXFILES){ fprintf(stderr, "At most %d -f specifications are allowed\n", MAXFILES); exit(EXIT_FAILURE); } if (optarg && *optarg) unitsfiles[ind] = optarg; else { unitsfiles[ind] = findunitsfile(0); if (!unitsfiles[ind]) exit(EXIT_FAILURE); } unitsfiles[ind+1] = 0; break; case 'L': logfilename = optarg; break; case 'l': mylocale = optarg; break; case 'n': flags.unitlists = 0; break; case 'q': flags.quiet = 1; break; case 'r': flags.round = 1; break; case 'S': flags.showfactor = 1; break; case 's': flags.strictconvert = 1; break; case 'v': flags.verbose = 2; break; case '1': flags.oneline = 1; break; case 'I': flags.verbose = 2; /* fall through */ case 'V': doprintversion = 1; break; case 'U': showunitsfile(); exit(EXIT_SUCCESS); break; case 'h': usage(); exit(EXIT_SUCCESS); #ifdef READLINE case 'H': if (strlen(optarg)==0) historyfile=NULL; else historyfile = optarg; break; #endif case 0: break; /* This is reached if a long option is processed with no return value set. */ case '?': /* Invalid option or missing argument returns '?' */ default: helpmsg(); /* helpmsg() exits with error */ } } if (doprintversion){ printversion(); exit(EXIT_SUCCESS); } if (flags.unitcheck) { if (optind != argc){ fprintf(stderr, "Too many arguments (arguments are not allowed with -c).\n"); helpmsg(); /* helpmsg() exits with error */ } } else { if (optind == argc - 2) { flags.quiet=1; *from = argv[optind]; *to = dupstr(argv[optind+1]); /* This string may get rewritten later */ return 0; /* and we might call free() on it */ } if (optind == argc - 1) { flags.quiet=1; *from = argv[optind]; *to=0; return 0; } if (optind < argc - 2) { fprintf(stderr,"Too many arguments (maybe you need quotes).\n"); helpmsg(); /* helpmsg() exits with error */ } } return 1; } /* Show a pointer under the input to indicate a problem. Prints 'position' spaces and then the pointer. If 'position' is negative, nothing is printed. */ void showpointer(int position) { if (position >= 0){ while (position--) putchar(' '); puts("^"); } } /* end showpointer */ /* Process the string 'unitstr' as a unit, placing the processed data in the unit structure 'theunit'. Returns 0 on success and 1 on failure. If an error occurs an error message is printed to stdout. A pointer ('^') will be printed if an error is detected, and promptlen should be set to the printing width of the prompt string, or set it to NOPOINT to supress printing of the pointer. */ int processunit(struct unittype *theunit, char *unitstr, int promptlen) { char *errmsg; int errloc,err; char savechar; if (flags.unitlists && strchr(unitstr, UNITSEPCHAR)){ puts("Unit list not allowed"); return 1; } if ((err=parseunit(theunit, unitstr, &errmsg, &errloc))){ if (promptlen >= 0){ if (err!=E_UNKNOWNUNIT || !irreducible){ if (errloc>0) { savechar = unitstr[errloc]; unitstr[errloc] = 0; showpointer(promptlen+strwidth(unitstr)-1); unitstr[errloc] = savechar; } else showpointer(promptlen); } } else printf("Error in '%s': ", unitstr); fputs(errmsg,stdout); if (err==E_UNKNOWNUNIT && irreducible) printf(" '%s'", irreducible); putchar('\n'); return 1; } if ((err=completereduce(theunit))){ fputs(errormsg[err],stdout); if (err==E_UNKNOWNUNIT) printf(" '%s'", irreducible); putchar('\n'); return 1; } return 0; } /* Checks the input parameter unitstr (a list of units separated by UNITSEPCHAR) for errors. All units must be parseable and conformable to each other. Returns 0 on success and 1 on failure. I an error is found then print an error message on stdout. A pointer ('^') will be printed to mark the error. The promptlen parameter should be set to the printing width of the prompt string so that the pointer is correctly aligned. To suppress the printing of the pointer set promptlen to NOPOINT. To suppress printing of error messages entirely set promptlen to NOERRMSG. */ int checkunitlist(char *unitstr, int promptlen) { struct unittype unit[2], one; char *firstunitstr,*nextunitstr; int unitidx = 0; int printerror = promptlen != NOERRMSG; initializeunit(&one); firstunitstr = unitstr; initializeunit(unit); initializeunit(unit+1); while (unitstr) { if ((nextunitstr = strchr(unitstr, UNITSEPCHAR)) != 0) *nextunitstr = '\0'; if (!unitstr[strspn(unitstr, WHITE)]) { /* unitstr is blank */ if (!nextunitstr) { /* terminal UNITSEPCHAR indicates repetition */ freeunit(unit); /* of last unit and is permitted */ return 0; } else { /* internal blank units are not allowed */ if (printerror){ showpointer(promptlen); puts("Error: blank unit not allowed"); } freeunit(unit); return 1; } } /* processunit() prints error messages; avoid it to supress them */ if ((printerror && processunit(unit+unitidx,unitstr,promptlen)) || (!printerror && (parseunit(unit+unitidx, unitstr,0,0) || completereduce(unit+unitidx) || compareunits(unit+unitidx,&one, ignore_primitive)))){ if (printerror) printf("Error in unit list entry: %s\n",unitstr); freeunit(unit); freeunit(unit+1); return 1; } if (unitidx == 0) unitidx = 1; else { if (compareunits(unit, unit+1, ignore_dimless)){ if (printerror){ int wasverbose = flags.verbose; FILE *savelog = logfile; logfile=0; flags.verbose = 2; /* always use verbose form to be unambiguous */ *(strchr(firstunitstr, UNITSEPCHAR)) = '\0'; firstunitstr = removepadding(firstunitstr); unitstr = removepadding(unitstr); showpointer(promptlen); showconformabilityerr(firstunitstr, unit, unitstr, unit+1); flags.verbose = wasverbose; logfile = savelog; } freeunit(unit); freeunit(unit+1); return 1; } freeunit(unit+1); } if (nextunitstr) { if (promptlen >= 0) promptlen += strwidth(unitstr)+1; *(nextunitstr++) = UNITSEPCHAR; } unitstr = nextunitstr; } freeunit(unit); return 0; } /* end checkunitlist */ /* Call either processunit or checkunitlist, depending on whether the string 'unitstr' contains a separator character. Returns 0 on success and 1 on failure. If an error occurs an error message is printed to stdout. A pointer will be printed if an error is detected, and promptlen should be set to the printing width of the prompt string, or set it to NOPOINT to supress printing of the pointer. */ int processwant(struct unittype *theunit, char *unitstr, int promptlen) { if (flags.unitlists && strchr(unitstr, UNITSEPCHAR)) return checkunitlist(unitstr, promptlen); else return processunit(theunit, unitstr, promptlen); } void checkallaliases(int verbose) { struct wantalias *aliasptr; for(aliasptr = firstalias; aliasptr; aliasptr=aliasptr->next){ if (verbose) printf("doing unit list '%s'\n", aliasptr->name); if (checkunitlist(aliasptr->definition,NOERRMSG)) printf("Unit list '%s' contains errors\n", aliasptr->name); if (ulookup(aliasptr->name)) printf("Unit list '%s' hides a unit definition.\n", aliasptr->name); if (fnlookup(aliasptr->name, strlen(aliasptr->name))) printf("Unit list '%s' hides a function definition.\n", aliasptr->name); } } /* Check that all units and prefixes are reducible to primitive units and that function definitions are valid and have correct inverses. A message is printed for every unit that does not reduce to primitive units. */ void checkunits(int verbosecheck) { struct unittype have,second,one; struct unitlist *uptr; struct prefixlist *pptr; struct func *funcptr; char *prefixbuf, *testunit; int i; initializeunit(&one); /* Check all functions for valid definition and correct inverse */ for(i=0;inext) checkfunc(funcptr, verbosecheck); checkallaliases(verbosecheck); /* Now check all units for validity */ for(i=0;inext){ if (verbosecheck) printf("doing '%s'\n",uptr->name); if (parseunit(&have, uptr->name,0,0) || completereduce(&have) || compareunits(&have,&one, ignore_primitive)){ if (isfunction(uptr->name)) printf("Unit '%s' hidden by function '%s'\n", uptr->name, uptr->name); else printf("'%s' defined as '%s' irreducible\n",uptr->name, uptr->value); } else { parserflags.minusminus = !parserflags.minusminus; /* coverity[check_return] */ parseunit(&second, uptr->name, 0, 0); /* coverity[check_return] */ completereduce(&second); /* Can't fail because it worked above */ if (compareunits(&have, &second, ignore_nothing)){ printf("'%s': replace '-' with '+-' for subtraction or '*' to multiply\n", uptr->name); } freeunit(&second); parserflags.minusminus=!parserflags.minusminus; } freeunit(&have); } /* Check prefixes */ testunit="meter"; for(i=0;inext){ if (verbosecheck) printf("doing '%s-'\n",pptr->name); prefixbuf = mymalloc(strlen(pptr->name) + strlen(testunit) + 1, "(checkunits)"); strcpy(prefixbuf,pptr->name); strcat(prefixbuf,testunit); if (parseunit(&have, prefixbuf,0,0) || completereduce(&have) || compareunits(&have,&one,ignore_primitive)) printf("'%s-' defined as '%s' irreducible\n",pptr->name, pptr->value); else { int plevel; /* check for bad '/' character in prefix */ char *ch; plevel = 0; for(ch=pptr->value;*ch;ch++){ if (*ch==')') plevel--; else if (*ch=='(') plevel++; else if (plevel==0 && *ch=='/'){ printf( "'%s-' defined as '%s' contains a bad '/'. (Add parentheses.)\n", pptr->name, pptr->value); break; } } } freeunit(&have); free(prefixbuf); } } /* Converts the input value 'havestr' (which is already parsed into the unit structure 'have') into a sum of the UNITSEPCHAR-separated units listed in 'wantstr'. You must call checkunitlist first to ensure 'wantstr' is error-free. Prints the results (or an error message) on stdout. Returns 0 on success and 1 on failure. */ int showunitlist(char *havestr, struct unittype *have, char *wantstr) { struct unittype want, lastwant; char *lastunitstr, *nextunitstr, *lastwantstr=0; double remainder; /* portion of have->factor remaining */ double round_dir; /* direction of rounding */ double value; /* value (rounded to integer with 'r' option) */ size_t wantstrlen; int firstunit = 1; /* first unit in a multi-unit string */ int value_shown = 0; /* has a value been shown? */ initializeunit(&want); remainder = have->factor; lastunitstr = 0; nextunitstr = 0; round_dir = 0; wantstrlen = strlen(wantstr); if (flags.round) { /* disable unit repetition with terminal UNITSEPCHAR when rounding */ if (wantstr[wantstrlen - 1] == UNITSEPCHAR) wantstr[wantstrlen - 1] = '\0'; if ((lastwantstr = strrchr(wantstr, UNITSEPCHAR))) lastwantstr++; } while (wantstr) { if ((nextunitstr = strchr(wantstr, UNITSEPCHAR))) *(nextunitstr++) = '\0'; wantstr = removepadding(wantstr); /* if wantstr ends in UNITSEPCHAR, repeat last unit--to give integer and fractional parts (3 oz + 0.371241 oz rather than 3.371241 oz) */ if (!*wantstr) /* coverity[alias_transfer] */ wantstr = lastunitstr; if (processunit(&want, wantstr, NOPOINT)) { freeunit(&want); return 1; } if (firstunit){ /* checkunitlist() ensures conformability within 'wantstr', so we just need to check the first unit to see if it conforms to 'have' */ if (compareunits(have, &want, ignore_dimless)) { showconformabilityerr(havestr, have, wantstr, &want); freeunit(&want); return 1; } /* round to nearest integral multiple of last unit */ if (flags.round) { value = remainder; if (lastwantstr && *lastwantstr) { /* more than one unit */ lastwantstr = removepadding(lastwantstr); initializeunit(&lastwant); if (processunit(&lastwant, lastwantstr, NOPOINT)) { freeunit(&lastwant); return 1; } remainder = floor(remainder / lastwant.factor + 0.5) * lastwant.factor; } else /* first unit is last unit */ remainder = floor(remainder / want.factor + 0.5) * want.factor; round_dir = remainder - value; } if (flags.verbose == 2) { havestr = removepadding(havestr); logprintf("\t%s = ", havestr); } else if (flags.verbose == 1) logputchar('\t'); } /* end if first unit */ if (nextunitstr) { remainder = want.factor * modf(remainder / want.factor, &value); if (round_to_displayed(remainder / want.factor, NULL) == 1) { value++; /* at displayed precision, value rounds up */ remainder = 0; /* and remainder is zero */ } else if (fabs(remainder / have->factor) < DBL_EPSILON) remainder = 0; /* remainder is just rounding error */ } else { /* last unit */ value = remainder / want.factor; if (!flags.round) { /* round to displayed precision */ value = round_to_displayed(value, NULL); } } if (!flags.verbose){ if (!firstunit) logputchar(UNITSEPCHAR); logprintf(num_format.format,value); value_shown=1; } else { /* verbose case */ if (value != 0) { if (value_shown) /* have already displayed a number so need a '+' */ logputs(" + "); showunitname(value, wantstr, PRINTNUM); value_shown=1; } } freeunit(&want); lastunitstr = wantstr; wantstr = nextunitstr; firstunit = 0; } /* if the final unit value was rounded print indication */ if (!value_shown) { /* provide output if every value rounded to zero */ logputs("0 "); if (isdecimal(*lastunitstr)) logputs("* "); logputs(lastunitstr); } if (round_dir != 0) { if (flags.verbose){ if (round_dir > 0) logprintf(" (rounded up to nearest %s) ", lastunitstr); else logprintf(" (rounded down to nearest %s) ", lastunitstr); } else logprintf("%c%c", UNITSEPCHAR, round_dir > 0 ?'-':'+'); } logputchar('\n'); return 0; } /* end showunitlist */ #if defined (_WIN32) && defined (HAVE_MKS_TOOLKIT) int ismksmore(char *pager) { static int mksmore = -1; if (mksmore >= 0) return mksmore; /* Tries to determine whether the MKS Toolkit version of more(1) or less(1) will run. Neither accepts '+', so if either will run, we need to give the option as '+g'. */ if (strstr(pager, "more") || strstr(pager, "less")) { char *mypager, *mkspager, *mksroot, *p; char pathbuf[FILENAME_MAX + 1]; struct _stat mybuf, mksbuf; mypager = NULL; mkspager = NULL; mksmore = 0; if (strlen(pager) > FILENAME_MAX) { fprintf(stderr, "%s: cannot invoke pager--value '%s' in PAGER too long\n", progname, pager); return 0; /* TODO: this really isn't the right value */ } else if (!isfullpath(pager)) { mypager = (char *) mymalloc(strlen(pager) + strlen(EXE_EXT) + 1, "(ishelpquery)"); strcpy(mypager, pager); if (!((p = strrchr(mypager, '.')) && isexe(p))) strcat(mypager, EXE_EXT); _searchenv(mypager, "PATH", pathbuf); } else strcpy(pathbuf, pager); mksroot = getenv("ROOTDIR"); if (mksroot) { char * mksprog; if (strstr(pager, "more")) mksprog = "more.exe"; else mksprog = "less.exe"; mkspager = (char *) mymalloc(strlen(mksroot) + strlen("/mksnt/") + strlen(mksprog) + 1, "(ishelpquery)"); strcpy(mkspager, mksroot); strcat(mkspager, "/mksnt/"); strcat(mkspager, mksprog); } if (*pathbuf && mksroot) { if (_stat(mkspager, &mksbuf)) { fprintf(stderr, "%s: cannot stat file '%s'. ", progname, mksbuf); perror((char *) NULL); return 0; } if (_stat(pathbuf, &mybuf)) { fprintf(stderr, "%s: cannot stat file '%s'. ", progname, pathbuf); perror((char *) NULL); return 0; } /* if we had inodes, this would be simple ... but if it walks like a duck and swims like a duck and quacks like a duck ... */ if (mybuf.st_size == mksbuf.st_size && mybuf.st_ctime == mksbuf.st_ctime && mybuf.st_mtime == mksbuf.st_mtime && mybuf.st_atime == mksbuf.st_atime && mybuf.st_mode == mksbuf.st_mode) mksmore = 1; } if (mypager) free(mypager); if (mkspager) free(mkspager); } return mksmore; } #endif /* Checks to see if the input string contains HELPCOMMAND possibly followed by a unit name on which help is sought. If not, then return 0. Otherwise invoke the pager on units file at the line where the specified unit is defined. Then return 1. */ int ishelpquery(char *str, struct unittype *have) { struct unitlist *unit; struct func *function; struct wantalias *alias; struct prefixlist *prefix; char commandbuf[1000]; /* Hopefully this is enough overkill as no bounds */ int unitline; /* checking is performed. */ char *file; str=removepadding(str); if (have && !strcmp(str, UNITMATCH)){ tryallunits(have,0); return 1; } if (!strncmp(SEARCHCOMMAND,str,strlen(SEARCHCOMMAND))){ str+=strlen(SEARCHCOMMAND); if (!strchr(WHITE,*str)) return 0; str = removepadding(str); if (strlen(str)==0){ printf("\n\ Type 'search text' to see a list of all unit names \n\ containing 'text' as a substring\n\n"); return 1; } tryallunits(0,str); return 1; } if (!strncmp(HELPCOMMAND,str,strlen(HELPCOMMAND))){ str+=strlen(HELPCOMMAND); if (!strchr(WHITE,*str)) return 0; str = removepadding(str); if (strlen(str)==0){ printf("\n\ Units converts between different measuring systems and %s6 inches\n\ acts as a units-aware calculator. At the '%s' %scm\n\ prompt, type in the units you want to convert from or * 15.24\n\ an expression to evaluate. At the '%s' prompt, / 0.065\n\ enter the units to convert to or press return to see\n\ the reduced form or definition. %stempF(75)\n\ %stempC\n\ The first example shows that 6 inches is about 15 cm 23.889\n\ or (1/0.065) cm. The second example shows how to\n\ convert 75 degrees Fahrenheit to Celsius. The third %sbu^(1/3)\n\ example converts the cube root of a bushel to a list %sft;in\n\ of semicolon-separated units. 1 ft + 0.9 in\n\ \n\ To quit from units type Ctrl-%s or Ctrl-C. %s2 btu + 450 ft lbf\n\ %s(kg^2/s)/(day lb/m^2)\n\ At the '%s' prompt type '%s' to get a * 1.0660684e+08\n\ list of conformable units. At either prompt you / 9.3802611e-09\n\ type 'help myunit' to browse the units database\n\ and read the comments relating to myunit or see %s6 tbsp sugar\n\ other units related to myunit. Typing 'search %sg\n\ text' will show units whose names contain 'text'. * 75\n\ / 0.013333333\n", QUERYHAVE, QUERYHAVE, QUERYWANT, QUERYWANT, QUERYHAVE,QUERYWANT,QUERYHAVE,QUERYWANT, EOFCHAR, QUERYHAVE,QUERYWANT, QUERYWANT, UNITMATCH, QUERYHAVE,QUERYWANT); return 1; } if ((function = isfunction(str))){ file = function->file; unitline = function->linenumber; } else if ((unit = ulookup(str))){ unitline = unit->linenumber; file = unit->file; } else if ((prefix = plookup(str)) && strlen(str)==prefix->len){ unitline = prefix->linenumber; file = prefix->file; } else if ((alias = aliaslookup(str))){ unitline = alias->linenumber; file = alias->file; } else { printf("Unknown unit '%s'\n",str); return 1; } #if defined (_WIN32) && defined (HAVE_MKS_TOOLKIT) if (ismksmore(pager)) /* inner escaped quotes are necessary for filenames with spaces; outer escaped quotes are necessary for cmd.exe to see the command as a single string containing one or more quoted strings (e.g., cmd /c ""command" "arg1" "arg2" ... ") */ sprintf(commandbuf,"\"\"%s\" +%dg \"%s\"\"", pager, unitline, file); else /* more.com seems to have positioning problems, and it can't back up */ sprintf(commandbuf,"\"\"%s\" +%d \"%s\"\"", pager, unitline > 2 ? unitline - 3 : unitline, file); #elif defined (_WIN32) sprintf(commandbuf,"\"\"%s\" +%d \"%s\"\"", pager, unitline > 2 ? unitline - 3 : unitline, file); #else sprintf(commandbuf,"%s +%d %s", pager, unitline, file); #endif if (system(commandbuf)) fprintf(stderr,"%s: cannot invoke pager '%s' to display help\n", progname, pager); return 1; } return 0; } #ifdef SUPPORT_UTF8 void checklocale() { char *temp; temp = setlocale(LC_CTYPE,""); utf8mode = (strcmp(nl_langinfo(CODESET),"UTF-8")==0); if (temp){ mylocale = dupstr(temp); temp = strchr(mylocale,'.'); if (temp) *temp = 0; } else mylocale = DEFAULTLOCALE; } #else void checklocale() { char *temp=0; #ifndef NO_SETLOCALE temp = setlocale(LC_CTYPE,""); #endif if (!temp) temp = getenv("LC_CTYPE"); if (!temp) temp = getenv("LANG"); if (!temp) mylocale = DEFAULTLOCALE; else { mylocale = dupstr(temp); temp = strchr(mylocale,'.'); if (temp) *temp = 0; } } #endif /* Replaces an alias in the specified string input. Returns 1 if the alias that is found contains errors. */ int replacealias(char **string, int *buflen) { int usefree = 1; struct wantalias *aliasptr; char *input; if (!flags.readline && buflen) usefree = 0; if (*string && **string) { /* check that string is defined and nonempty */ input = removepadding(*string); if ((aliasptr=aliaslookup(input))){ if (checkunitlist(aliasptr->definition,NOERRMSG)){ puts("Unit list definition contains errors."); return 1; } if (usefree){ free(*string); *string = dupstr(aliasptr->definition); } else { /* coverity[dead_error_line] */ while (strlen(aliasptr->definition)>*buflen) growbuffer(string, buflen); strcpy(*string, aliasptr->definition); } } } return 0; } /* Remaps the locale name returned on Windows systems to the value returned on Unix-like systems */ void remaplocale(char *filename) { FILE *map; char *value; char name[80]; map = fopen(filename,"rt"); if (!map) { fprintf(stderr,"%s: cannot open locale map '%s'. ",progname,filename); perror((char *) NULL); } else { while(!feof(map)){ if (!fgets(name,80,map)) break; value=strchr(name,'#'); if (value) *value=0; value=strchr(name,'\t'); if (!value) continue; *value++=0; value = removepadding(value); if (!strcmp(removepadding(name), mylocale)) mylocale = dupstr(value); } fclose(map); } } void close_logfile(void) { if (logfile){ fputc('\n',logfile); fclose(logfile); } } void open_logfile(void) { time_t logtime; char * timestr; logfile = fopen(logfilename, "at"); if (!logfile){ fprintf(stderr, "%s: cannot write to log file '%s'. ", progname, logfilename); perror(0); exit(EXIT_FAILURE); } time(&logtime); timestr = ctime(&logtime); fprintf(logfile, "### Log started %s \n", timestr); atexit(close_logfile); } void write_files_sig(int sig) { #ifdef READLINE save_history(); #endif close_logfile(); signal(sig, SIG_DFL); raise(sig); } int main(int argc, char **argv) { static struct unittype have, want; char *havestr=0, *wantstr=0; struct func *funcval; struct wantalias *alias; int havestrsize=0; /* Only used if READLINE is undefined */ int wantstrsize=0; /* Only used if READLINE is undefined */ int interactive; int readerr; char **unitfileptr; int unitcount=0, prefixcount=0, funccount=0; /* for counting units */ char *queryhave, *querywant, *comment; int queryhavewidth, querywantwidth; #ifdef _WIN32 char *localemap; #endif /* Set program parameter defaults */ num_format.format = NULL; num_format.precision = DEFAULTPRECISION; num_format.type = DEFAULTTYPE; flags.quiet = 0; /* Do not supress prompting */ flags.unitcheck = 0; /* Unit checking is off */ flags.verbose = 1; /* Medium verbosity */ flags.round = 0; /* Rounding off */ flags.strictconvert=0; /* Strict conversion disabled (reciprocals active) */ flags.unitlists = 1; /* Multi-unit conversion active */ flags.oneline = 0; /* One line output is disabled */ flags.showfactor = 0; /* Don't show a multiplier for a 1|x fraction */ /* in unit list output */ parserflags.minusminus = 1; /* '-' character gives subtraction */ parserflags.oldstar = 0; /* '*' has same precedence as '/' */ progname = getprogramname(argv[0]); /* unless UNITSFILE and LOCALEMAP have absolute pathnames, we may need progdir to search for supporting files */ if (!(isfullpath(UNITSFILE) && isfullpath(LOCALEMAP))) progdir = getprogdir(argv[0], &fullprogname); else { progdir = NULL; fullprogname = NULL; } datadir = NULL; /* directory to search as last resort */ checklocale(); #ifdef READLINE # if RL_READLINE_VERSION > 0x0402 rl_completion_entry_function = (rl_compentry_func_t *)completeunits; # else rl_completion_entry_function = (Function *)completeunits; # endif rl_basic_word_break_characters = " \t+-*/()|^;"; flags.readline = isatty(0); if (flags.readline){ int file_exists; historyfile = personalfile(NULL,HISTORY_FILE,1,&file_exists); } #else flags.readline = 0; #endif unitsfiles[0] = 0; #ifdef _WIN32 if (!strcmp(homeunitsfile,".units")) homeunitsfile = "unitdef.units"; #endif interactive = processargs(argc, argv, &havestr, &wantstr); #ifdef READLINE if (interactive && flags.readline && historyfile){ rl_initialize(); read_history(historyfile); init_history_length = history_length; init_history_base = history_base; atexit(save_history); } #endif signal(SIGINT, write_files_sig); signal(SIGTERM, write_files_sig); if (logfilename) { if (!interactive) fprintf(stderr, "Log file '%s' ignored in non-interactive mode.\n",logfilename); else open_logfile(); } /* user has specified the complete format--use it */ if (num_format.format != NULL) { if (parsenumformat()) exit(EXIT_FAILURE); } else setnumformat(); if (flags.verbose==0) deftext = ""; if (!unitsfiles[0]){ char *unitsfile; unitsfile = findunitsfile(0); if (!unitsfile) exit(EXIT_FAILURE); else { int file_exists; unitsfiles[0] = unitsfile; unitsfiles[1] = personalfile(HOME_UNITS_ENV, homeunitsfile, 0, &file_exists); unitsfiles[2] = 0; } } #ifdef _WIN32 localemap = findlocalemap(0); if (localemap) remaplocale(localemap); #endif for(unitfileptr=unitsfiles;*unitfileptr;unitfileptr++){ readerr = readunits(*unitfileptr, stderr, &unitcount, &prefixcount, &funccount, 0); if (readerr==E_MEMORY) exit(EXIT_FAILURE); if (readerr==E_FILE){ fprintf(stderr, "%s: cannot open units file '%s'. ", progname, *unitfileptr); perror(0); exit(EXIT_FAILURE); } } if (flags.quiet) queryhave = querywant = ""; /* No prompts are being printed */ else { queryhave = QUERYHAVE; querywant = QUERYWANT; printf("%d units, %d prefixes, %d nonlinear units\n\n", unitcount, prefixcount,funccount); } queryhavewidth = strwidth(queryhave); querywantwidth = strwidth(querywant); if (flags.unitcheck) { checkunits(flags.unitcheck==2 || flags.verbose==2); exit(EXIT_SUCCESS); } if (!interactive) { #ifdef SUPPORT_UTF8 if (strwidth(havestr)<0){ printf("Error: %s on input\n",invalid_utf8); exit(EXIT_FAILURE); } if (wantstr && strwidth(wantstr)<0){ printf("Error: %s on input\n",invalid_utf8); exit(EXIT_FAILURE); } #endif replace_minus(havestr); if (wantstr) replace_minus(wantstr); if ((funcval = isfunction(havestr))){ showfuncdefinition(funcval, FUNCTION); exit(EXIT_SUCCESS); } if (*removepadding(havestr) == '~' && (funcval = isfunction(removepadding(havestr)+1))){ showfuncdefinition(funcval, INVERSE); exit(EXIT_SUCCESS); } if ((alias = aliaslookup(removepadding(havestr)))){ showunitlistdef(alias); exit(EXIT_SUCCESS); } if (processunit(&have, havestr, NOPOINT)) exit(EXIT_FAILURE); if (!wantstr){ showdefinition(havestr,&have); exit(EXIT_SUCCESS); } if (replacealias(&wantstr, 0)) /* the 0 says that we can free wantstr */ exit(EXIT_FAILURE); if ((funcval = isfunction(wantstr))){ if (showfunc(havestr, &have, funcval)) /* Clobbers have */ exit(EXIT_FAILURE); else exit(EXIT_SUCCESS); } if (processwant(&want, wantstr, NOPOINT)) exit(EXIT_FAILURE); if (strchr(wantstr, UNITSEPCHAR)){ if (showunitlist(havestr, &have, wantstr)) exit(EXIT_FAILURE); else exit(EXIT_SUCCESS); } if (showanswer(havestr,&have,wantstr,&want)) exit(EXIT_FAILURE); else exit(EXIT_SUCCESS); } else { /* interactive */ pager = getenv("PAGER"); if (!pager) pager = DEFAULTPAGER; for (;;) { do { fflush(stdout); getuser(&havestr,&havestrsize,queryhave); replace_minus(havestr); comment = strip_comment(havestr); if (logfile && comment && isblankstr(havestr)) fprintf(logfile, "#%s\n", comment); } while (isblankstr(havestr) || ishelpquery(havestr,0) || (!isfunction(havestr) && !aliaslookup(removepadding(havestr)) && (*removepadding(havestr)!='~' || !isfunction(removepadding(havestr)+1)) && processunit(&have, havestr, queryhavewidth))); if (logfile) { if (comment) fprintf(logfile, "%s%s\t#%s\n", LOGFROM, havestr,comment); else fprintf(logfile, "%s%s\n", LOGFROM, havestr); } if ((alias = aliaslookup(removepadding(havestr)))){ showunitlistdef(alias); continue; } if ((funcval = isfunction(havestr))){ showfuncdefinition(funcval, FUNCTION); continue; } if (*removepadding(havestr) == '~' && (funcval = isfunction(removepadding(havestr)+1))){ showfuncdefinition(funcval, INVERSE); continue; } do { int repeat; do { repeat = 0; fflush(stdout); getuser(&wantstr,&wantstrsize,querywant); replace_minus(wantstr); comment = strip_comment(wantstr); if (logfile && comment && isblankstr(wantstr)){ fprintf(logfile, "#%s\n", comment); repeat = 1; } if (ishelpquery(wantstr, &have)){ repeat = 1; printf("%s%s\n",queryhave, havestr); } } while (repeat); } while (replacealias(&wantstr, &wantstrsize) || (!isfunction(wantstr) && processwant(&want, wantstr, querywantwidth))); if (logfile) { fprintf(logfile, "%s", LOGTO); tightprint(logfile, wantstr); if (comment) fprintf(logfile, "\t#%s", comment); putc('\n', logfile); } if (isblankstr(wantstr)) showdefinition(havestr,&have); else if (strchr(wantstr, UNITSEPCHAR)) showunitlist(havestr, &have, wantstr); else if ((funcval = isfunction(wantstr))) showfunc(havestr, &have, funcval); /* Clobbers have */ else { showanswer(havestr,&have,wantstr, &want); freeunit(&want); } unitcopy(&lastunit, &have); lastunitset=1; freeunit(&have); } } return (0); } /* NOTES: mymalloc, growbuffer and tryallunits are the only places with print statements that should (?) be removed to make a library. How can error reporting in these functions (memory allocation errors) be handled cleanly for a library implementation? Way to report the reduced form of the two operands of a sum when they are not conformable. Way to report the required domain when getting an domain error. */ units-2.12/makeobjs.cmd0000664000175000017500000000330110641165333014337 0ustar adrianadrian/* * Make a program object for the OS/2 version of units * Peter Weilbacher (os2@Weilbacher.org), 25Jan2003 * * Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ call RxFuncAdd SysLoadFuncs, REXXUtil, SysLoadFuncs call SysLoadFuncs workdir = Directory() classname='WPProgram' title = 'units' location = '' setup = 'OBJECTID=;'||, 'EXENAME=CMD.EXE;'||, 'PARAMETERS=/c mode co50,5 & units.exe [from-unit] [to-unit] & pause;'||, 'STARTUPDIR='workdir if SysCreateObject(classname, title, location, setup, 'U') then say 'Object created.' else say 'Could NOT create the object!!' title = 'units Shell' location = '' setup = 'OBJECTID=;'||, 'EXENAME=CMD.EXE;'||, 'PARAMETERS=/c mode co80,25 & units.exe;'||, 'STARTUPDIR='workdir if SysCreateObject(classname, title, location, setup, 'U') then say 'Object created.' else say 'Could NOT create the object!!' units-2.12/definitions.units0000664000175000017500000075622512577010111015473 0ustar adrianadrian# # This file is the units database for use with GNU units, a units conversion # program by Adrian Mariano adrianm@gnu.org # # August 2015 Version 2.13 # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 # 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 # Free Software Foundation, Inc # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301 USA # ############################################################################ # # Improvements and corrections are welcome. # # Fundamental constants in this file are the 2014 CODATA recommended values. # # Most units data was drawn from # 1. NIST Special Publication 811, Guide for the # Use of the International System of Units (SI). # Barry N. Taylor. 1995 # 2. CRC Handbook of Chemistry and Physics 70th edition # 3. Oxford English Dictionary # 4. Websters New Universal Unabridged Dictionary # 5. Units of Measure by Stephen Dresner # 6. A Dictionary of English Weights and Measures by Ronald Zupko # 7. British Weights and Measures by Ronald Zupko # 8. Realm of Measure by Isaac Asimov # 9. United States standards of weights and measures, their # creation and creators by Arthur H. Frazier. # 10. French weights and measures before the Revolution: a # dictionary of provincial and local units by Ronald Zupko # 11. Weights and Measures: their ancient origins and their # development in Great Britain up to AD 1855 by FG Skinner # 12. The World of Measurements by H. Arthur Klein # 13. For Good Measure by William Johnstone # 14. NTC's Encyclopedia of International Weights and Measures # by William Johnstone # 15. Sizes by John Lord # 16. Sizesaurus by Stephen Strauss # 17. CODATA Recommended Values of Physical Constants available at # http://physics.nist.gov/cuu/Constants/index.html # 18. How Many? A Dictionary of Units of Measurement. Available at # http://www.unc.edu/~rowlett/units/index.html # 19. Numericana. http://www.numericana.com # 20. UK history of measurement # http://www.ukmetrication.com/history.htm # 21. NIST Handbook 44, Specifications, Tolerances, and # Other Technical Requirements for Weighing and Measuring # Devices. 2011 # 22. NIST Special Publication 447, Weights and Measures Standards # of the the United States: a brief history. Lewis V. Judson. # 1963; rev. 1976 # # Thanks to Jeff Conrad for assistance in ferreting out unit definitions. # ########################################################################### # # If units you use are missing or defined incorrectly, please contact me. # If your country's local units are missing and you are willing to supply # them, please send me a list. # # I added shoe size information but I'm not convinced that it's correct. # If you know anything about shoe sizes please contact me. # ########################################################################### ########################################################################### # # Brief Philosophy of this file # # Most unit definitions are made in terms of integers or simple fractions of # other definitions. The typical exceptions are when converting between two # different unit systems, or the values of measured physical constants. In # this file definitions are given in the most natural and revealing way in # terms of integer factors. # # If you make changes be sure to run 'units --check' to check your work. # # The file is USA-centric, but there is some modest effort to support other # countries. This file is now coded in UTF-8. To support environments where # UTF-8 is not available, definitions that require this character set are # wrapped in !utf8 directives. # # When a unit name is used in different countries with the different meanings # the system should be as follows: # # Suppose countries ABC and XYZ both use the "foo". Then globally define # # ABCfoo # XYZfoo # # Then, using the !locale directive, define the "foo" appropriately for each of # the two countries with a definition like # # !locale ABC # foo ABCfoo # !endlocale # ########################################################################### !locale en_US ! set UNITS_ENGLISH US !endlocale !locale en_GB ! set UNITS_ENGLISH GB !endlocale !set UNITS_ENGLISH US # Default setting for English units ########################################################################### # # # Primitive units. Any unit defined to contain a '!' character is a # # primitive unit which will not be reduced any further. All units should # # reduce to primitive units. # # # ########################################################################### # # SI units # kg ! # Mass of the international prototype kilogram kg s ! # Duration of 9192631770 periods of the radiation second s # corresponding to the transition between the two hyperfine # levels of the ground state of the cesium-133 atom m ! # Length of the path traveled by light in a vacuum meter m # during 1|299792458 seconds. Originally meant to be # 1e-7 of the length along a meridian from the equator # to a pole. A ! # The current which produces a force of 2e-7 N/m between two ampere A # infinitely long wires that are 1 meter apart amp ampere cd ! # Luminous intensity in a given direction of a source which candela cd # emits monochromatic radiation at 540e12 Hz with radiant # intensity 1|683 W/steradian. (This differs from radiant # intensity (W/sr) in that it is adjusted for human # perceptual dependence on wavelength. The frequency of # 540e12 Hz (yellow) is where human perception is most # efficient.) mol ! # The amount of substance of a system which contains as many mole mol # elementary entities as there are atoms in 0.012 kg of # carbon 12. The elementary entities must be specified and # may be atoms, molecules, ions, electrons, or other # particles or groups of particles. It is understood that # unbound atoms of carbon 12, at rest and in the ground # state, are referred to. K ! # 1|273.16 of the thermodynamic temperature of the triple kelvin K # point of water # # The radian and steradian are defined as dimensionless primitive units. # The radian is equal to m/m and the steradian to m^2/m^2 so these units are # dimensionless. Retaining them as named units is useful because it allows # clarity in expressions and makes the meaning of unit definitions more clear. # These units will reduce to 1 in conversions but not for sums of units or for # arguments to functions. # radian !dimensionless # The angle subtended at the center of a circle by # an arc equal in length to the radius of the # circle sr !dimensionless # Solid angle which cuts off an area of the surface steradian sr # of the sphere equal to that of a square with # sides of length equal to the radius of the # sphere # # Some primitive non-SI units # US$ ! # The US dollar is chosen arbitrarily to be the primitive # unit of money. bit ! # Basic unit of information (entropy). The entropy in bits # of a random variable over a finite alphabet is defined # to be the sum of -p(i)*log2(p(i)) over the alphabet where # p(i) is the probability that the random variable takes # on the value i. ########################################################################### # # # Prefixes (longer names must come first) # # # ########################################################################### yotta- 1e24 # Greek or Latin octo, "eight" zetta- 1e21 # Latin septem, "seven" exa- 1e18 # Greek hex, "six" peta- 1e15 # Greek pente, "five" tera- 1e12 # Greek teras, "monster" giga- 1e9 # Greek gigas, "giant" mega- 1e6 # Greek megas, "large" myria- 1e4 # Not an official SI prefix kilo- 1e3 # Greek chilioi, "thousand" hecto- 1e2 # Greek hekaton, "hundred" deca- 1e1 # Greek deka, "ten" deka- deca deci- 1e-1 # Latin decimus, "tenth" centi- 1e-2 # Latin centum, "hundred" milli- 1e-3 # Latin mille, "thousand" micro- 1e-6 # Latin micro or Greek mikros, "small" nano- 1e-9 # Latin nanus or Greek nanos, "dwarf" pico- 1e-12 # Spanish pico, "a bit" femto- 1e-15 # Danish-Norwegian femten, "fifteen" atto- 1e-18 # Danish-Norwegian atten, "eighteen" zepto- 1e-21 # Latin septem, "seven" yocto- 1e-24 # Greek or Latin octo, "eight" quarter- 1|4 semi- 0.5 demi- 0.5 hemi- 0.5 half- 0.5 double- 2 triple- 3 treble- 3 kibi- 2^10 # In response to the convention of illegally mebi- 2^20 # and confusingly using metric prefixes for gibi- 2^30 # powers of two, the International tebi- 2^40 # Electrotechnical Commission aproved these pebi- 2^50 # binary prefixes for use in 1998. If you exbi- 2^60 # want to refer to "megabytes" using the Ki- kibi # binary definition, use these prefixes. Mi- mebi Gi- gibi Ti- tebi Pi- pebi Ei- exbi Y- yotta Z- zetta E- exa P- peta T- tera G- giga M- mega k- kilo h- hecto da- deka d- deci c- centi m- milli u- micro # it should be a mu but u is easy to type n- nano p- pico f- femto a- atto z- zepto y- yocto # # Names of some numbers # one 1 two 2 double 2 couple 2 three 3 triple 3 four 4 quadruple 4 five 5 quintuple 5 six 6 seven 7 eight 8 nine 9 ten 10 eleven 11 twelve 12 thirteen 13 fourteen 14 fifteen 15 sixteen 16 seventeen 17 eighteen 18 nineteen 19 twenty 20 thirty 30 forty 40 fifty 50 sixty 60 seventy 70 eighty 80 ninety 90 hundred 100 thousand 1000 million 1e6 # These number terms were described by N. Chuquet and De la Roche in the 16th # century as being successive powers of a million. These definitions are still # used in most European countries. The current US definitions for these # numbers arose in the 17th century and don't make nearly as much sense. These # numbers are listed in the CRC Concise Encyclopedia of Mathematics by Eric # W. Weisstein. shortbillion 1e9 shorttrillion 1e12 shortquadrillion 1e15 shortquintillion 1e18 shortsextillion 1e21 shortseptillion 1e24 shortoctillion 1e27 shortnonillion 1e30 shortnoventillion shortnonillion shortdecillion 1e33 shortundecillion 1e36 shortduodecillion 1e39 shorttredecillion 1e42 shortquattuordecillion 1e45 shortquindecillion 1e48 shortsexdecillion 1e51 shortseptendecillion 1e54 shortoctodecillion 1e57 shortnovemdecillion 1e60 shortvigintillion 1e63 centillion 1e303 googol 1e100 longbillion million^2 longtrillion million^3 longquadrillion million^4 longquintillion million^5 longsextillion million^6 longseptillion million^7 longoctillion million^8 longnonillion million^9 longnoventillion longnonillion longdecillion million^10 longundecillion million^11 longduodecillion million^12 longtredecillion million^13 longquattuordecillion million^14 longquindecillion million^15 longsexdecillion million^16 longseptdecillion million^17 longoctodecillion million^18 longnovemdecillion million^19 longvigintillion million^20 # These numbers fill the gaps left by the long system above. milliard 1000 million billiard 1000 million^2 trilliard 1000 million^3 quadrilliard 1000 million^4 quintilliard 1000 million^5 sextilliard 1000 million^6 septilliard 1000 million^7 octilliard 1000 million^8 nonilliard 1000 million^9 noventilliard nonilliard decilliard 1000 million^10 # For consistency longmilliard milliard longbilliard billiard longtrilliard trilliard longquadrilliard quadrilliard longquintilliard quintilliard longsextilliard sextilliard longseptilliard septilliard longoctilliard octilliard longnonilliard nonilliard longnoventilliard noventilliard longdecilliard decilliard # The long centillion would be 1e600. The googolplex is another # familiar large number equal to 10^googol. These numbers give overflows. # # The short system prevails in English speaking countries # billion shortbillion trillion shorttrillion quadrillion shortquadrillion quintillion shortquintillion sextillion shortsextillion septillion shortseptillion octillion shortoctillion nonillion shortnonillion noventillion shortnoventillion decillion shortdecillion undecillion shortundecillion duodecillion shortduodecillion tredecillion shorttredecillion quattuordecillion shortquattuordecillion quindecillion shortquindecillion sexdecillion shortsexdecillion septendecillion shortseptendecillion octodecillion shortoctodecillion novemdecillion shortnovemdecillion vigintillion shortvigintillion # # Numbers used in India # lakh 1e5 crore 1e7 arab 1e9 kharab 1e11 neel 1e13 padm 1e15 shankh 1e17 ############################################################################# # # # Derived units which can be reduced to the primitive units # # # ############################################################################# # # Named SI derived units (officially accepted) # newton kg m / s^2 # force N newton pascal N/m^2 # pressure or stress Pa pascal joule N m # energy J joule watt J/s # power W watt coulomb A s # charge C coulomb volt W/A # potential difference V volt ohm V/A # electrical resistance siemens A/V # electrical conductance S siemens farad C/V # capacitance F farad weber V s # magnetic flux Wb weber henry Wb/A # inductance H henry tesla Wb/m^2 # magnetic flux density T tesla hertz /s # frequency Hz hertz # # Dimensions. These are here to help with dimensional analysis and # because they will appear in the list produced by hitting '?' at the # "You want:" prompt to tell the user the dimension of the unit. # LENGTH meter AREA LENGTH^2 VOLUME LENGTH^3 MASS kilogram CURRENT ampere AMOUNT mole ANGLE radian SOLID_ANGLE steradian MONEY US$ FORCE newton PRESSURE FORCE / AREA STRESS FORCE / AREA CHARGE coulomb CAPACITANCE farad RESISTANCE ohm CONDUCTANCE siemens INDUCTANCE henry FREQUENCY hertz VELOCITY LENGTH / TIME ACCELERATION VELOCITY / TIME DENSITY MASS / VOLUME LINEAR_DENSITY MASS / LENGTH VISCOSITY FORCE TIME / AREA KINEMATIC_VISCOSITY VISCOSITY / DENSITY # # units derived easily from SI units # gram millikg gm gram g gram tonne 1000 kg t tonne metricton tonne sthene tonne m / s^2 funal sthene pieze sthene / m^2 quintal 100 kg bar 1e5 Pa # About 1 atm b bar vac millibar micron micrometer # One millionth of a meter bicron picometer # One brbillionth of a meter cc cm^3 are 100 m^2 a are liter 1000 cc # The liter was defined in 1901 as the oldliter 1.000028 dm^3 # space occupied by 1 kg of pure water at L liter # the temperature of its maximum density l liter # under a pressure of 1 atm. This was # supposed to be 1000 cubic cm, but it # was discovered that the original # measurement was off. In 1964, the # liter was redefined to be exactly 1000 # cubic centimeters. mho siemens # Inverse of ohm, hence ohm spelled backward galvat ampere # Named after Luigi Galvani angstrom 1e-10 m # Convenient for describing molecular sizes xunit xunit_cu # Used for measuring x-ray wavelengths. siegbahn xunit # Originally defined to be 1|3029.45 of xunit_cu 1.00207697e-13 m # the spacing of calcite planes at 18 xunit_mo 1.00209952e-13 m # degC. It was intended to be exactly # 1e-13 m, but was later found to be # slightly off. Current usage is with # reference to common x-ray lines, either # the K-alpha 1 line of copper or the # same line of molybdenum. angstromstar 1.00001495 angstrom # Defined by JA Bearden in 1965 fermi 1e-15 m # Convenient for describing nuclear sizes # Nuclear radius is from 1 to 10 fermis barn 1e-28 m^2 # Used to measure cross section for # particle physics collision, said to # have originated in the phrase "big as # a barn". shed 1e-24 barn # Defined to be a smaller companion to the # barn, but it's too small to be of # much use. brewster micron^2/N # measures stress-optical coef diopter /m # measures reciprocal of lens focal length fresnel 1e12 Hz # occasionally used in spectroscopy shake 1e-8 sec svedberg 1e-13 s # Used for measuring the sedimentation # coefficient for centrifuging. gamma microgram # Also used for 1e-9 tesla lambda microliter spat 1e12 m # Rarely used for astronomical measurements preece 1e13 ohm m # resistivity planck J s # action of one joule over one second sturgeon /henry # magnetic reluctance daraf 1/farad # elastance (farad spelled backwards) leo 10 m/s^2 poiseuille N s / m^2 # viscosity mayer J/g K # specific heat mired / microK # reciprocal color temperature. The name # abbreviates micro reciprocal degree. crocodile megavolt # used informally in UK physics labs metricounce 25 g mounce metricounce finsenunit 1e5 W/m^2 # Measures intensity of ultraviolet light # with wavelength 296.7 nm. fluxunit 1e-26 W/m^2 Hz # Used in radio astronomy to measure # the energy incident on the receiving # body across a specified frequency # bandwidth. [12] jansky fluxunit # K. G. Jansky identified radio waves coming Jy jansky # from outer space in 1931. flick W / cm^2 sr micrometer # Spectral radiance or irradiance pfu / cm^2 sr s # particle flux unit -- Used to measure # rate at which particles are received by # a spacecraft as particles per solid # angle per detector area per second. [18] pyron cal_IT / cm^2 min # Measures heat flow from solar radiation, # from Greek work "pyr" for fire. katal mol/sec # Measure of the amount of a catalyst. One kat katal # katal of catalyst enables the reaction # to consume or produce on mol/sec. solarluminosity 384.6e24 W # A common yardstick for comparing the # output of different stars. # http://nssdc.gsfc.nasa.gov/planetary/factsheet/sunfact.html # # time # sec s minute 60 s min minute hour 60 min hr hour day 24 hr d day da day week 7 day wk week sennight 7 day fortnight 14 day blink 1e-5 day # Actual human blink takes 1|3 second ce 1e-2 day cron 1e6 years watch 4 hours # time a sentry stands watch or a ship's # crew is on duty. bell 1|8 watch # Bell would be sounded every 30 minutes. # French Revolutionary Time or Decimal Time. It was Proposed during # the French Revolution. A few clocks were made, but it never caught # on. In 1998 Swatch defined a time measurement called ".beat" and # sold some watches that displayed time in this unit. decimalhour 1|10 day decimalminute 1|100 decimalhour decimalsecond 1|100 decimalminute beat decimalminute # Swatch Internet Time # # angular measure # circle 2 pi radian degree 1|360 circle deg degree arcdeg degree arcmin 1|60 degree arcminute arcmin ' arcmin arcsec 1|60 arcmin arcsecond arcsec " arcsec '' " rightangle 90 degrees quadrant 1|4 circle quintant 1|5 circle sextant 1|6 circle sign 1|12 circle # Angular extent of one sign of the zodiac turn circle revolution turn rev turn pulsatance radian / sec gon 1|100 rightangle # measure of grade grade gon centesimalminute 1|100 grade centesimalsecond 1|100 centesimalminute milangle 1|6400 circle # Official NIST definition. # Another choice is 1e-3 radian. pointangle 1|32 circle # Used for reporting compass readings centrad 0.01 radian # Used for angular deviation of light # through a prism. mas milli arcsec # Used by astronomers seclongitude circle (seconds/day) # Astronomers measure longitude # (which they call right ascension) in # time units by dividing the equator into # 24 hours instead of 360 degrees. # # Some geometric formulas # circlearea(r) units=[m;m^2] range=[0,) pi r^2 ; sqrt(circlearea/pi) spherevolume(r) units=[m;m^3] range=[0,) 4|3 pi r^3 ; \ cuberoot(spherevolume/4|3 pi) spherevol() spherevolume square(x) range=[0,) x^2 ; sqrt(square) # # Solid angle measure # sphere 4 pi sr squaredegree 1|180^2 pi^2 sr squareminute 1|60^2 squaredegree squaresecond 1|60^2 squareminute squarearcmin squareminute squarearcsec squaresecond sphericalrightangle 0.5 pi sr octant 0.5 pi sr # # Concentration measures # percent 0.01 % percent mill 0.001 # Originally established by Congress in 1791 # as a unit of money equal to 0.001 dollars, # it has come to refer to 0.001 in general. # Used by some towns to set their property # tax rate, and written with a symbol similar # to the % symbol but with two 0's in the # denominator. [18] proof 1|200 # Alcohol content measured by volume at # 60 degrees Fahrenheit. This is a USA # measure. In Europe proof=percent. ppm 1e-6 partspermillion ppm ppb 1e-9 partsperbillion ppb # USA billion ppt 1e-12 partspertrillion ppt # USA trillion karat 1|24 # measure of gold purity caratgold karat gammil mg/l basispoint 0.01 % # Used in finance fine 1|1000 # Measure of gold purity # The pH scale is used to measure the concentration of hydronium (H3O+) ions in # a solution. A neutral solution has a pH of 7 as a result of dissociated # water molecules. pH(x) units=[1;mol/liter] range=(0,) 10^(-x) mol/liter ; (-log(pH liters/mol)) # # Temperature # # Two types of units are defined: units for converting temperature differences # and functions for converting absolute temperatures. Conversions for # differences start with "deg" and conversions for absolute temperature start # with "temp". # TEMPERATURE kelvin TEMPERATURE_DIFFERENCE kelvin # In 1741 Anders Celsius introduced a temperature scale with water boiling at # 0 degrees and freezing at 100 degrees at standard pressure. After his death # the fixed points were reversed and the scale was called the centigrade # scale. Due to the difficulty of accurately measuring the temperature of # melting ice at standard pressure, the centigrade scale was replaced in 1954 # by the Celsius scale which is defined by subtracting 273.15 from the # temperature in Kelvins. This definition differed slightly from the old # centigrade definition, but the Kelvin scale depends on the triple point of # water rather than a melting point, so it can be measured accurately. tempC(x) units=[1;K] domain=[-273.15,) range=[0,) \ x K + stdtemp ; (tempC +(-stdtemp))/K tempcelsius() tempC degcelsius K degC K # Fahrenheit defined his temperature scale by setting 0 to the coldest # temperature he could produce in his lab with a salt water solution and by # setting 96 degrees to body heat. In Fahrenheit's words: # # Placing the thermometer in a mixture of sal ammoniac or sea # salt, ice, and water a point on the scale will be found which # is denoted as zero. A second point is obtained if the same # mixture is used without salt. Denote this position as 30. A # third point, designated as 96, is obtained if the thermometer # is placed in the mouth so as to acquire the heat of a healthy # man." (D. G. Fahrenheit, Phil. Trans. (London) 33, 78, 1724) tempF(x) units=[1;K] domain=[-459.67,) range=[0,) \ (x+(-32)) degF + stdtemp ; (tempF+(-stdtemp))/degF + 32 tempfahrenheit() tempF degfahrenheit 5|9 degC degF 5|9 degC degreesrankine degF # The Rankine scale has the degrankine degreesrankine # Fahrenheit degree, but its zero degreerankine degF # is at absolute zero. degR degrankine tempR degrankine temprankine degrankine tempreaumur(x) units=[1;K] domain=[-218.52,) range=[0,) \ x degreaumur+stdtemp ; (tempreaumur+(-stdtemp))/degreaumur degreaumur 10|8 degC # The Reaumur scale was used in Europe and # particularly in France. It is defined # to be 0 at the freezing point of water # and 80 at the boiling point. Reaumur # apparently selected 80 because it is # divisible by many numbers. degK K # "Degrees Kelvin" is forbidden usage. tempK K # For consistency # Gas mark is implemented below but in a terribly ugly way. There is # a simple formula, but it requires a conditional which is not # presently supported. # # The formula to convert to degrees Fahrenheit is: # # 25 log2(gasmark) + k_f gasmark<=1 # 25 (gasmark-1) + k_f gasmark>=1 # # k_f = 275 # gasmark[degR] \ .0625 634.67 \ .125 659.67 \ .25 684.67 \ .5 709.67 \ 1 734.67 \ 2 759.67 \ 3 784.67 \ 4 809.67 \ 5 834.67 \ 6 859.67 \ 7 884.67 \ 8 909.67 \ 9 934.67 \ 10 959.67 # Units cannot handle wind chill or heat index because they are two variable # functions, but they are included here for your edification. Clearly these # equations are the result of a model fitting operation. # # wind chill index (WCI) a measurement of the combined cooling effect of low # air temperature and wind on the human body. The index was first defined # by the American Antarctic explorer Paul Siple in 1939. As currently used # by U.S. meteorologists, the wind chill index is computed from the # temperature T (in ТАF) and wind speed V (in mi/hr) using the formula: # WCI = 0.0817(3.71 sqrt(V) + 5.81 - 0.25V)(T - 91.4) + 91.4. # For very low wind speeds, below 4 mi/hr, the WCI is actually higher than # the air temperature, but for higher wind speeds it is lower than the air # temperature. # # heat index (HI or HX) a measure of the combined effect of heat and # humidity on the human body. U.S. meteorologists compute the index # from the temperature T (in ТАF) and the relative humidity H (as a # value from 0 to 1). # HI = -42.379 + 2.04901523 T + 1014.333127 H - 22.475541 TH # - .00683783 T^2 - 548.1717 H^2 + 0.122874 T^2 H + 8.5282 T H^2 # - 0.0199 T^2 H^2. # # Physical constants # # Basic constants pi 3.14159265358979323846 c 2.99792458e8 m/s # speed of light in vacuum (exact) light c mu0 4 pi 1e-7 H/m # permeability of vacuum (exact) epsilon0 1/mu0 c^2 # permittivity of vacuum (exact) energy c^2 # convert mass to energy e 1.6021766208e-19 C # electron charge h 4.135667662e-15 eV s # Planck constant hbar h / 2 pi spin hbar G 6.67408e-11 N m^2 / kg^2 # Newtonian gravitational constant # This is the NIST 2006 value. # The relative uncertainty on this # is 1e-4. coulombconst 1/4 pi epsilon0 # listed as "k" sometimes # Physico-chemical constants atomicmassunit 1.660539040e-27 kg # atomic mass unit (defined to be u atomicmassunit # 1|12 of the mass of carbon 12) amu atomicmassunit amu_chem 1.66026e-27 kg # 1|16 of the weighted average mass of # the 3 naturally occuring neutral # isotopes of oxygen amu_phys 1.65981e-27 kg # 1|16 of the mass of a neutral # oxygen 16 atom dalton u # Maybe this should be amu_chem? avogadro grams/amu mol # size of a mole N_A avogadro gasconstant k N_A # molar gas constant R gasconstant boltzmann 1.38064852e-23 J/K # Boltzmann constant k boltzmann kboltzmann boltzmann molarvolume mol R stdtemp / atm # Volume occupied by one mole of an # ideal gas at STP. loschmidt avogadro mol / molarvolume # Molecules per cubic meter of an # ideal gas at STP. Loschmidt did # work similar to Avogadro. stefanboltzmann pi^2 k^4 / 60 hbar^3 c^2 # The power per area radiated by a sigma stefanboltzmann # blackbody at temperature T is # given by sigma T^4. wiendisplacement 2.8977729e-3 m K # Wien's Displacement Law gives the # frequency at which the the Planck # spectrum has maximum intensity. # The relation is lambda T = b where # lambda is wavelength, T is # temperature and b is the Wien # displacement. This relation is # used to determine the temperature # of stars. K_J90 483597.9 GHz/V # Direct measurement of the volt is difficult. Until K_J 483597.8525 GHz/V # recently, laboratories kept Weston cadmium cells as # a reference, but they could drift. In 1987 the # CGPM officially recommended the use of the # Josephson effect as a laboratory representation of # the volt. The Josephson effect occurs when two # superconductors are separated by a thin insulating # layer. A "supercurrent" flows across the insulator # with a frequency that depends on the potential # applied across the superconductors. This frequency # can be very accurately measured. The Josephson # constant K_J, which is equal to 2e/h, relates the # measured frequency to the potential. Two values # given, the conventional (exact) value from 1990 and # the current CODATA measured value. R_K90 25812.807 ohm # Measurement of the ohm also presents difficulties. R_K 25812.8074555 ohm # The old approach involved maintaining resistances # that were subject to drift. The new standard is # based on the Hall effect. When a current carrying # ribbon is placed in a magnetic field, a potential # difference develops across the ribbon. The ratio # of the potential difference to the current is # called the Hall resistance. Klaus von Klitzing # discovered in 1980 that the Hall resistance varies # in discrete jumps when the magnetic field is very # large and the temperature very low. This enables # accurate realization of the resistance h/e^2 in the # lab. Two values given, the conventional (exact) # value from 1990 and the current CODATA measured # value. # Various conventional values gravity 9.80665 m/s^2 # std acceleration of gravity (exact) force gravity # use to turn masses into forces atm 101325 Pa # Standard atmospheric pressure atmosphere atm Hg 13.5951 gram force / cm^3 # Standard weight of mercury (exact) water gram force/cm^3 # Standard weight of water (exact) waterdensity gram / cm^3 # Density of water H2O water wc water # water column mach 331.46 m/s # speed of sound in dry air at STP standardtemp 273.15 K # standard temperature stdtemp standardtemp normaltemp tempF(70) # for gas density, from NIST normtemp normaltemp # Handbook 44 # Weight of mercury and water at different temperatures using the standard # force of gravity. Hg10C 13.5708 force gram / cm^3 # These units, when used to form Hg20C 13.5462 force gram / cm^3 # pressure measures, are not accurate Hg23C 13.5386 force gram / cm^3 # because of considerations of the Hg30C 13.5217 force gram / cm^3 # revised practical temperature scale. Hg40C 13.4973 force gram / cm^3 Hg60F 13.5574 force gram / cm^3 H2O0C 0.99987 force gram / cm^3 H2O5C 0.99999 force gram / cm^3 H2O10C 0.99973 force gram / cm^3 H2O15C 0.99913 force gram / cm^3 H2O18C 0.99862 force gram / cm^3 H2O20C 0.99823 force gram / cm^3 H2O25C 0.99707 force gram / cm^3 H2O50C 0.98807 force gram / cm^3 H2O100C 0.95838 force gram / cm^3 # Atomic constants Rinfinity 10973731.568539 /m # The wavelengths of a spectral series R_H 10967760 /m # can be expressed as # 1/lambda = R (1/m^2 - 1/n^2). # where R is a number that various # slightly from element to element. # For hydrogen, R_H is the value, # and for heavy elements, the value # approaches Rinfinity, which can be # computed from # m_e c alpha^2 / 2 h # with a loss of 4 digits # of precision. alpha 7.2973525664e-3 # The fine structure constant was # introduced to explain fine # structure visible in spectral # lines. It can be computed from # mu0 c e^2 / 2 h # with a loss of 3 digits precision # and loss of precision in derived # values which use alpha. bohrradius alpha / 4 pi Rinfinity prout 185.5 keV # nuclear binding energy equal to 1|12 # binding energy of the deuteron # Planck constants planckmass 2.17651e-8 kg # sqrt(hbar c / G) m_P planckmass plancktime hbar / planckmass c^2 t_P plancktime plancklength plancktime c l_P plancklength # Particle radius electronradius (1/4 pi epsilon0) e^2 / electronmass c^2 # Classical deuteronchargeradius 2.1413e-15 m protonchargeradius 0.8751e-15 m # Masses of elementary particles electronmass 5.48579909070e-4 u m_e electronmass protonmass 1.007276466879 u m_p protonmass neutronmass 1.00866491588 u m_n neutronmass muonmass 0.1134289257 u m_mu muonmass deuteronmass 2.013553212745 u m_d deuteronmass alphaparticlemass 4.001506179127 u m_alpha alphaparticlemass taumass 1.90749 u m_tau taumass tritonmass 3.01550071632 u m_t tritonmass helionmass 3.01493224673 u m_h helionmass # particle wavelengths: the compton wavelength of a particle is # defined as h / m c where m is the mass of the particle. electronwavelength h / m_e c lambda_C electronwavelength protonwavelength h / m_p c lambda_C,p protonwavelength neutronwavelength h / m_n c lambda_C,n neutronwavelength # Magnetic moments bohrmagneton e hbar / 2 electronmass mu_B bohrmagneton nuclearmagneton e hbar / 2 protonmass mu_N nuclearmagneton mu_mu -4.49044826e-26 J/T # Muon magnetic moment mu_p 1.4106067873e-26 J/T # Proton magnetic moment mu_e -928.4764620e-26 J/T # Electron magnetic moment mu_n -0.96623650e-26 J/T # Neutron magnetic moment mu_d 0.4330735040e-26 J/T # Deuteron magnetic moment mu_t 1.504609503e-26 J/T # Triton magnetic moment mu_h -1.074617522e-26 J/T # Helion magnetic moment # # Units derived from physical constants # kgf kg force technicalatmosphere kgf / cm^2 at technicalatmosphere hyl kgf s^2 / m # Also gram-force s^2/m according to [15] mmHg mm Hg torr atm / 760 # These units, both named after Evangelista tor Pa # Torricelli, should not be confused. The inHg inch Hg # torr is very close to the mm Hg. inH2O inch water mmH2O mm water eV e V # Energy acquired by a particle with charge e electronvolt eV # when it is accelerated through 1 V lightyear c julianyear # The 365.25 day year is specified in ly lightyear # NIST publication 811 lightsecond c s lightminute c min parsec au / tan(arcsec) # Unit of length equal to distance pc parsec # from the sun to a point having # heliocentric parallax of 1 # arcsec (derived from parallax # second). A distant object with # paralax theta will be about # (arcsec/theta) parsecs from the # sun (using the approximation # that tan(theta) = theta). rydberg h c Rinfinity # Rydberg energy crith 0.089885 gram # The crith is the mass of one # liter of hydrogen at standard # temperature and pressure. amagatvolume molarvolume amagat mol/amagatvolume # Used to measure gas densities lorentz bohrmagneton / h c # Used to measure the extent # that the frequency of light # is shifted by a magnetic field. cminv h c / cm # Unit of energy used in infrared invcm cminv # spectroscopy. wavenumber cminv kcal_mol kcal_th / mol N_A # kcal/mol is used as a unit of # energy by physical chemists. # # CGS system based on centimeter, gram and second # dyne cm gram / s^2 # force dyn dyne erg cm dyne # energy poise gram / cm s # viscosity, honors Jean Poiseuille P poise rhe /poise # reciprocal viscosity stokes cm^2 / s # kinematic viscosity St stokes stoke stokes lentor stokes # old name Gal cm / s^2 # acceleration, used in geophysics galileo Gal # for earth's gravitational field # (note that "gal" is for gallon # but "Gal" is the standard symbol # for the gal which is evidently a # shortened form of "galileo".) barye dyne/cm^2 # pressure barad barye # old name kayser 1/cm # Proposed as a unit for wavenumber balmer kayser # Even less common name than "kayser" kine cm/s # velocity bole g cm / s # momentum pond gram force glug gram force s^2 / cm # Mass which is accelerated at # 1 cm/s^2 by 1 gram force darcy centipoise cm^2 / s atm # Measures permeability to fluid flow. # One darcy is the permeability of a # medium that allows a flow of cc/s # of a liquid of centipoise viscosity # under a pressure gradient of # atm/cm. Named for H. Darcy. mobileohm cm / dyn s # mobile ohm, measure of mechanical # mobility mechanicalohm dyn s / cm # mechanical resistance acousticalohm dyn s / cm^5 # ratio of the sound pressure of # 1 dyn/cm^2 to a source of strength # 1 cm^3/s ray acousticalohm rayl dyn s / cm^3 # Specific acoustical resistance eotvos 1e-9 Gal/cm # Change in gravitational acceleration # over horizontal distance # Electromagnetic units derived from the abampere abampere 10 A # Current which produces a force of abamp abampere # 2 dyne/cm between two infinitely aA abampere # long wires that are 1 cm apart biot aA # alternative name for abamp Bi biot abcoulomb abamp sec abcoul abcoulomb abfarad abampere sec / abvolt abhenry abvolt sec / abamp abvolt dyne cm / abamp sec abohm abvolt / abamp abmho /abohm gauss abvolt sec / cm^2 Gs gauss maxwell abvolt sec # Also called the "line" Mx maxwell oersted gauss / mu0 Oe oersted gilbert gauss cm / mu0 Gb gilbert Gi gilbert unitpole 4 pi maxwell emu erg/gauss # "electro-magnetic unit", a measure of # magnetic moment, often used as emu/cm^3 # to specify magnetic moment density. # Gaussian system: electromagnetic units derived from statampere. # # Note that the Gaussian units are often used in such a way that Coulomb's law # has the form F= q1 * q2 / r^2. The constant 1|4*pi*epsilon0 is incorporated # into the units. From this, we can get the relation force=charge^2/dist^2. # This means that the simplification esu^2 = dyne cm^2 can be used to simplify # units in the Gaussian system, with the curious result that capacitance can be # measured in cm, resistance in sec/cm, and inductance in sec^2/cm. These # units are given the names statfarad, statohm and stathenry below. statampere 10 A cm / s c statamp statampere statvolt dyne cm / statamp sec statcoulomb statamp s esu statcoulomb statcoul statcoulomb statfarad statamp sec / statvolt cmcapacitance statfarad stathenry statvolt sec / statamp statohm statvolt / statamp statmho /statohm statmaxwell statvolt sec franklin statcoulomb debye 1e-18 statcoul cm # unit of electrical dipole moment helmholtz debye/angstrom^2 # Dipole moment per area jar 1000 statfarad # approx capacitance of Leyden jar # # Some historical electromagnetic units # intampere 0.999835 A # Defined as the current which in one intamp intampere # second deposits .001118 gram of # silver from an aqueous solution of # silver nitrate. intfarad 0.999505 F intvolt 1.00033 V intohm 1.000495 ohm # Defined as the resistance of a # uniform column of mercury containing # 14.4521 gram in a column 1.063 m # long and maintained at 0 degC. daniell 1.042 V # Meant to be electromotive force of a # Daniell cell, but in error by .04 V faraday N_A e mol # Charge that must flow to deposit or faraday_phys 96521.9 C # liberate one gram equivalent of any faraday_chem 96495.7 C # element. (The chemical and physical # values are off slightly from what is # obtained by multiplying by amu_chem # or amu_phys. These values are from # a 1991 NIST publication.) Note that # there is a Faraday constant which is # equal to N_A e and hence has units of # C/mol. kappline 6000 maxwell # Named by and for Gisbert Kapp siemensunit 0.9534 ohm # Resistance of a meter long column of # mercury with a 1 mm cross section. # # Printed circuit board units. # # http://www.ndt-ed.org/GeneralResources/IACS/IACS.htm. # # Conductivity is often expressed as a percentage of IACS. A copper wire a # meter long with a 1 mm^2 cross section has a resistance of 1|58 ohm at # 20 deg C. Copper density is also standarized at that temperature. # copperconductivity 58 siemens m / mm^2 # A wire a meter long with IACS copperconductivity # a 1 mm^2 cross section copperdensity 8.89 g/cm^3 # The "ounce" measures the ouncecopper oz / ft^2 copperdensity # thickness of copper used ozcu ouncecopper # in circuitboard fabrication # # Photometric units # LUMINOUS_INTENSITY candela LUMINOUS_FLUX lumen LUMINOUS_ENERGY talbot ILLUMINANCE lux EXITANCE lux candle 1.02 candela # Standard unit for luminous intensity hefnerunit 0.9 candle # in use before candela hefnercandle hefnerunit # violle 20.17 cd # luminous intensity of 1 cm^2 of # platinum at its temperature of # solidification (2045 K) lumen cd sr # Luminous flux (luminous energy per lm lumen # time unit) talbot lumen s # Luminous energy lumberg talbot # References give these values for lumerg talbot # lumerg and lumberg both. Note that # a paper from 1948 suggests that # lumerg should be 1e-7 talbots so # that lumergs/erg = talbots/joule. # lumerg = luminous erg lux lm/m^2 # Illuminance or exitance (luminous lx lux # flux incident on or coming from phot lumen / cm^2 # a surface) ph phot # footcandle lumen/ft^2 # Illuminance from a 1 candela source # at a distance of one foot metercandle lumen/m^2 # Illuminance from a 1 candela source # at a distance of one meter mcs metercandle s # luminous energy per area, used to # measure photographic exposure nox 1e-3 lux # These two units were proposed for skot 1e-3 apostilb # measurements relating to dark adapted # eyes. # Luminance measures LUMINANCE nit nit cd/m^2 # Luminance: the intensity per projected stilb cd / cm^2 # area of an extended luminous source. sb stilb # (nit is from latin nitere = to shine.) apostilb cd/pi m^2 asb apostilb blondel apostilb # Named after a French scientist. # Equivalent luminance measures. These units are units which measure # the luminance of a surface with a specified exitance which obeys # Lambert's law. (Lambert's law specifies that luminous intensity of # a perfectly diffuse luminous surface is proportional to the cosine # of the angle at which you view the luminous surface.) equivalentlux cd / pi m^2 # luminance of a 1 lux surface equivalentphot cd / pi cm^2 # luminance of a 1 phot surface lambert cd / pi cm^2 footlambert cd / pi ft^2 # The bril is used to express "brilliance" of a source of light on a # logarithmic scale to correspond to subjective perception. An increase of 1 # bril means doubling the luminance. A luminance of 1 lambert is defined to # have a brilliance of 1 bril. bril(x) units=[1;lambert] 2^(x+-100) lamberts ;log2(bril/lambert)+100 # Some luminance data from the IES Lighting Handbook, 8th ed, 1993 sunlum 1.6e9 cd/m^2 # at zenith sunillum 100e3 lux # clear sky sunillum_o 10e3 lux # overcast sky sunlum_h 6e6 cd/m^2 # value at horizon skylum 8000 cd/m^2 # average, clear sky skylum_o 2000 cd/m^2 # average, overcast sky moonlum 2500 cd/m^2 # # Photographic Exposure Value # This section by Jeff Conrad (jeff_conrad@msn.com) # # The Additive system of Photographic EXposure (APEX) proposed in ASA # PH2.5-1960 was an attempt to simplify exposure determination for people who # relied on exposure tables rather than exposure meters. Shortly thereafter, # nearly all cameras incorporated exposure meters, so the APEX system never # caught on, but the concept of exposure value remains in use. Though given as # 'Ev' in ASA PH2.5-1960, it is now more commonly indicated by 'EV'. EV is # related to exposure parameters by # # A^2 LS ES # 2^EV = --- = -- = -- # t K C # # Where # A = Relative aperture (f-number) # t = Exposure time in seconds # L = Scene luminance in cd/m2 # E = Scene illuminance in lux # S = Arithmetic ISO speed # K = Reflected-light meter calibration constant # C = Incident-light meter calibration constant # # Strictly, an exposure value is a combination of aperture and exposure time, # but it's also commonly used to indicate luminance (or illuminance). # Conversion to luminance or illuminance units depends on the ISO speed and the # meter calibration constant. Common practice is to use an ISO speed of 100. # Calibration constants vary among camera and meter manufacturers: Canon, # Nikon, and Sekonic use a value of 12.5 for reflected-light meters, while # Kenko (formerly Minolta) and Pentax use a value of 14. Kenko and Sekonic use # a value of 250 for incident-light meters with flat receptors. # # The values for in-camera meters apply only averaging, weighted-averaging, or # spot metering--the multi-segment metering incorporated in most current # cameras uses proprietary algorithms that evaluate many factors related to the # luminance distribution of what is being metered; they are not amenable to # simple conversions, and are usually not disclosed by the manufacturers. s100 100 / lx s # ISO 100 speed iso100 s100 # Reflected-light meter calibration constant with ISO 100 speed k1250 12.5 (cd/m2) / lx s # For Canon, Nikon, and Sekonic k1400 14 (cd/m2) / lx s # For Kenko (Minolta) and Pentax # Incident-light meter calibration constant with ISO 100 film c250 250 lx / lx s # flat-disc receptor # Exposure value to scene luminance with ISO 100 imaging media # For Kenko (Minolta) or Pentax #ev100(x) units=[;cd/m^2] range=(0,) 2^x k1400 / s100; log2(ev100 s100/k1400) # For Canon, Nikon, or Sekonic ev100(x) units=[1;cd/m^2] range=(0,) 2^x k1250 / s100; log2(ev100 s100/k1250) EV100() ev100 # Exposure value to scene illuminance with ISO 100 imaging media iv100(x) units=[1;lx] range=(0,) 2^x c250 / s100; log2(iv100 s100 / c250) # Other Photographic Exposure Conversions # # As part of APEX, ASA PH2.5-1960 proposed several logarithmic quantities # related by # # Ev = Av + Tv = Bv + Sv # # where # Av = log2(A^2) Aperture value # Tv = log2(1/t) Time value # Sv = log2(N Sx) Speed value # Bv = log2(B S / K) Luminance ("brightness") value # Iv = log2(I S / C) Illuminance value # # and # A = Relative aperture (f-number) # t = Exposure time in seconds # Sx = Arithmetic ISO speed in 1/lux s # B = luminance in cd/m2 # I = luminance in lux # The constant N derives from the arcane relationship between arithmetic # and logarithmic speed given in ASA PH2.5-1960. That relationship # apparently was not obvious--so much so that it was thought necessary # to explain it in PH2.12-1961. The constant has had several values # over the years, usually without explanation for the changes. Although # APEX had little impact on consumer cameras, it has seen a partial # resurrection in the Exif standards published by the Camera & Imaging # Products Association of Japan. #N_apex 2^-1.75 lx s # precise value implied in ASA PH2.12-1961, # derived from ASA PH2.5-1960. #N_apex 0.30 lx s # rounded value in ASA PH2.5-1960, # ASA PH2.12-1961, and ANSI PH2.7-1986 #N_apex 0.3162 lx s # value in ANSI PH2.7-1973 N_exif 1|3.125 lx s # value in Exif 2.3 (2010), making Sv(5) = 100 K_apex1961 11.4 (cd/m2) / lx s # value in ASA PH2.12-1961 K_apex1971 12.5 (cd/m2) / lx s # value in ANSI PH3.49-1971; more common C_apex1961 224 lx / lx s # value in PH2.12-1961 (20.83 for I in # footcandles; flat sensor?) C_apex1971 322 lx / lx s # mean value in PH3.49-1971 (30 +/- 5 for I in # footcandles; hemispherical sensor?) N_speed N_exif K_lum K_apex1971 C_illum C_apex1961 # Units for Photographic Exposure Variables # # Practical photography sometimes pays scant attention to units for exposure # variables. In particular, the "speed" of the imaging medium is treated as if # it were dimensionless when it should have units of reciprocal lux seconds; # this practice works only because "speed" is almost invariably given in # accordance with international standards (or similar ones used by camera # manufacturers)--so the assumed units are invariant. In calculating # logarithmic quantities--especially the time value Tv and the exposure value # EV--the units for exposure time ("shutter speed") are often ignored; this # practice works only because the units of exposure time are assumed to be in # seconds, and the missing units that make the argument to the logarithmic # function dimensionless are silently provided. # # In keeping with common practice, the definitions that follow treat "speeds" # as dimensionless, so ISO 100 speed is given simply as '100'. When # calculating the logarithmic APEX quantities Av and Tv, the definitions # provide the missing units, so the times can be given with any appropriate # units. For example, giving an exposure time of 1 minute as either '1 min' or # '60 s' will result in Tv of -5.9068906. # # Exposure Value from f-number and Exposure Time # # Because nonlinear unit conversions only accept a single quantity, # there is no direct conversion from f-number and exposure time to # exposure value EV. But the EV can be obtained from a combination of # Av and Tv. For example, the "sunny 16" rule states that correct # exposure for a sunlit scene can achieved by using f/16 and an exposure # time equal to the reciprocal of the ISO speed in seconds; this can be # calculated as # # ~Av(16) + ~Tv(1|100 s), # # which gives 14.643856. These conversions may be combined with the # ev100 conversion: # # ev100(~Av(16) + ~Tv(1|100 s)) # # to yield the assumed average scene luminance of 3200 cd/m^2. # convert relative aperture (f-number) to aperture value Av(A) units=[1;1] domain=[-2,) range=[0.5,) 2^(A/2); 2 log2(Av) # convert exposure time to time value Tv(t) units=[1;s] range=(0,) 2^(-t) s; log2(s / Tv) # convert logarithmic speed Sv in ASA PH2.5-1960 to ASA/ISO arithmetic speed; # make arithmetic speed dimensionless # 'Sv' conflicts with the symbol for sievert; you can uncomment this function # definition if you don't need that symbol #Sv(S) units=[1;1] range=(0,) 2^S / (N_speed/lx s); log2((N_speed/lx s) Sv) Sval(S) units=[1;1] range=(0,) 2^S / (N_speed/lx s); log2((N_speed/lx s) Sval) # convert luminance value Bv in ASA PH2.12-1961 to luminance Bv(x) units=[1;cd/m^2] range=(0,) \ 2^x K_lum N_speed ; log2(Bv / (K_lum N_speed)) # convert illuminance value Iv in ASA PH2.12-1961 to illuminance Iv(x) units=[1;lx] range=(0,) \ 2^x C_illum N_speed ; log2(Iv / (C_illum N_speed)) # convert ASA/ISO arithmetic speed Sx to ASA logarithmic speed in # ASA PH2.5-1960; make arithmetic speed dimensionless Sx(S) units=[1;1] domain=(0,) \ log2((N_speed/lx s) S); 2^Sx / (N_speed/lx s) # convert DIN speed/ISO logarithmic speed in ISO 6:1993 to arithmetic speed # for convenience, speed is treated here as if it were dimensionless Sdeg(S) units=[1;1] range=(0,) 10^((S - 1) / 10) ; (1 + 10 log(Sdeg)) Sdin() Sdeg # Numerical Aperture and f-Number of a Lens # # The numerical aperture (NA) is given by # # NA = n sin(theta) # # where n is the index of refraction of the medium and theta is half # of the angle subtended by the aperture stop from a point in the image # or object plane. For a lens in air, n = 1, and # # NA = 0.5 / f-number # # convert NA to f-number numericalaperture(x) units=[1;1] domain=(0,1] range=[0.5,) \ 0.5 / x ; 0.5 / numericalaperture NA() numericalaperture # # convert f-number to itself; restrict values to those possible fnumber(x) units=[1;1] domain=[0.5,) range=[0.5,) x ; fnumber # Referenced Photographic Standards # # ASA PH-2.5-1960. USA Standard, Method for Determining (Monochrome, # Continuous-Tone) Speed of Photographic Negative Materials. # ASA PH2.12-1961. American Standard, General-Purpose Photographic # Exposure Meters (photoelectric type). # ANSI PH3.49-1971. American National Standard for general-purpose # photographic exposure meters (photoelectric type). # ANSI PH2.7-1973. American National Standard Photographic Exposure Guide. # ANSI PH2.7-1986. American National Standard for Photography -- # Photographic Exposure Guide. # CIPA DC-008-2010. Exchangeable image file format for digital still # cameras: Exif Version 2.3 # ISO 6:1993. International Standard, Photography -- Black-and-white # pictorial still camera negative film/process systems -- # Determination of ISO Speed. # # Astronomical time measurements # # Astronomical time measurement is a complicated matter. The length of the # true day at a given place can be 21 seconds less than 24 hours or 30 seconds # over 24 hours. The two main reasons for this are the varying speed of the # earth in its elliptical orbit and the fact that the sun moves on the ecliptic # instead of along the celestial equator. To devise a workable system for time # measurement, Simon Newcomb (1835-1909) used a fictitious "mean sun". # Consider a first fictitious sun traveling along the ecliptic at a constant # speed and coinciding with the true sun at perigee and apogee. Then # considering a second fictitious sun traveling along the celestial equator at # a constant speed and coinciding with the first fictitious sun at the # equinoxes. The second fictitious sun is the "mean sun". From this equations # can be written out to determine the length of the mean day, and the tropical # year. The length of the second was determined based on the tropical year # from such a calculation and was officially used from 1960-1967 until atomic # clocks replaced astronomical measurements for a standard of time. All of the # values below give the mean time for the specified interval. # # See "Mathematical Astronomy Morsels" by Jean Meeus for more details # and a description of how to compute the correction to mean time. # TIME second anomalisticyear 365.2596 days # The time between successive # perihelion passages of the # earth. siderealyear 365.256360417 day # The time for the earth to make # one revolution around the sun # relative to the stars. tropicalyear 365.242198781 day # The time needed for the mean sun # as defined above to increase # its longitude by 360 degrees. # Most references defined the # tropical year as the interval # between vernal equinoxes, but # this is misleading. The length # of the season changes over time # because of the eccentricity of # the earth's orbit. The time # between vernal equinoxes is # approximately 365.24237 days # around the year 2000. See # "Mathematical Astronomy # Morsels" for more details. eclipseyear 346.62 days # The line of nodes is the # intersection of the plane of # Earth's orbit around the sun # with the plane of the moon's # orbit around earth. Eclipses # can only occur when the moon # and sun are close to this # line. The line rotates and # appearances of the sun on the # line of nodes occur every # eclipse year. saros 223 synodicmonth # The earth, moon and sun appear in # the same arrangement every # saros, so if an eclipse occurs, # then one saros later, a similar # eclipse will occur. (The saros # is close to 19 eclipse years.) # The eclipse will occur about # 120 degrees west of the # preceeding one because the # saros is not an even number of # days. After 3 saros, an # eclipse will occur at # approximately the same place. siderealday 86164.09054 s # The sidereal day is the interval siderealhour 1|24 siderealday # between two successive transits siderealminute 1|60 siderealhour # of a star over the meridian, siderealsecond 1|60 siderealminute # or the time required for the # earth to make one rotation # relative to the stars. The # more usual solar day is the # time required to make a # rotation relative to the sun. # Because the earth moves in its # orbit, it has to turn a bit # extra to face the sun again, # hence the solar day is slightly # longer. anomalisticmonth 27.55454977 day # Time for the moon to travel from # perigee to perigee nodicalmonth 27.2122199 day # The nodes are the points where draconicmonth nodicalmonth # an orbit crosses the ecliptic. draconiticmonth nodicalmonth # This is the time required to # travel from the ascending node # to the next ascending node. siderealmonth 27.321661 day # Time required for the moon to # orbit the earth lunarmonth 29 days + 12 hours + 44 minutes + 2.8 seconds # Mean time between full moons. synodicmonth lunarmonth # Full moons occur when the sun lunation synodicmonth # and moon are on opposite sides lune 1|30 lunation # of the earth. Since the earth lunour 1|24 lune # moves around the sun, the moon # has to revolve a bit extra to # get into the full moon # configuration. year tropicalyear yr year month 1|12 year mo month lustrum 5 years # The Lustrum was a Roman # purification ceremony that took # place every five years. # Classically educated Englishmen # used this term. decade 10 years century 100 years millennium 1000 years millennia millennium solaryear year lunaryear 12 lunarmonth calendaryear 365 day commonyear 365 day leapyear 366 day julianyear 365.25 day gregorianyear 365.2425 day islamicyear 354 day # A year of 12 lunar months. They islamicleapyear 355 day # began counting on July 16, AD 622 # when Muhammad emigrated to Medina # (the year of the Hegira). They need # 11 leap days in 30 years to stay in # sync with the lunar year which is a # bit longer than the 29.5 days of the # average month. The months do not # keep to the same seasons, but # regress through the seasons every # 32.5 years. islamicmonth 1|12 islamicyear # They have 29 day and 30 day months. # The Hewbrew year is also based on lunar months, but synchronized to the solar # calendar. The months vary irregularly between 29 and 30 days in length, and # the years likewise vary. The regular year is 353, 354, or 355 days long. To # keep up with the solar calendar, a leap month of 30 days is inserted every # 3rd, 6th, 8th, 11th, 14th, 17th, and 19th years of a 19 year cycle. This # gives leap years that last 383, 384, or 385 days. # Sidereal days mercuryday 58.6462 day venusday 243.01 day # retrograde earthday siderealday marsday 1.02595675 day jupiterday 0.41354 day saturnday 0.4375 day uranusday 0.65 day # retrograde neptuneday 0.768 day plutoday 6.3867 day # Sidereal years from http://ssd.jpl.nasa.gov/phys_props_planets.html. Data # was updated in May 2001 based on the 1992 Explanatory Supplement to the # Astronomical Almanac and the mean longitude rates. Apparently the table of # years in that reference is incorrect. mercuryyear 0.2408467 julianyear venusyear 0.61519726 julianyear earthyear siderealyear marsyear 1.8808476 julianyear jupiteryear 11.862615 julianyear saturnyear 29.447498 julianyear uranusyear 84.016846 julianyear neptuneyear 164.79132 julianyear plutoyear 247.92065 julianyear # Objects on the earth are charted relative to a perfect ellipsoid whose # dimensions are specified by different organizations. The ellipsoid is # specified by an equatorial radius and a flattening value which defines the # polar radius. These values are the 1996 values given by the International # Earth Rotation Service (IERS) whose reference documents can be found at # http://maia.usno.navy.mil/ earthflattening 1|298.25642 earthradius_equatorial 6378136.49 m earthradius_polar (-earthflattening+1) earthradius_equatorial landarea 148.847e6 km^2 oceanarea 361.254e6 km^2 moonradius 1738 km # mean value sunradius 6.96e8 m # Many astronomical values can be measured most accurately in a system of units # using the astronomical unit and the mass of the sun as base units. The # uncertainty in the gravitational constant makes conversion to SI units # significantly less accurate. # The astronomical unit was defined to be the length of the of the semimajor # axis of a massless object with the same year as the earth. With such a # definition in force, and with the mass of the sun set equal to one, Kepler's # third law can be used to solve for the value of the gravitational constant. # Kepler's third law says that (2 pi / T)^2 a^3 = G M where T is the orbital # period, a is the size of the semimajor axis, G is the gravitational constant # and M is the mass. With M = 1 and T and a chosen for the earth's orbit, we # find sqrt(G) = (2 pi / T) sqrt(AU^3). This constant is called the Gaussian # gravitational constant, apparently because Gauss originally did the # calculations. However, when the original calculation was done, the value # for the length of the earth's year was inaccurate. The value used is called # the Gaussian year. Changing the astronomical unit to bring it into # agreement with more accurate values for the year would have invalidated a # lot of previous work, so instead the astronomical unit has been kept equal # to this original value. This is accomplished by using a standard value for # the Gaussian gravitational constant. This constant is called k. # Many values below are from http://ssd.jpl.nasa.gov/?constants gauss_k 0.01720209895 # This beast has dimensions of # au^(3|2) / day and is exact. gaussianyear (2 pi / gauss_k) days # Year that corresponds to the Gaussian # gravitational constant. This is a # fictional year, and doesn't # correspond to any celestial event. astronomicalunit 149597870700 m # IAU definition from 2012, exact au astronomicalunit # ephemeris for the above described # astronomical unit. (See the NASA # site listed above.) solarmass 1.9891e30 kg sunmass solarmass sundist 1.0000010178 au # mean earth-sun distance moondist 3.844e8 m # mean earth-moon distance sundist_near 1.471e11 m # earth-sun distance at perihelion sundist_far 1.521e11 m # earth-sun distance at aphelion # The following are masses for planetary systems, not just the planet itself. # The comments give the uncertainty in the denominators. As noted above, # masses are given relative to the solarmass because this is more accurate. # The conversion to SI is uncertain because of uncertainty in G, the # gravitational constant. # # Values are from http://ssd.jpl.nasa.gov/astro_constants.html mercurymass solarmass / 6023600 # 250 venusmass solarmass / 408523.71 # 0.06 earthmoonmass solarmass / 328900.56 # 0.02 marsmass solarmass / 3098708 # 9 jupitermass solarmass / 1047.3486 # 0.0008 saturnmass solarmass / 3497.898 # 0.018 uranusmass solarmass / 22902.98 # 0.03 neptunemass solarmass / 19412.24 # 0.04 plutomass solarmass / 1.35e8 # 0.07e8 moonearthmassratio 0.012300034 # uncertainty 3 x 10-9 earthmass earthmoonmass / ( 1 + moonearthmassratio) moonmass moonearthmassratio earthmass # These are the old values for the planetary masses. They may give # the masses of the planets alone. oldmercurymass 0.33022e24 kg oldvenusmass 4.8690e24 kg oldmarsmass 0.64191e24 kg oldjupitermass 1898.8e24 kg oldsaturnmass 568.5e24 kg olduranusmass 86.625e24 kg oldneptunemass 102.78e24 kg oldplutomass 0.015e24 kg # Mean radius from http://ssd.jpl.nsaa.gov/phys_props_planets.html which in # turn cites Global Earth Physics by CF Yoder, 1995. mercuryradius 2440 km venusradius 6051.84 km earthradius 6371.01 km marsradius 3389.92 km jupiterradius 69911 km saturnradius 58232 km uranusradius 25362 km neptuneradius 24624 km plutoradius 1151 km moongravity 1.62 m/s^2 # # The Hartree system of atomic units, derived from fundamental units # of mass (of electron), action (planck's constant), charge, and # the coulomb constant. # Fundamental units atomicmass electronmass atomiccharge e atomicaction hbar # derived units (Warning: accuracy is lost from deriving them this way) atomiclength bohrradius atomictime hbar^3/coulombconst^2 atomicmass e^4 # Period of first # bohr orbit atomicvelocity atomiclength / atomictime atomicenergy hbar / atomictime hartree atomicenergy # # These thermal units treat entropy as charge, from [5] # thermalcoulomb J/K # entropy thermalampere W/K # entropy flow thermalfarad J/K^2 thermalohm K^2/W # thermal resistance fourier thermalohm thermalhenry J K^2/W^2 # thermal inductance thermalvolt K # thermal potential difference # # United States units # # linear measure # The US Metric Law of 1866 legalized the metric system in the USA and # defined the meter in terms of the British system with the exact # 1 meter = 39.37 inches. On April 5, 1893 Thomas Corwin Mendenhall, # Superintendent of Weights and Measures, decided, in what has become # known as the "Mendenhall Order" that the meter and kilogram would be the # fundamental standards in the USA. The definition from 1866 was turned # around to give an exact definition of the yard as 3600|3937 meters This # definition was used until July of 1959 when the definition was changed # to bring the US and other English-speaking countries into agreement; the # Canadian value of 1 yard = 0.9144 meter (exactly) was chosen because it # was approximately halfway between the British and US values; it had the # added advantage of making 1 inch = 25.4 mm (exactly). Since 1959, the # "international" foot has been exactly 0.3048 meters. At the same time, # it was decided that any data expressed in feet derived from geodetic # surveys within the US would continue to use the old definition and call # the old unit the "survey foot." The US continues to define the statute # mile, furlong, chain, rod, link, and fathom in terms of the US survey # foot. # Sources: # NIST Special Publication 447, Sects. 5, 7, and 8. # NIST Handbook 44, 2011 ed., Appendix C. # Canadian Journal of Physics, 1959, 37:(1) 84, 10.1139/p59-014. US 1200|3937 m/ft # These four values will convert US- US # international measures to survey- US # US Survey measures geodetic- US int 3937|1200 ft/m # Convert US Survey measures to int- int # international measures inch 2.54 cm in inch foot 12 inch feet foot ft foot yard 3 ft yd yard mile 5280 ft # The mile was enlarged from 5000 ft # to this number in order to make # it an even number of furlongs. # (The Roman mile is 5000 romanfeet.) line 1|12 inch # Also defined as '.1 in' or as '1e-8 Wb' rod 5.5 yard perch rod furlong 40 rod # From "furrow long" statutemile mile league 3 mile # Intended to be an an hour's walk # surveyor's measure surveyorschain 66 surveyft surveychain surveyorschain surveyorspole 1|4 surveyorschain surveyorslink 1|100 surveyorschain chain 66 ft link 1|100 chain ch chain USacre 10 surveychain^2 intacre 10 chain^2 # Acre based on international ft intacrefoot acre foot USacrefoot USacre surveyfoot acrefoot intacrefoot acre intacre section mile^2 township 36 section homestead 160 acre # Area of land granted by the 1862 Homestead # Act of the United States Congress gunterschain surveyorschain engineerschain 100 ft engineerslink 1|100 engineerschain ramsdenschain engineerschain ramsdenslink engineerslink gurleychain 33 feet # Andrew Ellicott chain is the gurleylink 1|50 gurleychain # same length wingchain 66 feet # Chain from 1664, introduced by winglink 1|80 wingchain # Vincent Wing, also found in a # 33 foot length with 40 links. # early US length standards # The US has had four standards for the yard: one by Troughton of London # (1815); bronze yard #11 (1856); the Mendhall yard (1893), consistent # with the definition of the meter in the metric joint resolution of # Congress in 1866, but defining the yard in terms of the meter; and the # international yard (1959), which standardized definitions for Australia, # Canada, New Zealand, South Africa, the UK, and the US. # Sources: Pat Naughtin (2009), Which Inch?, www.metricationmatters.com; # Lewis E. Barbrow and Lewis V. Judson (1976). NBS Special Publication # 447, Weights and Measures Standards of the United States: A Brief # History. troughtonyard 914.42190 mm bronzeyard11 914.39980 mm mendenhallyard surveyyard internationalyard yard # nautical measure fathom 6 ft # Originally defined as the distance from # fingertip to fingertip with arms fully # extended. nauticalmile 1852 m # Supposed to be one minute of latitude at # the equator. That value is about 1855 m. # Early estimates of the earth's circumference # were a bit off. The value of 1852 m was # made the international standard in 1929. # The US did not accept this value until # 1954. The UK switched in 1970. cable 1|10 nauticalmile intcable cable # international cable cablelength cable UScable 100 USfathom navycablelength 720 USft # used for depth in water marineleague 3 nauticalmile geographicalmile brnauticalmile knot nauticalmile / hr click km # US military slang klick click # Avoirdupois weight pound 0.45359237 kg # The one normally used lb pound # From the latin libra grain 1|7000 pound # The grain is the same in all three # weight systems. It was originally # defined as the weight of a barley # corn taken from the middle of the # ear. ounce 1|16 pound oz ounce dram 1|16 ounce dr dram ushundredweight 100 pounds cwt hundredweight shorthundredweight ushundredweight uston shortton shortton 2000 lb quarterweight 1|4 uston shortquarterweight 1|4 shortton shortquarter shortquarterweight # Troy Weight. In 1828 the troy pound was made the first United States # standard weight. It was to be used to regulate coinage. troypound 5760 grain troyounce 1|12 troypound ozt troyounce pennyweight 1|20 troyounce # Abbreviated "d" in reference to a dwt pennyweight # Frankish coin called the "denier" # minted in the late 700's. There # were 240 deniers to the pound. assayton mg ton / troyounce # mg / assayton = troyounce / ton usassayton mg uston / troyounce brassayton mg brton / troyounce fineounce troyounce # A troy ounce of 99.5% pure gold # Some other jewelers units metriccarat 0.2 gram # Defined in 1907 metricgrain 50 mg carat metriccarat ct carat jewelerspoint 1|100 carat silversmithpoint 1|4000 inch momme 3.75 grams # Traditional Japanese unit based # on the chinese mace. It is used for # pearls in modern times and also for # silk density. The definition here # was adopted in 1891. # Apothecaries' weight appound troypound apounce troyounce apdram 1|8 apounce apscruple 1|3 apdram # Liquid measure usgallon 231 in^3 # US liquid measure is derived from gal gallon # the British wine gallon of 1707. quart 1|4 gallon # See the "winegallon" entry below pint 1|2 quart # more historical information. gill 1|4 pint usquart 1|4 usgallon uspint 1|2 usquart usgill 1|4 uspint usfluidounce 1|16 uspint fluiddram 1|8 usfloz minimvolume 1|60 fluiddram qt quart pt pint floz fluidounce usfloz usfluidounce fldr fluiddram liquidbarrel 31.5 usgallon usbeerbarrel 2 beerkegs beerkeg 15.5 usgallon # Various among brewers ponykeg 1|2 beerkeg winekeg 12 usgallon petroleumbarrel 42 usgallon # Originated in Pennsylvania oil barrel petroleumbarrel # fields, from the winetierce bbl barrel ushogshead 2 liquidbarrel usfirkin 9 usgallon # Dry measures: The Winchester Bushel was defined by William III in 1702 and # legally adopted in the US in 1836. usbushel 2150.42 in^3 # Volume of 8 inch cylinder with 18.5 bu bushel # inch diameter (rounded) peck 1|4 bushel uspeck 1|4 usbushel brpeck 1|4 brbushel pk peck drygallon 1|2 uspeck dryquart 1|4 drygallon drypint 1|2 dryquart drybarrel 7056 in^3 # Used in US for fruits, vegetables, # and other dry commodities except for # cranberries. cranberrybarrel 5826 in^3 # US cranberry barrel heapedbushel 1.278 usbushel# The following explanation for this # value was provided by Wendy Krieger # based on # guesswork. The cylindrical vessel is # 18.5 inches in diameter and 1|2 inch # thick. A heaped bushel includes the # contents of this cylinder plus a heap # on top. The heap is a cone 19.5 # inches in diameter and 6 inches # high. With these values, the volume # of the bushel is 684.5 pi in^3 and # the heap occupies 190.125 pi in^3. # Therefore, the heaped bushel is # 874.625|684.5 bushels. This value is # approximately 1.2777575 and it rounds # to the value listed for the size of # the heaped bushel. Sometimes the # heaped bushel is reported as 1.25 # bushels. This same explanation gives # that value if the heap is taken to # have an 18.5 inch diameter. # Grain measures. The bushel as it is used by farmers in the USA is actually # a measure of mass which varies for different commodities. Canada uses the # same bushel masses for most commodities, but not for oats. wheatbushel 60 lb soybeanbushel 60 lb cornbushel 56 lb ryebushel 56 lb barleybushel 48 lb oatbushel 32 lb ricebushel 45 lb canada_oatbushel 34 lb # Wine and Spirits measure ponyvolume 1 usfloz jigger 1.5 usfloz # Can vary between 1 and 2 usfloz shot jigger # Sometimes 1 usfloz eushot 25 ml # EU standard spirits measure fifth 1|5 usgallon winebottle 750 ml # US industry standard, 1979 winesplit 1|4 winebottle wineglass 4 usfloz magnum 1.5 liter # Standardized in 1979, but given # as 2 qt in some references metrictenth 375 ml metricfifth 750 ml metricquart 1 liter # Old British bottle size reputedquart 1|6 brgallon reputedpint 1|2 reputedquart brwinebottle reputedquart # Very close to 1|5 winegallon # French champagne bottle sizes split 200 ml jeroboam 2 magnum rehoboam 3 magnum methuselah 4 magnum salmanazar 6 magnum balthazar 8 magnum nebuchadnezzar 10 magnum # # Water is "hard" if it contains various minerals, expecially calcium # carbonate. # clarkdegree grains/brgallon # Content by weigh of calcium carbonate gpg grains/usgallon # Divide by water's density to convert to # a dimensionless concentration measure # # Shoe measures # shoeiron 1|48 inch # Used to measure leather in soles shoeounce 1|64 inch # Used to measure non-sole shoe leather # USA shoe sizes. These express the length of the shoe or the length # of the "last", the form that the shoe is made on. But note that # this only captures the length. It appears that widths change 1/4 # inch for each letter within the same size, and if you change the # length by half a size then the width changes between 1/8 inch and # 1/4 inch. But this may not be standard. If you know better, please # contact me. shoesize_delta 1|3 inch # USA shoe sizes differ by this amount shoe_men0 8.25 inch shoe_women0 (7+11|12) inch shoe_boys0 (3+11|12) inch shoe_girls0 (3+7|12) inch shoesize_men(n) units=[1;inch] shoe_men0 + n shoesize_delta ; \ (shoesize_men+(-shoe_men0))/shoesize_delta shoesize_women(n) units=[1;inch] shoe_women0 + n shoesize_delta ; \ (shoesize_women+(-shoe_women0))/shoesize_delta shoesize_boys(n) units=[1;inch] shoe_boys0 + n shoesize_delta ; \ (shoesize_boys+(-shoe_boys0))/shoesize_delta shoesize_girls(n) units=[1;inch] shoe_girls0 + n shoesize_delta ; \ (shoesize_girls+(-shoe_girls0))/shoesize_delta # European shoe size. According to # http://www.shoeline.com/footnotes/shoeterm.shtml # shoe sizes in Europe are measured with Paris points which simply measure # the length of the shoe. europeshoesize 2|3 cm # # USA slang units # buck US$ fin 5 US$ sawbuck 10 US$ usgrand 1000 US$ greenback US$ key kg # usually of marijuana, 60's lid 1 oz # Another 60's weed unit footballfield usfootballfield usfootballfield 100 yards canadafootballfield 110 yards # And 65 yards wide marathon 26 miles + 385 yards # # British # # The length measure in the UK was defined by a bronze bar manufactured in # 1844. Various conversions were sanctioned for convenience at different # times, which makes conversions before 1963 a confusing matter. Apparently # previous conversions were never explicitly revoked. Four different # conversion factors appear below. Multiply them times an imperial length # units as desired. The Weights and Measures Act of 1963 switched the UK away # from their bronze standard and onto a definition of the yard in terms of the # meter. This happened after an international agreement in 1959 to align the # world's measurement systems. UK UKlength_SJJ UK- UK british- UK UKlength_B 0.9143992 meter / yard # Benoit found the yard to be # 0.9143992 m at a weights and # measures conference around # 1896. Legally sanctioned # in 1898. UKlength_SJJ 0.91439841 meter / yard # In 1922, Seers, Jolly and # Johnson found the yard to be # 0.91439841 meters. # Used starting in the 1930's. UKlength_K meter / 39.37079 inch # In 1816 Kater found this ratio # for the meter and inch. This # value was used as the legal # conversion ratio when the # metric system was legalized # for contract in 1864. UKlength_C meter / 1.09362311 yard # In 1866 Clarke found the meter # to be 1.09362311 yards. This # conversion was legalized # around 1878. brnauticalmile 6080 ft # Used until 1970 when the UK brknot brnauticalmile / hr # switched to the international brcable 1|10 brnauticalmile # nautical mile. admiraltymile brnauticalmile admiraltyknot brknot admiraltycable brcable seamile 6000 ft shackle 15 fathoms # Adopted 1949 by British navy # British Imperial weight is mostly the same as US weight. A few extra # units are added here. clove 7 lb stone 14 lb tod 28 lb brquarterweight 1|4 brhundredweight brhundredweight 8 stone longhundredweight brhundredweight longton 20 brhundredweight brton longton # British Imperial volume measures brminim 1|60 brdram brscruple 1|3 brdram fluidscruple brscruple brdram 1|8 brfloz brfluidounce 1|20 brpint brfloz brfluidounce brgill 1|4 brpint brpint 1|2 brquart brquart 1|4 brgallon brgallon 4.54609 l # The British Imperial gallon was # defined in 1824 to be the volume of # water which weighed 10 pounds at 62 # deg F with a pressure of 30 inHg. # It was also defined as 277.274 in^3, # Which is slightly in error. In # 1963 it was defined to be the volume # occupied by 10 pounds of distilled # water of density 0.998859 g/ml weighed # in air of density 0.001217 g/ml # against weights of density 8.136 g/ml. # This gives a value of approximately # 4.5459645 liters, but the old liter # was in force at this time. In 1976 # the definition was changed to exactly # 4.54609 liters using the new # definition of the liter (1 dm^3). brbarrel 36 brgallon # Used for beer brbushel 8 brgallon brheapedbushel 1.278 brbushel brquarter 8 brbushel brchaldron 36 brbushel # Obscure British volume measures. These units are generally traditional # measures whose definitions have fluctuated over the years. Often they # depended on the quantity being measured. They are given here in terms of # British Imperial measures. For example, the puncheon may have historically # been defined relative to the wine gallon or beer gallon or ale gallon # rather than the British Imperial gallon. bag 4 brbushel bucket 4 brgallon kilderkin 2 brfirkin last 40 brbushel noggin brgill pottle 0.5 brgallon pin 4.5 brgallon puncheon 72 brgallon seam 8 brbushel coomb 4 brbushel boll 6 brbushel firlot 1|4 boll brfirkin 9 brgallon # Used for ale and beer cran 37.5 brgallon # measures herring, about 750 fish brwinehogshead 52.5 brgallon # This value is approximately equal brhogshead brwinehogshead # to the old wine hogshead of 63 # wine gallons. This adjustment # is listed in the OED and in # "The Weights and Measures of # England" by R. D. Connor brbeerhogshead 54 brgallon brbeerbutt 2 brbeerhogshead registerton 100 ft^3 # Used for internal capacity of ships shippington 40 ft^3 # Used for ship's cargo freight or timber brshippington 42 ft^3 # freightton shippington # Both register ton and shipping ton derive # from the "tun cask" of wine. displacementton 35 ft^3 # Approximate volume of a longton weight of # sea water. Measures water displaced by # ships. waterton 224 brgallon strike 70.5 l # 16th century unit, sometimes # defined as .5, 2, or 4 bushels # depending on the location. It # probably doesn't make a lot of # sense to define in terms of imperial # bushels. Zupko gives a value of # 2 Winchester grain bushels or about # 70.5 liters. amber 4 brbushel# Used for dry and liquid capacity [18] # British volume measures with "imperial" imperialminim brminim imperialscruple brscruple imperialdram brdram imperialfluidounce brfluidounce imperialfloz brfloz imperialgill brgill imperialpint brpint imperialquart brquart imperialgallon brgallon imperialbarrel brbarrel imperialbushel brbushel imperialheapedbushel brheapedbushel imperialquarter brquarter imperialchaldron brchaldron imperialwinehogshead brwinehogshead imperialhogshead brhogshead imperialbeerhogshead brbeerhogshead imperialbeerbutt brbeerbutt imperialfirkin brfirkin # obscure British lengths barleycorn 1|3 UKinch # Given in Realm of Measure as the # difference between successive shoe sizes nail 1|16 UKyard # Originally the width of the thumbnail, # or 1|16 ft. This took on the general # meaning of 1|16 and settled on the # nail of a yard or 1|16 yards as its # final value. [12] pole 16.5 UKft # This was 15 Saxon feet, the Saxon rope 20 UKft # foot (aka northern foot) being longer englishell 45 UKinch flemishell 27 UKinch ell englishell # supposed to be measure from elbow to # fingertips span 9 UKinch # supposed to be distance from thumb # to pinky with full hand extension goad 4.5 UKft # used for cloth, possibly named after the # stick used for prodding animals. # misc obscure British units hide 120 acre # English unit of land area dating to the 7th # century, originally the amount of land # that a single plowman could cultivate, # which varied from 60-180 acres regionally. # Standardized at Normon conquest. virgate 1|4 hide nook 1|2 virgate rood furlong rod # Area of a strip a rod by a furlong englishcarat troyounce/151.5 # Originally intended to be 4 grain # but this value ended up being # used in the London diamond market mancus 2 oz mast 2.5 lb nailkeg 100 lbs basebox 31360 in^2 # Used in metal plating # alternate spellings metre meter gramme gram litre liter dioptre diopter aluminium aluminum sulphur sulfur # # Units derived the human body (may not be very accurate) # geometricpace 5 ft # distance between points where the same # foot hits the ground pace 2.5 ft # distance between points where alternate # feet touch the ground USmilitarypace 30 in # United States official military pace USdoubletimepace 36 in # United States official doubletime pace fingerbreadth 7|8 in # The finger is defined as either the width fingerlength 4.5 in # or length of the finger finger fingerbreadth palmwidth hand # The palm is a unit defined as either the width palmlength 8 in # or the length of the hand hand 4 inch # width of hand shaftment 6 inch # Distance from tip of outstretched thumb to the # opposite side of the palm of the hand. The # ending -ment is from the old English word # for hand. [18] smoot 5 ft + 7 in # Created as part of an MIT fraternity prank. # In 1958 Oliver Smoot was used to measure # the length of the Harvard Bridge, which was # marked off in smooth lengths. These # markings have been maintained on the bridge # since then and repainted by subsequent # incoming fraternity members. During a # bridge rennovation the new sidewalk was # scored every smooth rather than at the # customary 6 ft spacing. # # Cooking measures # # Common abbreviations tbl tablespoon tbsp tablespoon tblsp tablespoon Tb tablespoon tsp teaspoon saltspoon 1|4 tsp # US measures uscup 8 usfloz ustablespoon 1|16 uscup usteaspoon 1|3 ustablespoon ustbl ustablespoon ustbsp ustablespoon ustblsp ustablespoon ustsp usteaspoon metriccup 250 ml stickbutter 1|4 lb # Butter in the USA is sold in one # pound packages that contain four # individually wrapped pieces. The # pieces are marked into tablespoons, # making it possible to measure out # butter by volume by slicing the # butter. legalcup 240 ml # The cup used on nutrition labeling legaltablespoon 1|16 legalcup legaltbsp legaltablespoon # Scoop size. Ice cream scoops in the US are marked with numbers # indicating the number of scoops requird to fill a US quart. scoop(n) units=[1;cup] domain=[4,100] range=[0.04,1] \ 32 usfloz / n ; 32 usfloz / scoop # US can sizes. number1can 10 usfloz number2can 19 usfloz number2.5can 3.5 uscups number3can 4 uscups number5can 7 uscups number10can 105 usfloz # British measures brcup 1|2 brpint brteacup 1|3 brpint brtablespoon 15 ml # Also 5|8 brfloz, approx 17.7 ml brteaspoon 1|3 brtablespoon # Also 1|4 brtablespoon brdessertspoon 2 brteaspoon dessertspoon brdessertspoon dsp dessertspoon brtsp brteaspoon brtbl brtablespoon brtbsp brtablespoon brtblsp brtablespoon # Australian australiatablespoon 20 ml austbl australiatablespoon austbsp australiatablespoon austblsp australiatablespoon australiateaspoon 1|4 australiatablespoon austsp australiateaspoon # Italian etto 100 g # Used for buying items like meat and etti etto # cheese. # Chinese catty 0.5 kg oldcatty 4|3 lbs # Before metric conversion. tael 1|16 oldcatty # Should the tael be defined both ways? mace 0.1 tael oldpicul 100 oldcatty picul 100 catty # Chinese usage # Indian seer 14400 grain # British Colonial standard ser seer maund 40 seer pakistanseer 1 kg pakistanmaund 40 pakistanseer chittak 1|16 seer tola 1|5 chittak ollock 1|4 liter # Is this right? # Japanese japancup 200 ml # densities of cooking ingredients from The Cake Bible by Rose Levy Beranbaum # so you can convert '2 cups sugar' to grams, for example, or in the other # direction grams could be converted to 'cup flour_scooped'. butter 8 oz/uscup butter_clarified 6.8 oz/uscup cocoa_butter 9 oz/uscup shortening 6.75 oz/uscup # vegetable shortening oil 7.5 oz/uscup cakeflour_sifted 3.5 oz/uscup # The density of flour depends on the cakeflour_spooned 4 oz/uscup # measuring method. "Scooped", or cakeflour_scooped 4.5 oz/uscup # "dip and sweep" refers to dipping a flour_sifted 4 oz/uscup # measure into a bin, and then sweeping flour_spooned 4.25 oz/uscup # the excess off the top. "Spooned" flour_scooped 5 oz/uscup # means to lightly spoon into a measure breadflour_sifted 4.25 oz/uscup # and then sweep the top. Sifted means breadflour_spooned 4.5 oz/uscup # sifting the flour directly into a breadflour_scooped 5.5 oz/uscup # measure and then sweeping the top. cornstarch 120 grams/uscup dutchcocoa_sifted 75 g/uscup # These are for Dutch processed cocoa dutchcocoa_spooned 92 g/uscup dutchcocoa_scooped 95 g/uscup cocoa_sifted 75 g/uscup # These are for nonalkalized cocoa cocoa_spooned 82 g/uscup cocoa_scooped 95 g/uscup heavycream 232 g/uscup milk 242 g/uscup sourcream 242 g/uscup molasses 11.25 oz/uscup cornsyrup 11.5 oz/uscup honey 11.75 oz/uscup sugar 200 g/uscup powdered_sugar 4 oz/uscup brownsugar_light 217 g/uscup # packed brownsugar_dark 239 g/uscup baking_powder 4.6 grams / ustsp salt 6 g / ustsp koshersalt 2.8 g / ustsp # Diamond Crystal kosher salt koshersalt_morton 4.8 g / ustsp # Morton kosher salt # Values are from the nutrition info # on the packages # Egg weights and volumes for a USA large egg egg 50 grams # without shell eggwhite 30 grams eggyolk 18.6 grams eggvolume 3 ustablespoons + 1|2 ustsp eggwhitevolume 2 ustablespoons eggyolkvolume 3.5 ustsp # # Density measures. Density has traditionally been measured on a variety of # bizarre nonlinear scales. # # Density of a sugar syrup is frequently measured in candy making procedures. # In the USA the boiling point of the syrup is measured. Some recipes instead # specify the density using degrees Baume. Conversion between degrees Baume # and the boiling point measure has proved elusive. This table appeared in one # text, and provides a fragmentary relationship to the concentration. # # temp(C) conc (%) # 100 30 # 101 40 # 102 50 # 103 60 # 106 70 # 112 80 # 123 90 # 140 95 # 151 97 # 160 98.2 # 166 99.5 # 171 99.6 # # The best source identified to date came from "Boiling point elevation of # technical sugarcane solutions and its use in automatic pan boiling" by # Michael Saska. International Sugar Journal, 2002, 104, 1247, pp 500-507. # # But I'm using equation (3) which is credited to Starzak and Peacock, # "Water activity coefficient in aqueous solutions of sucrose--A comprehensive # data analyzis. Zuckerindustrie, 122, 380-387. (I couldn't find this # document.) # # Note that the range of validity is uncertain, but answers are in agreement # with the above table all the way to 99.6. # # The original equation has a parameter for the boiling point of water, which # of course varies with altitude. It also includes various other model # parameters. The input is the molar concentration of sucrose in the solution, # (moles sucrose) / (total moles). # # Bsp 3797.06 degC # Csp 226.28 degC # QQ -17638 J/mol # asp -1.0038 # bsp -0.24653 # tbw 100 degC # boiling point of water # sugar_bpe_orig(x) ((1-QQ/R Bsp * x^2 (1+asp x + bsp x^2) (tbw + Csp) \ # /(tbw+stdtemp)) / (1+(tbw + Csp)/Bsp *ln(1-x))-1) * (tbw + Csp) # # To convert mass concentration (brix) to molar concentration # # sc(x) (x / 342.3) / (( x/342.3) + (100-x)/18.02); \ # 100 sc 342.3|18.02 / (sc (342.3|18.02-1)+1) # # Here is a simplfied version of this equation where the temperature of boiling # water has been fixed at 100 degrees Celcius and the argument is now the # concentration (brix). # # sugar_bpe(x) ((1+ 0.48851085 * sc(x)^2 (1+ -1.0038 sc(x) + -0.24653 sc(x)^2)) \ # / (1+0.08592964 ln(1-sc(x)))-1) 326.28 K # # # The formula is not invertible, so to implement it in units we unfortunately # must turn it into a table. # This table gives the boiling point elevation as a function of the sugar syrup # concentration expressed as a percentage. sugar_conc_bpe[K] \ 0 0.0000 5 0.0788 10 0.1690 15 0.2729 20 0.3936 25 0.5351 \ 30 0.7027 35 0.9036 40 1.1475 42 1.2599 44 1.3825 46 1.5165 \ 48 1.6634 50 1.8249 52 2.0031 54 2.2005 56 2.4200 58 2.6651 \ 60 2.9400 61 3.0902 62 3.2499 63 3.4198 64 3.6010 65 3.7944 \ 66 4.0012 67 4.2227 68 4.4603 69 4.7156 70 4.9905 71 5.2870 \ 72 5.6075 73 5.9546 74 6.3316 75 6.7417 76 7.1892 77 7.6786 \ 78.0 8.2155 79.0 8.8061 80.0 9.4578 80.5 9.8092 81.0 10.1793 \ 81.5 10.5693 82.0 10.9807 82.5 11.4152 83.0 11.8743 83.5 12.3601 \ 84.0 12.8744 84.5 13.4197 85.0 13.9982 85.5 14.6128 86.0 15.2663 \ 86.5 15.9620 87.0 16.7033 87.5 17.4943 88.0 18.3391 88.5 19.2424 \ 89.0 20.2092 89.5 21.2452 90.0 22.3564 90.5 23.5493 91.0 24.8309 \ 91.5 26.2086 92.0 27.6903 92.5 29.2839 93.0 30.9972 93.5 32.8374 \ 94.0 34.8104 94.5 36.9195 95.0 39.1636 95.5 41.5348 96.0 44.0142 \ 96.5 46.5668 97.0 49.1350 97.5 51.6347 98.0 53.9681 98.1 54.4091 \ 98.2 54.8423 98.3 55.2692 98.4 55.6928 98.5 56.1174 98.6 56.5497 \ 98.7 56.9999 98.8 57.4828 98.9 58.0206 99.0 58.6455 99.1 59.4062 \ 99.2 60.3763 99.3 61.6706 99.4 63.4751 99.5 66.1062 99.6 70.1448 \ 99.7 76.7867 # Using the brix table we can use this to produce a mapping from boiling point # to density which makes all of the units interconvertible. Because the brix # table stops at 95 this approach works up to a boiling point elevation of 39 K # or a boiling point of 139 C / 282 F, which is the "soft crack" stage in candy # making. The "hard crack" stage continues up to 310 F. # Boiling point elevation sugar_bpe(T) units=[K;g/cm^3] domain=[0,39.1636] range=[0.99717,1.5144619] \ brix(~sugar_conc_bpe(T)); sugar_conc_bpe(~brix(sugar_bpe)) # Absolute boiling point (produces an absolute temperature) sugar_bp(T) units=[K;g/cm^3] domain=[373.15,412.3136] \ range=[0.99717,1.5144619] \ brix(~sugar_conc_bpe(T-tempC(100))) ;\ sugar_conc_bpe(~brix(sugar_bp))+tempC(100) # In practice dealing with the absolute temperature is annoying because it is # not possible to convert to a nested function, so you're stuck retyping the # absolute temperature in Kelvins to convert to celsius or Fahrenheit. To # prevent this we supply definitions that build in the temperature conversion # and produce results in the Fahrenheit and Celcius scales. So using these # measures, to convert 46 degrees Baume to a Fahrenheit boiling point: # # You have: baume(45) # You want: sugar_bpF # 239.05647 # sugar_bpF(T) units=[1;g/cm^3] domain=[212,282.49448] range=[0.99717,1.5144619]\ brix(~sugar_conc_bpe(tempF(T)+-tempC(100))) ;\ ~tempF(sugar_conc_bpe(~brix(sugar_bpF))+tempC(100)) sugar_bpC(T) units=[1;g/cm^3] domain=[100,139.1636] range=[0.99717,1.5144619]\ brix(~sugar_conc_bpe(tempC(T)+-tempC(100))) ;\ ~tempC(sugar_conc_bpe(~brix(sugar_bpC))+tempC(100)) # Degrees Baume is used in European recipes to specify the density of a sugar # syrup. An entirely different definition is used for densities below # 1 g/cm^3. An arbitrary constant appears in the definition. This value is # equal to 145 in the US, but was according to [], the old scale used in # Holland had a value of 144, and the new scale or Gerlach scale used 146.78. baumeconst 145 # US value baume(d) units=[1;g/cm^3] domain=[0,145) range=[1,) \ (baumeconst/(baumeconst+-d)) g/cm^3 ; \ (baume+((-g)/cm^3)) baumeconst / baume # It's not clear if this value was ever used with negative degrees. twaddell(x) units=[1;g/cm^3] domain=[-200,) range=[0,) \ (1 + 0.005 x) g / cm^3 ; \ 200 (twaddell / (g/cm^3) +- 1) # The degree quevenne is a unit for measuring the density of milk. # Similarly it's unclear if negative values were allowed here. quevenne(x) units=[1;g/cm^3] domain=[-1000,) range=[0,) \ (1 + 0.001 x) g / cm^3 ; \ 1000 (quevenne / (g/cm^3) +- 1) # Degrees brix measures sugar concentration by weigh as a percentage, so a # solution that is 3 degrees brix is 3% sugar by weight. This unit was named # after Adolf Brix who invented a hydrometer that read this percentage # directly. This data is from Table 114 of NIST Circular 440, "Polarimetry, # Saccharimetry and the Sugars". It gives apparent specific gravity at 20 # degrees Celsius of various sugar concentrations. As rendered below this # data is converted to apparent density at 20 degrees Celsius using the # density figure for water given in the same NIST reference. They use the # word "apparent" to refer to measurements being made in air with brass # weights rather than vacuum. brix[0.99717g/cm^3]\ 0 1.00000 1 1.00390 2 1.00780 3 1.01173 4 1.01569 5 1.01968 \ 6 1.02369 7 1.02773 8 1.03180 9 1.03590 10 1.04003 11 1.04418 \ 12 1.04837 13 1.05259 14 1.05683 15 1.06111 16 1.06542 17 1.06976 \ 18 1.07413 19 1.07853 20 1.08297 21 1.08744 22 1.09194 23 1.09647 \ 24 1.10104 25 1.10564 26 1.11027 27 1.11493 28 1.11963 29 1.12436 \ 30 1.12913 31 1.13394 32 1.13877 33 1.14364 34 1.14855 35 1.15350 \ 36 1.15847 37 1.16349 38 1.16853 39 1.17362 40 1.17874 41 1.18390 \ 42 1.18910 43 1.19434 44 1.19961 45 1.20491 46 1.21026 47 1.21564 \ 48 1.22106 49 1.22652 50 1.23202 51 1.23756 52 1.24313 53 1.24874 \ 54 1.25439 55 1.26007 56 1.26580 57 1.27156 58 1.27736 59 1.28320 \ 60 1.28909 61 1.29498 62 1.30093 63 1.30694 64 1.31297 65 1.31905 \ 66 1.32516 67 1.33129 68 1.33748 69 1.34371 70 1.34997 71 1.35627 \ 72 1.36261 73 1.36900 74 1.37541 75 1.38187 76 1.38835 77 1.39489 \ 78 1.40146 79 1.40806 80 1.41471 81 1.42138 82 1.42810 83 1.43486 \ 84 1.44165 85 1.44848 86 1.45535 87 1.46225 88 1.46919 89 1.47616 \ 90 1.48317 91 1.49022 92 1.49730 93 1.50442 94 1.51157 95 1.51876 # Density measure invented by the American Petroleum Institute. Lighter # petroleum products are more valuable, and they get a higher API degree. # # The intervals of range and domain should be open rather than closed. # apidegree(x) units=[1;g/cm^3] domain=[-131.5,) range=[0,) \ 141.5 g/cm^3 / (x+131.5) ; \ 141.5 (g/cm^3) / apidegree + (-131.5) # # Units derived from imperial system # ouncedal oz ft / s^2 # force which accelerates an ounce # at 1 ft/s^2 poundal lb ft / s^2 # same thing for a pound tondal longton ft / s^2 # and for a ton pdl poundal osi ounce force / inch^2 # used in aviation psi pound force / inch^2 psia psi # absolute pressure # Note that gauge pressure can be given # using the gaugepressure() and # psig() nonlinear unit definitions tsi ton force / inch^2 reyn psi sec slug lbf s^2 / ft slugf slug force slinch lbf s^2 / inch # Mass unit derived from inch second slinchf slinch force # pound-force system. Used in space # applications where in/sec^2 was a # natural acceleration measure. geepound slug lbf lb force tonf ton force lbm lb kip 1000 lbf # from kilopound ksi kip / in^2 mil 0.001 inch thou 0.001 inch tenth 0.0001 inch # one tenth of one thousandth of an inch millionth 1e-6 inch # one millionth of an inch circularinch 1|4 pi in^2 # area of a one-inch diameter circle circleinch circularinch # A circle with diameter d inches has # an area of d^2 circularinches cylinderinch circleinch inch # Cylinder h inch tall, d inches diameter # has volume d^2 h cylinder inches circularmil 1|4 pi mil^2 # area of one-mil diameter circle cmil circularmil cental 100 pound centner cental caliber 0.01 inch # for measuring bullets duty ft lbf celo ft / s^2 jerk ft / s^3 australiapoint 0.01 inch # The "point" is used to measure rainfall # in Australia sabin ft^2 # Measure of sound absorption equal to the # absorbing power of one square foot of # a perfectly absorbing material. The # sound absorptivity of an object is the # area times a dimensionless # absorptivity coefficient. standardgauge 4 ft + 8.5 in # Standard width between railroad track flag 5 ft^2 # Construction term referring to sidewalk. rollwallpaper 30 ft^2 # Area of roll of wall paper fillpower in^3 / ounce # Density of down at standard pressure. # The best down has 750-800 fillpower. pinlength 1|16 inch # A #17 pin is 17/16 in long in the USA. buttonline 1|40 inch # The line was used in 19th century USA # to measure width of buttons. beespace 1|4 inch # Bees will fill any space that is smaller # than the bee space and leave open # spaces that are larger. The size of # the space varies with species. diamond 8|5 ft # Marking on US tape measures that is # useful to carpenters who wish to place # five studs in an 8 ft distance. Note # that the numbers appear in red every # 16 inches as well, giving six # divisions in 8 feet. retmaunit 1.75 in # Height of rack mountable equipment. U retmaunit # Equipment should be 1|32 inch narrower RU U # than its U measurement indicates to # allow for clearance, so 4U=(6+31|32)in # RETMA stands for the former name of # the standardizing organization, Radio # Electronics Television Manufacturers # Association. This organization is now # called the Electronic Industries # Alliance (EIA) and the rack standard # is specified in EIA RS-310-D. count per pound # For measuring the size of shrimp # # Other units of work, energy, power, etc # ENERGY joule WORK joule # Calories: energy to raise a gram of water one degree celsius cal_IT 4.1868 J # International Table calorie cal_th 4.184 J # Thermochemical calorie cal_fifteen 4.18580 J # Energy to go from 14.5 to 15.5 degC cal_twenty 4.18190 J # Energy to go from 19.5 to 20.5 degC cal_mean 4.19002 J # 1|100 energy to go from 0 to 100 degC calorie cal_IT cal calorie calorie_IT cal_IT thermcalorie cal_th calorie_th thermcalorie Calorie kilocalorie # the food Calorie thermie 1e6 cal_fifteen # Heat required to raise the # temperature of a tonne of # water from 14.5 to 15.5 degC. # btu definitions: energy to raise a pound of water 1 degF btu cal lb degF / gram K # international table BTU britishthermalunit btu btu_IT btu btu_th cal_th lb degF / gram K btu_mean cal_mean lb degF / gram K quad quadrillion btu ECtherm 1.05506e8 J # Exact definition, close to 1e5 btu UStherm 1.054804e8 J # Exact definition therm UStherm # Water latent heat (from Wikipedia) water_fusion_heat 79.8 calorie/g water_vaporization_heat 1160 J/g # Specific heat capacities of various substances specificheat_water calorie / g K water_specificheat specificheat_water # Values from www.engineeringtoolbox.com/specific-heat-metals-d_152.html specificheat_aluminum 0.91 J/g K specificheat_antimony 0.21 J/g K specificheat_barium 0.20 J/g K specificheat_beryllium 1.83 J/g K specificheat_bismuth 0.13 J/g K specificheat_cadmium 0.23 J/g K specificheat_cesium 0.24 J/g K specificheat_chromium 0.46 J/g K specificheat_cobalt 0.42 J/g K specificheat_copper 0.39 J/g K specificheat_gallium 0.37 J/g K specificheat_germanium 0.32 J/g K specificheat_gold 0.13 J/g K specificheat_hafnium 0.14 J/g K specificheat_indium 0.24 J/g K specificheat_iridium 0.13 J/g K specificheat_iron 0.45 J/g K specificheat_lanthanum 0.195 J/g K specificheat_lead 0.13 J/g K specificheat_lithium 3.57 J/g K specificheat_lutetium 0.15 J/g K specificheat_magnesium 1.05 J/g K specificheat_manganese 0.48 J/g K specificheat_mercury 0.14 J/g K specificheat_molybdenum 0.25 J/g K specificheat_nickel 0.44 J/g K specificheat_osmium 0.13 J/g K specificheat_palladium 0.24 J/g K specificheat_platinum 0.13 J/g K specificheat_plutonum 0.13 J/g K specificheat_potassium 0.75 J/g K specificheat_rhenium 0.14 J/g K specificheat_rhodium 0.24 J/g K specificheat_rubidium 0.36 J/g K specificheat_ruthenium 0.24 J/g K specificheat_scandium 0.57 J/g K specificheat_selenium 0.32 J/g K specificheat_silicon 0.71 J/g K specificheat_silver 0.23 J/g K specificheat_sodium 1.21 J/g K specificheat_strontium 0.30 J/g K specificheat_tantalum 0.14 J/g K specificheat_thallium 0.13 J/g K specificheat_thorium 0.13 J/g K specificheat_tin 0.21 J/g K specificheat_titanium 0.54 J/g K specificheat_tungsten 0.13 J/g K specificheat_uranium 0.12 J/g K specificheat_vanadium 0.39 J/g K specificheat_yttrium 0.30 J/g K specificheat_zinc 0.39 J/g K specificheat_zirconium 0.27 J/g K specificheat_ethanol 2.3 J/g K specificheat_ammonia 4.6 J/g K specificheat_freon 0.91 J/g K # R-12 at 0 degrees Fahrenheit specificheat_gasoline 2.22 J/g K specificheat_iodine 2.15 J/g K specificheat_oliveoil 1.97 J/g K # en.wikipedia.org/wiki/Heat_capacity#Table_of_specific_heat_capacities specificheat_hydrogen 14.3 J/g K specificheat_helium 5.1932 J/g K specificheat_argon 0.5203 J/g K specificheat_tissue 3.5 J/g K specificheat_diamond 0.5091 J/g K specificheat_granite 0.79 J/g K specificheat_graphite 0.71 J/g K specificheat_ice 2.11 J/g K specificheat_asphalt 0.92 J/g K specificheat_brick 0.84 J/g K specificheat_concrete 0.88 J/g K specificheat_glass_silica 0.84 J/g K specificheat_glass_flint 0.503 J/g K specificheat_glass_pyrex 0.753 J/g K specificheat_gypsum 1.09 J/g K specificheat_marble 0.88 J/g K specificheat_sand 0.835 J/g K specificheat_soil 0.835 J/g K specificheat_wood 1.7 J/g K specificheat_sucrose 1.244 J/g K #www.sugartech.co.za/heatcapacity/index.php # Energy densities of various fuels # # Most of these fuels have varying compositions or qualities and hence their # actual energy densities vary. These numbers are hence only approximate. # # E1. http://bioenergy.ornl.gov/papers/misc/energy_conv.html # E2. http://www.aps.org/policy/reports/popa-reports/energy/units.cfm # E3. http://www.ior.com.au/ecflist.html tonoil 1e10 cal_IT # Ton oil equivalent. A conventional # value for the energy released by toe tonoil # burning one metric ton of oil. [18,E2] # Note that energy per mass of petroleum # products is fairly constant. # Variations in volumetric energy # density result from variations in the # density (kg/m^3) of different fuels. # This definition is given by the # IEA/OECD. toncoal 7e9 cal_IT # Energy in metric ton coal from [18]. # This is a nominal value which # is close to the heat content # of coal used in the 1950's barreloil 5.8 Mbtu # Conventional value for barrel of crude # oil [E2]. Actual range is 5.6 - 6.3. naturalgas_HHV 1027 btu/ft3 # Energy content of natural gas. HHV naturalgas_LHV 930 btu/ft3 # is for Higher Heating Value and naturalgas naturalgas_HHV # includes energy from condensation # combustion products. LHV is for Lower # Heating Value and excludes these. # American publications typically report # HHV whereas European ones report LHV. charcoal 30 GJ/tonne woodenergy_dry 20 GJ/tonne # HHV, a cord weights about a tonne woodenergy_airdry 15 GJ/tonne # 20% moisture content coal_bituminous 27 GJ / tonne coal_lignite 15 GJ / tonne coal_US 22 GJ / uston # Average for US coal (short ton), 1995 ethanol_HHV 84000 btu/usgallon ethanol_LHV 75700 btu/usgallon diesel 130500 btu/usgallon gasoline_LHV 115000 btu/usgallon gasoline_HHV 125000 btu/usgallon gasoline gasoline_HHV heating 37.3 MJ/liter fueloil 39.7 MJ/liter # low sulphur propane 93.3 MJ/m^3 butane 124 MJ/m^3 # These values give total energy from uranium fission. Actual efficiency # of nuclear power plants is around 30%-40%. Note also that some reactors # use enriched uranium around 3% U-235. Uranium during processing or use # may be in a compound of uranium oxide or uranium hexafluoride, in which # case the energy density would be lower depending on how much uranium is # in the compound. uranium_pure 200 MeV avogadro / (235.0439299 g/mol) # Pure U-235 uranium_natural 0.7% uranium_pure # Natural uranium: 0.7% U-235 # Celsius heat unit: energy to raise a pound of water 1 degC celsiusheatunit cal lb degC / gram K chu celsiusheatunit POWER watt # "Apparent" average power in an AC circuit, the product of rms voltage # and rms current, equal to the true power in watts when voltage and # current are in phase. In a DC circuit, always equal to the true power. VA volt ampere kWh kilowatt hour # The horsepower is supposedly the power of one horse pulling. Obviously # different people had different horses. horsepower 550 foot pound force / sec # Invented by James Watt mechanicalhorsepower horsepower hp horsepower metrichorsepower 75 kilogram force meter / sec # PS=Pferdestaerke in electrichorsepower 746 W # Germany boilerhorsepower 9809.50 W waterhorsepower 746.043 W brhorsepower 745.70 W donkeypower 250 W chevalvapeur metrichorsepower # # Heat Transfer # # Thermal conductivity, K, measures the rate of heat transfer across # a material. The heat transfered is # Q = K dT A t / L # where dT is the temperature difference across the material, A is the # cross sectional area, t is the time, and L is the length (thickness). # Thermal conductivity is a material property. THERMAL_CONDUCTIVITY POWER / AREA (TEMPERATURE_DIFFERENCE/LENGTH) THERMAL_RESISTIVITY 1/THERMAL_CONDUCTIVITY # Thermal conductance is the rate at which heat flows across a given # object, so the area and thickness have been fixed. It depends on # the size of the object and is hence not a material property. THERMAL_CONDUCTANCE POWER / TEMPERATURE_DIFFERENCE THERMAL_RESISTANCE 1/THERMAL_CONDUCTANCE # Thermal admittance is the rate of heat flow per area across an # object whose thickness has been fixed. Its reciprocal, thermal # insulation, is used to for measuring the heat transfer per area # of sheets of insulation or cloth that are of specified thickness. THERMAL_ADMITTANCE THERMAL_CONDUCTIVITY / LENGTH THERMAL_INSULANCE THERMAL_RESISTIVITY LENGTH THERMAL_INSULATION THERMAL_RESISTIVITY LENGTH Rvalue degF ft^2 hr / btu Uvalue 1/Rvalue europeanUvalue watt / m^2 K RSI degC m^2 / W clo 0.155 degC m^2 / W # Supposed to be the insulance # required to keep a resting person # comfortable indoors. The value # given is from NIST and the CRC, # but [5] gives a slightly different # value of 0.875 ft^2 degF hr / btu. tog 0.1 degC m^2 / W # Also used for clothing. # The bel was defined by engineers of Bell Laboratories to describe the # reduction in audio level over a length of one mile. It was originally # called the transmission unit (TU) but was renamed around 1923 to honor # Alexander Graham Bell. The bel proved inconveniently large so the decibel # has become more common. The decibel is dimensionless since it reports a # ratio, but it is used in various contexts to report a signal's power # relative to some reference level. bel(x) units=[1;1] range=(0,) 10^(x); log(bel) # Basic bel definition decibel(x) units=[1;1] range=(0,) 10^(x/10); 10 log(decibel) # Basic decibel dB() decibel # Abbreviation dBW(x) units=[1;W] range=(0,) dB(x) W ; ~dB(dBW/W) # Reference = 1 W dBk(x) units=[1;W] range=(0,) dB(x) kW ; ~dB(dBk/kW) # Reference = 1 kW dBf(x) units=[1;W] range=(0,) dB(x) fW ; ~dB(dBf/fW) # Reference = 1 fW dBm(x) units=[1;W] range=(0,) dB(x) mW ; ~dB(dBm/mW) # Reference = 1 mW dBmW(x) units=[1;W] range=(0,) dBm(x) ; ~dBm(dBmW) # Reference = 1 mW dBJ(x) units=[1;J] range=(0,) dB(x) J; ~dB(dBJ/J) # Energy relative # to 1 joule. Used for power spectral # density since W/Hz = J # When used to measure amplitude, voltage, or current the signal is squared # because power is proportional to the square of these measures. The root # mean square (RMS) voltage is typically used with these units. dBV(x) units=[1;V] range=(0,) dB(0.5 x) V;~dB(dBV^2 / V^2) # Reference = 1 V dBmV(x) units=[1;V] range=(0,) dB(0.5 x) mV;~dB(dBmV^2/mV^2)# Reference = 1 mV dBuV(x) units=[1;V] range=(0,) dB(0.5 x) microV ; ~dB(dBuV^2 / microV^2) # Reference = 1 microvolt # Referenced to the voltage that causes 1 mW dissipation in a 600 ohm load. # Originally defined as dBv but changed to prevent confusion with dBV. # The "u" is for unloaded. dBu(x) units=[1;V] range=(0,) dB(0.5 x) sqrt(mW 600 ohm) ; \ ~dB(dBu^2 / mW 600 ohm) dBv(x) units=[1;V] range=(0,) dBu(x) ; ~dBu(dBv) # Synonym for dBu # Measurements for sound in air, referenced to the threshold of human hearing # Note that sound in other media typically uses 1 micropascal as a reference # for sound pressure. Units dBA, dBB, dBC, refer to different frequency # weightings meant to approximate the human ear's response. dBSPL(x) units=[1;Pa] range=(0,) dB(0.5 x) 20 microPa ; \ ~dB(dBSPL^2 / (20 microPa)^2) # pressure dBSIL(x) units=[1;W/m^2] range=(0,) dB(x) 1e-12 W/m^2; \ ~dB(dBSIL / (1e-12 W/m^2)) # intensity dBSWL(x) units=[1;W] range=(0,) dB(x) 1e-12 W; ~dB(dBSWL/1e-12 W) # Misc other measures ENTROPY ENERGY / TEMPERATURE clausius 1e3 cal/K # A unit of physical entropy langley thermcalorie/cm^2 # Used in radiation theory poncelet 100 kg force m / s tonrefrigeration uston 144 btu / lb day # One ton refrigeration is # the rate of heat extraction required # turn one ton of water to ice in # a day. Ice is defined to have a # latent heat of 144 btu/lb. tonref tonrefrigeration refrigeration tonref / ton frigorie 1000 cal_fifteen# Used in refrigeration engineering. tnt 1e9 cal_th / ton# So you can write tons tnt. This # is a defined, not measured, value. airwatt 8.5 (ft^3/min) inH2O # Measure of vacuum power as # pressure times air flow. # # Permeability: The permeability or permeance, n, of a substance determines # how fast vapor flows through the substance. The formula W = n A dP # holds where W is the rate of flow (in mass/time), n is the permeability, # A is the area of the flow path, and dP is the vapor pressure difference. # perm_0C grain / hr ft^2 inHg perm_zero perm_0C perm_0 perm_0C perm perm_0C perm_23C grain / hr ft^2 in Hg23C perm_twentythree perm_23C # # Counting measures # pair 2 brace 2 nest 3 # often used for items like bowls that # nest together hattrick 3 # Used in sports, especially cricket and ice # hockey to report the number of goals. dicker 10 dozen 12 bakersdozen 13 score 20 flock 40 timer 40 shock 60 toncount 100 # Used in sports in the UK longhundred 120 # From a germanic counting system gross 144 greatgross 12 gross tithe 1|10 # From Anglo-Saxon word for tenth # Paper counting measure shortquire 24 quire 25 shortream 480 ream 500 perfectream 516 bundle 2 reams bale 5 bundles # # Paper measures # # USA paper sizes lettersize 8.5 inch 11 inch legalsize 8.5 inch 14 inch ledgersize 11 inch 17 inch executivesize 7.25 inch 10.5 inch Apaper 8.5 inch 11 inch Bpaper 11 inch 17 inch Cpaper 17 inch 22 inch Dpaper 22 inch 34 inch Epaper 34 inch 44 inch # Correspondence envelope sizes. #10 is the standard business # envelope in the USA. envelope6_25size 3.5 inch 6 inch envelope6_75size 3.625 inch 6.5 inch envelope7size 3.75 inch 6.75 inch envelope7_75size 3.875 inch 7.5 inch envelope8_625size 3.625 inch 8.625 inch envelope9size 3.875 inch 8.875 inch envelope10size 4.125 inch 9.5 inch envelope11size 4.5 inch 10.375 inch envelope12size 4.75 inch 11 inch envelope14size 5 inch 11.5 inch envelope16size 6 inch 12 inch # Announcement envelope sizes (no relation to metric paper sizes like A4) envelopeA1size 3.625 inch 5.125 inch # same as 4bar envelopeA2size 4.375 inch 5.75 inch envelopeA6size 4.75 inch 6.5 inch envelopeA7size 5.25 inch 7.25 inch envelopeA8size 5.5 inch 8.125 inch envelopeA9size 5.75 inch 8.75 inch envelopeA10size 6 inch 9.5 inch # Baronial envelopes envelope4bar 3.625 inch 5.125 inch # same as A1 envelope5_5bar 4.375 inch 5.75 inch envelope6bar 4.75 inch 6.5 inch # Coin envelopes envelope1baby 2.25 inch 3.5 inch # same as #1 coin envelope00coin 1.6875 inch 2.75 inch envelope1coin 2.25 inch 3.5 inch envelope3coin 2.5 inch 4.25 inch envelope4coin 3 inch 4.5 inch envelope4_5coin 3 inch 4.875 inch envelope5coin 2.875 inch 5.25 inch envelope5_5coin 3.125 inch 5.5 inch envelope6coin 3.375 inch 6 inch envelope7coin 3.5 inch 6.5 inch # The metric paper sizes are defined so that if a sheet is cut in half # along the short direction, the result is two sheets which are # similar to the original sheet. This means that for any metric size, # the long side is close to sqrt(2) times the length of the short # side. Each series of sizes is generated by repeated cuts in half, # with the values rounded down to the nearest millimeter. A0paper 841 mm 1189 mm # The basic size in the A series A1paper 594 mm 841 mm # is defined to have an area of A2paper 420 mm 594 mm # one square meter. A3paper 297 mm 420 mm A4paper 210 mm 297 mm A5paper 148 mm 210 mm A6paper 105 mm 148 mm A7paper 74 mm 105 mm A8paper 52 mm 74 mm A9paper 37 mm 52 mm A10paper 26 mm 37 mm B0paper 1000 mm 1414 mm # The basic B size has an area B1paper 707 mm 1000 mm # of sqrt(2) square meters. B2paper 500 mm 707 mm B3paper 353 mm 500 mm B4paper 250 mm 353 mm B5paper 176 mm 250 mm B6paper 125 mm 176 mm B7paper 88 mm 125 mm B8paper 62 mm 88 mm B9paper 44 mm 62 mm B10paper 31 mm 44 mm C0paper 917 mm 1297 mm # The basic C size has an area C1paper 648 mm 917 mm # of sqrt(sqrt(2)) square meters. C2paper 458 mm 648 mm C3paper 324 mm 458 mm # Intended for envelope sizes C4paper 229 mm 324 mm C5paper 162 mm 229 mm C6paper 114 mm 162 mm C7paper 81 mm 114 mm C8paper 57 mm 81 mm C9paper 40 mm 57 mm C10paper 28 mm 40 mm # gsm (Grams per Square Meter), a sane, metric paper weight measure gsm grams / meter^2 # In the USA, a collection of crazy historical paper measures are used. Paper # is measured as a weight of a ream of that particular type of paper. This is # sometimes called the "substance" or "basis" (as in "substance 20" paper). # The standard sheet size or "basis size" varies depending on the type of # paper. As a result, 20 pound bond paper and 50 pound text paper are actually # about the same weight. The different sheet sizes were historically the most # convenient for printing or folding in the different applications. These # different basis weights are standards maintained by American Society for # Testing Materials (ASTM) and the American Forest and Paper Association # (AF&PA). poundbookpaper lb / 25 inch 38 inch ream lbbook poundbookpaper poundtextpaper poundbookpaper lbtext poundtextpaper poundoffsetpaper poundbookpaper # For offset printing lboffset poundoffsetpaper poundbiblepaper poundbookpaper # Designed to be lightweight, thin, lbbible poundbiblepaper # strong and opaque. poundtagpaper lb / 24 inch 36 inch ream lbtag poundtagpaper poundbagpaper poundtagpaper lbbag poundbagpaper poundnewsprintpaper poundtagpaper lbnewsprint poundnewsprintpaper poundposterpaper poundtagpaper lbposter poundposterpaper poundtissuepaper poundtagpaper lbtissue poundtissuepaper poundwrappingpaper poundtagpaper lbwrapping poundwrappingpaper poundwaxingpaper poundtagpaper lbwaxing poundwaxingpaper poundglassinepaper poundtagpaper lbglassine poundglassinepaper poundcoverpaper lb / 20 inch 26 inch ream lbcover poundcoverpaper poundindexpaper lb / 25.5 inch 30.5 inch ream lbindex poundindexpaper poundindexbristolpaper poundindexpaper lbindexbristol poundindexpaper poundbondpaper lb / 17 inch 22 inch ream # Bond paper is stiff and lbbond poundbondpaper # durable for repeated poundwritingpaper poundbondpaper # filing, and it resists lbwriting poundwritingpaper # ink penetration. poundledgerpaper poundbondpaper lbledger poundledgerpaper poundcopypaper poundbondpaper lbcopy poundcopypaper poundblottingpaper lb / 19 inch 24 inch ream lbblotting poundblottingpaper poundblankspaper lb / 22 inch 28 inch ream lbblanks poundblankspaper poundpostcardpaper lb / 22.5 inch 28.5 inch ream lbpostcard poundpostcardpaper poundweddingbristol poundpostcardpaper lbweddingbristol poundweddingbristol poundbristolpaper poundweddingbristol lbbristol poundbristolpaper poundboxboard lb / 1000 ft^2 lbboxboard poundboxboard poundpaperboard poundboxboard lbpaperboard poundpaperboard # When paper is marked in units of M, it means the weight of 1000 sheets of the # given size of paper. To convert this to paper weight, divide by the size of # the paper in question. paperM lb / 1000 # In addition paper weight is reported in "caliper" which is simply the # thickness of one sheet, typically in inches. Thickness is also reported in # "points" where a point is 1|1000 inch. These conversions are supplied to # convert these units roughly (using an approximate density) into the standard # paper weight values. pointthickness 0.001 in paperdensity 0.8 g/cm^3 # approximate--paper densities vary! papercaliper in paperdensity paperpoint pointthickness paperdensity # # Printing # fournierpoint 0.1648 inch / 12 # First definition of the printers # point made by Pierre Fournier who # defined it in 1737 as 1|12 of a # cicero which was 0.1648 inches. olddidotpoint 1|72 frenchinch # FranУЇois Ambroise Didot, one of # a family of printers, changed # Fournier's definition around 1770 # to fit to the French units then in # use. bertholdpoint 1|2660 m # H. Berthold tried to create a # metric version of the didot point # in 1878. INpoint 0.4 mm # This point was created by a # group directed by Fermin Didot in # 1881 and is associated with the # imprimerie nationale. It doesn't # seem to have been used much. germandidotpoint 0.376065 mm # Exact definition appears in DIN # 16507, a German standards document # of 1954. Adopted more broadly in # 1966 by ??? metricpoint 3|8 mm # Proposed in 1977 by Eurograf oldpoint 1|72.27 inch # The American point was invented printerspoint oldpoint # by Nelson Hawks in 1879 and texpoint oldpoint # dominates USA publishing. # It was standardized by the American # Typefounders Association at the # value of 0.013837 inches exactly. # Knuth uses the approximation given # here (which is very close). The # comp.fonts FAQ claims that this # value is supposed to be 1|12 of a # pica where 83 picas is equal to 35 # cm. But this value differs from # the standard. texscaledpoint 1|65536 texpoint # The TeX typesetting system uses texsp texscaledpoint # this for all computations. computerpoint 1|72 inch # The American point was rounded point computerpoint computerpica 12 computerpoint # to an even 1|72 inch by computer postscriptpoint computerpoint # people at some point. pspoint postscriptpoint twip 1|20 point # TWentieth of an Imperial Point Q 1|4 mm # Used in Japanese phototypesetting # Q is for quarter frenchprinterspoint olddidotpoint didotpoint germandidotpoint # This seems to be the dominant value europeanpoint didotpoint # for the point used in Europe cicero 12 didotpoint stick 2 inches # Type sizes excelsior 3 oldpoint brilliant 3.5 oldpoint diamondtype 4 oldpoint pearl 5 oldpoint agate 5.5 oldpoint # Originally agate type was 14 lines per # inch, giving a value of 1|14 in. ruby agate # British nonpareil 6 oldpoint mignonette 6.5 oldpoint emerald mignonette # British minion 7 oldpoint brevier 8 oldpoint bourgeois 9 oldpoint longprimer 10 oldpoint smallpica 11 oldpoint pica 12 oldpoint english 14 oldpoint columbian 16 oldpoint greatprimer 18 oldpoint paragon 20 oldpoint meridian 44 oldpoint canon 48 oldpoint # German type sizes nonplusultra 2 didotpoint brillant 3 didotpoint diamant 4 didotpoint perl 5 didotpoint nonpareille 6 didotpoint kolonel 7 didotpoint petit 8 didotpoint borgis 9 didotpoint korpus 10 didotpoint corpus korpus garamond korpus mittel 14 didotpoint tertia 16 didotpoint text 18 didotpoint kleine_kanon 32 didotpoint kanon 36 didotpoint grobe_kanon 42 didotpoint missal 48 didotpoint kleine_sabon 72 didotpoint grobe_sabon 84 didotpoint # # Information theory units. Note that the name "entropy" is used both # to measure information and as a physical quantity. # INFORMATION bit nat (1/ln(2)) bits # Entropy measured base e hartley log2(10) bits # Entropy of a uniformly ban hartley # distributed random variable # over 10 symbols. dit hartley # from Decimal digIT # # Computer # bps bit/sec # Sometimes the term "baud" is # incorrectly used to refer to # bits per second. Baud refers # to symbols per second. Modern # modems transmit several bits # per symbol. byte 8 bit # Not all machines had 8 bit B byte # bytes, but these days most of # them do. But beware: for # transmission over modems, a # few extra bits are used so # there are actually 10 bits per # byte. octet 8 bits # The octet is always 8 bits nybble 4 bits # Half of a byte. Sometimes # equal to different lengths # such as 3 bits. nibble nybble nyp 2 bits # Donald Knuth asks in an exercise # for a name for a 2 bit # quantity and gives the "nyp" # as a solution due to Gregor # Purdy. Not in common use. meg megabyte # Some people consider these # units along with the kilobyte gig gigabyte # to be defined according to # powers of 2 with the kilobyte # equal to 2^10 bytes, the # megabyte equal to 2^20 bytes and # the gigabyte equal to 2^30 bytes # but these usages are forbidden # by SI. Binary prefixes have # been defined by IEC to replace # the SI prefixes. Use them to # get the binary values: KiB, MiB, # and GiB. jiffy 0.01 sec # This is defined in the Jargon File jiffies jiffy # (http://www.jargon.org) as being the # duration of a clock tick for measuring # wall-clock time. Supposedly the value # used to be 1|60 sec or 1|50 sec # depending on the frequency of AC power, # but then 1|100 sec became more common. # On linux systems, this term is used and # for the Intel based chips, it does have # the value of .01 sec. The Jargon File # also lists two other definitions: # millisecond, and the time taken for # light to travel one foot. cdaudiospeed 44.1 kHz 2*16 bits # CD audio data rate at 44.1 kHz with 2 # samples of sixteen bits each. cdromspeed 75 2048 bytes / sec # For data CDs (mode1) 75 sectors are read # each second with 2048 bytes per sector. # Audio CDs do not have sectors, but # people sometimes divide the bit rate by # 75 and claim a sector length of 2352. # Data CDs have a lower rate due to # increased error correction overhead. # There is a rarely used mode (mode2) with # 2336 bytes per sector that has fewer # error correction bits than mode1. dvdspeed 1385 kB/s # This is the "1x" speed of a DVD using # constant linear velocity (CLV) mode. # Modern DVDs may vary the linear velocity # as they go from the inside to the # outside of the disc. # See http://www.osta.org/technology/dvdqa/dvdqa4.htm # # Musical measures. Musical intervals expressed as ratios. Multiply # two intervals together to get the sum of the interval. The function # musicalcent can be used to convert ratios to cents. # # Perfect intervals octave 2 majorsecond musicalfifth^2 / octave majorthird 5|4 minorthird 6|5 musicalfourth 4|3 musicalfifth 3|2 majorsixth musicalfourth majorthird minorsixth musicalfourth minorthird majorseventh musicalfifth majorthird minorseventh musicalfifth minorthird pythagoreanthird majorsecond musicalfifth^2 / octave syntoniccomma pythagoreanthird / majorthird pythagoreancomma musicalfifth^12 / octave^7 # Equal tempered definitions semitone octave^(1|12) musicalcent(x) units=[1;1] range=(0,) semitone^(x/100) ; \ 100 log(musicalcent)/log(semitone) # # Musical note lengths. # wholenote ! MUSICAL_NOTE_LENGTH wholenote halfnote 1|2 wholenote quarternote 1|4 wholenote eighthnote 1|8 wholenote sixteenthnote 1|16 wholenote thirtysecondnote 1|32 wholenote sixtyfourthnote 1|64 wholenote dotted 3|2 doubledotted 7|4 breve doublewholenote semibreve wholenote minimnote halfnote crotchet quarternote quaver eighthnote semiquaver sixteenthnote demisemiquaver thirtysecondnote hemidemisemiquaver sixtyfourthnote semidemisemiquaver hemidemisemiquaver # # yarn and cloth measures # # yarn linear density woolyarnrun 1600 yard/pound # 1600 yds of "number 1 yarn" weighs # a pound. yarncut 300 yard/pound # Less common system used in # Pennsylvania for wool yarn cottonyarncount 840 yard/pound linenyarncount 300 yard/pound # Also used for hemp and ramie worstedyarncount 1680 ft/pound metricyarncount meter/gram denier 1|9 tex # used for silk and rayon manchesteryarnnumber drams/1000 yards # old system used for silk pli lb/in typp 1000 yd/lb # abbreviation for Thousand Yard Per Pound asbestoscut 100 yd/lb # used for glass and asbestos yarn tex gram / km # rational metric yarn measure, meant drex 0.1 tex # to be used for any kind of yarn poumar lb / 1e6 yard # yarn and cloth length skeincotton 80*54 inch # 80 turns of thread on a reel with a # 54 in circumference (varies for other # kinds of thread) cottonbolt 120 ft # cloth measurement woolbolt 210 ft bolt cottonbolt heer 600 yards cut 300 yards # used for wet-spun linen yarn lea 300 yards sailmakersyard 28.5 in sailmakersounce oz / sailmakersyard 36 inch silkmomme momme / 25 yards 1.49 inch # Traditional silk weight silkmm silkmomme # But it is also defined as # lb/100 yd 45 inch. The two # definitions are slightly different # and neither one seems likely to be # the true source definition. # # drug dosage # mcg microgram # Frequently used for vitamins iudiptheria 62.8 microgram # IU is for international unit iupenicillin 0.6 microgram iuinsulin 41.67 microgram drop 1|20 ml # The drop was an old "unit" that was # replaced by the minim. But I was # told by a pharmacist that in his # profession, the conversion of 20 # drops per ml is actually used. bloodunit 450 ml # For whole blood. For blood # components, a blood unit is the # quanity of the component found in a # blood unit of whole blood. The # human body contains about 12 blood # units of whole blood. # # misc medical measure # frenchcathetersize 1|3 mm # measure used for the outer diameter # of a catheter charriere frenchcathetersize # # fixup units for times when prefix handling doesn't do the job # hectare hectoare megohm megaohm kilohm kiloohm microhm microohm megalerg megaerg # 'L' added to make it pronounceable [18]. # # Money # # Note that US$ is the primitive unit so other currencies are # generally given in US$. # unitedstatesdollar US$ usdollar US$ $ dollar mark germanymark bolivar venezuelabolivar venezuelanbolivarfuerte venezuelabolivar bolivarfuerte bolivar # The currency was revalued by oldbolivar 1|1000 bolivar # a factor of 1000. peseta spainpeseta rand southafricarand escudo portugalescudo guilder netherlandsguilder hollandguilder netherlandsguilder peso mexicopeso yen japanyen lira italylira rupee indiarupee drachma greecedrachma franc francefranc markka finlandmarkka britainpound unitedkingdompound greatbritainpound unitedkingdompound unitedkingdompound ukpound poundsterling britainpound yuan chinayuan # Some European currencies have permanent fixed exchange rates with # the Euro. These rates were taken from the EC's web site: # http://ec.europa.eu/economy_finance/euro/adoption/conversion/index_en.htm austriaschilling 1|13.7603 euro belgiumfranc 1|40.3399 euro estoniakroon 1|15.6466 euro # Equal to 1|8 germanymark finlandmarkka 1|5.94573 euro francefranc 1|6.55957 euro germanymark 1|1.95583 euro greecedrachma 1|340.75 euro irelandpunt 1|0.787564 euro italylira 1|1936.27 euro luxembourgfranc 1|40.3399 euro netherlandsguilder 1|2.20371 euro portugalescudo 1|200.482 euro spainpeseta 1|166.386 euro cypruspound 1|0.585274 euro maltalira 1|0.429300 euro sloveniatolar 1|239.640 euro slovakiakoruna 1|30.1260 euro UKP GBP # Not an ISO code, but looks like one, and # sometimes used on usenet. VEB 1|1000 VEF # old venezuelan bolivar !include currency.units # Money on the gold standard, used in the late 19th century and early # 20th century. olddollargold 23.22 grains goldprice # Used until 1934 newdollargold 96|7 grains goldprice # After Jan 31, 1934 dollargold newdollargold poundgold 113 grains goldprice goldounce goldprice troyounce silverounce silverprice troyounce platinumounce platinumprice troyounce XAU goldounce XPT platinumounce XAG silverounce # Nominal masses of US coins. Note that dimes, quarters and half dollars # have weight proportional to value. Before 1965 it was $40 / kg. USpennyweight 2.5 grams # Since 1982, 48 grains before USnickelweight 5 grams USdimeweight US$ 0.10 / (20 US$ / lb) # Since 1965 USquarterweight US$ 0.25 / (20 US$ / lb) # Since 1965 UShalfdollarweight US$ 0.50 / (20 US$ / lb) # Since 1971 USdollarmass 8.1 grams # British currency quid britainpound # Slang names fiver 5 quid tenner 10 quid monkey 500 quid brgrand 1000 quid bob shilling shilling 1|20 britainpound # Before decimalisation, there oldpence 1|12 shilling # were 20 shillings to a pound, farthing 1|4 oldpence # each of twelve old pence guinea 21 shilling # Still used in horse racing crown 5 shilling florin 2 shilling groat 4 oldpence tanner 6 oldpence brpenny 0.01 britainpound pence brpenny tuppence 2 pence tuppenny tuppence ha'penny halfbrpenny hapenny ha'penny oldpenny oldpence oldtuppence 2 oldpence oldtuppenny oldtuppence threepence 3 oldpence # threepence never refers to new money threepenny threepence oldthreepence threepence oldthreepenny threepence oldhalfpenny halfoldpenny oldha'penny oldhalfpenny oldhapenny oldha'penny brpony 25 britainpound # Canadian currency loony 1 canadadollar # This coin depicts a loon toony 2 canadadollar # # Units used for measuring volume of wood # cord 4*4*8 ft^3 # 4 ft by 4 ft by 8 ft bundle of wood facecord 1|2 cord cordfoot 1|8 cord # One foot long section of a cord cordfeet cordfoot housecord 1|3 cord # Used to sell firewood for residences, # often confusingly called a "cord" boardfoot ft^2 inch # Usually 1 inch thick wood boardfeet boardfoot fbm boardfoot # feet board measure stack 4 yard^3 # British, used for firewood and coal [18] rick 4 ft 8 ft 16 inches # Stack of firewood, supposedly # sometimes called a face cord, but this # value is equal to 1|3 cord. Name # comes from an old Norse word for a # stack of wood. stere m^3 timberfoot ft^3 # Used for measuring solid blocks of wood standard 120 12 ft 11 in 1.5 in # This is the St Petersburg or # Pittsburg standard. Apparently the # term is short for "standard hundred" # which was meant to refer to 100 pieces # of wood (deals). However, this # particular standard is equal to 120 # deals which are 12 ft by 11 in by 1.5 # inches (not the standard deal). hoppusfoot (4/pi) ft^3 # Volume calculation suggested in 1736 hoppusboardfoot 1|12 hoppusfoot # forestry manual by Edward Hoppus, for hoppuston 50 hoppusfoot # estimating the usable volume of a log. # It results from computing the volume # of a cylindrical log of length, L, and # girth (circumference), G, by V=L(G/4)^2. # The hoppus ton is apparently still in # use for shipments from Southeast Asia. # In Britain, the deal is apparently any piece of wood over 6 feet long, over # 7 wide and 2.5 inches thick. The OED doesn't give a standard size. A piece # of wood less than 7 inches wide is called a "batten". This unit is now used # exclusively for fir and pine. deal 12 ft 11 in 2.5 in # The standard North American deal [OED] wholedeal 12 ft 11 in 1.25 in # If it's half as thick as the standard # deal it's called a "whole deal"! splitdeal 12 ft 11 in 5|8 in # And half again as thick is a split deal. # Used for shellac mixing rate poundcut pound / gallon lbcut poundcut # # Gas and Liquid flow units # FLUID_FLOW VOLUME / TIME # Some obvious volumetric gas flow units (cu is short for cubic) cumec m^3/s cusec ft^3/s # Conventional abbreviations for fluid flow units gph gal/hr gpm gal/min mgd megagal/day cfs ft^3/s cfh ft^3/hour cfm ft^3/min lpm liter/min lfm ft/min # Used to report air flow produced by fans. # Multiply by cross sectional area to get a # flow in cfm. pru mmHg / (ml/min) # peripheral resistance unit, used in # medicine to assess blood flow in # the capillaries. # Miner's inch: This is an old historic unit used in the Western United # States. It is generally defined as the rate of flow through a one square # inch hole at a specified depth such as 4 inches. In the late 19th century, # volume of water was sometimes measured in the "24 hour inch". Values for the # miner's inch were fixed by state statues. (This information is from a web # site operated by the Nevada Division of Water Planning: The Water Words # Dictionary at http://www.state.nv.us/cnr/ndwp/dict-1/waterwds.htm.) minersinchAZ 1.5 ft^3/min minersinchCA 1.5 ft^3/min minersinchMT 1.5 ft^3/min minersinchNV 1.5 ft^3/min minersinchOR 1.5 ft^3/min minersinchID 1.2 ft^3/min minersinchKS 1.2 ft^3/min minersinchNE 1.2 ft^3/min minersinchNM 1.2 ft^3/min minersinchND 1.2 ft^3/min minersinchSD 1.2 ft^3/min minersinchUT 1.2 ft^3/min minersinchCO 1 ft^3/sec / 38.4 # 38.4 miner's inches = 1 ft^3/sec minersinchBC 1.68 ft^3/min # British Columbia # Oceanographic flow sverdrup 1e6 m^3 / sec # Used to express flow of ocean # currents. Named after Norwegian # oceanographer H. Sverdrup. # In vacuum science and some other applications, gas flow is measured # as the product of volumetric flow and pressure. This is useful # because it makes it easy to compare with the flow at standard # pressure (one atmosphere). It also directly relates to the number # of gas molecules per unit time, and hence to the mass flow if the # molecular mass is known. GAS_FLOW PRESSURE FLUID_FLOW sccm atm cc/min # 's' is for "standard" to indicate sccs atm cc/sec # flow at standard pressure scfh atm ft^3/hour # scfm atm ft^3/min slpm atm liter/min slph atm liter/hour lusec liter micron Hg / s # Used in vacuum science # US Standard Atmosphere (1976) # Atmospheric temperature and pressure vs. geometric height above sea level # This definition covers only the troposphere (the lowest atmospheric # layer, up to 11 km), and assumes the layer is polytropic. # A polytropic process is one for which PV^k = const, where P is the # pressure, V is the volume, and k is the polytropic exponent. The # polytropic index is n = 1 / (k - 1). As noted in the Wikipedia article # https://en.wikipedia.org/wiki/Polytropic_process, some authors reverse # the definitions of "exponent" and "index." The functions below assume # the following parameters: # temperature lapse rate, -dT/dz, in troposphere lapserate 6.5 K/km # US Std Atm (1976) # air molecular weight, including constituent mol wt, given # in Table 3, p. 3 air_1976 78.084 % 28.0134 \ + 20.9476 % 31.9988 \ + 9340 ppm 39.948 \ + 314 ppm 44.00995 \ + 18.18 ppm 20.183 \ + 5.24 ppm 4.0026 \ + 2 ppm 16.04303 \ + 1.14 ppm 83.80 \ + 0.55 ppm 2.01594 \ + 0.087 ppm 131.30 # universal gas constant R_1976 8.31432e3 N m/(kmol K) # polytropic index n polyndx_1976 air_1976 (kg/kmol) gravity/(R_1976 lapserate) - 1 # If desired, redefine using current values for air mol wt and R polyndx polyndx_1976 # polyndx air (kg/kmol) gravity/(R lapserate) - 1 # for comparison with various references polyexpnt (polyndx + 1) / polyndx # The model assumes the following reference values: # sea-level temperature and pressure stdatmT0 288.15 K stdatmP0 atm # "effective radius" for relation of geometric to geopotential height, # at a latitude at which g = 9.80665 m/s (approximately 45.543 deg); no # relation to actual radius earthradUSAtm 6356766 m # Temperature vs. geopotential height h # Assumes 15 degC at sea level # Based on approx 45 deg latitude # Lower limits of domain and upper limits of range are those of the # tables in US Standard Atmosphere (NASA 1976) stdatmTH(h) units=[m;K] domain=[-5000,11e3] range=[217,321] \ stdatmT0+(-lapserate h) ; (stdatmT0+(-stdatmTH))/lapserate # Temperature vs. geometric height z; based on approx 45 deg latitude stdatmT(z) units=[m;K] domain=[-5000,11e3] range=[217,321] \ stdatmTH(geop_ht(z)) ; ~geop_ht(~stdatmTH(stdatmT)) # Pressure vs. geopotential height h # Assumes 15 degC and 101325 Pa at sea level # Based on approx 45 deg latitude # Lower limits of domain and upper limits of range are those of the # tables in US Standard Atmosphere (NASA 1976) stdatmPH(h) units=[m;Pa] domain=[-5000,11e3] range=[22877,177764] \ atm (1 - (lapserate/stdatmT0) h)^(polyndx + 1) ; \ (stdatmT0/lapserate) (1+(-(stdatmPH/stdatmP0)^(1/(polyndx + 1)))) # Pressure vs. geometric height z; based on approx 45 deg latitude stdatmP(z) units=[m;Pa] domain=[-5000,11e3] range=[22877,177764] \ stdatmPH(geop_ht(z)); ~geop_ht(~stdatmPH(stdatmP)) # Geopotential height from geometric height # Based on approx 45 deg latitude # Lower limits of domain and range are somewhat arbitrary; they # correspond to the limits in the US Std Atm tables geop_ht(z) units=[m;m] domain=[-5000,) range=[-5004,) \ (earthradUSAtm z) / (earthradUSAtm + z) ; \ (earthradUSAtm geop_ht) / (earthradUSAtm + (-geop_ht)) # The standard value for the sea-level acceleration due to gravity is # 9.80665 m/s^2, but the actual value varies with latitude (Harrison 1949) # R_eff = 2 g_phi / denom # g_phi = 978.0356e-2 (1+0.0052885 sin(lat)^2+(-0.0000059) sin(2 lat)^2) # or # g_phi = 980.6160e-2 (1+(-0.0026373) cos(2 lat)+0.0000059 cos(2 lat)^2) # denom = 3.085462e-6+2.27e-9 cos(2 lat)+(-2e-12) cos(4 lat) (minutes?) # There is no inverse function; the standard value applies at a latitude # of about 45.543 deg g_phi(lat) units=[deg;m/s2] domain=[0,90] noerror \ 980.6160e-2 (1+(-0.0026373) cos(2 lat)+0.0000059 cos(2 lat)^2) m/s2 # effective Earth radius for relation of geometric height to # geopotential height, as function of latitude (Harrison 1949) earthradius_eff(lat) units=[deg;m] domain=[0,90] noerror \ m 2 9.780356 (1+0.0052885 sin(lat)^2+(-0.0000059) sin(2 lat)^2) / \ (3.085462e-6 + 2.27e-9 cos(2 lat) + (-2e-12) cos(4 lat)) # References # Harrison, L.P. 1949. Relation Between Geopotential and Geometric # Height. In Smithsonian Meteorological Tables. List, Robert J., ed. # 6th ed., 4th reprint, 1968. Washington, DC: Smithsonian Institution. # NASA. US National Aeronautics and Space Administration. 1976. # US Standard Atmosphere 1976. Washington, DC: US Government Printing Office. # Gauge pressure functions # # Gauge pressure is measured relative to atmospheric pressure. In the English # system, where pressure is often given in pounds per square inch, gauge # pressure is often indicated by 'psig' to distinguish it from absolute # pressure, often indicated by 'psia'. At the standard atmospheric pressure # of 14.696 psia, a gauge pressure of 0 psig is an absolute pressure of 14.696 # psia; an automobile tire inflated to 31 psig has an absolute pressure of # 45.696 psia. # # With gaugepressure(), the units must be specified (e.g., gaugepressure(1.5 # bar)); with psig(), the units are taken as psi, so the example above of tire # pressure could be given as psig(31). # # If the normal elevation is significantly different from sea level, change # Patm appropriately, and adjust the lower domain limit on the gaugepressure # definition. Patm atm gaugepressure(x) units=[Pa;Pa] domain=[-101325,) range=[0,) \ x + Patm ; gaugepressure+(-Patm) psig(x) units=[1;Pa] domain=[-14.6959487755135,) range=[0,) \ gaugepressure(x psi) ; ~gaugepressure(psig) / psi # # Wire Gauge # # This area is a nightmare with huge charts of wire gauge diameters # that usually have no clear origin. There are at least 5 competing wire gauge # systems to add to the confusion. The use of wire gauge is related to the # manufacturing method: a metal rod is heated and drawn through a hole. The # size change can't be too big. To get smaller wires, the process is repeated # with a series of smaller holes. Generally larger gauges mean smaller wires. # The gauges often have values such as "00" and "000" which are larger sizes # than simply "0" gauge. In the tables that appear below, these gauges must be # specified as negative numbers (e.g. "00" is -1, "000" is -2, etc). # Alternatively, you can use the following units: # g00 (-1) g000 (-2) g0000 (-3) g00000 (-4) g000000 (-5) g0000000 (-6) # American Wire Gauge (AWG) or Brown & Sharpe Gauge appears to be the most # important gauge. ASTM B-258 specifies that this gauge is based on geometric # interpolation between gauge 0000, which is 0.46 inches exactly, and gauge 36 # which is 0.005 inches exactly. Therefore, the diameter in inches of a wire # is given by the formula 1|200 92^((36-g)/39). Note that 92^(1/39) is close # to 2^(1/6), so diameter is approximately halved for every 6 gauges. For the # repeated zero values, use negative numbers in the formula. The same document # also specifies rounding rules which seem to be ignored by makers of tables. # Gauges up to 44 are to be specified with up to 4 significant figures, but no # closer than 0.0001 inch. Gauges from 44 to 56 are to be rounded to the # nearest 0.00001 inch. # # In addition to being used to measure wire thickness, this gauge is used to # measure the thickness of sheets of aluminum, copper, and most metals other # than steel, iron and zinc. wiregauge(g) units=[1;m] range=(0,) \ 1|200 92^((36+(-g))/39) in; 36+(-39)ln(200 wiregauge/in)/ln(92) awg() wiregauge # Next we have the SWG, the Imperial or British Standard Wire Gauge. This one # is piecewise linear. It was used for aluminum sheets. brwiregauge[in] \ -6 0.5 \ -5 0.464 \ -3 0.4 \ -2 0.372 \ 3 0.252 \ 6 0.192 \ 10 0.128 \ 14 0.08 \ 19 0.04 \ 23 0.024 \ 26 0.018 \ 28 0.0148 \ 30 0.0124 \ 39 0.0052 \ 49 0.0012 \ 50 0.001 # The following is from the Appendix to ASTM B 258 # # For example, in U.S. gage, the standard for sheet metal is based on the # weight of the metal, not on the thickness. 16-gage is listed as # approximately .0625 inch thick and 40 ounces per square foot (the original # standard was based on wrought iron at .2778 pounds per cubic inch; steel # has almost entirely superseded wrought iron for sheet use, at .2833 pounds # per cubic inch). Smaller numbers refer to greater thickness. There is no # formula for converting gage to thickness or weight. # # It's rather unclear from the passage above whether the plate gauge values are # therefore wrong if steel is being used. Reference [15] states that steel is # in fact measured using this gauge (under the name Manufacturers' Standard # Gauge) with a density of 501.84 lb/ft3 = 0.2904 lb/in3 used for steel. # But this doesn't seem to be the correct density of steel (.2833 lb/in3 is # closer). # # This gauge was established in 1893 for purposes of taxation. # Old plate gauge for iron plategauge[(oz/ft^2)/(480*lb/ft^3)] \ -5 300 \ 1 180 \ 14 50 \ 16 40 \ 17 36 \ 20 24 \ 26 12 \ 31 7 \ 36 4.5 \ 38 4 # Manufacturers Standard Gage stdgauge[(oz/ft^2)/(501.84*lb/ft^3)] \ -5 300 \ 1 180 \ 14 50 \ 16 40 \ 17 36 \ 20 24 \ 26 12 \ 31 7 \ 36 4.5 \ 38 4 # A special gauge is used for zinc sheet metal. Notice that larger gauges # indicate thicker sheets. zincgauge[in] \ 1 0.002 \ 10 0.02 \ 15 0.04 \ 19 0.06 \ 23 0.1 \ 24 0.125 \ 27 0.5 \ 28 1 # # Screw sizes # # In the USA, screw diameters are reported using a gauge number. # Metric screws are reported as Mxx where xx is the diameter in mm. # screwgauge(g) units=[1;m] range=[0,) \ (.06 + .013 g) in ; (screwgauge/in + (-.06)) / .013 # # Abrasive grit size # # Standards governing abrasive grit sizes are complicated, specifying # fractions of particles that are passed or retained by different mesh # sizes. As a result, it is not possible to make precise comparisons # of different grit standards. The tables below allow the # determination of rough equivlants by using median particle size. # # Standards in the USA are determined by the Unified Abrasives # Manufacturers' Association (UAMA), which resulted from the merger of # several previous organizations. One of the old organizations was # CAMI (Coated Abrasives Manufacturers' Institute). # # UAMA has a web page with plots showing abrasive particle ranges for # various different grits and comparisons between standards. # # http://www.uama.org/Abrasives101/101Standards.html # # Abrasives are grouped into "bonded" abrasives for use with grinding # wheels and "coated" abrasives for sandpapers and abrasive films. # The industry uses different grit standards for these two # categories. # # Another division is between "macrogrits", grits below 240 and # "microgrits", which are above 240. Standards differ, as do methods # for determining particle size. In the USA, ANSI B74.12 is the # standard governing macrogrits. ANSI B74.10 covers bonded microgrit # abrasives, and ANSI B74.18 covers coated microgrit abrasives. It # appears that the coated standard is identical to the bonded standard # for grits up through 600 but then diverges significantly. # # European grit sizes are determined by the Federation of European # Producers of Abrasives. http://www.fepa-abrasives.org # # They give two standards, the "F" grit for bonded abrasives and the # "P" grit for coated abrasives. This data is taken directly from # their web page. # FEPA P grit for coated abrasives is commonly seen on sandpaper in # the USA where the paper will be marked P600, for example. FEPA P # grits are said to be more tightly constrained than comparable ANSI # grits so that the particles are more uniform in size and hence give # a better finish. grit_P[micron] \ 12 1815 \ 16 1324 \ 20 1000 \ 24 764 \ 30 642 \ 36 538 \ 40 425 \ 50 336 \ 60 269 \ 80 201 \ 100 162 \ 120 125 \ 150 100 \ 180 82 \ 220 68 \ 240 58.5 \ 280 52.2 \ 320 46.2 \ 360 40.5 \ 400 35 \ 500 30.2 \ 600 25.8 \ 800 21.8 \ 1000 18.3 \ 1200 15.3 \ 1500 12.6 \ 2000 10.3 \ 2500 8.4 # The F grit is the European standard for bonded abrasives such as # grinding wheels grit_F[micron] \ 4 4890 \ 5 4125 \ 6 3460 \ 7 2900 \ 8 2460 \ 10 2085 \ 12 1765 \ 14 1470 \ 16 1230 \ 20 1040 \ 22 885 \ 24 745 \ 30 625 \ 36 525 \ 40 438 \ 46 370 \ 54 310 \ 60 260 \ 70 218 \ 80 185 \ 90 154 \ 100 129 \ 120 109 \ 150 82 \ 180 69 \ 220 58 \ 230 53 \ 240 44.5 \ 280 36.5 \ 320 29.2 \ 360 22.8 \ 400 17.3 \ 500 12.8 \ 600 9.3 \ 800 6.5 \ 1000 4.5 \ 1200 3 \ 1500 2.0 \ 2000 1.2 # According to the UAMA web page, the ANSI bonded and ANSI coated standards # are identical to FEPA F in the macrogrit range (under 240 grit), so these # values are taken from the FEPA F table. The values for 240 and above are # from the UAMA web site and represent the average of the "d50" range # endpoints listed there. ansibonded[micron] \ 4 4890 \ 5 4125 \ 6 3460 \ 7 2900 \ 8 2460 \ 10 2085 \ 12 1765 \ 14 1470 \ 16 1230 \ 20 1040 \ 22 885 \ 24 745 \ 30 625 \ 36 525 \ 40 438 \ 46 370 \ 54 310 \ 60 260 \ 70 218 \ 80 185 \ 90 154 \ 100 129 \ 120 109 \ 150 82 \ 180 69 \ 220 58 \ 240 50 \ 280 39.5 \ 320 29.5 \ 360 23 \ 400 18.25 \ 500 13.9 \ 600 10.55 \ 800 7.65 \ 1000 5.8 \ 1200 3.8 grit_ansibonded() ansibonded # Like the bonded grit, the coated macrogrits below 240 are taken from the # FEPA F table. Data above this is from the UAMA site. Note that the coated # and bonded standards are evidently the same from 240 up to 600 grit, but # starting at 800 grit, the coated standard diverges. The data from UAMA show # that 800 grit coated has an average size slightly larger than the average # size of 600 grit coated/bonded. However, the 800 grit has a significantly # smaller particle size variation. # # Because of this non-monotonicity from 600 grit to 800 grit this definition # produces a warning about the lack of a unique inverse. ansicoated[micron] noerror \ 4 4890 \ 5 4125 \ 6 3460 \ 7 2900 \ 8 2460 \ 10 2085 \ 12 1765 \ 14 1470 \ 16 1230 \ 20 1040 \ 22 885 \ 24 745 \ 30 625 \ 36 525 \ 40 438 \ 46 370 \ 54 310 \ 60 260 \ 70 218 \ 80 185 \ 90 154 \ 100 129 \ 120 109 \ 150 82 \ 180 69 \ 220 58 \ 240 50 \ 280 39.5 \ 320 29.5 \ 360 23 \ 400 18.25 \ 500 13.9 \ 600 10.55 \ 800 11.5 \ 1000 9.5 \ 2000 7.2 \ 2500 5.5 \ 3000 4 \ 4000 3 \ 6000 2 \ 8000 1.2 grit_ansicoated() ansicoated # # Is this correct? This is the JIS Japanese standard used on waterstones # jisgrit[micron] \ 150 75 \ 180 63 \ 220 53 \ 280 48 \ 320 40 \ 360 35 \ 400 30 \ 600 20 \ 700 17 \ 800 14 \ 1000 11.5 \ 1200 9.5 \ 1500 8 \ 2000 6.7 \ 2500 5.5 \ 3000 4 \ 4000 3 \ 6000 2 \ 8000 1.2 # The "Finishing Scale" marked with an A (e.g. A75). This information # is from the web page of the sand paper manufacturer Klingspor # http://www.klingspor.com/gritgradingsystems.htm # # I have no information about what this scale is used for. grit_A[micron]\ 16 15.3 \ 25 21.8 \ 30 23.6 \ 35 25.75 \ 45 35 \ 60 46.2 \ 65 53.5 \ 75 58.5 \ 90 65 \ 110 78 \ 130 93 \ 160 127 \ 200 156 # # Grits for DMT brand diamond sharpening stones from # http://dmtsharp.com/products/colorcode.htm # dmtxxcoarse 120 micron # 120 mesh dmtsilver dmtxxcoarse dmtxx dmtxxcoarse dmtxcoarse 60 micron # 220 mesh dmtx dmtxcoarse dmtblack dmtxcoarse dmtcoarse 45 micron # 325 mesh dmtc dmtcoarse dmtblue dmtcoarse dmtfine 25 micron # 600 mesh dmtred dmtfine dmtf dmtfine dmtefine 9 micron # 1200 mesh dmte dmtefine dmtgreen dmtefine dmtceramic 7 micron # 2200 mesh dmtcer dmtceramic dmtwhite dmtceramic dmteefine 3 micron # 8000 mesh dmttan dmteefine dmtee dmteefine # # The following values come from a page in the Norton Stones catalog, # available at their web page, http://www.nortonstones.com. # hardtranslucentarkansas 6 micron # Natural novaculite (silicon quartz) softarkansas 22 micron # stones extrafineindia 22 micron # India stones are Norton's manufactured fineindia 35 micron # aluminum oxide product mediumindia 53.5 micron coarseindia 97 micron finecrystolon 45 micron # Crystolon stones are Norton's mediumcrystalon 78 micron # manufactured silicon carbide product coarsecrystalon 127 micron # The following are not from the Norton catalog hardblackarkansas 6 micron hardwhitearkansas 11 micron washita 35 micron # # Ring size. All ring sizes are given as the circumference of the ring. # # USA ring sizes. Several slightly different definitions seem to be in # circulation. According to [15], the interior diameter of size n ring in # inches is 0.32 n + 0.458 for n ranging from 3 to 13.5 by steps of 0.5. The # size 2 ring is inconsistently 0.538in and no 2.5 size is listed. # # However, other sources list 0.455 + 0.0326 n and 0.4525 + 0.0324 n as the # diameter and list no special case for size 2. (Or alternatively they are # 1.43 + .102 n and 1.4216+.1018 n for measuring circumference in inches.) One # reference claimed that the original system was that each size was 1|10 inch # circumference, but that source doesn't have an explanation for the modern # system which is somewhat different. ringsize(n) units=[1;in] domain=[2,) range=[1.6252,) \ (1.4216+.1018 n) in ; (ringsize/in + (-1.4216))/.1018 # Old practice in the UK measured rings using the "Wheatsheaf gauge" with sizes # specified alphabetically and based on the ring inside diameter in steps of # 1|64 inch. This system was replaced in 1987 by British Standard 6820 which # specifies sizes based on circumference. Each size is 1.25 mm different from # the preceding size. The baseline is size C which is 40 mm circumference. # The new sizes are close to the old ones. Sometimes it's necessary to go # beyond size Z to Z+1, Z+2, etc. sizeAring 37.50 mm sizeBring 38.75 mm sizeCring 40.00 mm sizeDring 41.25 mm sizeEring 42.50 mm sizeFring 43.75 mm sizeGring 45.00 mm sizeHring 46.25 mm sizeIring 47.50 mm sizeJring 48.75 mm sizeKring 50.00 mm sizeLring 51.25 mm sizeMring 52.50 mm sizeNring 53.75 mm sizeOring 55.00 mm sizePring 56.25 mm sizeQring 57.50 mm sizeRring 58.75 mm sizeSring 60.00 mm sizeTring 61.25 mm sizeUring 62.50 mm sizeVring 63.75 mm sizeWring 65.00 mm sizeXring 66.25 mm sizeYring 67.50 mm sizeZring 68.75 mm # Japanese sizes start with size 1 at a 13mm inside diameter and each size is # 1|3 mm larger in diameter than the previous one. They are multiplied by pi # to give circumference. jpringsize(n) units=[1;mm] domain=[1,) range=[0.040840704,) \ (38|3 + n/3) pi mm ; 3 jpringsize/ pi mm + (-38) # The European ring sizes are the length of the circumference in mm minus 40. euringsize(n) units=[1;mm] (n+40) mm ; euringsize/mm + (-40) # # Abbreviations # mph mile/hr mpg mile/gal kph km/hr fL footlambert fpm ft/min fps ft/s rpm rev/min rps rev/sec mi mile smi mile nmi nauticalmile mbh 1e3 btu/hour mcm 1e3 circularmil ipy inch/year # used for corrosion rates ccf 100 ft^3 # used for selling water [18] Mcf 1000 ft^3 # not million cubic feet [18] kp kilopond kpm kp meter Wh W hour hph hp hour plf lb / foot # pounds per linear foot # # Compatibility units with unix version # pa Pa ev eV hg Hg oe Oe mh mH rd rod pf pF gr grain nt N hz Hz hd hogshead dry drygallon/gallon nmile nauticalmile beV GeV bev beV coul C # # Radioactivity units # becquerel /s # Activity of radioactive source Bq becquerel # curie 3.7e10 Bq # Defined in 1910 as the radioactivity Ci curie # emitted by the amount of radon that is # in equilibrium with 1 gram of radium. rutherford 1e6 Bq # RADIATION_DOSE gray gray J/kg # Absorbed dose of radiation Gy gray # rad 1e-2 Gy # From Radiation Absorbed Dose rep 8.38 mGy # Roentgen Equivalent Physical, the amount # of radiation which , absorbed in the # body, would liberate the same amount # of energy as 1 roentgen of X rays # would, or 97 ergs. sievert J/kg # Dose equivalent: dosage that has the Sv sievert # same effect on human tissues as 200 rem 1e-2 Sv # keV X-rays. Different types of # radiation are weighted by the # Relative Biological Effectiveness # (RBE). # # Radiation type RBE # X-ray, gamma ray 1 # beta rays, > 1 MeV 1 # beta rays, < 1 MeV 1.08 # neutrons, < 1 MeV 4-5 # neutrons, 1-10 MeV 10 # protons, 1 MeV 8.5 # protons, .1 MeV 10 # alpha, 5 MeV 15 # alpha, 1 MeV 20 # # The energies are the kinetic energy # of the particles. Slower particles # interact more, so they are more # effective ionizers, and hence have # higher RBE values. # # rem stands for Roentgen Equivalent # Mammal roentgen 2.58e-4 C / kg # Ionizing radiation that produces # 1 statcoulomb of charge in 1 cc of # dry air at stp. rontgen roentgen # Sometimes it appears spelled this way sievertunit 8.38 rontgen # Unit of gamma ray dose delivered in one # hour at a distance of 1 cm from a # point source of 1 mg of radium # enclosed in platinum .5 mm thick. eman 1e-7 Ci/m^3 # radioactive concentration mache 3.7e-7 Ci/m^3 # # Atomic weights. The atomic weight of an element is the ratio of the mass of # a mole of the element to 1|12 of a mole of Carbon 12. The Standard Atomic # Weights apply to the elements as they occur naturally on earth. Elements # which do not occur naturally or which occur with wide isotopic variability do # not have Standard Atomic Weights. For these elements, the atomic weight is # based on the longest lived isotope, as marked in the comments. In some # cases, the comment for these entries also gives a number which is an atomic # weight for a different isotope that may be of more interest than the longest # lived isotope. # actinium 227.0278 aluminum 26.981539 americium 243.0614 # Longest lived. 241.06 antimony 121.760 argon 39.948 arsenic 74.92159 astatine 209.9871 # Longest lived barium 137.327 berkelium 247.0703 # Longest lived. 249.08 beryllium 9.012182 bismuth 208.98037 boron 10.811 bromine 79.904 cadmium 112.411 calcium 40.078 californium 251.0796 # Longest lived. 252.08 carbon 12.011 cerium 140.115 cesium 132.90543 chlorine 35.4527 chromium 51.9961 cobalt 58.93320 copper 63.546 curium 247.0703 deuterium 2.0141017778 dysprosium 162.50 einsteinium 252.083 # Longest lived erbium 167.26 europium 151.965 fermium 257.0951 # Longest lived fluorine 18.9984032 francium 223.0197 # Longest lived gadolinium 157.25 gallium 69.723 germanium 72.61 gold 196.96654 hafnium 178.49 helium 4.002602 holmium 164.93032 hydrogen 1.00794 indium 114.818 iodine 126.90447 iridium 192.217 iron 55.845 krypton 83.80 lanthanum 138.9055 lawrencium 262.11 # Longest lived lead 207.2 lithium 6.941 lutetium 174.967 magnesium 24.3050 manganese 54.93805 mendelevium 258.10 # Longest lived mercury 200.59 molybdenum 95.94 neodymium 144.24 neon 20.1797 neptunium 237.0482 nickel 58.6934 niobium 92.90638 nitrogen 14.00674 nobelium 259.1009 # Longest lived osmium 190.23 oxygen 15.9994 palladium 106.42 phosphorus 30.973762 platinum 195.08 plutonium 244.0642 # Longest lived. 239.05 polonium 208.9824 # Longest lived. 209.98 potassium 39.0983 praseodymium 140.90765 promethium 144.9127 # Longest lived. 146.92 protactinium 231.03588 radium 226.0254 radon 222.0176 # Longest lived rhenium 186.207 rhodium 102.90550 rubidium 85.4678 ruthenium 101.07 samarium 150.36 scandium 44.955910 selenium 78.96 silicon 28.0855 silver 107.8682 sodium 22.989768 strontium 87.62 sulfur 32.066 tantalum 180.9479 technetium 97.9072 # Longest lived. 98.906 tellurium 127.60 terbium 158.92534 thallium 204.3833 thorium 232.0381 thullium 168.93421 tin 118.710 titanium 47.867 tungsten 183.84 uranium 238.0289 vanadium 50.9415 xenon 131.29 ytterbium 173.04 yttrium 88.90585 zinc 65.39 zirconium 91.224 # Average molecular weight of air # # The atmospheric composition listed is from NASA Earth Fact Sheet (accessed # 28 August 2015) # http://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html # Numbers do not add up to exactly 100% due to roundoff and uncertainty Water # is highly variable, typically makes up about 1% air 78.08% nitrogen 2 \ + 20.95% oxygen 2 \ + 9340 ppm argon \ + 400 ppm (carbon + oxygen 2) \ + 18.18 ppm neon \ + 5.24 ppm helium \ + 1.7 ppm (carbon + 4 hydrogen) \ + 1.14 ppm krypton \ + 0.55 ppm hydrogen 2 # # population units # people 1 person people death people capita people percapita per capita # TGM dozen based unit system listed on the "dozenal" forum # http://www.dozenalsociety.org.uk/apps/tgm.htm. These units are # proposed as an allegedly more rational alternative to the SI system. Tim 12^-4 hour # Time Grafut gravity Tim^2 # Length based on gravity Surf Grafut^2 # area Volm Grafut^3 # volume Vlos Grafut/Tim # speed Denz Maz/Volm # density Mag Maz gravity # force Maz Volm kg / oldliter # mass based on water Tm Tim # Abbreviations Gf Grafut Sf Surf Vm Volm Vl Vlos Mz Maz Dz Denz # Dozen based unit prefixes Zena- 12 Duna- 12^2 Trina- 12^3 Quedra- 12^4 Quena- 12^5 Hesa- 12^6 Seva- 12^7 Aka- 12^8 Neena- 12^9 Dexa- 12^10 Lefa- 12^11 Zennila- 12^12 Zeni- 12^-1 Duni- 12^-2 Trini- 12^-3 Quedri- 12^-4 Queni- 12^-5 Hesi- 12^-6 Sevi- 12^-7 Aki- 12^-8 Neeni- 12^-9 Dexi- 12^-10 Lefi- 12^-11 Zennili- 12^-12 # # Traditional Japanese units (shakkanhou) # # The traditional system of weights and measures is called shakkanhou from the # shaku and the ken. Japan accepted SI units in 1891 and legalized conversions # to the traditional system. In 1909 the inch-pound system was also legalized, # so Japan had three legally approved systems. A change to the metric system # started in 1921 but there was a lot of resistance. The Measurement Law of # October 1999 prohibits sales in anything but SI units. However, the old # units still live on in construction and as the basis for paper sizes of books # and tools used for handicrafts. # # Note that units below use the Hepburn romanization system. Some other # systems would render "mou", "jou", and "chou" as "mo", "jo" and "cho". # # # http://hiramatu-hifuka.com/onyak/onyindx.html # Japanese Proportions. These are still in everyday use. They also # get used as units to represent the proportion of the standard unit. wari_proportion 1|10 wari wari_proportion bu_proportion 1|100 # The character bu can also be read fun or bun # but usually "bu" is used for units. rin_proportion 1|1000 mou_proportion 1|10000 # Japanese Length Measures # # The length system is called kanejaku or # square and originated in China. It was # adopted as Japan's official measure in 701 # by the Taiho Code. This system is still in # common use in architecture and clothing. shaku 1|3.3 m mou 1|10000 shaku rin 1|1000 shaku bu_distance 1|100 shaku sun 1|10 shaku jou_distance 10 shaku jou jou_distance kanejakusun sun # Alias to emphasize architectural name kanejaku shaku kanejakujou jou # http://en.wikipedia.org/wiki/Taiwanese_units_of_measurement taichi shaku # http://zh.wikipedia.org/wiki/хАхАК taicun sun # http://zh.wikipedia.org/wiki/хАхˆЖ !utf8 хАхАК taichi # via Hanyu Pinyin romanizations хАхЏИ taicun !endutf8 # In context of clothing, shaku is different from architecture # http://www.scinet.co.jp/sci/sanwa/kakizaki-essay54.html kujirajaku 10|8 shaku kujirajakusun 1|10 kujirajaku kujirajakubu 1|100 kujirajaku kujirajakujou 10 kujirajaku tan_distance 3 kujirajakujou ken 6 shaku # Also sometimes 6.3, 6.5, or 6.6 # http://www.homarewood.co.jp/syakusun.htm # mostly unused chou_distance 60 ken chou chou_distance ri 36 chou # Japanese Area Measures # Tsubo is still used for land size, though the others are more # recognized by their homonyms in the other measurements. gou_area 1|10 tsubo tsubo 36 shaku^2 # Size of two tatami = ken^2 ?? se 30 tsubo tan_area 10 se chou_area 10 tan_area # http://en.wikipedia.org/wiki/Taiwanese_units_of_measurement ping tsubo # http://zh.wikipedia.org/wiki/хЊ jia 2934 ping # http://zh.wikipedia.org/wiki/ч”В_(х•фН) fen 1|10 jia # http://zh.wikipedia.org/wiki/хˆ† fen_area 1|10 jia # Protection against future collisions !utf8 хЊ ping # via Hanyu Pinyin romanizations ч”В jia хˆ† fen хˆ†хœА fen_area # Protection against future collisions !endutf8 # Japanese architecture is based on a "standard" size of tatami mat. # Room sizes today are given in number of tatami, and this number # determines the spacing between colums and hence sizes of sliding # doors and paper screens. However, every region has its own slightly # different tatami size. Edoma, used in and around Tokyo and # Hokkaido, is becoming a nationwide standard. Kyouma is used around # Kyoto, Osaka and Kyuushu, and Chuukyouma is used around Nagoya. # Note that the tatami all have the aspect ratio 2:1 so that the mats # can tile the room with some of them turned 90 degrees. # # http://www.moon2.net/tatami/infotatami/structure.html edoma (5.8*2.9) shaku^2 kyouma (6.3*3.15) shaku^2 chuukyouma (6*3) shaku^2 jou_area edoma tatami jou_area # Japanese Volume Measures # The "shou" is still used for such things as alcohol and seasonings. # Large quantities of paint are still purchased in terms of "to". shaku_volume 1|10 gou_volume gou_volume 1|10 shou gou gou_volume shou (4.9*4.9*2.7) sun^3 # The character shou which is # the same as masu refers to a # rectangular wooden cup used to # measure liquids and cereal. # Sake is sometimes served in a masu # Note that it happens to be # EXACTLY 7^4/11^3 liters. to 10 shou koku 10 to # No longer used; historically a measure of rice # Japanese Weight Measures # # http://wyoming.hp.infoseek.co.jp/zatugaku/zamoney.html # Not really used anymore. rin_weight 1|10 bu_weight bu_weight 1|10 monme fun 1|10 monme monme momme kin 160 monme kan 1000 monme kwan kan # This was the old pronounciation of the unit. # The old spelling persisted a few centuries # longer and was not changed until around # 1950. # http://en.wikipedia.org/wiki/Taiwanese_units_of_measurement # says: "Volume measure in Taiwan is largely metric". taijin kin # http://zh.wikipedia.org/wiki/хАц–Є tailiang 10 monme # http://zh.wikipedia.org/wiki/хАц–Є taiqian monme # http://zh.wikipedia.org/wiki/хАхˆЖ !utf8 хАц–Є taijin # via Hanyu Pinyin romanizations хАх…Љ tailiang хАщŒЂ taiqian !endutf8 # # Australian unit # australiasquare (10 ft)^2 # Used for house area # # A few German units as currently in use. # zentner 50 kg doppelzentner 2 zentner pfund 500 g # # Some traditional Russian measures # # If you would like to help expand this section and understand # cyrillic transliteration, let me know. These measures are meant to # reflect common usage, e.g. in translated literature. # dessiatine 2400 sazhen^2 # Land measure dessjatine dessiatine funt 409.51718 grams # similar to pound zolotnik 1|96 funt # used for precious metal measure pood 40 funt # common in agricultural measure arshin (2 + 1|3) feet sazhen 3 arshin # analogous to fathom verst 500 sazhen # of similar use to mile versta verst borderverst 1000 sazhen russianmile 7 verst # # Old French distance measures, from French Weights and Measures # Before the Revolution by Zupko # frenchfoot 144|443.296 m # pied de roi, the standard of Paris. pied frenchfoot # Half of the hashimicubit, frenchfeet frenchfoot # instituted by Charlemagne. frenchinch 1|12 frenchfoot # This exact definition comes from frenchthumb frenchinch # a law passed on 10 Dec 1799 which pouce frenchthumb # fixed the meter at # 3 frenchfeet + 11.296 lignes. frenchline 1|12 frenchinch # This is supposed to be the size ligne frenchline # of the average barleycorn frenchpoint 1|12 frenchline toise 6 frenchfeet arpent 180^2 pied^2 # The arpent is 100 square perches, # but the perche seems to vary a lot # and can be 18 feet, 20 feet, or 22 # feet. This measure was described # as being in common use in Canada in # 1934 (Websters 2nd). The value # given here is the Paris standard # arpent. frenchgrain 1|18827.15 kg # Weight of a wheat grain, hence # smaller than the British grain. frenchpound 9216 frenchgrain # # Before the Imperial Weights and Measures Act of 1824, various different # weights and measures were in use in different places. # # Scots linear measure scotsinch 1.00540054 UKinch scotslink 1|100 scotschain scotsfoot 12 scotsinch scotsfeet scotsfoot scotsell 37 scotsinch scotsfall 6 scotsell scotschain 4 scotsfall scotsfurlong 10 scotschain scotsmile 8 scotsfurlong # Scots area measure scotsrood 40 scotsfall^2 scotsacre 4 scotsrood # Irish linear measure irishinch UKinch irishpalm 3 irishinch irishspan 3 irishpalm irishfoot 12 irishinch irishfeet irishfoot irishcubit 18 irishinch irishyard 3 irishfeet irishpace 5 irishfeet irishfathom 6 irishfeet irishpole 7 irishyard # Only these values irishperch irishpole # are different from irishchain 4 irishperch # the British Imperial irishlink 1|100 irishchain # or English values for irishfurlong 10 irishchain # these lengths. irishmile 8 irishfurlong # # Irish area measure irishrood 40 irishpole^2 irishacre 4 irishrood # English wine capacity measures (Winchester measures) winepint 1|2 winequart winequart 1|4 winegallon winegallon 231 UKinch^3 # Sometimes called the Winchester Wine Gallon, # it was legalized in 1707 by Queen Anne, and # given the definition of 231 cubic inches. It # had been in use for a while as 8 pounds of wine # using a merchant's pound, but the definition of # the merchant's pound had become uncertain. A # pound of 15 tower ounces (6750 grains) had been # common, but then a pound of 15 troy ounces # (7200 grains) gained popularity. Because of # the switch in the value of the merchants pound, # the size of the wine gallon was uncertain in # the market, hence the official act in 1707. # The act allowed that a six inch tall cylinder # with a 7 inch diameter was a lawful wine # gallon. (This comes out to 230.9 in^3.) # Note also that in Britain a legal conversion # was established to the 1824 Imperial gallon # then taken as 277.274 in^3 so that the wine # gallon was 0.8331 imperial gallons. This is # 231.1 cubic inches (using the international # inch). winerundlet 18 winegallon winebarrel 31.5 winegallon winetierce 42 winegallon winehogshead 2 winebarrel winepuncheon 2 winetierce winebutt 2 winehogshead winepipe winebutt winetun 2 winebutt # English beer and ale measures used 1803-1824 and used for beer before 1688 beerpint 1|2 beerquart beerquart 1|4 beergallon beergallon 282 UKinch^3 beerbarrel 36 beergallon beerhogshead 1.5 beerbarrel # English ale measures used from 1688-1803 for both ale and beer alepint 1|2 alequart alequart 1|4 alegallon alegallon beergallon alebarrel 34 alegallon alehogshead 1.5 alebarrel # Scots capacity measure scotsgill 1|4 mutchkin mutchkin 1|2 choppin choppin 1|2 scotspint scotspint 1|2 scotsquart scotsquart 1|4 scotsgallon scotsgallon 827.232 UKinch^3 scotsbarrel 8 scotsgallon jug scotspint # Scots dry capacity measure scotswheatlippy 137.333 UKinch^3 # Also used for peas, beans, rye, salt scotswheatlippies scotswheatlippy scotswheatpeck 4 scotswheatlippy scotswheatfirlot 4 scotswheatpeck scotswheatboll 4 scotswheatfirlot scotswheatchalder 16 scotswheatboll scotsoatlippy 200.345 UKinch^3 # Also used for barley and malt scotsoatlippies scotsoatlippy scotsoatpeck 4 scotsoatlippy scotsoatfirlot 4 scotsoatpeck scotsoatboll 4 scotsoatfirlot scotsoatchalder 16 scotsoatboll # Scots Tron weight trondrop 1|16 tronounce tronounce 1|20 tronpound tronpound 9520 grain tronstone 16 tronpound # Irish liquid capacity measure irishnoggin 1|4 irishpint irishpint 1|2 irishquart irishquart 1|2 irishpottle irishpottle 1|2 irishgallon irishgallon 217.6 UKinch^3 irishrundlet 18 irishgallon irishbarrel 31.5 irishgallon irishtierce 42 irishgallon irishhogshead 2 irishbarrel irishpuncheon 2 irishtierce irishpipe 2 irishhogshead irishtun 2 irishpipe # Irish dry capacity measure irishpeck 2 irishgallon irishbushel 4 irishpeck irishstrike 2 irishbushel irishdrybarrel 2 irishstrike irishquarter 2 irishbarrel # English Tower weights, abolished in 1528 towerpound 5400 grain towerounce 1|12 towerpound towerpennyweight 1|20 towerounce towergrain 1|32 towerpennyweight # English Mercantile weights, used since the late 12th century mercpound 6750 grain mercounce 1|15 mercpound mercpennyweight 1|20 mercounce # English weights for lead leadstone 12.5 lb fotmal 70 lb leadwey 14 leadstone fothers 12 leadwey # English Hay measure newhaytruss 60 lb # New and old here seem to refer to "new" newhayload 36 newhaytruss # hay and "old" hay rather than a new unit oldhaytruss 56 lb # and an old unit. oldhayload 36 oldhaytruss # English wool measure woolclove 7 lb woolstone 2 woolclove wooltod 2 woolstone woolwey 13 woolstone woolsack 2 woolwey woolsarpler 2 woolsack woollast 6 woolsarpler # # Ancient history units: There tends to be uncertainty in the definitions # of the units in this section # These units are from [11] # Roman measure. The Romans had a well defined distance measure, but their # measures of weight were poor. They adopted local weights in different # regions without distinguishing among them so that there are half a dozen # different Roman "standard" weight systems. romanfoot 296 mm # There is some uncertainty in this definition romanfeet romanfoot # from which all the other units are derived. pes romanfoot # This value appears in numerous sources. In "The pedes romanfoot # Roman Land Surveyors", Dilke gives 295.7 mm. romaninch 1|12 romanfoot # The subdivisions of the Roman foot have the romandigit 1|16 romanfoot # same names as the subdivisions of the pound, romanpalm 1|4 romanfoot # but we can't have the names for different romancubit 18 romaninch # units. romanpace 5 romanfeet # Roman double pace (basic military unit) passus romanpace romanperch 10 romanfeet stade 125 romanpaces stadia stade stadium stade romanmile 8 stadia # 1000 paces romanleague 1.5 romanmile schoenus 4 romanmile # Other values for the Roman foot (from Dilke) earlyromanfoot 29.73 cm pesdrusianus 33.3 cm # or 33.35 cm, used in Gaul & Germany in 1st c BC lateromanfoot 29.42 cm # Roman areas actuslength 120 romanfeet # length of a Roman furrow actus 120*4 romanfeet^2 # area of the furrow squareactus 120^2 romanfeet^2 # actus quadratus acnua squareactus iugerum 2 squareactus iugera iugerum jugerum iugerum jugera iugerum heredium 2 iugera # heritable plot heredia heredium centuria 100 heredia centurium centuria # Roman volumes sextarius 35.4 in^3 # Basic unit of Roman volume. As always, sextarii sextarius # there is uncertainty. Six large Roman # measures survive with volumes ranging from # 34.4 in^3 to 39.55 in^3. Three of them # cluster around the size given here. # # But the values for this unit vary wildly # in other sources. One reference gives 0.547 # liters, but then says the amphora is a # cubic Roman foot. This gives a value for the # sextarius of 0.540 liters. And the # encyclopedia Brittanica lists 0.53 liters for # this unit. Both [7] and [11], which were # written by scholars of weights and measures, # give the value of 35.4 cubic inches. cochlearia 1|48 sextarius cyathi 1|12 sextarius acetabula 1|8 sextarius quartaria 1|4 sextarius quartarius quartaria heminae 1|2 sextarius hemina heminae cheonix 1.5 sextarii # Dry volume measures (usually) semodius 8 sextarius semodii semodius modius 16 sextarius modii modius # Liquid volume measures (usually) congius 12 heminae congii congius amphora 8 congii amphorae amphora # Also a dry volume measure culleus 20 amphorae quadrantal amphora # Roman weights libra 5052 grain # The Roman pound varied significantly librae libra # from 4210 grains to 5232 grains. Most of romanpound libra # the standards were obtained from the weight uncia 1|12 libra # of particular coins. The one given here is unciae uncia # based on the Gold Aureus of Augustus which romanounce uncia # was in use from BC 27 to AD 296. deunx 11 uncia dextans 10 uncia dodrans 9 uncia bes 8 uncia seprunx 7 uncia semis 6 uncia quincunx 5 uncia triens 4 uncia quadrans 3 uncia sextans 2 uncia sescuncia 1.5 uncia semuncia 1|2 uncia siscilius 1|4 uncia sextula 1|6 uncia semisextula 1|12 uncia scriptulum 1|24 uncia scrupula scriptulum romanobol 1|2 scrupula romanaspound 4210 grain # Old pound based on bronze coinage, the # earliest money of Rome BC 338 to BC 268. # Egyptian length measure egyptianroyalcubit 20.63 in # plus or minus .2 in egyptianpalm 1|7 egyptianroyalcubit egyptiandigit 1|4 egyptianpalm egyptianshortcubit 6 egyptianpalm doubleremen 29.16 in # Length of the diagonal of a square with remendigit 1|40 doubleremen # side length of 1 royal egyptian cubit. # This is divided into 40 digits which are # not the same size as the digits based on # the royal cubit. # Greek length measures greekfoot 12.45 in # Listed as being derived from the greekfeet greekfoot # Egyptian Royal cubit in [11]. It is greekcubit 1.5 greekfoot # said to be 3|5 of a 20.75 in cubit. pous greekfoot podes greekfoot orguia 6 greekfoot greekfathom orguia stadion 100 orguia akaina 10 greekfeet plethron 10 akaina greekfinger 1|16 greekfoot homericcubit 20 greekfingers # Elbow to end of knuckles. shortgreekcubit 18 greekfingers # Elbow to start of fingers. ionicfoot 296 mm doricfoot 326 mm olympiccubit 25 remendigit # These olympic measures were not as olympicfoot 2|3 olympiccubit # common as the other greek measures. olympicfinger 1|16 olympicfoot # They were used in agriculture. olympicfeet olympicfoot olympicdakylos olympicfinger olympicpalm 1|4 olympicfoot olympicpalestra olympicpalm olympicspithame 3|4 foot olympicspan olympicspithame olympicbema 2.5 olympicfeet olympicpace olympicbema olympicorguia 6 olympicfeet olympicfathom olympicorguia olympiccord 60 olympicfeet olympicamma olympiccord olympicplethron 100 olympicfeet olympicstadion 600 olympicfeet # Greek capacity measure greekkotyle 270 ml # This approximate value is obtained xestes 2 greekkotyle # from two earthenware vessels that khous 12 greekkotyle # were reconstructed from fragments. metretes 12 khous # The kotyle is a day's corn ration choinix 4 greekkotyle # for one man. hekteos 8 choinix medimnos 6 hekteos # Greek weight. Two weight standards were used, an Aegina standard based # on the Beqa shekel and an Athens (attic) standard. aeginastater 192 grain # Varies up to 199 grain aeginadrachmae 1|2 aeginastater aeginaobol 1|6 aeginadrachmae aeginamina 50 aeginastaters aeginatalent 60 aeginamina # Supposedly the mass of a cubic foot # of water (whichever foot was in use) atticstater 135 grain # Varies 134-138 grain atticdrachmae 1|2 atticstater atticobol 1|6 atticdrachmae atticmina 50 atticstaters attictalent 60 atticmina # Supposedly the mass of a cubic foot # of water (whichever foot was in use) # "Northern" cubit and foot. This was used by the pre-Aryan civilization in # the Indus valley. It was used in Mesopotamia, Egypt, North Africa, China, # central and Western Europe until modern times when it was displaced by # the metric system. northerncubit 26.6 in # plus/minus .2 in northernfoot 1|2 northerncubit sumeriancubit 495 mm kus sumeriancubit sumerianfoot 2|3 sumeriancubit assyriancubit 21.6 in assyrianfoot 1|2 assyriancubit assyrianpalm 1|3 assyrianfoot assyriansusi 1|20 assyrianpalm susi assyriansusi persianroyalcubit 7 assyrianpalm # Arabic measures. The arabic standards were meticulously kept. Glass weights # accurate to .2 grains were made during AD 714-900. hashimicubit 25.56 in # Standard of linear measure used # in Persian dominions of the Arabic # empire 7-8th cent. Is equal to two # French feet. blackcubit 21.28 in arabicfeet 1|2 blackcubit arabicfoot arabicfeet arabicinch 1|12 arabicfoot arabicmile 4000 blackcubit silverdirhem 45 grain # The weights were derived from these two tradedirhem 48 grain # units with two identically named systems # used for silver and used for trade purposes silverkirat 1|16 silverdirhem silverwukiyeh 10 silverdirhem silverrotl 12 silverwukiyeh arabicsilverpound silverrotl tradekirat 1|16 tradedirhem tradewukiyeh 10 tradedirhem traderotl 12 tradewukiyeh arabictradepound traderotl # Miscellaneous ancient units parasang 3.5 mile # Persian unit of length usually thought # to be between 3 and 3.5 miles biblicalcubit 21.8 in hebrewcubit 17.58 in li 10|27.8 mile # Chinese unit of length # 100 li is considered a day's march liang 11|3 oz # Chinese weight unit # Medieval time units. According to the OED, these appear in Du Cange # by Papias. timepoint 1|5 hour # also given as 1|4 timeminute 1|10 hour timeostent 1|60 hour timeounce 1|8 timeostent timeatom 1|47 timeounce # Given in [15], these subdivisions of the grain were supposedly used # by jewelers. The mite may have been used but the blanc could not # have been accurately measured. mite 1|20 grain droit 1|24 mite periot 1|20 droit blanc 1|24 periot # # Localization # !var UNITS_ENGLISH US hundredweight ushundredweight ton uston scruple apscruple fluidounce usfluidounce gallon usgallon bushel usbushel quarter quarterweight cup uscup tablespoon ustablespoon teaspoon usteaspoon dollar US$ cent $ 0.01 penny cent minim minimvolume pony ponyvolume grand usgrand firkin usfirkin hogshead ushogshead !endvar !var UNITS_ENGLISH GB hundredweight brhundredweight ton brton scruple brscruple fluidounce brfluidounce gallon brgallon bushel brbushel quarter brquarter chaldron brchaldron cup brcup teacup brteacup tablespoon brtablespoon teaspoon brteaspoon dollar US$ cent $ 0.01 penny brpenny minim minimnote pony brpony grand brgrand firkin brfirkin hogshead brhogshead !endvar !varnot UNITS_ENGLISH GB US !message Unknown value for environment variable UNITS_ENGLISH. Should be GB or US. !endvar !utf8 т…›- 1|8 ТМ- 1|4 т…œ- 3|8 ТН- 1|2 т…- 5|8 ТО- 3|4 т…ž- 7|8 т…™- 1|6 т…“- 1|3 т…”- 2|3 т…š- 5|6 т…•- 1|5 т…–- 2|5 т…—- 3|5 т…˜- 4|5 # U+2150- 1|7 For some reason these characters are getting # U+2151- 1|9 flagged as invalid UTF8. # U+2152- 1|10 т„Џ exp(1) # U+212F, base of natural log ТЕ- micro # micro sign U+00B5 ЮМ- micro # small mu U+03BC УЅngstrУЖm angstrom т„Ћ angstrom # angstrom symbol U+212B У… angstrom # A with ring U+00C5 rУЖntgen roentgen ТАC degC ТАF degF ТАK K # ТАK is incorrect notation ТАR degR ТА degree т„ƒ degC т„‰ degF т„Њ K # Kelvin symbol, U+212A т„“ liter # unofficial abbreviation used in some places ТЂ cent ТЃ britainpound ТЅ japanyen т‚Ќ euro т‚Љ southkoreawon т‚Њ israelnewshekel т‚Є lira т‚Ј rupee т„І ohm # Ohm symbol U+2126 ЮЉ ohm # Greek capital omega U+03A9 т„Ї mho Ъ’ dram # U+0292 т„ˆ scruple т„Ѕ ounce т„” lb т„Ž h т„ hbar т€А 1|1000 т€Б 1|10000 т€В ' # U+2032 т€Г " # U+2033 # # Square unicode symbols starting at U+3371 # уБ hPa уВ da уГ au уД bar # уЕ oV??? уЖ pc #уЗ dm invalid on Mac #уИ dm^2 invalid on Mac #уЙ dm^3 invalid on Mac уŽ€ pA уŽ nA уŽ‚ ТЕA уŽƒ mA уŽ„ kA уŽ… kB уŽ† MB уŽ‡ GB уŽˆ cal уŽ‰ kcal уŽŠ pF уŽ‹ nF уŽŒ ТЕF уŽ ТЕg уŽŽ mg уŽ kg уŽ Hz уŽ‘ kHz уŽ’ MHz уŽ“ GHz уŽ” THz уŽ• ТЕL уŽ– mL уŽ— dL уŽ˜ kL уŽ™ fm уŽš nm уŽ› ТЕm уŽœ mm уŽ cm уŽž km уŽŸ mm^2 уŽ  cm^2 уŽЁ m^2 уŽЂ km^2 уŽЃ mm^3 уŽЄ cm^3 уŽЅ m^3 уŽІ km^3 уŽЇ m/s уŽЈ m/s^2 уŽЉ Pa уŽЊ kPa уŽЋ MPa уŽЌ GPa уŽ­ rad уŽЎ rad/s уŽЏ rad/s^2 уŽА ps уŽБ ns уŽВ ТЕs уŽГ ms уŽД pV уŽЕ nV уŽЖ ТЕV уŽЗ mV уŽИ kV уŽЙ MV уŽК pW уŽЛ nW уŽМ ТЕW уŽН mW уŽО kW уŽП MW у€ kт„І у Mт„І уƒ Bq у„ cc у… cd у† C/kg уˆ() dB у‰ Gy уŠ ha # у‹ HP?? уŒ in # у KK?? # уŽ KM??? у kt у lm # у‘ ln # у’ log у“ lx у” mb у• mil у– mol у—() pH у™ ppm # уš PR??? у› sr уœ Sv у Wb #уž V/m Invalid on Mac #уŸ A/m Invalid on Mac #уП gal Invalid on Mac !endutf8 ############################################################################ # # Unit list aliases # # These provide a shorthand for conversions to unit lists. # ############################################################################ !unitlist hms hr;min;sec !unitlist time year;day;hr;min;sec !unitlist dms deg;arcmin;arcsec !unitlist ftin ft;in;1|8 in !unitlist inchfine in;1|8 in;1|16 in;1|32 in;1|64 in !unitlist usvol cup;3|4 cup;2|3 cup;1|2 cup;1|3 cup;1|4 cup;\ tbsp;tsp;1|2 tsp;1|4 tsp;1|8 tsp ############################################################################ # # The following units were in the unix units database but do not appear in # this file: # # wey used for cheese, salt and other goods. Measured mass or # waymass volume depending on what was measured and where the measuring # took place. A wey of cheese ranged from 200 to 324 pounds. # # sack No precise definition # # spindle The length depends on the type of yarn # # block Defined variously on different computer systems # # erlang A unit of telephone traffic defined variously. # Omitted because there are no other units for this # dimension. Is this true? What about CCS = 1/36 erlang? # Erlang is supposed to be dimensionless. One erlang means # a single channel occupied for one hour. # ############################################################################ units-2.12/getopt.c0000664000175000017500000005316212301221016013521 0ustar adrianadrian/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.org before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02111 USA. */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #ifdef HAVE_CONFIG_H #include #endif #if !defined (__STDC__) && !defined (_MSC_VER) || !__STDC__ /* This is a separate conditional since some stdc systems reject `defined (const)'. */ #ifndef const #define const #endif #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #endif /* GNU C library. */ /* This is for other GNU distributions with internationalized messages. The GNU C Library itself does not yet support such messages. */ #if HAVE_LIBINTL_H # include #else # define gettext(msgid) (msgid) #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = NULL; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* XXX 1003.2 says this must be 1 before any call. */ int optind = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #else /* Avoid depending on library functions or files whose names are inconsistent. */ char *getenv (); static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } /* If using GCC, we can safely declare strlen this way. If not using GCC, it is ok not to declare it. */ #ifdef __GNUC__ /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. That was relevant to code that was here before. */ #if !defined (__STDC__) || !__STDC__ /* gcc with -traditional declares the built-in strlen to return int, and has done so at least since version 2.4.5. -- rms. */ extern int strlen (const char *); #endif /* not __STDC__ */ #endif /* __GNUC__ */ #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (argv) char **argv; { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ static const char * _getopt_initialize (optstring) const char *optstring; { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind = 1; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { optarg = NULL; if (optind == 0) optstring = _getopt_initialize (optstring); if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && (argv[optind][0] != '-' || argv[optind][1] == '\0')) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if ((argv[optind][0] != '-' || argv[optind][1] == '\0')) { if (ordering == REQUIRE_ORDER) return EOF; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if (nameend - nextchar == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, gettext ("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, gettext ("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, gettext ("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, gettext ("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, gettext ("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, gettext ("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, gettext ("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, gettext ("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, gettext ("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == EOF) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ units-2.12/README0000664000175000017500000001606112315150362012742 0ustar adrianadrianWhen updating from 1.x to 2.x: The name of the personal units file has changed from $HOME/units.dat to $HOME/.units ($HOME/unitdef.units under Windows). The format for nonlinear unit definitions has changed. Run 'units -c' and add the "units=" keyword in front of any bracketed unit specifications. ------------------------------------------------------------------ GNU `units' converts between different systems of units. It can handle multiplicative scale changes. It can also handle nonlinear conversions such as Celsius to Fahrenheit (which may appear to be linear but is actually affine). General installation instructions appear in the file `INSTALL'. You should be able to run `./configure' followed by `make'. If you give no options to configure, it will compile units to look for the units data file in a standard location (probably /usr/local/share). If you try to use the program without installing you will need to use the `-f' option. If you don't want to commit to an installation location, you can invoke configure by typing `./configure --enable-path-search'. Then no path name will be compiled into `units' and it will search the current directory and the directories listed in your PATH environment variable to find the units data file. For full functionality you should have the GNU readline library installed to provide history and editing of data entry. You can update currency conversions using the units_cur script which requires Python and the unidecode module. The documentation is available in texinfo, roff, and text format. The man page is generated automatically from the texinfo documentation. This man page produces readable results when run through nroff, but it should probably not be printed with troff or groff---no effort has been made to ensure that it prints out reasonably. To generate a printed manual, use `units.dvi' instead. The distribution includes three simple icons that may be useful for installation in a GUI. Use the icotool command to extract the png files from the .ico files. The icon_ms.png file is suitable for use as a small button. This program has the following incompatibilties with unix `units': * The '-' character is a subtraction operator rather than a multiply operator by default. * Exponentiation in numbers requires an `e', so you must write 2.5e-2 instead of 2.5-2. * Prefixes are listed in the units file. * GNU `units' tries the -s, -es, and -ies plural forms. * The default output format is slightly different. * The units database is much larger and more informative, but with some differences. (e.g. `g' is for gravity in unix `units' and grams in GNU `units'.) The comment character has been changed to `#'. GNU `units' includes the following extensions: * Multiplication can be written with a `*' if desired. * Exponents can be written with `^' or `**' in units. * Exponents can be larger than 9 if written with `^' or `**'. * Sums of units can be converted. * The units data file is extensively commented. * Units which measure reciprocal dimensions can be converted. * Parentheses for grouping are supported. * Funtions such as sin, cos, and log are supported. * Roots of units and rational exponents can be computed. * Nonlinear units conversions are supported. * Conversion to lists of units (e.g. feet and inches) is supported ---------------------------------------------------------------------- Ports A Windows version A binary distribution for Windows is available at http://ftp.gnu.org/gnu/units/windows/ The executable was built with Microsoft Visual C/C++ Express using Makefile.Win and the same source files included in the source distribution. There is currently no support for UTF-8 or readline; however, command history and intraline editing are available via the standard Windows console facilities described in the documentation for doskey. A port of units 1.87 to Windows is available from the http://gnuwin32.sourceforge.net/packages/units.htm This port includes readline support. A Java version of units by Roman Redziejowski is available on SourceForge at http://units-in-java.sourceforge.net/ Two versions are available for Android. Steve Pomeroy has a version based on the the above Java version that you can obtain at http://staticfree.info/projects/units/ and Keith Flowers has compiled the C code for Android: http://apps.keithflower.org/?page_id=6 A Perl version was written by Bob Walton and can be accessed either as a units converting web form or as perl source code from: http://bwalton.com/cgi-bin/myunitscgi.pl Several years ago the program was ported to Pocket PC and given the name QuickUnits. This version appears to remain available here: http://www.freewareppc.com/calculator/quickunits.shtml ----------------------------------------------------------------------------- Ideas the future (may or may not happen): * Bundle up the units conversion stuff into a library. * Inflation adjusted currency? * Allow multiple definitions of the same unit and resolve the correct definition by a conformability check. (This has exponential growth behavior in the number of units typed in!) * When a nonconformable units error is given list units the user might have meant (e.g. britainpound for pound) by a conformability check and string pattern match of some sort. "spelling advice" * Allow some way of having units like '$' that don't require a trailing space so you can write '$5'. This could be handled by having a command in the units database that specifies units which automatically get a space inserted after their name. * Have a metacommand in the units datafile that specifies how plurals should be tried for this file. This would allow expansion into other languages. (Of course, the real work of expanding into other languages is writing a units file that is appropriate for the language in question and includes local units. It's not just a translation task.) Another thing that could be accomplished here would be translation of English words like "cubic" and "per" into their symbolic meanings. A command in the units file could indicate that "per" should be substituted into a '/' and "cubic" means the cube the next unit. As it stands, "per" is hard coded into the parser. * Represent uncertainties in values in the database. ----------------------------------------------------------------------------- Acknowledgements This program owes a lot to Jeff Conrad who made many helpful suggestions, found numerous bugs, and helped me to find the definitions of obscure units. Chris Madsen also made some valuable contributions. The documentation has greatly benefited from the suggestions made by Robert Chassell who kindly read several drafts. The following people have been particularly helpful in fixing portability problems: Kaveh Ghazi, Eric Backus, and Marcus Daniels. Bug reports and suggestions for improvements should be sent to the author: Adrian Mariano (adrianm@gnu.org). units-2.12/Makefile.OS20000664000175000017500000000441110641165333014124 0ustar adrianadrian# Makefile for the OS/2 version of units # Peter Weilbacher (os2@Weilbacher.org), 25Jan2003. # # Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA CC=gcc CFLAGS=-Zomf LFLAGS=-Zlinker /PM:VIO -Zlinker /E:2 -Lf:\P\emx\lib -Lf:\P\emx\lib\st -lm -lreadline -ltermcap O=.o NAME=units READLINE=-DREADLINE OBJECTS=$(NAME)$O getopt$O getopt1$O strfunc$O parse.tab$O # ansi2knr$O EXE=$(NAME).exe DOC=$(NAME).doc MAN=$(NAME).man SRCFILES=ChangeLog INSTALL Makefile.dos Makefile.in aclocal.m4 \ ansi2knr.1 ansi2knr.c configure configure.in getopt.c getopt.h \ getopt1.c install-sh mkinstalldirs strfunc.c texi2man units.c \ units.texinfo \ Makefile.OS2 DISTFILES=COPYING README NEWS units.dat \ ReadMe.OS2 makeobjs.cmd \ $(EXE) $(DOC) $(NAME).less .SUFFIXES: .c $O .c$O: $(CC) $(CFLAGS) $(READLINE) -c $< all: $(EXE) $(DOC) $(EXE): $(OBJECTS) $(CC) $(CFLAGS) $(LFLAGS) $(READLINE) $(OBJECTS) -o $@ $(DOC): $(NAME).texinfo texi2man perl .\texi2man $(NAME).texinfo > $(MAN) sed s!@DATAFILE@!units.dat! $(NAME).man > $(NAME).1 groff -man $(NAME).1 > $(NAME).less # col -b $(NAME).less > $(DOC) sed -e "s/_//g" -e "s/.//g" units.less > units.doc dist: all @mkdir dist @cp -f $(DISTFILES) dist @zip -9rSq dist\units-src.zip $(SRCFILES) @rm -f $(OBJECTS) check: $(EXE) @echo Checking $(EXE) @echo If output is "* 25.4" the program should be OK @$(EXE) -f .\units.dat kiloinch meter | grep "\*" @echo End check clean: rm -f $(OBJECTS) $(EXE) $(MAN) $(NAME).1 $(NAME).less $(DOC) rm -rf dist units-2.12/unitsprog.ico0000664000175000017500000010050612312376060014610 0ustar adrianadrian Ј†00Ј. hж%00 Ј%>+ Ј цP  ЈŽ] h6n00Јžr( @€€€РРР€џџџѓччрССљђђЭššлЖЖ @@Бcc—..Ш‘‘„фЩЩшббŒЎ]]ІMMщгг‘""“&&ыззМxxМyyцЭЭјёёЅJJ‘##цЬЬЋWW™22–--Т……њѕѕКuuˆЊTTъееуЧЧьййўќќЮœœІLL† —//РГff’$$ќљљАaaЁBBДiiђххš55Ы——‹„ ћїїсУУєщщёууЄHHŠиААЉSSЦŒŒ::бЃЃ‚š44ƒЉRRљѓѓїююЮвЅЅА``ѕыынЛЛШхЫЫрРР+TUVQ4R;SLKMNO=?@8.9 *:; <,,*0 *12345+67 () * +,-./  # $%&'   !"     (0`sssXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXpppЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'’H#ЂP'ЃQ'ЃQ'ЃQ'ЃQ'XXXЎhCЄR&ЄR&ЅR'ЄR&ЄR&ЄR&ЄR&ЄR&ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЄR'XXXЅR&ўќчјџџјџџјџџљџџјџџјџџјџџјџџэџџ№џџ№џџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџєџџјџџўќчЅS&XXXЇS%јџџјџџјџџљџџљџџљџџљџџљџџјџџјџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџЇS$XXXЈU$љџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџЈU#XXXЊV"њџџљџџљџџњџџљџџњџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџјџџЋV"XXXЌW!њџџњџџњџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџ­X XXXЎYћџџњџџњџџљџџњџџњџџћџџћџџњџџњџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџњџџЏX XXXБZћџџћџџћџџљџџћџџћџџћџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџњџџБZXXXГ\ћџџћџџћџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџюривБžљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџжИЇциЮљџџљџџљџџљџџљџџљџџљџџћџџГ[XXXЕ]ќџџћџџќџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџьхпЊ_8Шœ„љџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџЮЇ’ЇY1ъскљџџљџџљџџљџџљџџљџџћџџЕ]XXXИ^§џџќџџ§џџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџьхпЋa;Љ\5ђёюљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџіјїЋb<Њ_8ъскљџџљџџљџџљџџљџџћџџИ_XXXЙ`§џџ§џџ§џџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџчкбЊ`:ЃQ'мМЌљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџоЩМЃQ'Ј\5сЯФљџџљџџљџџљџџ§џџК`XXXМa§џџ§џџўџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџїћњЮЇ’ЄT*ЃQ'Ф”zџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџЪЁŠЃQ'ЃQ'ЬЃіјїљџџљџџ§џџМaXXXМa§џџ§џџўџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџЎhDЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ЃQ'Ћa:ѕїѕљџџ§џџМaXXXМa§џџ§џџўџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџшмгЗyYЃQ'ЃQ'Х–}щеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫфеЫЪŸˆЃQ'ЃQ'ГrPциЮљџџљџџ§џџМaXXXМa§џџ§џџўџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџаЌ˜ЃQ'ЅV-юпзљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџэчсЇY1ЃQ'Щž†ј§ќљџџљџџљџџ§џџМaXXXМa§џџ§џџўџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџмХЖЄT*ГpMј§ќљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџЕvUЃQ'иМЋљџџљџџљџџљџџљџџ§џџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџрХЖЄR)йИІџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџтЧКЃQ'кЙЈџџџџџџџџџџџџџџџџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкЙЈХ’wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫœ…еЏ›џџџџџџџџџџџџџџџџџџџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџџџџќњјщеЫєыцџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіэщщеЫіэщџџџџџџџџџэмдщеЫѕьчџџџџџџџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџ№тмЊ_8ЃQ'ЃQ'Э ‰Р‡kЃQ'оСВџџџвЉ•ЃQ'Р‡kџџџџџџтЩМЃQ'АiEџџџљѓёЃQ'ЃQ'ёхпџџџыиЯІV-ЃQ'ЃQ'ќњјыкбЏhDЃQ'ЃQ'ЃQ'О…gћјїџџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџМbЃQ'ЄT*К}]ЄT*ЈZ2ЃQ'оСВџџџвЉ•ЃQ'Р‡kџџџџџџтЩМЃQ'АiEџџџљѓёЃQ'ЃQ'ёхпџџџЧ–|ЃQ'Њ_8ДrPњѕђЊ_8ЃQ'Ћa:К}]ІW/ЃQ'Ш–}џџџџџџМaXXXМaџџџџџџџџџџџџџџџџџџџџџџџџЈ[4ЃQ'кКЉџџџшгШЃQ'ЃQ'оСВџџџвЉ•ЃQ'Р‡kџџџџџџтЩМЃQ'АiEџџџљѓёЃQ'ЃQ'ёхпџџџР‡kЃQ'бЇ’џџџоРБЃQ'Ћa:ћїѕџџџуЫОЃQ'Њ^7џџџџџџМaXXXМa§џџ§џџўџџљџџљџџљџџљџџљџџЄR)ЃQ'шнељџџљџџЉ^7ЃQ'кСВљџџЯЉ•ЃQ'О‡kџџџљџџоЩМЃQ'ЏiEљџџѓѓёЃQ'ЃQ'ьхпљџџО‡kЃQ'бЏ›љџџљџџј§ќъскіјїпЫПО‡kЃQ'Ј[4љџџ§џџМaXXXМa§џџ§џџўџџљџџљџџљџџљџџљџџЃQ'ЃQ'ъриљџџљџџЏiEЃQ'кСВљџџЯЉ•ЃQ'О‡kџџџљџџоЩМЃQ'ЏiEљџџѓѓёЃQ'ЃQ'ьхпљџџО‡kЃQ'бЏ›љџџљџџяычТuЄT*ЃQ'ЃQ'ЃQ'СŽsљџџ§џџМaXXXОcўџџ§џџ§џџљџџљџџљџџљџџљџџЃQ'ЃQ'ъриљџџљџџЏiEЃQ'кСВљџџЯЉ•ЃQ'Н…gџџџљџџоЩМЃQ'ЏiEљџџѓѓёЃQ'ЃQ'ьхпљџџО‡kЃQ'бЏ›љџџљџџБmJЃQ'ЃQ'ЃQ'ІW/Ч™€ѕїѕ§џџўџџОcXXXРdџџџџџџўџџљџџљџџљџџљџџљџџЃQ'ЃQ'ъриљџџљџџЏiEЃQ'кСВљџџЯЉ•ЃQ'ДsQџџџљџџиМЌЃQ'ЏiEљџџѓѓёЃQ'ЃQ'ьхпљџџО‡kЃQ'бЏ›љџџъскЃQ'ЄT*Х–}сЮТ№эщѕїѕљџџўџџўџџРdXXXФgџџџџџџџџџљџџљџџџџџљџџљџџЃQ'ЃQ'ъриљџџљџџЏiEЃQ'кСВљџџЯЉ•ЃQ'ЃQ'оСВїћњМ„fЃQ'ЖxWљџџѓѓёЃQ'ЃQ'ьхпытмЗzZЃQ'Х–}циЮъскЃQ'­e@єѕѓіњјО‡kЃQ'аІџџџџџџФgXXXФgџџџџџџџџџљџџљџџџџџљџџљџџЃQ'ЃQ'ъриљџџљџџЏiEЃQ'кСВљџџЯЉ•ЃQ'АlHЃQ'ЃQ'ЃQ'ЃQ'ЬЄŽљџџѓѓёЃQ'ЃQ'ьхпО‡kЃQ'ЃQ'ЃQ'Ј\5ј§ќАkGЃQ'ЃQ'ЃQ'ЃQ'ЃQ'ъзЭџџџџџџФgXXXФgџџџџџџџџџљџџљџџџџџљџџљџџЙ}]Й}]юштљџџљџџСŽsЙ}]тбЦљџџйПАЙ}]йПАзДЁЊ_8ЃQ'Ф”zіњјљџџѕїѕЙ}]Й}]№ьчЭЅЊ_8ЃQ'ЎhDН…gљџџюштП‰lЃQ'ЃQ'АlHлТГџџџџџџџџџФgXXXЦhџџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџО‡kЃQ'бЏ›љџџљџџљџџљџџљџџљџџљџџљџџџџџџџџџџџЦiXXXШi џџџџџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџѓѓёЃQ'ЃQ'ьхпљџџУ‘vЃQ'бЏ›љџџљџџљџџљџџљџџљџџљџџљџџџџџџџџџџџЩi[[[Ыk џџџџџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџѓѓёЃQ'ЃQ'ьхпљџџіњјШ›ƒбЏ›љџџљџџџџџљџџљџџџџџљџџљџџџџџџџџџџџЫk ___Эl џџџџџџџџџљџџџџџџџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџіњјвЉ•вЉ•ѓѓ№љџџљџџљџџіјїљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџџџџЭl aaaЯn џџџџџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџџџџЯn aaaвoџџџџџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџљџџџџџџџџџџџџџџбpaaaдpџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгqaaaжrомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧомЧжw```ЙcВ_­]Ћ[Њ\Њ[Њ\Њ\Њ\Њ[Њ[Њ\Њ\Њ\Њ\Њ\Њ[Њ[Њ\Њ\Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ[Њ\Њ[Њ[Њ[Њ[Њ[Њ[Ћ\­]ЕbФt]]]МeНfМeЙcЙbЙcЙbИcИbЙbИbЙbИbИcИbИbЙbИcЙcЙcИbИbИbИbИbИbИbИbЙbИbЙcЙcИcИcЙbТoжŽ@Мh ЙbШy"Ы}'ИbЄe)qj‹’iPТtЦtYYYТjЪnдrиsйtйuйtиuйwйuйvкy к{кz к{йz кx иvйwйwиuиuиuиuиuиuиuиuйtиtйvйvиvйwйvъ›EјМ|н‚кy эЄUљОиu{r“FpуcqЕШ‚3ЬwiiiЪoбyу SъЉ^эŸEюŸDюЁIюЂIюŸDэš:юžBяЂIь—6ь—3ь˜8э?ю@ьœ=эœ>эœ>эœ=эœ=эœ=эœ=эœ=эœ=эœ=эœ=ь™8ы“,ь–0э•0ы“-ы“.ъ(ы'ы’,ь•0ь“-ь”0ь–1э˜7эš8ЪŒPп‹,лŒ1аqвqеvиz зx зvжsжsжsжsжsжsжtжtжtзuзuзuзuзuзwзwзwзwзwзwзwзwзwзuзuжuжtжsжsжsжsжsжsжsжsжsжtиwйx зv€€( рšIх”6ч’0ч-ц‘+ц,ц’/ц-ц&фŒ$ч+щ*у‘4Ю‡>МgНdМc Нd НdМb Мc Мc Шx(Ъs Гo7|WRЎ”x}}}рД„хрзфмЯхнахмафнафмаукЫукЬчлЩькН›zZэУœџџџўџџгЈЈњїїчаа•f@чϘыжжїљљуааѕѕѕънноХХњџџбЈЈЭЁЁЊXXє№№оУУїё№’gDЊUUђффž<<щгг•++ЈPPЭ››ЇMMП~~ž==ЌYYВddКuuётт99БccйВВЦЙrrнЛЛ“''О||eDхОšЕiiАdd‘""хггВhhеВВФЅMMкЛЛœ::ЊWWДmm™33уМœњѕѕтЮЮчжжшккёэээффцеељќќпЧЧѓэьcEрЛЙwwёььЏbbјљљ§џўŠbEЯЅЅŠЙvvР……Ÿ@@ž>>ёцхˆ`EјёёЊTTсТТЏ^^вЅЅ…^GлЙЃ§џџћќќЩ––ќџџьннзДДзВ›њѕѓљѕђјѕђїѕђК€b”Y9ŒQ2‹Q2‰O1ŽQ3sP?”””~~~„„„˜™šššššššššš›‘’““”“““““““•–—ŒŽŽŽŽŽŽŽŽŽ„…*††‡ˆ‰‰‰‰Š‹†+„0**€*****‚ƒ*„0*7wxyzzzzz{|}~p*77kq7777rstuvdefg4hijklm40123456789:;<=>)**++++*,-.+**/ !!"!!#$%&'( €(0` ŒЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џ’H#џЂP'џЃQ'џЃQ'џЃQ'џЃQ'џЇЂQ&нЄR&џЄR&џЅR'џЄR&џЄR&џЄR&џЄR&џЄR&џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЄR'џЇЅR&џўќчџјџџџјџџџјџџџљџџџјџџџјџџџјџџџјџџџэџџџ№џџџ№џџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџєџџџјџџџўќчџЅS&џЇЇS%џјџџџјџџџјџџџљџџџљџџџљџџџљџџџљџџџјџџџјџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџЇS$џЇЈU$џљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџЈU#џЇЊV"џњџџџљџџџљџџџњџџџљџџџњџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџјџџџЋV"џЇЌW!џњџџџњџџџњџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџ­X џЇЎYџћџџџњџџџњџџџљџџџњџџџњџџџћџџџћџџџњџџџњџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџњџџџЏX џЇБZџћџџџћџџџћџџџљџџџћџџџћџџџћџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџъриџвБžџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџжИЇџциЮџљџџџљџџџљџџџљџџџљџџџљџџџњџџџБZџЇГ\џћџџџћџџџћџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџьхпџЊ_8џШœ„џљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџЮЇ’џЇY1џъскџљџџџљџџџљџџџљџџџљџџџћџџџГ[џЇЕ]џќџџџћџџџќџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџьхпџЋa;џЈ\5џђёюџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџіјїџЋb<џЊ_8џъскџљџџџљџџџљџџџљџџџћџџџЕ]џЇИ^џ§џџџќџџџ§џџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџчкбџЊ`:џЃQ'џиМЌџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџоЩМџЃQ'џЈ\5џсЯФџљџџџљџџџљџџџћџџџИ_џЇЙ`џ§џџџ§џџџ§џџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџїћњџЮЇ’џЄT*џЃQ'џФ”zџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџЪЁŠџЃQ'џЃQ'џЬЃџіјїџљџџџ§џџџК`џЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџЎhDџЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џЋa:џѕїѕџ§џџџМaџЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџшмгџЗyYџЃQ'џЃQ'џХ–}џфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџфеЫџЪŸˆџЃQ'џЃQ'џГrPџциЮџљџџџ§џџџМaџЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџаЌ˜џЃQ'џЅV-џщпзџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџэчсџЇY1џЃQ'џЩž†џј§ќџљџџџљџџџ§џџџМaџЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџмХЖџЄT*џВpMџј§ќџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџЕvUџЃQ'џиМЋџљџџџљџџџљџџџљџџџ§џџџМaџЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџмХЖџЄR)џжИІџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџнЧКџЃQ'џжЙЈџљџџџљџџџљџџџљџџџљџџџ§џџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџкЙЈџХ’wџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫœ…џеЏ›џџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџќњјџщеЫџєыцџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџіэщџщеЫџіэщџџџџџџџџџџџџџэмдџщеЫџѕьчџџџџџџџџџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ№тмџЊ_8џЃQ'џЃQ'џЭ ‰џР‡kџЃQ'џоСВџџџџџвЉ•џЃQ'џР‡kџџџџџџџџџтЩМџЃQ'џАiEџџџџџљѓёџЃQ'џЃQ'џёхпџџџџџыиЯџІV-џЃQ'џЃQ'џќњјџыкбџЏhDџЃQ'џЃQ'џЃQ'џО…gџћјїџџџџџџџџџМaџЇМaџџџџџџџџџџџџџџџџџџџџџџџџџџџџџМbџЃQ'џЄT*џК}]џЄT*џЈZ2џЃQ'џоСВџџџџџвЉ•џЃQ'џР‡kџџџџџџџџџтЩМџЃQ'џАiEџџџџџљѓёџЃQ'џЃQ'џёхпџџџџџЧ–|џЃQ'џЊ_8џДrPџњѕђџЊ_8џЃQ'џЋa:џК}]џІW/џЃQ'џШ–}џџџџџџџџџМaџЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџЈ[4џЃQ'џзКЉџљџџџугШџЃQ'џЃQ'џкСВџљџџџЯЉ•џЃQ'џО‡kџљџџџљџџџоЩМџЃQ'џЏiEџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџО‡kџЃQ'џЮЇ’џљџџџкРБџЃQ'џЋa:џѕїѕџљџџџпЫОџЃQ'џЉ^7џљџџџ§џџџМaџЇМaџ§џџџ§џџџўџџџљџџџљџџџљџџџљџџџЄR)џЃQ'џшнеџљџџџљџџџЉ^7џЃQ'џкСВџљџџџЯЉ•џЃQ'џО‡kџљџџџљџџџоЩМџЃQ'џЏiEџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџО‡kџЃQ'џбЏ›џљџџџљџџџј§ќџъскџіјїџпЫПџО‡kџЃQ'џЈ[4џљџџџ§џџџМaџЇОcџўџџџ§џџџ§џџџљџџџљџџџљџџџљџџџЃQ'џЃQ'џъриџљџџџљџџџЏiEџЃQ'џкСВџљџџџЯЉ•џЃQ'џО‡kџљџџџљџџџоЩМџЃQ'џЏiEџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџО‡kџЃQ'џбЏ›џљџџџљџџџяычџТuџЄT*џЃQ'џЃQ'џЃQ'џСŽsџ§џџџўџџџОcџЇРdџџџџџџџџџўџџџљџџџљџџџљџџџљџџџЃQ'џЃQ'џъриџљџџџљџџџЏiEџЃQ'џкСВџљџџџЯЉ•џЃQ'џН…gџљџџџљџџџоЩМџЃQ'џЏiEџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџО‡kџЃQ'џбЏ›џљџџџљџџџБmJџЃQ'џЃQ'џЃQ'џІW/џЧ™€џѕїѕџўџџџўџџџРdџЇФgџџџџџџџџџџџџџљџџџљџџџџџџџљџџџЃQ'џЃQ'џъриџљџџџљџџџЏiEџЃQ'џкСВџљџџџЯЉ•џЃQ'џДsQџљџџџљџџџиМЌџЃQ'џЏiEџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџО‡kџЃQ'џбЏ›џљџџџъскџЃQ'џЄT*џХ–}џсЮТџ№эщџѕїѕџџџџџџџџџџџџџФgџЇФgџџџџџџџџџџџџџљџџџљџџџџџџџљџџџЃQ'џЃQ'џъриџљџџџљџџџЏiEџЃQ'џкСВџљџџџЯЉ•џЃQ'џЃQ'џкСВџїћњџМ„fџЃQ'џЖxWџљџџџѓѓёџЃQ'џЃQ'џьхпџытмџЗzZџЃQ'џХ–}џциЮџъскџЃQ'џ­e@џєѕѓџіњјџО‡kџЃQ'џаІџџџџџџџџџФgџЇФgџџџџџџџџџџџџџљџџџљџџџџџџџљџџџЃQ'џЃQ'џъриџљџџџљџџџЏiEџЃQ'џкСВџљџџџЯЉ•џЃQ'џАlHџЃQ'џЃQ'џЃQ'џЃQ'џЬЄŽџљџџџѓѓёџЃQ'џЃQ'џьхпџО‡kџЃQ'џЃQ'џЃQ'џЈ\5џј§ќџАkGџЃQ'џЃQ'џЃQ'џЃQ'џЃQ'џъзЭџџџџџџџџџФgџЇЦhџџџџџџџџџљџџџљџџџљџџџљџџџљџџџЙ}]џЙ}]џюштџљџџџљџџџСŽsџЙ}]џтбЦџљџџџйПАџЙ}]џйПАџдДЁџЊ_8џЃQ'џФ”zџіњјџљџџџѕїѕџЙ}]џЙ}]џ№ьчџЭЅџЊ_8џЃQ'џЎhDџН…gџљџџџюштџП‰lџЃQ'џЃQ'џАlHџлТГџџџџџџџџџџџџџЦiџЉШi џџџџџџџџџџџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџО‡kџЃQ'џбЏ›џљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџџџџџџџџџџџџџЩiџ Ќ!Ыk џџџџџџџџџџџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџУ‘vџЃQ'џбЏ›џљџџџљџџџџџџџљџџџљџџџџџџџљџџџљџџџџџџџџџџџџџџџЫk џЎ"Эl џџџџџџџџџџџџџљџџџџџџџџџџџџџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџѓѓёџЃQ'џЃQ'џьхпџљџџџіњјџШ›ƒџбЏ›џљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџџџџџџџџџЭl џЎ"Яn џџџџџџџџџџџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџіњјџЯЉ•џЯЉ•џѓѓ№џљџџџљџџџљџџџіјїџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџџџџџџџџџЯn џЎ"вoџџџџџџџџџџџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџљџџџџџџџџџџџџџџџџџџџбpџЎ"дpџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџгqџЎ!жrџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџомЧџжwџ­ЙcџВ_џ­]џЋ[џЊ\џЊ[џЊ\џЊ\џЊ\џЊ[џЊ[џЊ\џЊ\џЊ\џЊ\џЊ\џЊ[џЊ[џЊ\џЊ\џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЊ\џЊ[џЊ[џЊ[џЊ[џЊ[џЊ[џЋ\џ­]џЕbџФtџ ЊМeџНfџМeџЙcџЙbџЙcџЙbџИcџИbџЙbџИbџЙbџИbџИcџИbџИbџЙbџИcџЙcџЙcџИbџИbџИbџИbџИbџИbџИbџЙbџИbџЙcџЙcџИcџИcџЙbџТoџжŽ@џМh џЙbџШy"џЫ}'џИbџЄe)џqj‹џ’iPџТtџЦtџЈТjџЪnџдrџиsџйtџйuџйtџиuџйwџйuџйvџкy џк{џкz џк{џйz џкx џиvџйwџйwџиuџиuџиuџиuџиuџиuџиuџйtџиtџйvџйvџиvџйwџйvџъ›EџјМ|џн‚џкy џэЄUџљОџиuџ{r“џFpуџcqЕџШ‚3џЬwџ–Ъoџбyџу SџъЉ^џэŸEџюŸDџюЁIџюЂIџюŸDџэš:џюžBџяЂIџь—6џь—3џь˜8џэ?џю@џьœ=џэœ>џэœ>џэœ=џэœ=џэœ=џэœ=џэœ=џэœ=џэœ=џь™8џы“,џь–0џэ•0џы“-џы“.џъ(џы'џы’,џь•0џь“-џь”0џь–1џэ˜7џэš8џЪŒPџп‹,џлŒ1џаqџJнw1вqџеvџиz џзx џзvџжsџжsџжsџжsџжsџжsџжtџжtџжtџзuџзuџзuџзuџзuџзwџзwџзwџзwџзwџзwџзwџзwџзuџзuџжuџжtџжsџжsџжsџжsџжsџжsџжsџжsџжsџжtџиwџйx џзvџВ`W€( @€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‰YBxI1wG0wG0wG0wG0wG0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0wH0xI0rE.pE.xH0xH0~L3b_]€€€ЁKІS(ЄO$ЂN!ЂN!ЂN!ЂN!ЂN!ЁN" M"ЁM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂM"ЂN" M" M"ЁO$ЄS)ЄO"\TP€€€ДlAџџџџџџџџџџџџџџџџџџџџџњџџїџџћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџџџЩ—sXRO€€€Вj@џџџџџџўџџџџџўџџўџџўџџџџџџџџџџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџўџџџџџџџџЧ—zXRO€€€Гh:џџџќџџќџџџџџћџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџќџџџџџШ”sYRO€€€Еi7џџџ§џџњџџџџџљџџћџџћџџњџџњџџњџџѓѕєхснњџџњџџњџџњџџњџџњџџњџџњџџњџџцупяяэњџџњџџњџџћџџџџџЪ•rYRO€€€Зl6џџџўџџћџџџџџќџџќџџћџџњџџњџџєіѕ’nZХДЊњџџњџџњџџњџџњџџњџџњџџњџџњџџаХНŒeP№ё№њџџњџџћџџџџџЬ–qYSO€€€Лn5џџџџџџџџџџџџџџџџџџџџџџџџѕё№”o\’mX§§§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ™vchTёэъџџџџџџџџџЮ—nYSO€€€Лn5џџџџџџџџџџџџџџџџџџџџџкЭЦ†\FyJ2ЪИЎогЭогЭогЭогЭогЭогЭогЭогЭогЭогЭогЭЮОЕzL3ƒW@жШСџџџџџџЮ—nYSO€€€Оo1џџџџџџџџџџџџџџџџџџшрл€T=xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0xI0~R:овЬџџџа™mYSO€€€Сp0џџџџџџџџџџџџџџџџџџџџџѕё№Ё€nyJ2зЪТџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџпдЮzL3˜taђюьџџџџџџвšlYSO€€€Уr.џџџџџџџџџџџџџџџџџџџџџџџџџџџБ–‡ƒW@іѓёџџџџџџџџџџџџџџџџџџџџџџџџџџџћљљˆ_IЋ~§§§џџџџџџџџџе›kYSO€€€Цs-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ­ЗžџџџџџџџџџџџџџџџџџџџџџџџџџџџУЎЃЂ‚qџџџџџџџџџџџџџџџзœjZSO€€€Цs-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзœjZSO€€€Цs-џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџзœjZSO€€€Цs-џџџџџџЌxI0›xeХБІЄ„sџџџЦВЈ{iџџџџџџЇ‰yЙЁ”џџџЇ‰yЙЁ”џџџШЕЋxI0—s`љіѕЃƒrxI0~R:И “џџџџџџзœjZSO€€€Цs-џџџцниxI0”o\Џ”…zL3…[DџџџВ—‰|O6џџџџџџŠbLЂ‚qџџџŠbLЂ‚qџџџ™ub…[DЦВЈ­yJ2Г™‹Ѕ†vxI0йЫФџџџзœjZSO€€€Цs-џџџеЦОxI0иЪУџџџšwe…[DџџџВ—‰|O6џџџџџџŠbLЂ‚qџџџŠbLЂ‚qџџџjU{iџџџтигЬКБљіѕШДЊxI0ЦВЈџџџзœjZSO€€€Цs-џџџеЦОxI0сзвњџџЅˆx…[DљџџА—‰{M5њџџњџџŠbLЁ‚qњџџŠbLЁ‚qњџџjU|jњџџѓѕєЂƒrxI0xI0}O7цупџџџзœjZSO€€€Щv,џџџеЦОxI0уйгљџџІˆx…[DќџџА—‰xI0ѓієњџџ„YCЁ‚qњџџŠbLЁ‚qњџџjU|jњџџВ›xI0’nZНЊžьышќџџџџџйiZTO€€€Ыw*џџџеЦОxI0уйгќџџІˆx…[DћџџА—‰xI0Ў”†ЫНДyJ2ЉŽ~њџџŠbLЁ‚qжЭЦ„YCŠcMЪМГЉŽ~„YCлгЭБ™‹‰aK№ъшџџџлžhZTO€€€Эx'џџџдЦОxI0уйгљџџЅˆx…[DњџџА—‰„YC™wexI0zL3квЫњџџŠbLЁ‚qА—‰xI0xI0™wdпйг€T=xI0xI0 pџџџџџџнЁfZTO€€€аz&џџџџџџљџџџџџљџџљџџњџџњџџњџџњџџњџџнжаьышњџџњџџљџџљџџњџџjU|jњџџћџџїіѕлгЭцокљџџџџџџџџпЂe[TO€€€в{$џџџџџџњџџџџџџџџџџџљџџњџџњџџњџџњџџњџџњџџњџџљџџŠbLЁ‚qљџџЏ–ˆ|jњџџњџџћџџљџџћџџљџџћџџџџџрЃb[TO€€€з$џџџџџџњџџџџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџњџџІ‰yЗЁ”њџџњџџуплњџџњџџњџџњџџњџџ§џџџџџџџџтЃb[TO€€€о†*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчЉc[TO€€€д}мпЮкеНйвЙйвЙйвЙкгЙкгЙквЙкгЙкгЙкгЙкгЙйвЙйгЙйвЙквЙквЙквЙйвЙйгИиЯЖжЭГйбЗиЯЕиЯДнбДувЊомУд7^][€€€ГYЉLЂFŸCŸEŸEŸDŸEŸCŸCŸCŸDŸCŸC EŸCŸDŸEŸEŸEžCЄIЊS@ІJІI B‰I KКY```€€€ОfЫkвmбkбnбnаnбnбmвqвrвrбqбnбnЯmбlбnбoЯoЯiх—@№ЋbЯjьЁQіЂDœf>.j§~r‡Яottt€€€аu л‰*эЇV№=№œ;№œ;№?ё›7№˜3ёŸ?ю—/ю–/№›8№›7юš5№š6я•-я’&№”*э‘'эŽ!№”+№˜3э$ђ™3ѕž5ш•7Р‹_е‹;йxЈЄžеzн‰*н†!м„м„м‚мммƒмм€нƒн„н„н†н…м‚мƒмл€йz йz м€й{ к{ у‚ шƒ хтЎpР€€( @ ^ƒ‰ˆˆˆˆˆˆˆˆˆwwwџwwwџwwwџrrrџ]]]џXXXџXXXџXXXџXXXџXXXџXXXџXXXџXXXџXXXџXXXџXXXџXXXџbbbџ–––џ•G ”‰>ъ…:№ƒ9№ƒ8№ƒ8№ƒ8№ƒ9№ƒ:№ƒ:№ƒ:№ƒ:№ƒ:№ŠF"џŠF"џŠF"џŠF"џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џxG.џa^]џЁKџІS(џЄO$џЂN!џЂN!џЂN!џЂN!џЁN"џ M"џЁM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂM"џЂN"џ M"џ M"џЁO$џЄS)џЄO"џ[PJџДlAџџџџџџџџџџџџџџџџџџџџџџџџџњџџџїџџџћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџџџџџџЩ—sџaSKџВj@џџџџџџџџџўџџџўџџџўџџџўџџџџџџџџџџџџџџџўџџџўџџџџџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџџџџџџџџџЧ—zџ^RKџГh:џџџџџќџџџќџџџћџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџљѕѓџшрлџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџщтмџ№яьџњџџџњџџџњџџџќџџџџџџџШ”sџ\QKџЕi7џџџџџ§џџџњџџџљџџџћџџџћџџџњџџџњџџџњџџџњџџџѕіѕџЂkNџЬГЄџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџжУИџ›aCџђёяџњџџџњџџџћџџџџџџџЪ•rџ]RKџЗl6џџџџџўџџџћџџџќџџџќџџџћџџџњџџџњџџџњџџџђёяџЂlPџЁiLџљ§ќџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџІsXџeGџяьшџњџџџћџџџџџџџЬ–qџ^RKџЛn5џџџџџўџџџљџџџљџџџљџџџњџџџњџџџњџџџлЬТџ–Y8џ‹F#џбЖЈџпвЩџпвЩџпвЩџпвЩџпвЩџпвЩџпвЩџпвЩџпвЩџпвЩџпвЩџвМЏџŒH$џ“T2џиЧМџћџџџџџџџЮ—nџ^RKџОo1џџџџџџџџџљџџџњџџџњџџџњџџџњџџџчпйџ‘Q/џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џŠE!џN+џпбШџџџџџа™mџ^RKџСp0џџџџџџџџџљџџџњџџџњџџџњџџџњџџџњџџџђёяџЌ}dџ‹F#џнЩОџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџпгЪџŒH$џЅqVџ№юъџћџџџџџџџвšlџ_RKџУr.џџџџџџџџџљџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџЙ“џ“T2џѓѓ№џњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџїљјџ˜\<џД‹tџљ§ќџњџџџћџџџџџџџе›kџ_TLџУr.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџИŽxџР›ˆџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЫЌœџЏfџџџџџџџџџџџџџџџџџџџџџе›kџ[UQџУr.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе›kџ[UQџУr.џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџе›kџ[UQџУr.џџџџџџџџџџџџџЗŒvџŠE!џЈuZџЭЏ џАiџџџџџЮБЁџЊx^џџџџџџџџџГ†oџУŸџџџџџГ†oџУŸџџџџџЯГЅџŠE!џЅpTџњіѕџЏhџŠE!џN+џТž‹џџџџџџџџџе›kџ[UQџУr.џџџџџџџџџщмеџŠE!џЃlPџК‘|џŒH$џ•W7џџџџџМ•€џŽK(џџџџџџџџџš^?џЏfџџџџџš^?џЏfџџџџџІrWџ•W7џЮБЁџИŽxџ‹F#џН–‚џБƒlџŠE!џоЪРџџџџџе›kџ[UQџУr.џџџџџџџџџкХКџŠE!џнЩПџџџџџЈtYџ•W7џџџџџМ•€џŽK(џџџџџџџџџš^?џЏfџџџџџš^?џЏfџџџџџŸfIџЊx^џџџџџцзЯџгЙЋџњіѕџЯГЄџŠE!џЮБЁџџџџџе›kџ[UQџУr.џџџџџџџџџжХКџŠE!џтжЮџњџџџБ†nџ•W7џњџџџК•€џI&џџџџџњџџџ™^?џ­fџњџџџ™^?џ­fџњџџџžfIџЊy_џњџџџєѕѓџЎhџŠE!џŠE!џŽL)џщтмџџџџџе›kџ[UQџЦs-џџџџџџџџџжХКџŠE!џтиаџљџџџБ†nџ•W7џњџџџК•€џŠE!џљієџњџџџ”V5џ­fџњџџџ™^?џ­fџњџџџžfIџЊy_џњџџџМ™…џŠE!џЁkNџЦЈ—џюычџњџџџџџџџзœjџ\UQџЩv,џџџџџџџџџзХКџŠE!џуиаџќџџџВ†nџ•W7џњџџџК•€џŠE!џК’}џбЛЎџ‹F#џД‹uџњџџџ™^?џ­fџлЫСџ”V5џš_@џбЛ­џД‹uџ”V5џпвЩџЛ—ƒџ™^>џяъцџџџџџйiџ\UQџЫw*џџџџџџџџџжХКџŠE!џфиаџћџџџБ†nџ•W7џњџџџК•€џ”V5џЈtYџŠE!џŒH$џобШџњџџџ™^?џ­fџК•€џŠE!џŠE!џІtYџтиаџ‘Q/џŠE!џŠE!џЌ~fџџџџџџџџџлžhџ\UQџЭx'џџџџџўџџџљџџџљџџџљџџџњџџџњџџџњџџџњџџџњџџџњџџџџџџџсеЭџюычџњџџџњџџџњџџџњџџџњџџџžfIџЊy_џњџџџњџџџѕіѕџпвЩџхозџљџџџџџџџџџџџнЁfџ\UQџаz&џџџџџџџџџљџџџљџџџљџџџњџџџњџџџњџџџњџџџњџџџњџџџџџџџњџџџњџџџњџџџњџџџ™^?џ­fџњџџџК”€џЊy_џњџџџћџџџ§џџџћџџџўџџџљџџџџџџџџџџџпЂeџ\UQџв{$џџџџџџџџџњџџџџџџџџџџџљџџџњџџџњџџџњџџџњџџџњџџџџџџџњџџџњџџџљџџџљџџџГ†oџСŸџљџџџњџџџцоиџњџџџњџџџћџџџљџџџћџџџљџџџћџџџџџџџрЃbџ\UQџз$џџџџџџџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџџџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџњџџџ§џџџџџџџџџџџтЃbџ\UQџо†*џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчЉcџ\UQџд}џмпЮџкеНџйвЙџйвЙџкгЙџкгЙџквЙџкгЙџкгЙџкгЙџкгЙџйвЙџйвЙџйгЙџйвЙџйвЙџквЙџквЙџквЙџйвЙџйгИџиЯЖџжЭГџйбЗџиЯЕџиЯДџнбДџувЊџомУџд7џ`^]џГYџЉLџЂFџŸCџŸEџŸDџŸEџŸCџŸCџŸCџŸDџŸCџŸCџŸCџ EџŸCџŸCџŸDџŸEџŸEџŸEџžCџЄIџЊSџ@џІJџІIџ Bџ‰Iџ KџКYџ```џОfџЫkџвmџбkџбnџаnџбnџбmџвqџвrџвrџбqџбnџбnџбnџЯmџЯmџбlџбnџбoџЯoџЯiџх—@џ№ЋbџЯjџьЁQџіЂDџœf>џ.j§џ~r‡џЯoџnnnџЭnђл‰*џэЇVџ№=џ№œ;џ№?џё›7џ№˜3џёŸ?џю—/џю–/џ№›8џ№›7џ№›7џюš5џ№š6џ№š6џя•-џя’&џ№”*џэ‘'џэŽ!џ№”+џ№˜3џэ$џђ™3џѕž5џш•7џР‹_џе‹;џйxџЁ˜џкtbеx §м„џм€ўл}ўл{ ўлz ўлz ўл| ўлz ўлy ўм|ўм}ўм~џм~џм€џн†џн…џм‚џмƒџмџл€џйz џйz џм€џй{ џк{ џу‚ џшƒ џхџтЌoџђђђџ(  яяяџ”””џџ~~~џ~~~џ~~~џ~~~џ~~~џ~~~џ~~~џ~~~џ~~~џ~~~џ}}}џ„„„џАААџК€bџ”Y9џŒQ1џŒQ1џ‹Q1џŒQ1џŒQ1џŒQ1џŒQ1џŒQ1џŒQ1џŒQ1џ‰O1џŽQ3џrP?џџзВ›џњѕѓџљѕђџјѕђџїѕђџљѕђџљѕђџљѕђџљѕђџљѕђџљѕђџљѕђџњѕѓџљѕђџ…^GџџлЙЃџџџџџ§џџџ§џџџћќќџЩ––џќџџџќџџџќџџџќџџџьннџзДДџ§џџџўџџџ…^GџџнЙŸџџџџџњџџџєёёџЈTTџнТТџњџџџњџџџњџџџњџџџњџџџ­^^џаЅЅџ§џўџˆ`EџџлЕ™ёџџџџџџџџвЅЅџŠџЛvvџТ……џТ……џТ……џТ……џТ……џ @@џŸ>>џѓццџwH'лpоЗ—ёџџџџњџџџњџџџцееџЙwwџњџџџњџџџњџџџњџџџёььџЏbbџјљљџ§џўџwH'лpсИ–ёњѕѕџтЮЮџчжжџѕѕѕџшккџёээџэффџцееџљќќџпЧЧџѕѕѕџоУУџѓэьџzI&лpфК”ёЕiiџАddџ‘""џхггџВhhџеВВџФџЅMMџкЛЛџœ::џЊWWџДmmџ™33џ}L%лpфК”ёЊUUџёттџ99џщггџБccџйВВџЦџЇMMџйВВџЙrrџнЛЛџ“''џО||џ}L%лpцЛ’ёЊUUџђффџž<<џщггџ•++џЈPPџЭ››џЇMMџП~~џž==џЌYYџВddџКuuџ€N%лpцЛ’ёыжжџїљљџуааџѕѕѕџъннџоХХџњџџџбЈЈџЭЁЁџЊXXџє№№џоУУџїё№џ€N%лpьР–ёџџџџџџџџўџџџўџџџўџџџўџџџџџџџгЈЈџњїїџчааџўџџџџџџџџџџџƒM!лpоА}ёхрзџфмЯџхнаџхмаџхмаџфнаџхмаџхмаџфмаџукЫџукЬџчлЩџькНџŠc>кpКcјНdџМc џНd џНd џНdџМc џМb џМc џМc џШx(џЪs џГo7џ|WRџšzWЭRжy РфŽ*ёх‰ых‡ыфˆыф†ыф‰ыф‡ыф…ыт‚ых†ыч‡ысˆ$ьЫ1яПm p (0`€€€@@@   РРРAAA€aaa___000```AАААПППџџџрррћїїРіээњѕѕїююьййЖmmФ‰‰Џ^^ЈPP @@юнн­ZZнЛЛаЁЁШŠБbbљѓѓёууО||‘""ІLLЉRR“''вЅЅшбб‘##вЄЄНzzˆўќќ“&&тФФќљљЅKKœ99ъееž<<ГffтХХщггјёёО}}™22Ю‚лЗЗђххзЏЏ”))„ ЕjjёттЎ\\цЭЭ‰йГГ‡Ь™™пООПбЂЂ‹йВВЃFF† Вee˜00ј№№КttуЦЦƒфШШрСС№ссцЬЬܘ˜Џ__ЗooдЉЉЫ––ж­­–--›66ЮœœТ……шааэлл† ИqqхЫЫ;;ЙssКuuМyyфЩЩ‹иААмЙЙŒѕыыŒЗnnЦŒŒЫ——ааа ~}+{|9!zPl:w/xy!:st?u/v3P@"qr&R#no8]]]]]]]]]]]]]]]]]pW9i[jklm0c@f0ghcIde``ab]^B]B_]$6!Y-C,Z[\&'T@@U-C,V!WX!RE8MNO-C,PQR#SKIJK-C,0:LM+,-C,GH@+,-'C,DEF#+,->?,:@8AB#+,--3456789:;<=+,-)./012 !"#$%!&'()*