summaryrefslogtreecommitdiff
path: root/support/easylatex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/easylatex
Initial commit
Diffstat (limited to 'support/easylatex')
-rw-r--r--support/easylatex/COPYRIGHT344
-rw-r--r--support/easylatex/Getopt/Declare.pm3189
-rw-r--r--support/easylatex/HACKING13
-rw-r--r--support/easylatex/INSTALLATION52
-rw-r--r--support/easylatex/MANUAL.txt13
-rw-r--r--support/easylatex/README8
-rw-r--r--support/easylatex/TUTORIAL53
-rw-r--r--support/easylatex/Text/Balanced.pm997
-rw-r--r--support/easylatex/clean.sh7
-rw-r--r--support/easylatex/demo-no-graph.txt20
-rw-r--r--support/easylatex/demo.txt26
-rw-r--r--support/easylatex/easylatex.pl434
-rwxr-xr-xsupport/easylatex/easylatex/disabled/30autoAlignEquationsOutsideOfMathMode.pl37
-rw-r--r--support/easylatex/easylatex/embed_transforms/25scriptedMatrix.pl114
-rw-r--r--support/easylatex/easylatex/math_mode_symbol_list.txt612
-rwxr-xr-xsupport/easylatex/easylatex/transforms/20escapeInsideGraphs.pl118
-rw-r--r--support/easylatex/easylatex/transforms/25autoLinefeedInMathMode.pl31
-rwxr-xr-xsupport/easylatex/easylatex/transforms/25wiki.pl27
-rw-r--r--support/easylatex/easylatex/transforms/30autoFractions.pl20
-rwxr-xr-xsupport/easylatex/easylatex/transforms/30dotsToLdots.pl20
-rw-r--r--support/easylatex/easylatex/transforms/30superSubscripts.pl84
-rw-r--r--support/easylatex/easylatex/transforms/70autoMathMode.pl463
-rwxr-xr-xsupport/easylatex/easylatex/transforms/80autoAlignEquations.pl264
-rwxr-xr-xsupport/easylatex/easylatex/transforms/80autoItemize.pl99
-rwxr-xr-xsupport/easylatex/easylatex/transforms/80easyMatrices.pl239
-rwxr-xr-xsupport/easylatex/easylatex/transforms/85sweepHalfEquationsIntoAdjacentMathMode.pl125
-rw-r--r--support/easylatex/easylatex/transforms/90addHeaderAndFooter.pl123
-rwxr-xr-xsupport/easylatex/easylatex/transforms/90doublePercentIsCommentSymbol.pl14
-rwxr-xr-xsupport/easylatex/easylatex/transforms/90easyFigures.pl67
-rwxr-xr-xsupport/easylatex/easylatex/transforms/90graphs.pl192
-rwxr-xr-xsupport/easylatex/easylatex/transforms/90numberSign.pl12
-rwxr-xr-xsupport/easylatex/easylatex/transforms/90removeWhitespaceAroundEquations.pl13
-rwxr-xr-xsupport/easylatex/easylatex/transforms/91easyQuotes.pl17
-rwxr-xr-xsupport/easylatex/easylatex/transforms/91easySections.pl106
-rwxr-xr-xsupport/easylatex/easylatex/transforms/91seminarAddSlidesec.pl37
-rwxr-xr-xsupport/easylatex/easylatex/transforms/91seminarEnvAddSlide.pl36
-rwxr-xr-xsupport/easylatex/easylatex/transforms/92seminarFlushHeadingsTop.pl40
-rw-r--r--support/easylatex/easylatex/transforms/92tempKludges.pl17
-rw-r--r--support/easylatex/psfrag/00readme.txt82
-rw-r--r--support/easylatex/psfrag/announce.txt63
-rw-r--r--support/easylatex/psfrag/example.eps389
-rw-r--r--support/easylatex/psfrag/pfgguide.ps3935
-rw-r--r--support/easylatex/psfrag/pfgguide.tex695
-rw-r--r--support/easylatex/psfrag/psfrag.dtx1102
-rw-r--r--support/easylatex/psfrag/psfrag.ins25
-rw-r--r--support/easylatex/psfrag/testfig.eps6
-rw-r--r--support/easylatex/quickInstall.pl38
-rw-r--r--support/easylatex/testFiles/alignAndLinefeed.tex.correct17
-rw-r--r--support/easylatex/testFiles/alignAndLinefeed.txt6
-rw-r--r--support/easylatex/testFiles/alreadyHasHeaderAndFooter.tex.correct18
-rw-r--r--support/easylatex/testFiles/alreadyHasHeaderAndFooter.txt16
-rw-r--r--support/easylatex/testFiles/alreadyInMathMode_align.tex.correct19
-rw-r--r--support/easylatex/testFiles/alreadyInMathMode_align.txt4
-rw-r--r--support/easylatex/testFiles/alreadyInMathMode_dollar.tex.correct12
-rw-r--r--support/easylatex/testFiles/alreadyInMathMode_dollar.txt1
-rw-r--r--support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.tex.correct15
-rw-r--r--support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.txt4
-rw-r--r--support/easylatex/testFiles/autoAlignEquations.tex.correct17
-rw-r--r--support/easylatex/testFiles/autoAlignEquations.txt6
-rw-r--r--support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.tex.correct19
-rw-r--r--support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.txt4
-rw-r--r--support/easylatex/testFiles/autoItemize.tex.correct41
-rw-r--r--support/easylatex/testFiles/autoItemize.txt20
-rw-r--r--support/easylatex/testFiles/autoLinefeedInMathMode.tex.correct17
-rw-r--r--support/easylatex/testFiles/autoLinefeedInMathMode.txt6
-rw-r--r--support/easylatex/testFiles/autoLinefeedInMathMode.txt.correct15
-rw-r--r--support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.tex.correct12
-rw-r--r--support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.txt1
-rw-r--r--support/easylatex/testFiles/automathFracSqrt.tex.correct12
-rw-r--r--support/easylatex/testFiles/automathFracSqrt.txt1
-rw-r--r--support/easylatex/testFiles/bareParensShouldntBeItemized.tex.correct22
-rw-r--r--support/easylatex/testFiles/bareParensShouldntBeItemized.txt11
-rw-r--r--support/easylatex/testFiles/binarySymbol.tex.correct12
-rw-r--r--support/easylatex/testFiles/binarySymbol.txt1
-rw-r--r--support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.tex.correct15
-rw-r--r--support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.txt6
-rw-r--r--support/easylatex/testFiles/columnVector.tex.correct20
-rw-r--r--support/easylatex/testFiles/columnVector.txt1
-rw-r--r--support/easylatex/testFiles/demo.tex.correct55
-rw-r--r--support/easylatex/testFiles/demo.txt29
-rw-r--r--support/easylatex/testFiles/dontSweepApartDollarSigns.tex.correct18
-rw-r--r--support/easylatex/testFiles/dontSweepApartDollarSigns.txt12
-rw-r--r--support/easylatex/testFiles/dotsToLdots.tex.correct18
-rw-r--r--support/easylatex/testFiles/dotsToLdots.txt7
-rw-r--r--support/easylatex/testFiles/easySections.tex.correct34
-rw-r--r--support/easylatex/testFiles/easySections.txt20
-rw-r--r--support/easylatex/testFiles/escapedMatrix.tex.correct12
-rw-r--r--support/easylatex/testFiles/escapedMatrix.txt1
-rw-r--r--support/easylatex/testFiles/graphInteractions.tex.correct18
-rw-r--r--support/easylatex/testFiles/graphInteractions.txt12
-rw-r--r--support/easylatex/testFiles/graphInteractions2.tex.correct21
-rw-r--r--support/easylatex/testFiles/graphInteractions2.txt22
-rw-r--r--support/easylatex/testFiles/graphViz.tex.correct15
-rw-r--r--support/easylatex/testFiles/graphViz.txt11
-rw-r--r--support/easylatex/testFiles/identityMatrix.tex.correct20
-rw-r--r--support/easylatex/testFiles/identityMatrix.txt1
-rw-r--r--support/easylatex/testFiles/identityMatrix4D.tex.correct21
-rw-r--r--support/easylatex/testFiles/identityMatrix4D.txt1
-rw-r--r--support/easylatex/testFiles/inequalityAfterFirstEqn.tex.correct24
-rw-r--r--support/easylatex/testFiles/inequalityAfterFirstEqn.txt12
-rw-r--r--support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.tex.correct24
-rw-r--r--support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.txt12
-rw-r--r--support/easylatex/testFiles/multipleEqnsToAlign.tex.correct28
-rw-r--r--support/easylatex/testFiles/multipleEqnsToAlign.txt12
-rw-r--r--support/easylatex/testFiles/nakedEqnsInequalities.tex.correct47
-rw-r--r--support/easylatex/testFiles/nakedEqnsInequalities.txt31
-rw-r--r--support/easylatex/testFiles/nakedEqnsMultipleLines.tex.correct18
-rw-r--r--support/easylatex/testFiles/nakedEqnsMultipleLines.txt6
-rw-r--r--support/easylatex/testFiles/notAMatrix.tex.correct14
-rw-r--r--support/easylatex/testFiles/notAMatrix.txt3
-rw-r--r--support/easylatex/testFiles/scriptedMatrix.tex.correct20
-rw-r--r--support/easylatex/testFiles/scriptedMatrix.txt1
-rw-r--r--support/easylatex/testFiles/scriptedMatrixAckermann.tex.correct23
-rw-r--r--support/easylatex/testFiles/scriptedMatrixAckermann.txt13
-rw-r--r--support/easylatex/testFiles/seminarDocClass.tex.correct16
-rw-r--r--support/easylatex/testFiles/seminarDocClass.txt5
-rw-r--r--support/easylatex/testFiles/seminarSlideDivider.tex.correct21
-rw-r--r--support/easylatex/testFiles/seminarSlideDivider.txt7
-rw-r--r--support/easylatex/testFiles/simpleFraction.tex.correct12
-rw-r--r--support/easylatex/testFiles/simpleFraction.txt1
-rw-r--r--support/easylatex/testFiles/simpleSymbol.tex.correct12
-rw-r--r--support/easylatex/testFiles/simpleSymbol.txt1
-rw-r--r--support/easylatex/testFiles/singleLineNakedEqn.tex.correct17
-rw-r--r--support/easylatex/testFiles/singleLineNakedEqn.txt5
-rw-r--r--support/easylatex/testFiles/singleLineNakedEqnNot.tex.correct16
-rw-r--r--support/easylatex/testFiles/singleLineNakedEqnNot.txt5
-rw-r--r--support/easylatex/testFiles/superSubscripts.tex.correct14
-rw-r--r--support/easylatex/testFiles/superSubscripts.txt3
-rw-r--r--support/easylatex/testFiles/superSubscripts2.tex.correct16
-rw-r--r--support/easylatex/testFiles/superSubscripts2.txt5
-rw-r--r--support/easylatex/testFiles/superSymbolInteraction.tex.correct12
-rw-r--r--support/easylatex/testFiles/superSymbolInteraction.txt1
-rw-r--r--support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.tex.correct17
-rw-r--r--support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.txt11
-rw-r--r--support/easylatex/testFiles/transpose.tex.correct28
-rw-r--r--support/easylatex/testFiles/transpose.txt1
-rw-r--r--support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.tex.correct12
-rw-r--r--support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.txt1
-rwxr-xr-xsupport/easylatex/unitTestDiffs.pl62
-rw-r--r--support/easylatex/unitTestDiffs.sh20
-rwxr-xr-xsupport/easylatex/wikiLatexToEasyLatex.pl41
-rwxr-xr-xsupport/easylatex/wikiLatexToEasyLatexTables.pl36
142 files changed, 15823 insertions, 0 deletions
diff --git a/support/easylatex/COPYRIGHT b/support/easylatex/COPYRIGHT
new file mode 100644
index 0000000000..6f2db31242
--- /dev/null
+++ b/support/easylatex/COPYRIGHT
@@ -0,0 +1,344 @@
+The source code of EasyLatex is copyright 2004 by Bayle Shanks. You may use it under the terms of either the GNU GPL Version 2, or the Latex Project Public License (LPPL), at your choice. However, for the user's convenience it is distributed with other software which is under different licenses: GetOpt, PSFrag, and ladot. The GNU GPL is appended below.
+
+----
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/support/easylatex/Getopt/Declare.pm b/support/easylatex/Getopt/Declare.pm
new file mode 100644
index 0000000000..df2f6afd70
--- /dev/null
+++ b/support/easylatex/Getopt/Declare.pm
@@ -0,0 +1,3189 @@
+package Getopt::Declare;
+
+use strict;
+use vars qw($VERSION);
+use UNIVERSAL qw(isa);
+
+$VERSION = '1.09';
+
+
+package Getopt::Declare::StartOpt;
+
+sub new { bless {} }
+sub matcher { '(?:()' }
+sub code { '' }
+sub cachecode { '' }
+sub trailer { undef }
+sub ows { return $_[1]; }
+
+package Getopt::Declare::EndOpt;
+
+sub new { bless {} }
+sub matcher { '())?' }
+sub code { '' }
+sub cachecode { '' }
+sub trailer { undef }
+sub ows { return $_[1]; }
+
+package Getopt::Declare::ScalarArg;
+
+my %stdtype = ();
+
+sub _reset_stdtype
+{
+ %stdtype =
+ (
+ ':i' => { pattern => '(?:(?:%T[+-]?)%D+)' },
+ ':n' => { pattern => '(?:(?:%T[+-]?)(?:%D+(?:%T\.%D*)?(?:%T[eE]%D+)?'
+ . '|%T\.%D+(?:%T[eE]%D+)?))' },
+ ':s' => { pattern => '(?:%T(?:\S|\0))+' },
+ ':qs' => { pattern => q{"(?:\\"|[^"])*"|'(?:\\'|[^"])*|(?:%T(?:\S|\0))+} },
+ ':id' => { pattern => '%T[a-zA-Z_](?:%T\w)*' },
+ ':if' => { pattern => '%F(?:%T(?:\S|\0))+',
+ action => '{reject(!defined $_VAL_ || $_VAL_ ne "-" && ! -r $_VAL_, "in parameter \'$_PARAM_\' (file \"$_VAL_\" is not readable)")}' },
+ ':of' => { pattern => '%F(?:%T(?:\S|\0))+',
+ action => '{reject (!defined $_VAL_ || $_VAL_ ne "-" && -e $_VAL_ && ! -w $_VAL_ , "in parameter \'$_PARAM_\' (file \"$_VAL_\" is not writable)")}' },
+ '' => { pattern => ':s', ind => 1 },
+
+ ':+i' => { pattern => ':i',
+ action => '{reject (!defined $_VAL_ || $_VAL_<=0, "in parameter \'$_PARAM_\' ($_VAR_ must be an integer greater than zero)")}',
+ ind => 1},
+
+ ':+n' => { pattern => ':n',
+ action => '{reject (!defined $_VAL_ || $_VAL_<=0, "in parameter \'$_PARAM_\' ($_VAR_ must be a number greater than zero)")}',
+ ind => 1},
+
+ ':0+i' => { pattern => ':i',
+ action => '{reject (!defined $_VAL_ || $_VAL_<0, "in parameter \'$_PARAM_\' ($_VAR_ must be an positive integer)")}',
+ ind => 1},
+
+ ':0+n' => { pattern => ':n',
+ action => '{reject (!defined $_VAL_ || $_VAL_<0, "in parameter \'$_PARAM_\' ($_VAR_ must be a positive number)")}',
+ ind => 1},
+
+ );
+}
+
+sub stdtype # ($typename)
+{
+ my $name = shift;
+ my %seen = ();
+ while (!$seen{$name} && $stdtype{$name} && $stdtype{$name}->{ind})
+ { $seen{$name} = 1; $name = $stdtype{$name}->{pattern} }
+
+ return undef if $seen{$name} || !$stdtype{$name};
+ return $stdtype{$name}->{pattern};
+}
+
+sub stdactions # ($typename)
+{
+ my $name = shift;
+ my %seen = ();
+ my @actions = ();
+ while (!$seen{$name} && $stdtype{$name} && $stdtype{$name}->{ind})
+ {
+ $seen{$name} = 1;
+ push @actions, $stdtype{$name}->{action}
+ if $stdtype{$name}->{action};
+ $name = $stdtype{$name}->{pattern}
+ }
+ push @actions, $stdtype{$name}->{action}
+ if $stdtype{$name}->{action};
+
+ return @actions;
+}
+
+sub addtype # ($abbrev, $pattern, $action, $ref)
+{
+ my $typeid = ":$_[0]";
+ unless ($_[1] =~ /\S/) { $_[1] = ":s" , $_[3] = 1; }
+ $stdtype{$typeid} = {};
+ $stdtype{$typeid}->{pattern} = "(?:$_[1])" if $_[1] && !$_[3];
+ $stdtype{$typeid}->{pattern} = ":$_[1]" if $_[1] && $_[3];
+ $stdtype{$typeid}->{action} = $_[2] if $_[2];
+ $stdtype{$typeid}->{ind} = $_[3];
+}
+
+sub new # ($self, $name, $type, $nows)
+{
+ bless
+ { name => $_[1],
+ type => $_[2],
+ nows => $_[3],
+ }, ref($_[0])||$_[0];
+}
+
+sub matcher # ($self, $trailing)
+{
+ my ($self, $trailing) = @_;
+ #WAS: $trailing = $trailing ? '(?!\Q'.$trailing.'\E)' : '';
+ $trailing = $trailing ? '(?!'.quotemeta($trailing).')' : '';
+ my $stdtype = stdtype($self->{type});
+
+ if (!$stdtype && $self->{type} =~ m#\A:/([^/]+)/\Z#) { $stdtype = $1; }
+ if (!$stdtype)
+ {
+ die "Error: bad type in Getopt::Declare parameter variable specification near '<$self->{name}$self->{type}>'\n";
+ }
+ $stdtype =~ s/\%D/(?:$trailing\\d)/g;
+ $stdtype =~ s/\%T/$trailing/g;
+ unless ($stdtype =~ s/\%F//)
+ {
+ $stdtype = Getopt::Declare::Arg::negflagpat().$stdtype;
+ }
+ return "(?:$stdtype)";
+}
+
+sub code # ($self, $pos, $package)
+{
+ my $code = '
+ $_VAR_ = q|<' . $_[0]->{name} . '>|;
+ $_VAL_ = defined $' . ($_[1]+1) . '? $' . ($_[1]+1) . ': undef;
+ $_VAL_ =~ tr/\0/ / if $_VAL_;';
+
+ my @actions = stdactions($_[0]->{type});
+ foreach ( @actions )
+ {
+ s/(\s*\{)/$1 package $_[2]; /;
+ $code .= "\n\t\tdo $_;";
+ }
+
+ $code .= '
+ my $' . $_[0]->{name} . ' = $_VAL_;';
+
+ return $code;
+}
+
+sub cachecode # ($self, $ownerflag, $itemcount)
+{
+ return "\t\t\$self->{'$_[1]'}{'<$_[0]->{name}>'} = \$$_[0]->{name};\n"
+ if $_[2] > 1;
+ return "\t\t\$self->{'$_[1]'} = \$$_[0]->{name};\n";
+}
+
+sub trailer { '' }; # MEANS TRAILING PARAMETER VARIABLE
+
+sub ows
+{
+ return '(?:\s|\0)*('.$_[1].')' unless $_[0]->{nows};
+ return '('.$_[1].')';
+}
+
+
+package Getopt::Declare::ArrayArg;
+
+use vars qw { @ISA };
+@ISA = qw ( Getopt::Declare::ScalarArg );
+
+sub matcher # ($self, $trailing)
+{
+ my ($self, $trailing) = @_;
+ my $suffix = (defined $trailing && !$trailing) ? '\s+' : '';
+ my $scalar = $self->SUPER::matcher($trailing);
+
+ return $scalar.'(?:\s+'.$scalar.')*'.$suffix;
+}
+
+sub code # ($self, $pos, $package)
+{
+ my $code = '
+ $_VAR_ = q|<' . $_[0]->{name} . '>|;
+ $_VAL_ = undef;
+ my @' . $_[0]->{name} . ' =
+ map { tr/\0/ /; $_ } split " ", $'.($_[1]+1)."||'';\n";
+
+
+ my @actions = Getopt::Declare::ScalarArg::stdactions($_[0]->{type});
+ if (@actions)
+ {
+ $code .= '
+ foreach $_VAL_ ( @' . $_[0]->{name} . ' )
+ {';
+ foreach ( @actions )
+ {
+ s/(\s*\{)/$1 package $_[2]; /;
+ $code .= "\t\t\tdo $_;\n";
+ }
+ $code .= '
+ }';
+ }
+ return $code;
+}
+
+sub cachecode # ($self, $ownerflag, $itemcount)
+{
+ return "\t\t\$self->{'$_[1]'}{'<$_[0]->{name}>'} = []
+ unless \$self->{'$_[1]'}{'<$_[0]->{name}>'};
+ push \@{\$self->{'$_[1]'}{'<$_[0]->{name}>'}}, \@$_[0]->{name};\n"
+ if $_[2] > 1;
+ return "\t\t\$self->{'$_[1]'} = []
+ unless \$self->{'$_[1]'};
+ push \@{\$self->{'$_[1]'}}, \@$_[0]->{name};\n";
+}
+
+
+package Getopt::Declare::Punctuator;
+
+sub new # ($self, $text, $nows)
+{
+ bless { text => $_[1], nows => $_[2] }
+}
+
+sub matcher # ($self, $trailing)
+{
+ #WAS: Getopt::Declare::Arg::negflagpat() . '\Q' . $_[0]->{text} . '\E';
+ Getopt::Declare::Arg::negflagpat() . quotemeta($_[0]->{text});
+}
+
+sub code # ($self, $pos)
+{
+ "
+ \$_PUNCT_{'" . $_[0]->{text} . "'" . '} = $' . ($_[1]+1) . ";\n";
+}
+
+sub cachecode # ($self, $ownerflag, $itemcount)
+{
+ return "\t\t\$self->{'$_[1]'}{'$_[0]->{text}'} = \$_PUNCT_{'$_[0]->{text}'};\n"
+ if $_[2] > 1;
+ return "\t\t\$self->{'$_[1]'} = \$_PUNCT_{'$_[0]->{text}'};\n";
+}
+
+sub trailer { $_[0]->{text} };
+
+sub ows
+{
+ return '(?:\s|\0)*('.$_[1].')' unless $_[0]->{nows};
+ return '('.$_[1].')';
+}
+
+
+package Getopt::Declare::Arg;
+
+use Text::Balanced qw( extract_bracketed );
+
+my $nextID = 0;
+
+my @helpcmd = qw( -help --help -Help --Help -HELP --HELP -h -H );
+my %helpcmd = map { $_ => 1 } @helpcmd;
+
+sub besthelp { foreach ( @helpcmd ) { return $_ if exists $helpcmd{$_}; } }
+sub helppat { return join '|', keys %helpcmd; }
+
+my @versioncmd = qw( -version --version -Version --Version
+ -VERSION --VERSION -v -V );
+my %versioncmd = map { $_ => 1 } @versioncmd;
+
+sub bestversion {foreach (@versioncmd) { return $_ if exists $versioncmd{$_}; }}
+sub versionpat { return join '|', keys %versioncmd; }
+
+my @flags;
+my $posflagpat = '';
+my $negflagpat = '';
+sub negflagpat
+{
+ $negflagpat = join '', map { "(?!".quotemeta($_).")" } @flags
+ if !$negflagpat && @flags;
+ return $negflagpat;
+}
+
+sub posflagpat
+{
+ $posflagpat = '(?:'.join('|', map { quotemeta($_) } @flags).')'
+ if !$posflagpat && @flags;
+ return $posflagpat;
+}
+
+sub new # ($class, $spec, $desc, $dittoflag)
+{
+ my ($class,$spec,$desc,$ditto) = @_;
+ my $first = 1;
+ my $arg;
+ my $nows;
+
+ my $self =
+ {
+ flag => '',
+ args => [],
+ actions => [],
+ ditto => $ditto,
+ required => 0,
+ requires => '',
+ ID => $nextID++,
+ desc => $spec,
+ items => 0,
+ };
+
+ $self->{desc} =~ s/\A\s*(.*?)\s*\Z/$1/;
+
+ while ($spec)
+ {
+ # OPTIONAL
+ if ($spec =~ s/\A(\s*)\[/$1/)
+ {
+ push @{$self->{args}}, new Getopt::Declare::StartOpt;
+ next;
+ }
+ elsif ($spec =~ s/\A\s*\]//)
+ {
+ push @{$self->{args}}, new Getopt::Declare::EndOpt;
+ next;
+ }
+
+ # ARG
+
+ ($arg,$spec,$nows) = extract_bracketed($spec,'<>');
+ if ($arg)
+ {
+ $arg =~ m/\A(\s*)(<)([a-zA-Z]\w*)(:[^>]+|)>/ or
+ die "Error: bad Getopt::Declare parameter variable specification near '$arg'\n";
+
+ my @details = ( $3, $4, !$first && !length($nows) ); # NAME,TYPE,NOWS
+
+ if ($spec =~ s/\A\.\.\.//) # ARRAY ARG
+ {
+ push @{$self->{args}},
+ new Getopt::Declare::ArrayArg (@details);
+ }
+ else # SCALAR ARG
+ {
+ push @{$self->{args}},
+ new Getopt::Declare::ScalarArg (@details);
+ }
+ $self->{items}++;
+ next;
+ }
+
+ # PUNCTUATION
+
+ elsif ( $spec =~ s/\A(\s*)((\\.|[^] \t\n[<])+)// )
+ {
+ my ($ows, $punct) = ($1,$2);
+ $punct =~ s/\\(?!\\)(.)/$1/g;
+ if ($first) { $self->{flag} = $punct; push @flags, $punct; }
+
+ else { push @{$self->{args}},
+ new Getopt::Declare::Punctuator ($punct,!length($ows));
+ $self->{items}++; }
+
+ }
+
+ else { last; }
+
+ }
+ continue
+ {
+ $first = 0;
+ }
+
+ delete $helpcmd{$self->{flag}} if exists $helpcmd{$self->{flag}};
+ delete $versioncmd{$self->{flag}} if exists $versioncmd{$self->{flag}};
+
+ bless $self;
+}
+
+sub code
+{
+ my ($self, $owner,$package) = @_;
+
+ my $code = "\n";
+ my $flag = $self->{flag};
+ my $clump = $owner->{_internal}{clump};
+ my $i = 0;
+ my $nocase = (Getopt::Declare::_nocase() || $self->{nocase} ? 'i' : '');
+
+ $code .= (!$self->{repeatable})
+ ? q# param: while (!$_FOUND_{'# . $self->name . q#'}#
+ : q# param: while (1#;
+
+ if ($flag && ($clump==1 && $flag !~ /\A[^a-z0-9]+[a-z0-9]\Z/i
+ || ($clump<3 && @{$self->{args}} )))
+ {
+ $code .= q# && !$_lastprefix#;
+ }
+
+ $code .= q#)
+ {
+ pos $_args = $_nextpos if defined $_args;
+ %_PUNCT_ = ();#;
+
+ if ($flag)
+ {
+ #WAS: $_args =~ m/\G(?:\s|\0)*\Q# . $flag . q#\E/g# . $nocase
+ $code .= q#
+
+ $_args && $_args =~ m/\G(?:\s|\0)*# . quotemeta($flag) . q#/g# . $nocase
+ . q# or last;
+ $_errormsg = q|incorrect specification of '# . $flag . q#' parameter| unless $_errormsg;
+
+ #;
+ }
+ elsif ((Getopt::Declare::ScalarArg::stdtype($self->{args}[0]{type})||'') !~ /\%F/)
+ {
+ $code .= q#
+
+ last if $_errormsg;
+
+ #;
+ }
+
+ $code .= q#
+ $_PARAM_ = '# . $self->name . q#';
+ #;
+ my @trailer;
+ $#trailer = @{$self->{args}};
+ for ($i=$#{$self->{args}} ; $i>0 ; $i-- )
+ {
+ $trailer[$i-1] = $self->{args}[$i]->trailer();
+ $trailer[$i-1] = $trailer[$i] unless defined $trailer[$i-1];
+ }
+
+ if (@{$self->{args}})
+ {
+ $code .= '
+ $_args && $_args =~ m/\G';
+
+ for ($i=0; $i < @{$self->{args}} ; $i++ )
+ {
+ $code .=
+ $self->{args}[$i]->ows($self->{args}[$i]->matcher($trailer[$i]))
+ }
+
+ $code .= '/gx' . $nocase . ' or last;'
+ }
+
+
+ for ($i=0; $i < @{$self->{args}} ; $i++ )
+ {
+ $code .= $self->{args}[$i]->code($i,$package); #, $flag ????
+ }
+
+ if ($flag)
+ {
+ $code .= q#
+ if (exists $_invalid{'# . $flag . q#'})
+ {
+ $_errormsg = q|parameter '# . $flag
+ . q#' not allowed with parameter '|
+ . $_invalid{'# . $flag . q#'} . q|'|;
+ last;
+ }
+ else
+ {
+ foreach (#
+ . ($owner->{_internal}{mutex}{$flag}
+ ? join(',', map {"'$_'"} @{$owner->{_internal}{mutex}{$flag}})
+ : '()')
+ . q#)
+ {
+ $_invalid{$_} = '# . $flag . q#';
+ }
+ }
+ #
+ }
+
+ foreach my $action ( @{$self->{actions}} )
+ {
+ $action =~ s{(\s*\{)}
+ { $1 package $package; };
+ $code .= "\n\t\tdo " . $action . ";\n";
+ }
+
+ if ($flag && $self->{items}==0)
+ {
+ $code .= "\n\t\t\$self->{'$flag'} = '$flag';\n";
+ }
+ foreach my $subarg ( @{$self->{args}} )
+ {
+ $code .= $subarg->cachecode($self->name,$self->{items});
+ }
+
+ if ($flag =~ /\A([^a-z0-9]+)/i) { $code .= '$_lastprefix = "'.quotemeta($1).'";'."\n" }
+ else { $code .= '$_lastprefix = "";' }
+
+ $code .= q#
+ $_FOUND_{'# . $self->name . q#'} = 1;
+ next arg if pos $_args;
+ $_nextpos = length $_args;
+ last arg;
+ }
+
+ #;
+}
+
+sub name
+{
+ my $self = shift;
+ return $self->{flag} || "<$self->{args}[0]{name}>";
+}
+
+
+package Getopt::Declare;
+
+use Text::Balanced qw( :ALL );
+use Text::Tabs qw( expand );
+
+# PREDEFINED GRAMMARS
+
+my %_predef_grammar =
+(
+ "-PERL" =>
+q{ -<varname:id> Set $<varname> to 1 [repeatable]
+ { no strict "refs"; ${"::$varname"} = 1 }
+
+},
+
+ "-AWK" =>
+q{ <varname:id>=<val> Set $<varname> to <val> [repeatable]
+ {no strict "refs"; ${"::$varname"} = $val }
+ <varname:id>= Set $<varname> to '' [repeatable]
+ {no strict "refs"; ${"::$varname"} = '' }
+
+},
+);
+my $_predef_grammar = join '|', keys %_predef_grammar;
+
+sub _quoteat
+{
+ my $text = shift;
+ $text =~ s/\A\@/\\\@/;
+ $text =~ s/([^\\])\@/$1\\\@/;
+ $text;
+}
+
+sub new # ($self, $grammar; $source)
+{
+# HANDLE SHORT-CIRCUITS
+
+ return 0 if @_==3 && (!defined($_[2]) || $_[2] eq '-SKIP');
+
+# SET-UP
+
+ my ($_class, $_grammar) = @_;
+
+# PREDEFINED GRAMMAR?
+
+ if ($_grammar =~ /\A(-[A-Z]+)+/)
+ {
+ my $predef = $_grammar;
+ my %seen = ();
+ $_grammar = '';
+ $predef =~ s{($_predef_grammar)}{ do {$_grammar .= $_predef_grammar{$1} unless $seen{$1}; $seen{$1} = 1; ""} }ge;
+ return undef if $predef || !$_grammar;
+ }
+
+# PRESERVE ESCAPED '['s
+
+ $_grammar =~ s/\\\[/\255/g;
+
+# MAKE SURE GRAMMAR ENDS WITH A NEWLINE
+
+ $_grammar =~ s/([^\n])\Z/$1\n/;
+
+# SET-UP
+
+ local $_ = $_grammar;
+ my @_args = ();
+ my $_mutex = {};
+ my $_action;
+ my $_strict = 0;
+ my $_all_repeatable = 0;
+ my $_lastdesc = undef;
+ _nocase(0);
+ Getopt::Declare::ScalarArg::_reset_stdtype();
+
+# CONSTRUCT GRAMMAR
+
+ while (length $_ > 0)
+ {
+ # COMMENT:
+ s/\A[ ]*#.*\n// and next;
+
+ # TYPE DIRECTIVE:
+
+ #WAS: if (m/\A\s*\[pvtype:/ and $_action = extract_codeblock($_,'[{}]'))
+ if (m/\A\s*\[pvtype:/ and $_action = extract_codeblock($_,'[]'))
+ {
+ $_action =~ s/.*?\[pvtype:\s*//;
+ _typedef($_action);
+ next;
+ }
+
+ # ACTION
+ if ($_action = extract_codeblock)
+ {
+ # WAS: eval q{no strict;my $ref = sub }._quoteat($_action).q{;1}
+ my $_check_action = $_action;
+ $_check_action =~ s{(\s*\{)}
+ { $1 sub defer(&); sub finish(;\$); sub reject(;\$\$); };
+ eval q{no strict;my $ref = sub }.$_check_action.q{;1}
+ or die "Error: bad action in Getopt::Declare specification:"
+ . "\n\n$_action\n\n$@\n";
+ if ($#_args < 0)
+ {
+ die "Error: unattached action in Getopt::Declare specification:\n$_action\n"
+ . "\t(did you forget the tab after the preceding parameter specification?)\n"
+ }
+ push @{$_args[$#_args]->{actions}}, $_action;
+ next;
+ }
+ elsif (m/\A(\s*[{].*)/)
+ {
+ die "Error: incomplete action in Getopt::Declare specification:\n$1.....\n"
+ . "\t(did you forget a closing '}'?)\n";
+ }
+
+ # ARG + DESC:
+ if ( s/\A(.*?\S.*?)(\t.*\n)// )
+ {
+ my $spec = $1;
+ my $desc = $2;
+ my $ditto;
+ $_strict ||= $desc =~ /\Q[strict]/;
+
+ $desc .= $1 while s/\A((?![ ]*({|\n)|.*?\S.*?\t.*?\S).*?\S.*\n)//;
+
+ $_lastdesc and $desc =~ s/\A\s*\[ditto\]/$_lastdesc/
+ and $ditto = 1;
+ $_lastdesc = $desc;
+
+ my $arg = new Getopt::Declare::Arg($spec,$desc,$ditto) ;
+ push @_args, $arg;
+
+ _infer($desc, $arg, $_mutex);
+ next;
+ }
+
+
+ # OTHERWISE: DECORATION
+
+ s/((?:(?!\[pvtype:).)*)(\n|(?=\[pvtype:))//;
+ my $decorator = $1;
+ $_strict ||= $decorator =~ /\Q[strict]/;
+ _infer($decorator, undef, $_mutex);
+ $_all_repeatable = 1 if $decorator =~ /\[repeatable\]/;
+ }
+
+ my $_lastactions;
+ foreach ( @_args )
+ {
+ if ($_lastactions && $_->{ditto} && !@{$_->{actions}})
+ { $_->{actions} = $_lastactions }
+ else
+ { $_lastactions = $_->{actions} }
+
+ if ($_all_repeatable)
+ {
+ $_->{repeatable} = 1;
+ }
+ }
+
+ @_args = sort
+ {
+ length($b->{flag}) <=> length($a->{flag})
+ or
+ $b->{flag} eq $a->{flag} and $#{$b->{args}} <=> $#{$a->{args}}
+ or
+ $a->{ID} <=> $b->{ID}
+
+ } @_args;
+
+# CONSTRUCT OBJECT ITSELF
+
+ my $clump = ($_grammar =~ /\[cluster:\s*none\s*\]/i) ? 0
+ : ($_grammar =~ /\[cluster:\s*singles?\s*\]/i) ? 1
+ : ($_grammar =~ /\[cluster:\s*flags?\s*\]/i) ? 2
+ : ($_grammar =~ /\[cluster:\s*any\s*\]/i) ? 3
+ : ($_grammar =~ /\[cluster:(.*)\s*\]/i) ?
+ die "Error: unknown clustering mode: [cluster:$1]\n"
+ : 3;
+
+ my $self = bless
+ {
+ _internal =>
+ {
+ args => [@_args],
+ mutex => $_mutex,
+ usage => $_grammar,
+ helppat => Getopt::Declare::Arg::helppat(),
+ verspat => Getopt::Declare::Arg::versionpat(),
+ strict => $_strict,
+ clump => $clump,
+ source => '',
+ 'caller' => scalar caller(),
+ }
+ }, ref($_class)||$_class;
+
+
+# VESTIGAL DEBUGGING CODE
+
+ open (CODE, ">.CODE")
+ and print CODE $self->code($self->{_internal}{'caller'})
+ and close CODE
+ if $::Declare_debug;
+
+# DO THE PARSE (IF APPROPRIATE)
+
+
+ if (@_==3) { return undef unless defined $self->parse($_[2]) }
+ else { return undef unless defined $self->parse(); }
+
+ return $self;
+}
+
+sub _get_nextline { scalar <> }
+
+sub _load_sources # ( \$_get_nextline, @files )
+{
+ my $text = '';
+ my @found = ();
+ my $gnlref = shift;
+ foreach ( @_ )
+ {
+ open FILE, $_ or next;
+ if (-t FILE)
+ {
+ push @found, '<STDIN>';
+ $$gnlref = \&_get_nextline;
+ }
+ else
+ {
+ push @found, $_;
+ $text .= join "\n", <FILE>;
+ }
+ }
+ return undef unless @found;
+ $text = <STDIN> unless $text;
+ return ( $text, join(" or ",@found));
+}
+
+
+sub parse # ($self;$source)
+{
+ my ( $self, $source ) = @_;
+ my $_args = ();
+ my $_get_nextline = sub { undef };
+ if (@_>1)
+ {
+ if (!defined $source)
+ {
+ return 0;
+ }
+ elsif (isa($source,'CODE'))
+ {
+ $_get_nextline = $source;
+ $_args = &{$_get_nextline}($self);
+ $source = '[SUB]';
+ }
+ elsif (isa($source,'GLOB'))
+ {
+ if (-t *$source)
+ {
+ $_get_nextline = \&_get_nextline ;
+ $_args = <STDIN>;
+ $source = '<STDIN>';
+ }
+ else
+ {
+ $_args = join ' ', (<$source>);
+ $_args =~ tr/\t\n/ /s;
+ $source = ref($source);
+ }
+ }
+ elsif (isa($source,'IO::Handle'))
+ {
+ if (!($source->fileno) && -t)
+ {
+ $_get_nextline = \&_get_nextline ;
+ $_args = <STDIN>;
+ $source = '<STDIN>';
+ }
+ else
+ {
+ $_args = join ' ', (<$source>);
+ $_args =~ tr/\t\n/ /s;
+ $source = ref($source);
+ }
+ }
+ elsif (ref($source) eq 'ARRAY')
+ {
+ if (@$source == 1 && (!defined($source->[0])
+ || $source->[0] eq '-BUILD'
+ || $source->[0] eq '-SKIP') )
+ {
+ return 0;
+ }
+ elsif (@$source == 1 && $source->[0] eq '-STDIN')
+ {
+ $_get_nextline = \&_get_nextline ;
+ $_args = <STDIN>;
+ $source = '<STDIN>';
+ }
+ elsif (@$source == 1 && $source->[0] eq '-CONFIG')
+ {
+ my $progname = "$0rc";
+ $progname =~ s#.*/##;
+ ($_args,$source) = _load_sources(\$_get_nextline,"$ENV{HOME}/.$progname", ".$progname");
+ }
+ else
+ {
+ my $stdin;
+ ($_args,$source) = _load_sources(\$_get_nextline,@$source);
+ }
+ }
+ else # LITERAL STRING TO PARSE
+ {
+ $_args = $source;
+ substr($source,7) = '...' if length($source)>7;
+ $source = "\"$source\"";
+ }
+ return 0 unless defined $_args;
+ $source = " (in $source)";
+ }
+ else
+ {
+ foreach (@ARGV) { $_ =~ tr/ \t\n/\0\0\0/; }
+ $_args = join(' ', @ARGV);
+ $source = '';
+ }
+
+ $self->{_internal}{source} = $source;
+
+ if (!eval $self->code($self->{_internal}{'caller'}))
+ {
+ die "Error: in generated parser code:\n$@\n"
+ if $@;
+ return undef;
+ }
+
+ return 1;
+}
+
+sub type # ($abbrev, $pattern, $action)
+{
+ &Getopt::Declare::ScalarArg::addtype;
+}
+
+sub _enbool
+{
+ my $expr = shift;
+ $expr =~ s/\s*\|\|\s*/ or /g;
+ $expr =~ s/\s*&&\s*/ and /g;
+ $expr =~ s/\s*!\s*/ not /g;
+ return $expr;
+}
+
+sub _enfound
+{
+ my $expr = shift;
+ my $original = $expr;
+ $expr =~ s/((?:&&|\|\|)?\s*(?:[!(]\s*)*)([^ \t\n|&\)]+)/$1\$_FOUND_{'$2'}/gx;
+ die "Error: bad condition in [requires: $original]\n"
+ unless eval 'no strict; my $ref = sub { '.$expr.' }; 1';
+ return $expr;
+}
+
+my $_nocase = 0;
+
+sub _nocase
+{
+ $_nocase = $_[0] if $_[0];
+ return $_nocase;
+}
+
+sub _infer # ($desc, $arg, $mutex)
+{
+ my ($desc, $arg, $mutex) = @_;
+
+ _mutex($mutex, split(' ',$1))
+ while $desc =~ s/\[mutex:\s*(.*?)\]//i;
+
+ if ( $desc =~ m/\[no\s*case\]/i)
+ {
+ if ($arg) { $arg->{nocase} = 1 }
+ else { _nocase(1); }
+ }
+
+ if (defined $arg)
+ {
+ _exclude($mutex, $arg->name, (split(' ',$1)))
+ if $desc =~ m/.*\[excludes:\s*(.*?)\]/i;
+ $arg->{requires} = $1
+ if $desc =~ m/.*\[requires:\s*(.*?)\]/i;
+
+ $arg->{required} = ( $desc =~ m/\[required\]/i );
+ $arg->{repeatable} = ( $desc =~ m/\[repeatable\]/i );
+ }
+
+ _typedef($desc) while $desc =~ s/.*?\[pvtype:\s*//;
+}
+
+sub _typedef
+{
+ my $desc = $_[0];
+ my ($name,$pat,$action,$ind);
+
+ ($name,$desc) = (extract_quotelike($desc))[5,1];
+ do { $desc =~ s/\A\s*([^] \t\n]+)// and $name = $1 } unless $name;
+ die "Error: bad type directive (missing type name): [pvtype: "
+ . substr($desc,0,index($desc,']')||20). "....\n"
+ unless $name;
+
+ ($pat,$desc,$ind) = (extract_quotelike($desc,'\s*:?\s*'))[5,1,2];
+ do { $desc =~ s/\A\s*(:?)\s*([^] \t\n]+)//
+ and $pat = $2 and $ind = $1 } unless $pat;
+ $pat = '' unless $pat;
+
+ $action = extract_codeblock($desc) || '';
+ die "Error: bad type directive (expected closing ']' but found"
+ . "'$1' instead): [pvtype: $name " . ($pat?"/$pat/":'')
+ . " $action $1$2....\n" if $desc =~ /\A\s*([^] \t\n])(\S*)/;
+
+ Getopt::Declare::ScalarArg::addtype($name,$pat,$action,$ind=~/:/);
+}
+
+sub _ditto # ($originalflag, $orginaldesc, $extra)
+{
+ my ($originalflag, $originaldesc, $extra) = @_;
+ if ($originaldesc =~ /\n.*\n/)
+ {
+ $originaldesc = "Same as $originalflag ";
+ }
+ else
+ {
+ chomp $originaldesc;
+ $originaldesc =~ s/\S/"/g;
+ 1 while $originaldesc =~ s/"("+)"/ $1 /g;
+ $originaldesc =~ s/""/" /g;
+ }
+ return "$originaldesc$extra\n";
+}
+
+sub _mutex # (\%mutex, @list)
+{
+ my ($mref, @mutexlist) = @_;
+
+ foreach my $flag ( @mutexlist )
+ {
+ $mref->{$flag} = [] unless $mref->{$flag};
+ foreach my $otherflag ( @mutexlist )
+ {
+ next if ($flag eq $otherflag);
+ push @{$mref->{$flag}}, $otherflag;
+ }
+ }
+}
+
+sub _exclude # (\%mutex, $excluded, @list)
+{
+ my ($mref, $excluded, @mutexlist) = @_;
+
+ foreach my $flag ( @mutexlist )
+ {
+ unless ($flag eq $excluded)
+ {
+ $mref->{$flag} = [] unless $mref->{$flag};
+ push @{$mref->{$excluded}}, $flag;
+ push @{$mref->{$flag}}, $excluded;
+ }
+ }
+}
+
+sub version
+{
+ # my $filedate = localtime(time - 86400 * -M $0);
+ my $filedate = localtime((stat $0)[9]);
+ if ($::VERSION) { print "\n\t$0: version $::VERSION ($filedate)\n\n" }
+ else { print "\n\t$0: version dated $filedate\n\n" }
+ exit $_[1] if defined $_[1];
+}
+
+sub usage
+{
+ my $self = $_[0];
+ local $_ = $self->{_internal}{usage};
+
+ my $lastflag = undef;
+ my $lastdesc = undef;
+
+ my $usage = '';
+ my $uoff;
+ my $decfirst;
+ my $ditto;
+
+ while (length $_ > 0)
+ {
+ # COMMENT:
+ s/\A[ ]*#.*\n// and next;
+
+ # TYPE DIRECTIVE:
+
+ if (m/\A\s*\[pvtype:/ and extract_codeblock($_,'[{}]'))
+ {
+ next;
+ }
+
+ # ACTION
+ extract_codeblock
+ and do { s/\A[ ]*\n//;
+ $decfirst = 0 unless defined $decfirst;
+ next; };
+
+ # ARG + DESC:
+ if ( s/\A(.*?\S.*?\t+)(.*?\n)// )
+ {
+ $decfirst = 0 unless defined $decfirst;
+
+ my ($spec) = expand $1;
+ my ($desc) = expand $2;
+
+ $desc .= (expand $1)[0]
+ while s/\A((?![ ]*({|\n)|.*?\S.*?\t.*?\S).*?\S.*\n)//;
+
+ next if $desc =~ /\[undocumented\]/i;
+
+ $uoff = 0;
+ $spec =~ s/(<[a-zA-Z]\w*):([^>]+)>/$uoff+=1+length $2 and "$1>"/ge;
+ $ditto = $desc =~ /\A\s*\[ditto\]/;
+ $desc =~ s/^\s*\[.*?\]\s*\n//gm;
+ $desc =~ s/\[.*?\]//g;
+
+ if ($ditto)
+ { $desc = ($lastdesc? _ditto($lastflag,$lastdesc,$desc) : "" ) }
+ elsif ($desc =~ /\A\s*\Z/)
+ { next; }
+ else
+ { $lastdesc = $desc; }
+ $spec =~ /\A\s*(\S+)/ and $lastflag = $1;
+
+ $usage .= $spec . ' ' x $uoff . $desc;
+
+ next;
+ };
+
+
+ # OTHERWISE, DECORATION
+ if (s/((?:(?!\[pvtype:).)*)(\n|(?=\[pvtype:))//)
+ {
+ my $desc = $1.($2||'');
+ $desc =~ s/^(\s*\[.*?\])+\s*\n//gm;
+ $desc =~ s/\[.*?\]//g;
+ $decfirst = 1 unless defined $decfirst
+ or $desc =~ m/\A\s*\Z/;
+ $usage .= $desc;
+ }
+ }
+
+ my $required = '';
+
+ foreach my $arg ( @{$self->{_internal}{args}} )
+ {
+ if ($arg->{required})
+ {
+ $required .= ' ' . $arg->{desc} . ' ';
+ }
+ }
+
+ $usage =~ s/\255/[/g; # REINSTATE ESCAPED '['s
+
+ $required =~ s/<([a-zA-Z]\w*):[^>]+>/<$1>/g;
+
+ my $helpcmd = Getopt::Declare::Arg::besthelp;
+ my $versioncmd = Getopt::Declare::Arg::bestversion;
+
+ my $PAGER = \*STDOUT;
+
+ if (eval { require IO::Pager })
+ {
+ $PAGER = new IO::Pager ( resume => 1 );
+ }
+
+ unless ($self->{_internal}{source})
+ {
+ print $PAGER "\nUsage: $0 [options] $required\n";
+ print $PAGER " $0 $helpcmd\n" if $helpcmd;
+ print $PAGER " $0 $versioncmd\n" if $versioncmd;
+ print $PAGER "\n" unless $decfirst && $usage =~ /\A[ \t]*\n/;
+ }
+ print $PAGER "Options:\n" unless $decfirst;
+ print $PAGER $usage;
+
+ exit $_[1] if defined $_[1];
+}
+
+sub unused {
+ return @{$_[0]->{_internal}{unused}} if wantarray;
+ return join " ", @{$_[0]->{_internal}{unused}};
+}
+
+sub flatten {
+ my ($val, $nested) = @_;
+ if (ref $val eq 'ARRAY') {
+ return join " ", map {flatten($_,1)} @$val;
+ }
+ elsif (ref $val eq 'HASH') {
+ return join " ", map {
+ $nested || /^-/ ? ($_, flatten($val->{$_},1))
+ : (flatten($val->{$_},1))
+ } keys %$val;
+ }
+ else {
+ return $val;
+ }
+}
+
+sub used {
+ my $self = shift;
+ my @used = map { /^_/ ? () : ($_, $self->{$_}) } keys %$self;
+ return @used if wantarray;
+ return join " ", map { flatten $_ } @used;
+}
+
+sub code
+{
+ my $self = shift;
+ my $package = shift||'main';
+ my $code = q#
+
+ do
+ {
+ my @_deferred = ();
+ my @_unused = ();
+ sub # . $package . q#::defer (&);
+ {
+ package # . $package . q#; local $^W;
+ *defer = sub (&) { push @_deferred, $_[0]; }
+ }
+ my %_FOUND_ = ();
+ my $_errors = 0;
+ my $_nextpos;
+ my %_invalid = ();
+ my $_lastprefix = '';
+ my $_finished = 0;
+ my %_PUNCT_;
+ my $_errormsg;
+ my $_VAL_;
+ my $_VAR_;
+ my $_PARAM_;
+
+ sub # . $package . q#::reject (;$$);
+ sub # . $package . q#::finish (;$);
+
+ {
+ package # . $package . q#; local $^W;
+ *reject = sub (;$$) { local $^W; if (!@_ || $_[0]) { $_errormsg = $_[1] if defined $_[1]; last param; } };
+ *finish = sub (;$) { if (!@_ || $_[0]) { $_finished = 1; } };
+ }
+
+ $_nextpos = 0;
+ arg: while (!$_finished)
+ {
+ $_errormsg = '';
+ # . ( $self->{_internal}{clump} ? q#
+ while ($_lastprefix)
+ {
+ my $substr = substr($_args,$_nextpos);
+ $substr =~ m/\A(?!\s|\0|\Z)#
+ . Getopt::Declare::Arg::negflagpat() . q#/
+ or do { $_lastprefix='';last};
+ "$_lastprefix$substr" =~ m/\A(#
+ . Getopt::Declare::Arg::posflagpat()
+ . q#)/
+ or do { $_lastprefix='';last};
+ substr($_args,$_nextpos,0) = $_lastprefix;
+ last;
+ }
+ # : '') . q#
+ pos $_args = $_nextpos if defined $_args;
+
+ $self->usage(0) if $_args && $_args =~ m/\G(# . $self->{_internal}{helppat} . q#)(\s|\0|\Z)/g;
+ $self->version(0) if $_args && $_args =~ m/(# . $self->{_internal}{verspat} . q#)(\s|\0|\Z)/;
+
+ #;
+
+ foreach my $arg ( @{$self->{_internal}{args}} )
+ {
+ $code .= $arg->code($self,$package);
+ }
+
+ $code .= q#
+
+ if ($_lastprefix)
+ {
+ pos $_args = $_nextpos+length($_lastprefix);
+ $_lastprefix = '';
+ next;
+ }
+
+ pos $_args = $_nextpos;
+ $_args && $_args =~ m/\G(?:\s|\0)*(\S+)/g or last;
+ if ($_errormsg) { print STDERR "Error"."$self->{_internal}{source}: $_errormsg\n" }
+
+ else { push @_unused, $1; }
+ $_errors++ if ($_errormsg);
+ }
+ continue
+ {
+ $_nextpos = pos $_args if defined $_args;
+ if (defined $_args and $_args =~ m/\G(\s|\0)*\Z/g)
+ {
+ $_args = &{$_get_nextline}($self);
+ last unless defined($_args);
+ $_nextpos = 0;
+ $_lastprefix = '';
+ }
+ }
+ #;
+
+ foreach my $arg ( @{$self->{_internal}{args}} )
+ {
+ next unless $arg->{required};
+ $code .= q#
+ do { print STDERR "Error"."$self->{_internal}{source}".': required parameter # . $arg->name . q# not found.',"\n"; $_errors++ }
+ unless $_FOUND_{'# . $arg->name . q#'}#;
+ if ($self->{_internal}{mutex}{$arg->name})
+ {
+ foreach my $mutex (@{$self->{_internal}{mutex}{$arg->name}})
+ {
+ $code .= q# or $_FOUND_{'# . $mutex . q#'}#;
+ }
+ }
+ $code .= ';';
+ }
+
+ foreach my $arg ( @{$self->{_internal}{args}} )
+ {
+ if ($arg->{requires})
+ {
+ $code .= q#
+ do { print STDERR q|Error|.$self->{_internal}{source}.q|: parameter '# . $arg->name
+ . q#' can only be specified with '# . _enbool($arg->{requires})
+ . q#'|,"\n"; $_errors++ }
+ if $_FOUND_{'# . $arg->name . "'} && !(" . _enfound($arg->{requires}) . ');'
+ }
+ }
+
+ $code .= q#
+ push @_unused, split(' ', substr($_args,$_nextpos))
+ if $_args && $_nextpos && length($_args) >= $_nextpos;
+ #;
+
+ if ($self->{_internal}{strict})
+ {
+ $code .= q#
+ unless ($_nextpos < length($_args||''))
+ {
+ foreach (@_unused)
+ {
+ tr/\0/ /;
+ print STDERR "Error"."$self->{_internal}{source}: unrecognizable argument ('$_')\n";
+ $_errors++;
+ }
+ }
+ #
+ }
+
+ $code .= q#
+
+ if ($_errors && !$self->{_internal}{source})
+ {
+ print STDERR "\n(try '$0 ".'# . Getopt::Declare::Arg::besthelp
+ . q#'."' for more information)\n";
+ }
+
+ $self->{_internal}{unused} = [map { tr/\0/ /; $_ } @_unused];
+ @ARGV = @{$self->{_internal}{unused}}
+ unless $self->{_internal}{source};
+
+ unless ($_errors) { foreach (@_deferred) { &$_ } }
+
+ !$_errors;
+
+ }
+ #;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Getopt::Declare - Declaratively Expressed Command-Line Arguments via Regular Expressions
+
+=head1 VERSION
+
+This document describes version 1.08 of Getopt::Declare,
+released May 21, 1999.
+
+=head1 SYNOPSIS
+
+ use Getopt::Declare;
+
+ $args = new Getopt::Declare ($specification_string, $optional_source);
+
+
+=head1 DESCRIPTION
+
+=head2 Overview
+
+F<Getopt::Declare> is I<yet another> command-line argument parser,
+one which is specifically designed to be powerful but exceptionally
+easy to use.
+
+To parse the command-line in C<@ARGV>, one simply creates a
+F<Getopt::Declare> object, by passing C<Getopt::Declare::new()> a
+specification of the various parameters that may be encountered:
+
+ $args = new Getopt::Declare($specification);
+
+The specification is a single string such as this:
+
+ $specification = q(
+
+ -a Process all data
+
+ -b <N:n> Set mean byte length threshold to <N>
+ { bytelen = $N; }
+
+ +c <FILE> Create new file <FILE>
+
+ --del Delete old file
+ { delold() }
+
+ delete [ditto]
+
+ e <H:i>x<W:i> Expand image to height <H> and width <W>
+ { expand($H,$W); }
+
+ -F <file>... Process named file(s)
+ { defer {for (@file) {process()}} }
+
+ =getrand [<N>] Get a random number
+ (or, optionally, <N> of them)
+ { $N = 1 unless defined $N; }
+
+ -- Traditionally indicates end of arguments
+ { finish }
+ );
+
+in which the syntax of each parameter is declared, along with a
+description and (optionally) one or more actions to be performed when
+the parameter is encountered. The specification string may also
+include other usage formatting information (such as group headings or
+separators) as well as standard Perl comments (which are ignored).
+
+Calling C<Getopt::Delare::new()> parses the contents of the array C<@ARGV>,
+extracting any arguments which match the parameters defined in the
+specification string, and storing the parsed values as hash elements
+within the new F<Getopt::Declare> object being created.
+
+Other features of the F<Getopt::Declare> package include:
+
+=over 4
+
+=item *
+
+The use of full Perl regular expressions to constrain matching
+of parameter components.
+
+=item *
+
+Automatic generation of error, usage and version information.
+
+=item *
+
+Optional conditional execution of embedded actions (i.e. only on
+successful parsing of the entire command-line)
+
+=item *
+
+Strict or non-strict parsing (unrecognized command-line elements may either
+trigger an error or may simply be left in C<@ARGV>)
+
+=item *
+
+Declarative specification of various inter-parameter relationships (for
+example, two parameters may be declared mutually exclusive and this
+relationship will then be automatically enforced).
+
+=item *
+
+Intelligent clustering of adjacent flags (for example: the
+command-line sequence "S<-a -b -c>" may be abbreviated to "-abc", unless
+there is also a C<-abc> flag declared).
+
+=item *
+
+Selective or global case-insensitivity of parameters.
+
+=item *
+
+The ability to parse files (especially configuration files) instead of
+the command-line.
+
+=back
+
+=head2 Terminology
+
+The terminology of command-line processing is often confusing, with various
+terms (such as "argument", "parameter", "option", "flag", etc.)
+frequently being used interchangeably and inconsistently in the various
+F<Getopt::> packages available. In this documentation, the following
+terms are used consistently:
+
+=over 4
+
+=item "command-line"
+
+The space-separated concatenation of the elements of the array C<@ARGV>
+at the time a F<Getopt::Declare> object is created.
+
+=item "parameter specification" (or just "parameter")
+
+A specification of a single entity which may appear in the
+command-line. Always includes at least one syntax for the entity.
+Optionally may include other (I<variant>) syntaxes, one or more
+I<descriptions> of the entity, and/or I<actions> to be performed when
+the entity is encountered. For example, the following is a single
+parameter specification (with two variants):
+
+ --window <height> x <width> Set window to <height> by <width>
+ { setwin($width,$height); }
+
+ --window <h>x<w>@<x>,<y> Set window size and centroid
+ { setwin($w,$h,$x,$y); }
+
+
+=item "argument"
+
+A substring of the command-line which matches a single parameter variant.
+Unlike some other Getopt:: packages, in F<Getopt::Declare> an argument
+may be a single element of C<@ARGV>, or part of a single C<@ARGV> element,
+or the concatenation of several adjacent C<@ARGV> elements.
+
+
+=item "parameter definition"
+
+A specification of one actual syntax variant matched by a parameter. Always
+consists of a leading I<parameter flag> or I<parameter variable>,
+optionally followed by one or more I<parameter components> (that is,
+other parameter variables or I<punctuators>). In the above example,
+C<S<--window E<lt>heightE<gt> x E<lt>widthE<gt>>> is a parameter definition.
+
+
+=item "parameter flag" (or just "flag")
+
+A sequence of non-space characters which introduces a parameter. Traditionally
+a parameter flag begins with "-" or "--", but F<Getopt::Declare> allows
+almost any sequence of characters to be used as a flag. In the above example,
+C<--window> is the parameter flag.
+
+
+=item "parameter variable"
+
+A place-holder (within a parameter specification) for a value that
+will appear in any argument matching that parameter. In the above example,
+C<E<lt>heightE<gt>>, C<E<lt>widthE<gt>>, C<E<lt>hE<gt>>, C<E<lt>yE<gt>>,
+C<E<lt>xE<gt>>, and C<E<lt>yE<gt>> are all parameter variables.
+
+
+=item "parameter punctuator" (or just "punctuator")
+
+A literal sequence of characters (within a parameter specification)
+which will appear in any argument matching that parameter. In the above
+example, the literals C<x> and C<@> are punctuators.
+
+
+=item "parameter description"
+
+A textual description of the purpose and/or use of a particular variant of
+parameter. In the above examples, the string:
+
+ Set window to <height> by <width>
+
+is a parameter description.
+
+
+=item "parameter action" (or just "action")
+
+A block of Perl code to be executed in response to encountering a specific
+parameter. In the above example:
+
+ { setwin($width,$height); }
+
+is a parameter action.
+
+=item "parameter variants"
+
+One or more different syntaxes for a single parameter, all sharing
+the same leading flag, but having different trailing parameter
+variables and/or punctuators. F<Getopt::Declare> considers all parameter
+definitions with the same leading flag to be merely variant forms of
+a single "underlying" parameter. The above example shows two parameter
+variants for the C<--window> parameter.
+
+=back
+
+
+=head2 Parameter definitions
+
+As indicated above, a parameter specification consists of three
+parts: the parameter definition, a textual description, and any
+actions to be performed when the parameter is matched.
+
+The parameter definition consists of a leading flag or parameter
+variable, followed by any number of parameter variables or
+punctuators, optionally separated by spaces. The parameter definition
+is terminated by one or more tabs (at least one trailing tab I<must>
+be present).
+
+For example, all of the following are valid F<Getopt::Declare> parameter
+definitions:
+
+ -v
+ in=<infile>
+ +range <from>..<to>
+ --lines <start> - <stop>
+ ignore bad lines
+ <outfile>
+
+Note that each of the above examples has at least one trailing tab
+(even if you can't see them). Note too that this hodge-podge of
+parameter styles is certainly not recommended within a single program,
+but is shown so as to illustrate some of the range of parameter syntax
+conventions F<Getopt::Declare> supports.
+
+The spaces between components of the parameter definition are optional but
+significant, both in the definition itself and in the arguments that
+the definition may match. If there is no space between components in the
+specification, then no space is allowed between corresponding arguments
+on the command-line. If there I<is> space between components of the
+specification, then space between those components is optional on the
+command-line.
+
+For example, the C<--lines> parameter above matches:
+
+ --lines1-10
+ --lines 1-10
+ --lines 1 -10
+ --lines 1 - 10
+ --lines1- 10
+
+If it were instead specified as:
+
+ --lines <start>-<stop>
+
+then it would match only:
+
+ --lines1-10
+ --lines 1-10
+
+Note that the optional nature of spaces in parameter specification implies that
+flags and punctuators cannot contain the character '<' (which is taken as the
+delimiter for a parameter variable) nor the character '[' (which
+introduces an optional parameter component - see
+L<"Optional parameter components">).
+
+
+=head2 Types of parameter variables
+
+By default, a parameter variable will match a single blank-terminated
+or comma-delimited string. For example, the parameter:
+
+ -val <value>
+
+would match any of the following the arguments:
+
+ -value # <value> <- "ue"
+ -val abcd # <value> <- "abcd"
+ -val 1234 # <value> <- "1234"
+ -val "a value" # <value> <- "a value"
+
+
+It is also possible to restrict the types of values which may be
+matched by a given parameter variable. For example:
+
+ -limit <threshold:n> Set threshold to some (real) value
+ -count <N:i> Set count to <N> (must be an integer)
+
+If a parameter variable is suffixed with ":n", it will match any
+reasonable numeric value, whilst the ":i" suffix restricts a
+parameter variable to only matching integer values.
+These two "type specifiers" are the simplest examples of a much more
+powerful mechanism, which allows parameter variables to be restricted
+to matching any specific regular expression. See L<"Defining new
+parameter variable types">.
+
+Parameter variables are treated as scalars by default, but this too
+can be altered. Any parameter variable immediately followed by
+an ellipsis (C<...>) is treated as a list variable, and matches its
+specified type sequentially as many times as possible. For example,
+the parameter specification:
+
+ -pages <page:i>...
+
+would match either of the following arguments:
+
+ -pages 1
+ -pages 1 2 7 20
+
+Note that both scalar and list parameter variables are "respectful" of the
+flags of other parameters as well as their own trailing punctuators.
+For example, given the specifications:
+
+ -a
+ -b <b_list>...
+ -c <c_list>... ;
+
+The following arguments will be parsed as indicated:
+
+ -b -d -e -a # <b_list> <- ("-d", "-e")
+ -b -d ; # <b_list> <- ("-d", ";")
+ -c -d ; # <c_list> <- ("-d")
+
+List parameter variables are also "repectful" of the needs of
+subsequent parameter variables. That is, a parameter specification
+like:
+
+ -copy <files>... <dir>
+
+will behave as expected, putting all but the last string after the C<-copy>
+flag into the parameter variable C<E<lt>filesE<gt>>, whilst the very
+last string is assigned to C<E<lt>dirE<gt>>.
+
+
+=head2 Optional parameter components
+
+Except for the leading flag, any part of a parameter definition
+may be made optional by placing it in square brackets.
+For example:
+
+ +range <from> [..] [<to>]
+
+which matches any of:
+
+ +range 1..10
+ +range 1..
+ +range 1 10
+ +range 1
+
+List parameter variables may also be made optional (the ellipsis must
+follow the parameter variable name immediately, so it goes I<inside>
+the square brackets):
+
+ -list [<page>...]
+
+Two or more parameter components may be made jointly optional, by specifying
+them in the same pair of brackets. Optional components may also be nested. For
+example:
+
+ -range <from> [.. [<to>] ]
+
+Scalar optional parameter variables (such as C<[E<lt>toE<gt>]>)
+are given undefined values if they are skipped during
+a successful parameter match. List optional parameter variables (such as
+C<[E<lt>pageE<gt>...]>) are assigned an empty list if unmatched.
+
+One important use for optional punctuators is to provide abbreviated
+versions of specific flags. For example:
+
+ -num[eric] # Match "-num" or "-numeric"
+ -lexic[ographic]al # Match "-lexical" or "-lexicographical"
+ -b[ells+]w[histles] # Match "-bw" or "-bells+whistles"
+
+Note that the actual flags for these three parameters are C<-num>, C<-lexic>
+and C<-b>, respectively.
+
+=head2 Parameter descriptions
+
+Providing a textual description for each parameter (or parameter
+variant) is optional, but strongly recommended. Apart from providing internal
+documentation, parameter descriptions are used in the automatically-generated
+usage information provided by F<Getopt::Declare>.
+
+Descriptions may be placed after the tab(s) following the
+parameter definition and may be continued on subsequent lines,
+provided those lines do not contain any tabs after the first
+non-whitespace character (because any such line will instead be
+treated as a new parameter specification). The description is
+terminated by a blank line, an action specification (see below) or
+another parameter specification.
+
+For example:
+
+ -v Verbose mode
+ in=<infile> Specify input file
+ (will fail if file does not exist)
+
+ +range <from>..<to> Specify range of columns to consider
+ --lines <start> - <stop> Specify range of lines to process
+
+ ignore bad lines Ignore bad lines :-)
+
+ <outfile> Specify an output file
+
+The parameter description may also contain special directives which
+alter the way in which the parameter is parsed. See the various
+subsections of L<"ADVANCED FEATURES"> for more information.
+
+
+=head2 Actions
+
+Each parameter specification may also include one or more blocks of
+Perl code, specified in a pair of curly brackets (which I<must> start on
+a new line).
+
+Each action is executed as soon as the corresponding parameter is
+successfully matched in the command-line (but see L<"Deferred actions">
+for a means of delaying this response).
+
+For example:
+
+ -v Verbose mode
+ { $::verbose = 1; }
+ -q Quiet mode
+ { $::verbose = 0; }
+
+Actions are executed (as C<do> blocks) in the package in which the
+F<Getopt::Declare> object containing them was created. Hence they
+have access to all package variables and functions in that namespace.
+
+In addition, each parameter variable belonging to the corresponding
+parameter is made available as a (block-scoped) Perl variable with the
+same name. For example:
+
+ +range <from>..<to> Set range
+ { setrange($from, $to); }
+
+ -list <page:i>... Specify pages to list
+ { foreach (@page)
+ {
+ list($_) if $_ > 0;
+ }
+ }
+
+Note that scalar parameter variables become scalar Perl variables,
+and list parameter variables become Perl arrays.
+
+
+=head2 Predefined variables available in actions
+
+Within an action the following variables are also available:
+
+=over 4
+
+=item C<$_PARAM_>
+
+Stores the identifier of the current parameter: either the leading
+flag or, if there is no leading flag, the name of the first parameter
+variable.
+
+
+=item C<%_PUNCT_>
+
+Stores the substring matched by each punctuator in the current parameter.
+The hash is indexed by the punctuator itself. The main purpose of this variable
+is to allow actions to check whether optional punctuators were in fact matched.
+For example:
+
+ -v[erbose] Set verbose mode
+ (doubly verbose if full word used)
+ { if ($_PUNCT_{"erbose"}) { $verbose = 2; }
+ else { $verbose = 1; }
+ }
+
+=item C<%_FOUND_>
+
+This hash stores boolean values indicating whether or not a given
+parameter has already been found. The hash keys are the leading flags
+or parameter variables of each parameter. For instance, the following
+specification makes the C<-q> and C<-v> parameters mutually exclusive
+(but see L<"Parameter dependencies"> for a I<much> easier way to achieve
+this effect):
+
+ -v Set verbose mode
+ { die "Can't be verbose *and* quiet!\n"
+ if $_FOUND_{"-q"};
+ }
+
+ -q Set quiet mode
+ { die "Can't be quiet *and* verbose!\n"
+ if $_FOUND_{"-v"};
+ }
+
+For reasons that will be explained in L<"Rejection and termination">,
+a given parameter is not marked as found until I<after> its
+associated actions are executed. That is, C<$_FOUND_{$_PARAM_}> will not
+(usually) be true during a parameter action.
+
+=back
+
+Note that, although numerous other internal variables on which the
+generated parser relies are also visible within parameter actions,
+accessing any of them may have Dire Consequences. Moreover, these
+other variables may no longer be accessible (or even present) in
+future versions of F<Getopt::Declare>. All such internal variables
+have names beginning with an underscore. Avoiding such variables names
+will ensure there are no conflicts between actions and the parser
+itself.
+
+
+=head2 The command-line parsing process
+
+Whenever a F<Getopt::Declare> object is created, the current command-line
+is parsed by sequentially, by attempting to match each parameter
+in the object's specification string against the current elements in the
+C<@ARGV> array (but see L<"Parsing from other sources">). The order
+in which parameters are tried against C<@ARGV> is determined by
+three rules:
+
+=over 4
+
+=item 1.
+
+Parameters with longer flags are tried first. Hence the command-line
+argument "-quiet" would be parsed as matching the parameter C<-quiet>
+rather than the parameter C<S<-q E<lt>stringE<gt>>>, even if the C<-q>
+parameter was defined first.
+
+=item 2.
+
+Parameter I<variants> with the most components are
+matched first. Hence the argument "-rand 12345" would be parsed as matching
+the parameter variant C<S<-rand E<lt>seedE<gt>>>, rather than the
+variant C<-rand>, even if the "shorter" C<-rand> variant was defined first.
+
+=item 3.
+
+Otherwise, parameters are matched in the order they are defined.
+
+=back
+
+Elements of C<@ARGV> which do not match any defined parameter are collected
+during the parse and are eventually put back into C<@ARGV>
+(see L<"Strict and non-strict command-line parsing">).
+
+
+=head1 ADVANCED FEATURES
+
+=head2 Case-insensitive parameter matching
+
+By default, a F<Getopt::Declare> object parses the command-line in
+a I<case-sensitive> manner. The C<[nocase]> directive enables a specific
+parameter (or, alternatively, I<all> parameters) to be matched
+case-insensitively.
+
+If a C<[nocase]> directive is included in the description of a
+specific parameter variant, then that variant (only) will be matched
+without regard for case. For example, the specification:
+
+ -q Quiet mode [nocase]
+
+ -v Verbose mode
+
+means that the arguments "S<-q>" and "S<-Q>" will both match the C<-q> parameter, but
+that only "S<-v>" (and I<not> "S<-V>") will match the C<-v> parameter.
+
+If a C<[nocase]> directive appears anywhere I<outside> a parameter description,
+then the entire specification is declared case-insensitive and all parameters
+defined in that specification are matched without reagrd to case.
+
+
+=head2 Termination and rejection
+
+It is sometimes useful to be able to terminate command-line
+processing before all arguments have been parsed. To this end,
+F<Getopt::Declare> provides a special local operator (C<finish>) which
+may be used within actions. The C<finish> operator takes a single optional
+argument. If the argument is true (or omitted),
+command-line processing is terminated at once (although the current
+parameter is still marked as having been successfully matched). For
+example:
+
+ -- Traditional argument list terminator
+ { finish }
+
+ -no-- Use non-traditional terminator instead
+ { $nontrad = 1; }
+
+ ## Non-traditional terminator (only valid if -no-- flag seen)
+ { finish($nontrad); }
+
+It is also possible to reject a single parameter match from within an
+action (and then continue trying other candidates). This allows
+actions to be used to perform more sophisticated tests on the type of
+a parameter variable, or to implement complicated parameter
+interdependencies.
+
+To reject a parameter match, the C<reject> operator is used. The
+C<reject> operator takes an optional argument.
+If the argument is true (or was omitted), the current parameter
+match is immediately rejected. For example:
+
+ -ar <R:n> Set aspect ratio (must be in the range (0..1])
+ {
+ $::sawaspect++;
+ reject $R <= 0 || $R > 1 ;
+ setaspect($R);
+ }
+
+ -q Quiet option (not available on Wednesdays)
+ {
+ reject((localtime)[6] == 3);
+ $::verbose = 0;
+ }
+
+Note that any actions performed I<before> the call to C<reject> will
+still have effect (for example, the variable C<$::sawaspect> remains
+incremented even if the aspect ratio parameter is subsequently rejected).
+
+The C<reject> operator may also take a second argument, which is
+used as an error message if the rejected argument subsequently
+fails to match any other parameter. For example:
+
+ -q Quiet option (not available on Wednesdays)
+ {
+ reject((localtime)[6] == 3 => "Not today!");
+ $::verbose = 0;
+ }
+
+
+=head2 Specifying other parameter variable types
+
+As was mentioned in L<"Type of parameter variables">, parameter
+variables can be restricted to matching only numbers or only integers
+by using the type specifiers ":n" and ":i". F<Getopt::Declare>
+provides seven other inbuilt type specifiers, as well as two mechanisms
+for defining new restrictions on parameter variables.
+
+The other inbuilt type specifiers are:
+
+=over 4
+
+=item :+i
+
+which restricts a parameter variable to matching positive, non-zero
+integers (that is: 1, 2, 3, etc.)
+
+=item :+n
+
+which restricts a parameter variable to matching positive, non-zero
+numbers (that is, floating point numbers strictly greater than zero).
+
+=item :0+i
+
+which restricts a parameter variable to matching non-negative integers (that
+is: 0, 1, 2, 3, etc.)
+
+=item :0+n
+
+which restricts a parameter variable to matching non-negative numbers (that
+is, floating point numbers greater than or equal to zero).
+
+=item :s
+
+which allows a parameter variable to match any quote-delimited or
+whitespace-terminated string. Note that this specifier simply makes
+explicit the default behaviour.
+
+=item :if
+
+which is used to match input file names. Like type ':s', type ':if'
+matches any quote-delimited or whitespace-terminated string. However
+this type does I<not> respect other command-line flags and also
+requires that the matched string is either "-" (indicating standard
+input) or the name of a readable file.
+
+=item :of
+
+which is used to match output file names. It is exactly like type ':if' except
+that it requires that the string is either "-" (indicating standard output)
+or the name of a file that is either writable or non-existent.
+
+=item :s
+
+which allows a parameter variable to match any quote-delimited or
+whitespace-terminated string. Note that this specifier simply makes
+explicit the default behaviour.
+
+=back
+
+For example:
+
+ -repeat <count:+i> Repeat <count> times (must be > 0)
+
+ -scale <factor:0+n> Set scaling factor (cannot be negative)
+
+
+Alternatively, parameter variables can be restricted to matching a
+specific regular expression, by providing the required pattern
+explicitly (in matched "/" delimiters after the ":"). For example:
+
+ -parity <p:/even|odd|both/> Set parity (<p> must be "even",
+ "odd" or "both")
+
+ -file <name:/\w*\.[A-Z]{3}/> File name must have a three-
+ capital-letter extension
+
+If an explicit regular expression is used, there are three "convenience"
+extensions available:
+
+=over 4
+
+=item %T
+
+If the sequence C<%T> appears in a pattern, it is translated to a negative
+lookahead containing the parameter variable's trailing context.
+Hence the parameter definition:
+
+ -find <what:/(%T\.)+/> ;
+
+ensures that the command line argument "-find abcd;" causes C<E<lt>whatE<gt>>
+to match "abcd", I<not> "abcd;".
+
+
+=item %D
+
+If the sequence C<%D> appears in a pattern, it is translated into a subpattern
+which matches any single digit (like a C<\d>), but only if that digit
+would I<not> match the parameter variable's trailing context.
+Hence C<%D> is just a convenient short-hand for C<(?:%T\d)> (and is actually
+implemented that way).
+
+=item %F
+
+By default, any explicit pattern is modified by F<Getopt::Declare>
+so that it fails if the argument being matched represents some defined
+parameter flag. If however the sequence C<%F> appears anywhere in a
+pattern, it causes the pattern I<not> to reject strings which would
+otherwise match another flag. For example, the inbuilt types ':if' and
+':of' use C<%F> to enable them to match filenames which happen to be
+identical to parameter flags.
+
+=back
+
+=head2 Defining new parameter variable types
+
+Explicit regular expressions are very powerful, but also cumbersome to
+use (or reuse) in some situations. F<Getopt::Declare> provides a general
+"parameter variable type definition" mechanism to simplify such cases.
+
+To declare a new parameter variable type, the C<[pvtype:...]> directive
+is used. A C<[pvtype...]> directive specifies the name, matching
+pattern, and action for the new parameter variable type (though both
+the pattern and action are optional).
+
+The name string may be I<any> whitespace-terminated sequence of
+characters which does not include a ">". The name may also be specified
+within a pair of quotation marks (single or double) or within any Perl
+quotelike operation. For example:
+
+ [pvtype: num ] # Makes this valid: -count <N:num>
+ [pvtype: 'a num' ] # Makes this valid: -count <N:a num>
+ [pvtype: q{nbr} ] # Makes this valid: -count <N:nbr>
+
+The pattern is used in initial matching of the parameter variable.
+Patterns are normally specified as a "/"-delimited Perl regular
+expression:
+
+ [pvtype: num /\d+/ ]
+ [pvtype: 'a num' /\d+(\.\d*)/ ]
+ [pvtype: q{nbr} /[+-]?\d+/ ]
+
+Alternatively the pattern associated with a new type may be specified
+as a ":" followed by the name of another parameter variable type (in
+quotes if necessary). In this case the new type matches the same
+pattern (and action! - see below) as the named type. For example:
+
+ [pvtype: num :+i ] # <X:num> is the same as <X:+i>
+ [pvtype: 'a num' :n ] # <X:a num> is the same as <X:n>
+ [pvtype: q{nbr} :'a num' ] # <X:nbr> is also the same as <X:n>
+
+As a third alternative, the pattern may be omitted altogether, in
+which case the new type matches whatever the inbuilt pattern ":s"
+matches.
+
+The optional action which may be included in any C<[pvtype:...]>
+directive is executed I<after> the corresponding parameter variable
+matches the command line but I<before> any actions belonging to the
+enclosing parameter are executed. Typically, such type actions
+will call the C<reject> operator (see L<"Termination and rejection">)
+to test extra conditions, but any valid Perl code is acceptible. For
+example:
+
+ [pvtype: num /\d+/ { reject if (localtime)[6]==3 } ]
+ [pvtype: 'a num' :n { print "a num!" } ]
+ [pvtype: q{nbr} :'a num' { reject $::no_nbr } ]
+
+If a new type is defined in terms of another (for example, ":a num"
+and ":nbr" above), any action specified by that new type is
+I<prepended> to the action of that other type. Hence:
+
+=over 4
+
+=item *
+
+the new type ":num" matches any string of digits, but then rejects the
+match if it's Wednesday.
+
+=item *
+
+the new type ":a num" matches any string of digits (like its parent
+type ":num"), I<then> prints out "a num!", I<and then> rejects the
+match if it's Wednesday (like its parent type ":num").
+
+=item *
+
+the new type ":nbr" matches any string of digits (like its parent type
+":a num"), but then rejects the match if the global C<$::no_nbr> variable
+is true. Otherwise it next prints out "a num!" (like its parent type
+":a num"), and finally rejects the match if it's Wednesday (like its
+grandparent type ":num").
+
+=back
+
+When a type action is executed (as part of a particular parameter
+match), three local variables are available:
+
+=over 4
+
+=item C<$_VAL_>
+
+which contains the value matched by the type's pattern. It is this value which
+is ultimately assigned to the local Perl variable which is available to
+parameter actions. Hence if the type action changes the value of C<$_VAL_>,
+that changed value becomes the "real" value of the corresponding parameter
+variable (see the Roman numeral example below).
+
+=item C<$_VAR_>
+
+which contains the name of the parameter variable being matched.
+
+=item C<$_PARAM_>
+
+which contains the name of the parameter currently being matched.
+
+=back
+
+Here is a example of the use of these variables:
+
+ $args = new Getopt::Declare <<'EOPARAM';
+
+ [pvtype: type /[OAB]|AB')/ ]
+ [pvtype: Rh? /Rh[+-]/ ]
+ [pvtype: days :+i { reject $_VAL_<14 " $_PARAM_ (too soon!)"} ]
+
+ -donated <D:days> Days since last donation
+ -applied <A:days> Days since applied to donate
+
+ -blood <type:type> [<rh:Rh?>] Specify blood type
+ and (optionally) rhesus factor
+ EOPARAM
+
+In the above example, the ":days" parameter variable type is defined
+to match whatever the ":+i" type matches (that is positive, non-zero
+integers), with the proviso that the matching value (C<$_VAL_>) must
+be at least 14. If a shorter value is specified for C<E<lt>DE<gt>>,
+or C<E<lt>AE<gt>> parameter variables, then F<Getopt::Declare> would
+issue the following (respective) error messages:
+
+ Error: -donated (too soon!)
+ Error: -applied (too soon!)
+
+Note that the "inbuilt" parameter variable types ("i", "n", etc.) are
+really just predefined type names, and hence can be altered if necessary:
+
+ $args = new Getopt::Declare <<'EOPARAM';
+
+ [pvtype: 'n' /[MDCLXVI]+/ { reject !($_VAL_=to_roman $_VAL_) } ]
+
+ -index <number:n> Index number
+ { print $data[$number]; }
+ EOPARAM
+
+The above C<[pvtype:...]> directive means that all parameter variables
+specified with a type ":n" henceforth only match valid Roman
+numerals, but that any such numerals are I<automatically> converted to
+ordinary numbers (by passing C<$_VAL_>) through the C<to_roman>
+function).
+
+Hence the requirement that all ":n" numbers now must be Roman can be
+imposed I<transparently>, at least as far as the actual parameter
+variables which use the ":n" type are concerned. Thus C<$number> can
+be still used to index the array C<@data> despite the new restrictions
+placed upon it by the redefinition of type ":n".
+
+Note too that, because the ":+n" and ":0+n" types are implicitly
+defined in terms of the original ":n" type (as if the directives:
+
+ [pvtype: '+n' :n { reject if $_VAL <= 0 } ]
+ [pvtype: '0+n' :n { reject if $_VAL < 0 } ]
+
+were included in every specification), the above redefinition of ":n"
+affects those types as well. In such cases the format conversion is
+performed I<before> the "sign" tests (in other words, the "inherited"
+actions are performed I<after> any newly defined ones).
+
+Parameter variable type definitions may appear anywhere in a
+F<Getopt::Declare> specification and are effective for the entire
+scope of the specification. In particular, new parameter variable
+types may be defined I<after> they are used.
+
+=head2 Undocumented parameters
+
+If a parameter description is omitted, or consists entirely of
+whitespace, or contains the special directive C<[undocumented]>, then
+the parameter is still parsed as normal, but will not appear in the
+automatically generated usage information (see L<"Usage information">).
+
+Apart from allowing for "secret" parameters (a dubious benefit), this
+feature enables the programmer to specify some undocumented action
+which is to be taken on encountering an otherwise unknown argument.
+For example:
+
+ <unknown>
+ { handle_unknown($unknown); }
+
+
+=head2 "Dittoed" parameters
+
+Sometimes it is desirable to provide two or more alternate flags for
+the same behaviour (typically, a short form and a long form). To
+reduce the burden of specifying such pairs, the special directive
+C<[ditto]> is provided. If the description of a parameter I<begins> with
+a C<[ditto]> directive, that directive is replaced with the
+description for the immediately preceding parameter (including any
+other directives). For example:
+
+ -v Verbose mode
+ --verbose [ditto] (long form)
+
+In the automatically generated usage information this would be displayed as:
+
+ -v Verbose mode
+ --verbose " " (long form)
+
+Furthermore, if the "dittoed" parameter has no action(s) specified, the
+action(s) of the preceding parameter are reused. For example, the
+specification:
+
+ -v Verbose mode
+ { $::verbose = 1; }
+ --verbose [ditto]
+
+would result in the C<--verbose> option setting C<$::verbose> just like the
+C<-v> option. On the other hand, the specification:
+
+ -v Verbose mode
+ { $::verbose = 1; }
+ --verbose [ditto]
+ { $::verbose = 2; }
+
+would give separate actions to each flag.
+
+
+=head2 Deferred actions
+
+It is often desirable or necessary to defer actions taken in response
+to particular flags until the entire command-line has been parsed. The most
+obvious case is where modifier flags must be able to be specified I<after>
+the command-line arguments they modify.
+
+To support this, F<Getopt::Declare> provides a local operator (C<defer>) which
+delays the execution of a particular action until the command-line processing
+is finished. The C<defer> operator takes a single block, the execution of which
+is deferred until the command-line is fully and successfully parsed. If
+command-line processing I<fails> for some reason (see L<"DIAGNOSTICS">), the
+deferred blocks are never executed.
+
+For example:
+
+ <files>... Files to be processed
+ { defer { foreach (@files) { proc($_); } } }
+
+ -rev[erse] Process in reverse order
+ { $::ordered = -1; }
+
+ -rand[om] Process in random order
+ { $::ordered = 0; }
+
+With the above specification, the C<-rev> and/or C<-rand> flags can be
+specified I<after> the list of files, but still affect the processing of
+those files. Moreover, if the command-line parsing fails for some reason
+(perhaps due to an unrecognized argument), the deferred processing will
+not be performed.
+
+
+=head2 Flag clustering
+
+Like some other F<Getopt::> packages, F<Getopt::Declare> allows parameter
+flags to be "clustered". That is, if two or more flags have the same
+"flag prefix" (one or more leading non-whitespace, non-alphanumeric characters),
+those flags may be concatenated behind a single copy of that flag prefix.
+For example, given the parameter specifications:
+
+ -+ Swap signs
+ -a Append mode
+ -b Bitwise compare
+ -c <FILE> Create new file
+ +del Delete old file
+ +e <NICE:i> Execute (at specified nice level) when complete
+
+The following command-lines (amongst others) are all exactly equivalent:
+
+ -a -b -c newfile +e20 +del
+ -abc newfile +dele20
+ -abcnewfile+dele20
+ -abcnewfile +e 20del
+
+The last two alternatives are correctly parsed because
+F<Getopt::Declare> allows flag clustering at I<any point> where the
+remainder of the command-line being processed starts with a
+non-whitespace character and where the remaining substring would not
+otherwise immediately match a parameter flag.
+
+Hence the trailing "+dele20" in the third command-line example is parsed as
+S<"+del +e20"> and not S<"-+ del +e20">. This is because the previous "-"
+prefix is I<not> propagated (since the leading "+del" I<is> a valid flag).
+
+In contrast, the trailing S<"+e 20del"> in the fourth example is parsed as
+S<"+e 20 +del"> because, after the S<" 20"> is parsed (as the integer
+parameter variable C<E<lt>NICEE<gt>>), the next characters are "del",
+which I<do not> form a flag themselves unless prefixed with the
+controlling "+".
+
+In some circumstances a clustered sequence of flags on the command-line
+might also match a single (multicharacter) parameter flag. For example, given
+the specifications:
+
+ -a Blood type is A
+ -b Blood type is B
+ -ab Blood type is AB
+ -ba Donor has a Bachelor of Arts
+
+A command-line argument "-aba" might be parsed as
+S<"-a -b -a"> or S<"-a -ba"> or S<"-ab -a">. In all such
+cases, F<Getopt::Declare> prefers the longest unmatched flag first.
+Hence the previous example would be parsed as S<"-ab -a">, unless
+the C<-ab> flag had already appeared in the command-line (in which
+case, it would be parsed as S<"-a -ba">).
+
+These rules are designed to produce consistency and "least surprise",
+but (as the above example illustrates) may not always do so. If the
+idea of unconstrained flag clustering is too libertarian for a particular
+application, the feature may be restricted (or removed completely),
+by including a C<[cluster:...]> directive anywhere in the specification string.
+
+The options are:
+
+=over 8
+
+=item C<[cluster: any]>
+
+This version of the directive allows any flag to be clustered (that is,
+it merely makes explicit the default behaviour).
+
+=item C<[cluster: flags]>
+
+This version of the directive restricts clustering to parameters which are
+"pure" flags (that is, those which have no parameter variables or punctuators).
+
+=item C<[cluster: singles]>
+
+This version of the directive restricts clustering to parameters which are
+"pure" flags, and which consist of a flag prefix followed by a single
+alphanumeric character.
+
+=item C<[cluster: none]>
+
+This version of the directive turns off clustering completely.
+
+=back
+
+For example:
+
+ $args = new Getopt::Declare <<'EOSPEC';
+ -a Append mode
+ -b Back-up mode
+ -bu [ditto]
+ -c <file> Copy mode
+ -d [<file>] Delete mode
+ -e[xec] Execute mode
+
+ [cluster:singles]
+ EOSPEC
+
+In the above example, only the C<-a> and C<-b> parameters may be clustered.
+The C<-bu> parameter is excluded because it consists of more than one
+letter, whilst the C<-c> and C<-d> parameters are excluded because they
+take (or may take, in C<-d>'s case) a variable. The C<-e[xec]> parameter
+is excluded because it may take a trailing punctuator (C<[xec]>).
+
+By comparison, if the directive had been C<[cluster: flags]>, then
+C<-bu> I<could> be clustered, though C<-c>, C<-d> and C<-e[xec]> would
+still be excluded since they are not "pure flags").
+
+
+=head2 Strict and non-strict command-line parsing
+
+"Strictness" in F<Getopt::Declare> refers to the way in which unrecognized
+command-line arguments are handled. By default, F<Getopt::Declare> is
+"non-strict", in that it simply skips silently over any unrecognized
+command-line argument, leaving it in C<@ARGV> at the conclusion of
+command-line processing (but only if they were originally parsed
+from C<@ARGV>).
+
+No matter where they came from, the remaining arguments are also available
+by calling the C<unused> method on the Getopt::Declare object, after it
+has parsed. In a list context, this method returns a list of the
+unprocessed arguments; in a scalar context a single string with the unused
+arguments concatenated is returned.
+
+Likewise, there is a C<used> method that returns the arguments that were
+successfully processed by the parser.
+
+However, if a new F<Getopt::Declare> object is created with a
+specification string containing the C<[strict]> directive (at any
+point in the specification):
+
+ $args = new Getopt::Declare <<'EOSPEC';
+
+ [strict]
+
+ -a Append mode
+ -b Back-up mode
+ -c Copy mode
+ EOSPEC
+
+then the command-line is parsed "strictly". In this case, any
+unrecognized argument causes an error message (see L<"DIAGNOSTICS">) to
+be written to STDERR, and command-line processing to (eventually)
+fail. On such a failure, the call to C<Getopt::Declare::new()> returns
+C<undef> instead of the usual hash reference.
+
+The only concession that "strict" mode makes to the unknown is that,
+if command-line processing is prematurely terminated via the
+C<finish> operator, any command-line arguments which have not yet
+been examined are left in C<@ARGV> and do not cause the parse to fail (of
+course, if any unknown arguments were encountered I<before> the
+C<finish> was executed, those earlier arguments I<will> cause
+command-line processing to fail).
+
+The "strict" option is useful when I<all> possible parameters
+can be specified in a single F<Getopt::Declare> object, whereas the
+"non-strict" approach is needed when unrecognized arguments are either
+to be quietly tolerated, or processed at a later point (possibly in a
+second F<Getopt::Declare> object).
+
+
+=head2 Parameter dependencies
+
+F<Getopt::Declare> provides five other directives which modify the
+behaviour of the command-line parser in some way. One or more of these
+directives may be included in any parameter description. In addition,
+the C<[mutex:...]> directive may also appear in any usage "decoration"
+(see L<"Usage information">).
+
+Each directive specifies a particular set of conditions that a
+command-line must fulfil (for example, that certain parameters may not
+appear on the same command-line). If any such condition is violated,
+an appropriate error message is printed (see L<"DIAGNOSTICS">).
+Furthermore, once the command-line is completely parsed, if any
+condition was violated, the program terminates
+(whilst still inside C<Getopt::Declare::new()>).
+
+The directives are:
+
+=over 4
+
+=item C<[required]>
+
+Specifies that an argument matching at least one variant of the
+corresponding parameter I<must> be specified somewhere in the
+command-line. That is, if two or more required parameters share the
+same flag, it suffices that I<any one> of them matches an argument
+(recall that F<Getopt::Declare> considers all parameter specifications
+with the same flag merely to be variant forms of a single "underlying"
+parameter).
+
+If an argument matching a "required" flag is I<not> found in the
+command-line, an error message to that effect is issued,
+command-line processing fails, and C<Getopt::Declare::new()> returns
+C<undef>.
+
+
+=item C<[repeatable]>
+
+By default, F<Getopt::Declare> objects allow each of their parameters to
+be matched only once (that is, once any variant of a particular
+parameter matches an argument, I<all> variants of that same parameter
+are subsequently excluded from further consideration when parsing the
+rest of the command-line).
+
+However, it is sometimes useful to allow a particular parameter to match
+more than once. Any parameter whose description includes the directive
+C<[repeatable]> is I<never> excluded as a potential argument match, no matter
+how many times it has matched previously:
+
+ -nice Increase nice value (linearly if repeated)
+ [repeatable]
+ { set_nice( get_nice()+1 ); }
+
+ -w Toggle warnings [repeatable] for the rest
+ of the command-line
+ { $warn = !$warn; }
+
+As a more general mechanism is a C<[repeatable]> directive appears in a
+specification anywhere other than a flag's description, then I<all> parameters
+are marked repeatable:
+
+ [repeatable]
+
+ -nice Increase nice value (linearly if repeated)
+ { set_nice( get_nice()+1 ); }
+
+ -w Toggle warnings for the rest of the command-line
+ { $warn = !$warn; }
+
+
+=item C<[mutex: E<lt>flag listE<gt>]>
+
+The C<[mutex:...]> directive specifies that the parameters whose
+flags it lists are mutually exclusive. That is, no two or more of them
+may appear in the same command-line. For example:
+
+ -case set to all lower case
+ -CASE SET TO ALL UPPER CASE
+ -Case Set to sentence case
+ -CaSe SeT tO "RAnSom nOTe" CasE
+
+ [mutex: -case -CASE -Case -CaSe]
+
+The interaction of the C<[mutex:...]> and C<[required]> directives is
+potentially awkward in the case where two "required" arguments are
+also mutually exclusive (since the C<[required]> directives insist
+that both parameters must appear in the command-line, whilst the
+C<[mutex:...]> directive expressly forbids this).
+
+F<Getopt::Declare> resolves such contradictory constraints by
+relaxing the meaning of "required" slightly. If a flag is marked
+"required", it is considered "found" for the purposes of error
+checking if it or I<any other flag with which it is mutually
+exclusive> appears on the command-line.
+
+Hence the specifications:
+
+ -case set to all lower case [required]
+ -CASE SET TO ALL UPPER CASE [required]
+ -Case Set to sentence case [required]
+ -CaSe SeT tO "RAnSom nOTe" CasE [required]
+
+ [mutex: -case -CASE -Case -CaSe]
+
+mean that I<exactly one> of these four flags must appear on the
+command-line, but that the presence of any one of them will suffice
+to satisfy the "requiredness" of all four.
+
+It should also be noted that mutual exclusion is only tested for
+I<after> a parameter has been completely matched (that is, after the
+execution of its actions, if any). This prevents "rejected" parameters
+(see L<"Termination and rejection">) from incorrectly generating
+mutual exclusion errors. However, it also sometimes makes it necessary
+to defer the actions of a pair of mutually exclusive parameters (for
+example, if those actions are expensive or irreversible).
+
+
+=item C<[excludes: E<lt>flag listE<gt>]>
+
+The C<[excludes:...]> directive provides a "pairwise" version of
+mutual exclusion, specifying that the current parameter is mutually exclusive
+with all the other parameters lists, but those other parameters are not
+mutually exclusive with each other. That is, whereas the specification:
+
+ -left Justify to left margin
+ -right Justify to right margin
+ -centre Centre each line
+
+ [mutex: -left -right -centre]
+
+means that only one of these three justification alternatives can ever be used
+at once, the specification:
+
+ -left Justify to left margin
+ -right Justify to right margin
+ -centre Centre each line [excludes: -left -right]
+
+means that C<-left> and C<-right> can still be used together
+(probably to indicate "left I<and> right" justification), but that
+neither can be used with C<-centre>. Note that the C<[excludes:...]>
+directive also differs from the C<[mutex:...]> in that it is always
+connected with a paricular parameter, I<implicitly>
+using the flag of that parameter as the target of exclusion.
+
+
+=item C<[requires: E<lt>conditionE<gt>]>
+
+The C<[requires]> directive specifies a set of flags which
+must also appear in order for a particular flag to be permitted in the
+command-line. The condition is a boolean expression, in which the
+terms are the flags or various parameters, and the operations are
+C<&&>, C<||>, C<!>, and bracketting. For example, the specifications:
+
+ -num Use numeric sort order
+ -lex Use "dictionary" sort order
+ -len Sort on length of line (or field)
+
+ -field <N:+i> Sort on value of field <N>
+
+ -rev Reverse sort order
+ [requires: -num || -lex || !(-len && -field)]
+
+means that the C<-rev> flag is allowed only if either the C<-num> or the
+C<-lex> parameter has been used, or if it is not true that
+I<both> the C<-len> I<and> the C<-field> parameters have been used.
+
+Note that the operators C<&&>, C<||>, and C<!> retain their normal
+Perl precedences.
+
+
+=head2 Parsing from other sources
+
+F<Getopt::Declare> normally parses the contents of C<@ARGV>, but can
+be made to parse specified files instead. To accommodate this,
+C<Getopt::Declare::new()> takes an optional second parameter, which specifies
+a file to be parsed. The parameter may be either:
+
+=over 8
+
+=item A C<IO::Handle> reference or a filehandle GLOB reference
+
+in which case C<Getopt::Declare::new()> reads the corresponding handle until
+end-of-file, and parses the resulting text (even if it is an empty string).
+
+=item An ARRAY reference containing the single string C<'-CONFIG'>
+
+in which case C<Getopt::Declare::new()> looks for the files
+F<$ENV{HOME}/.${progname}rc> and F<$ENV{PWD}/.${progname}rc>,
+concatenates their contents, and parses that.
+
+If neither file is found (or if both are inaccessible)
+C<Getopt::Declare::new()> immediately returns zero. If a
+file is found but the parse subsequently fails, C<undef> is returned.
+
+=item An ARRAY reference containing the single string C<'-BUILD'>
+
+in which case C<Getopt::Declare::new()> builds a parser from the
+supplied grammar and returns a reference to it, but does not parse anything.
+See L<"The Getopt::Declare::code() method"> and
+L<"The Getopt::Declare::parse() method">.
+
+=item An ARRAY reference containing the single string C<'-SKIP'> or the single value C<undef> or nothing
+
+in which case C<Getopt::Declare::new()> immediately returns zero.
+This alternative is useful when using a C<FileHandle>:
+
+ my $args = new Getopt::Declare($grammar,
+ new FileHandle ($filename) || -SKIP);
+
+because it makes explicit what happens if C<FileHandle::new()> fails. Of course,
+if the C<-SKIP> alternative were omitted, <Getopt::Declare::new> would
+still return immediately, having found C<undef> as its second argument.
+
+=item Any other ARRAY reference
+
+in which case C<Getopt::Declare::new()> treats the array elements as a
+list of filenames, concatenates the contents of those files, and parses that.
+
+If the list does not denote any accessible file(s)
+C<Getopt::Declare::new()> immediately returns zero. If matching files
+are found, but not successfully parsed, C<undef> is returned.
+
+=item A string
+
+in which case C<Getopt::Declare::new()> parses that string directly.
+
+=back
+
+Note that when C<Getopt::Declare::new()> parses from a
+source other than C<@ARGV>, unrecognized arguments are I<not>
+placed back in C<@ARGV>.
+
+
+=head2 Using F<Getopt::Declare> objects after command-line processing
+
+After command-line processing is completed, the object returned by
+C<Getopt::Declare::new()> will have the following features:
+
+=over 4
+
+=item Parameter data
+
+For each successfully matched parameter, the F<Getopt::Declare> object
+will contain a hash element. The key of that element will be the leading flag
+or parameter variable name of the parameter.
+
+The value of the element will be a reference to another hash which contains
+the names and values of each distinct parameter variable and/or
+punctuator which was matched by the parameter. Punctuators generate
+string values containing the actual text matched. Scalar parameter
+variables generate scalar values. List parameter variables
+generate array references.
+
+As a special case, if a parameter consists of a single component
+(either a single flag or a single parameter variable), then the value for the
+corresponding hash key is not a hash reference, but the actual value matched.
+
+The following example illustrates the various possibilities:
+
+ $args = new Getopt::Declare, q{
+
+ -v <value> [etc] One or more values
+ <infile> Input file [required]
+ -o <outfiles>... Output files
+ };
+
+ if ( $args->{'-v'} )
+ {
+ print "Using value: ", $args->{'-v'}{'<value>'};
+ print " (et cetera)" if $args->{'-v'}{'etc'};
+ print "\n";
+ }
+
+ open INFILE, $args->{'<infile>'} or die;
+ @data = <INFILE>;
+
+ foreach $outfile ( @{$args->{'-o'}{'<outfiles>'}} )
+ {
+ open OUTFILE, ">$outfile" or die;
+ print OUTFILE process(@data);
+ close OUTFILE;
+ }
+
+
+The values which are assigned to the various hash elements are copied from
+the corresponding blocked-scoped variables which are available within
+actions. In particular, if the value of any of those block-scoped variables
+is changed within an action, that changed value is saved in the hash. For
+example, given the specification:
+
+ $args = new Getopt::Declare, q{
+
+ -ar <R:n> Set aspect ratio (will be clipped to [0..1])
+ {
+ $R = 0 if $R < 0;
+ $R = 1 if $R > 1;
+ }
+ };
+
+then the value of C<$args-E<gt>{'-ar'}{'E<lt>RE<gt>'}>
+will always be between zero and one.
+
+
+=item The C<@ARGV> array
+
+In its "non-strict" mode, once a F<Getopt::Declare> object has
+completed its command-line processing, it pushes any unrecognized
+arguments back into the emptied command-line array C<@ARGV> (whereas
+all I<recognized> arguments will have been removed).
+
+Note that these remaining arguments will be in sequential elements
+(starting at C<$ARGV[0]>), I<not> in their original positions in
+C<@ARGV>.
+
+
+=item The C<Getopt::Declare::usage()> method
+
+Once a F<Getopt::Declare> object is created, its C<usage()> method may be called
+to explicitly print out usage information corresponding to the specification
+with which it was built. See L<"Usage information"> for more details.
+If the C<usage()> method is called with an argument, that argument is passed
+to C<exit> after the usage information is printed (the no-argument version of
+C<usage()> simply returns at that point).
+
+
+=item The C<Getopt::Declare::version()> method
+
+Another useful method of a F<Getopt::Declare> object is C<version()>,
+which prints out the name of the enclosing program, the last time it
+was modified, and the value of C<$::VERSION>, if it is defined.
+Note that this implies that I<all> F<Getopt::Declare> objects in a
+single program will print out identical version information.
+
+Like the C<usage()> method, if C<version> is passed an argument, it
+will exit with that value after printing.
+
+
+=item The C<Getopt::Declare::parse()> method
+
+It is possible to separate the construction of a F<Getopt::Declare>
+parser from the actual parsing it performs. If
+C<Getopt::Declare::new()> is called with a second parameter C<'-BUILD'>
+(see L<"Parsing from other sources">, it constructs and returns a
+parser, without parsing anything.
+The resulting parser object can then be used to parse multiple sources,
+by calling its C<parse()> method.
+
+C<Getopt::Declare::parse()> takes an optional parameter which specifies
+the source of the text to be parsed (it parses C<@ARGV> if the
+parameter is omitted). This parameter takes the same set of values as the
+optional second parameter of C<Getopt::Declare::new()> (see L<"Parsing
+from other sources">).
+
+C<Getopt::Declare::parse()> returns true if the source is located and
+parsed successfully. It returns a defined false (zero) if the source is
+not located. An C<undef> is returned if the source is located, but not
+successfully parsed.
+
+Thus, the following code first constructs a parsers for a series of alternate
+configuration files and the command line, and then parses them:
+
+ # BUILD PARSERS
+ my $config = Getopt::Declare::new($config_grammar, -BUILD);
+ my $cmdline = Getopt::Declare::new($cmdline_grammar, -BUILD);
+
+ # TRY STANDARD CONFIG FILES
+ $config->parse(-CONFIG)
+
+ # OTHERWISE, TRY GLOBAL CONFIG
+ or $config->parse('/usr/local/config/.demo_rc')
+
+ # OTHERWISE, TRY OPENING A FILEHANDLE (OR JUST GIVE UP)
+ or $config->parse(new FileHandle (".config") || -SKIP);
+
+ # NOW PARSE THE COMMAND LINE
+
+ $cmdline->parse() or die;
+
+
+=item The C<Getopt::Declare::code()> method
+
+It is also possible to retreive the command-line parsing code generated
+internally by C<Getopt::Declare::new()>. The C<Getopt::Declare::code()>
+method returns a string containing the complete command-line processing
+code, as a single C<do> block plus a leading C<package> declaration.
+
+C<Getopt::Declare::code()> takes as its sole argument a string
+containing the complete name of the package (for the leading
+C<package> declaration in the generated code). If this string is empty
+or undefined, the package name defaults to "main".
+
+Since the default behaviour of C<Getopt::Declare::new()> is to execute
+the command-line parsing code it generates, if the goal is only to
+generate the parser code, the optional second '-BUILD' parameter
+(see L<"Parsing from other sources">) should be specified when calling
+<Getopt::Declare::new()>.
+
+For example, the following program "inlines" a C<Getopt::Declare>
+specification, by extracting it from between the first "=for
+Getopt::Declare" and the next "=cut" appearing on C<STDIN>:
+
+ use Getopt::Declare;
+
+ sub encode { return new Getopt::Declare (shift,-BUILD)->code() || die }
+
+ undef $/;
+ if (<>)
+ {
+ s {^=for\s+Getopt::Declare\s*\n(.*?)\n=cut}
+ {'my (\$self,$source) = ({});'.encode($1).' or die "\n";'}
+ esm;
+ }
+
+ print;
+
+Note that the generated inlined version expects to find a lexical variable
+named C<$source>, which tells it what to parse (this variable is
+normally set by the optional parameters of C<Getopt::Declare::new()> or
+C<Getopt::Declare::parse()>).
+
+The inlined code leaves all extracted parameters in the lexical
+variable C<$self> and the does not autogenerate help or version flags
+(since there is no actual F<Getopt::Declare> object in the inlined code
+through which to generate them).
+
+=back
+
+
+=head1 AUTOGENERATED FEATURES
+
+=head2 Usage information
+
+The specification passed to C<Getopt::Declare::new> is used (almost
+verbatim) as a "usage" display whenever usage information is
+requested.
+
+Such requests may be made either by specifying an argument matching
+the help parameter (see L<"Help parameters">) or by explicitly calling
+the C<Getopt::Declare::usage()> method (through an action or after
+command-line processing):
+
+ $args = new Getopt::Declare, q{
+
+ -usage Show usage information and exit
+ { $self->usage(0); }
+
+ +usage Show usage information at end of program
+ };
+
+ # PROGRAM HERE
+
+ $args->usage() if $args->{'+usage'};
+
+
+The following changes are made to the original specification before
+it is displayed:
+
+=over 4
+
+=item *
+
+All actions and comments are deleted,
+
+=item *
+
+any C<[ditto]> directive is converted to an appropriate set of "ditto" marks,
+
+=item *
+
+any text in matching square brackets (including any directive) is deleted,
+
+=item *
+
+any parameter variable type specifier (":i", ":n", ":/pat/", etc.) is deleted.
+
+=back
+
+Otherwise, the usage information displayed retains all the formatting
+present in the original specification.
+
+In addition to this information, if the input source is @ARGV,
+F<Getopt::Declare> displays three sample command-lines: one indicating
+the normal usage (including any required parameter variables), one
+indicating how to invoke help (see L<"Help parameters">), and one
+indicating how to determine the current version of the program (see
+L<"Version parameters">).
+
+The usage information is printed to C<STDOUT> and (since F<Getopt::Declare>
+tends to encourage longer and better-documented parameter lists) if
+the F<IO::Pager> package is available, an F<IO::Pager> object is used to
+page out the entire usage documentation.
+
+=head2 Usage "decoration"
+
+It is sometimes convenient to add other "decorative" features to a
+program's usage information, such as subheadings, general notes,
+separators, etc. F<Getopt::Declare> accommodates this need by ignoring
+such items when interpreting a specification string, but printing them
+when asked for usage information.
+
+Any line which cannot be interpreted as either a parameter
+definition, a parameter description, or a parameter action, is treated
+as a "decorator" line, and is printed verbatim (after any square
+bracketted substrings have been removed from it).
+
+The key to successfully decorating F<Getopt::Declare> usage
+information is to ensure that decorator lines are separated from
+any preceding parameter specification, either by an action or by an
+empty line. In addition, like a parameter description, a decorator
+line cannot contain a tab character after the first non-whitespace
+character (because it would then be treated as a parameter
+specification).
+
+The following specification demonstrates various forms of usage
+decoration. In fact, there are only four actual parameters (C<-in>,
+C<-r>, C<-p>, and C<-out>) specified. Note in particular that I<leading> tabs
+are perfectly acceptible in decorator lines.
+
+ $args = new Getopt::Declare (<<'EOPARAM');
+
+ ============================================================
+ Required parameter:
+
+ -in <infile> Input file [required]
+
+ ------------------------------------------------------------
+
+ Optional parameters:
+
+ (The first two are mutually exclusive) [mutex: -r -p]
+
+ -r[and[om]] Output in random order
+ -p[erm[ute]] Output all permutations
+
+ ---------------------------------------------------
+
+ -out <outfile> Optional output file
+
+ ------------------------------------------------------------
+ Note: this program is known to run very slowly of files with
+ long individual lines.
+ ============================================================
+ EOPARAM
+
+
+=head2 Help parameters
+
+By default, F<Getopt::Declare> automatically defines I<all> of the following
+parameters:
+
+ -help Show usage information [undocumented]
+ { $self->usage(0); }
+ -Help [ditto]
+ -HELP [ditto]
+ --help [ditto]
+ --Help [ditto]
+ --HELP [ditto]
+ -h [ditto]
+ -H [ditto]
+
+Hence, most attempts by the user to get help will automatically work
+successfully.
+
+Note however that, if a parameter with any of these flags is
+explicitly specified in the string passed to C<Getopt::Declare::new()>,
+that flag (only) is removed from the list of possible help flags. For
+example:
+
+ -w <pixels:+i> Specify width in pixels
+ -h <pixels:+i> Specify height in pixels
+
+would cause the C<-h> help parameter to be removed (although help
+would still be accessible through the other seven alternatives).
+
+
+=head2 Version parameters
+
+F<Getopt::Declare> also automatically creates a set of parameters which can be
+used to retreive program version information:
+
+ -version Show version information [undocumented]
+ { $self->version(0); }
+ -Version [ditto]
+ -VERSION [ditto]
+ --version [ditto]
+ --Version [ditto]
+ --VERSION [ditto]
+ -v [ditto]
+ -V [ditto]
+
+As with the various help commands, explicitly specifying a parameter
+with any of the above flags removes that flag from the list of version
+flags.
+
+
+=head1 DIAGNOSTICS
+
+F<Getopt::Declare> may issue the following diagnostics whilst parsing a
+command-line. All of them are fatal (the first five, instantly so):
+
+=over 4
+
+=item "Error: bad Getopt::Declare parameter variable specification near %s"
+
+A matching pair of angle brackets were specified as part of a
+parameter definition, but did not form a valid parameter variable
+specification (that is, it wasn't in the form: <I<name>> or
+<I<name>:I<type>>).
+
+=item "Error: bad type in Getopt::Declare parameter variable specification near %s"
+
+An unknown type specifier was used in a parameter variable type suffix.
+
+=item "Error: bad action in Getopt::Declare specification:\n %s"
+
+A Perl syntax error was detected in the indicated action.
+
+=item "Error: unattached action in Getopt::Declare specification:\n %s"
+
+An action was found for which there was no preceding parameter specification.
+This usually occurs because the trailing tab was omitted from the preceding
+parameter specification.
+
+=item "Error: incomplete action in Getopt::Declare specification:\n %s"
+
+An action was found, but it was missing one or more closing '}'s.
+
+=item "Error: bad condition in directive [requires: %s]\n"
+
+The condition specified as part of the indicated C<[requires:...]>
+directive was not a well-formed boolean expression. Common problems
+include: omitting a C<&&>/C<||> operator between two flags,
+mismatched brackets, or using C<and>/C<or> instead of C<&&>/C<||>.
+
+=item "Error: in generated command-line parser code:\n %s"
+
+Either there was a Perl syntax error in one some action (which was
+not caught by the previous diagnostic), or (less likely) there is a
+bug in the code generator inside F<Getopt::Declare>.
+
+=item "Error: incorrect specification of %s parameter"
+
+The flag for the indicated parameter was found, but the argument did not
+then match any of that parameter's variant syntaxes.
+
+=item "Error: parameter %s not allowed with %s"
+
+Two mutually exclusive flags were specified together.
+
+=item "Error: required parameter %s not found"
+
+No argument matching the specified "required" parameter was found
+during command-line processing.
+
+=item "Error: parameter %s can only be specified with %s"
+
+The indicated parameter has a C<[requires:...]> directive, which
+was not satisfied.
+
+=item "Error: unknown command-line argument (%s)"
+
+A command-line argument was encountered which did not match any
+specified parameter. This diagnostic can only only appear if the
+"strict" option is in effect.
+
+=item "Error: in parameter %s (%s must be an integer greater than zero)"
+
+A parameter variable in the indicated parameter was declared with the
+type ":+i" (or a type derived from it), but the corresponding
+argument was not a positive, non-zero integer.
+
+=item "Error: in parameter %s (%s must be a number greater than zero)"
+
+A parameter variable in the indicated parameter was declared with the
+type ":+n" (or a type derived from it), but the corresponding
+argument was not a positive, non-zero number.
+
+=item "Error: in parameter %s (%s must be an positive integer)"
+
+A parameter variable in the indicated parameter was declared with the
+type ":0+i" (or a type derived from it), but the corresponding
+argument was not a positive integer.
+
+=item "Error: in parameter %s (%s must be a positive number)"
+
+A parameter variable in the indicated parameter was declared with the
+type ":0+n" (or a type derived from it), but the corresponding
+argument was not a positive number.
+
+=back
+
+=head1 AUTHOR
+
+Damian Conway (damian@conway.org)
+
+
+=head1 BUGS AND ANNOYANCES
+
+There are undoubtedly serious bugs lurking somewhere in this code.
+
+If nothing else, it shouldn't take 1500 lines to explain a
+package that was designed for intuitive ease of use!
+
+Bug reports and other feedback are most welcome.
+
+
+=head1 COPYRIGHT
+
+ Copyright (c) 1997-2000, Damian Conway. All Rights Reserved.
+ This module is free software. It may be used, redistributed
+ and/or modified under the terms of the Perl Artistic License
+ (see http://www.perl.com/perl/misc/Artistic.html)
diff --git a/support/easylatex/HACKING b/support/easylatex/HACKING
new file mode 100644
index 0000000000..0ef1d4c4b1
--- /dev/null
+++ b/support/easylatex/HACKING
@@ -0,0 +1,13 @@
+This file is for people who would like to modify or reprogram easylatex. If you merely want to use the program, you don't need to read this file.
+
+
+
+--------------------
+Wiki
+--------------------
+The easylatex wiki is the central place for information and development discussion about easylatex. Most of the text that would have been put in this file went there instead. It is at http://easylatex.sf.net.
+
+
+
+-- bayle shanks
+http://purl.net/net/bshanks
diff --git a/support/easylatex/INSTALLATION b/support/easylatex/INSTALLATION
new file mode 100644
index 0000000000..d4ca560572
--- /dev/null
+++ b/support/easylatex/INSTALLATION
@@ -0,0 +1,52 @@
+More detailed installation instructions may be available in the file TUTORIAL.
+
+Support is available by emailing the Easylatex mailing list, easylatex-devel@lists.sourceforge.net.
+
+
+---------------------------------------------
+WINDOWS
+---------------------------------------------
+You must have Perl installed on your machine (the program was tested only with ActiveState Perl). Unfortunately, you must also install "psfrag", which is included with the easylatex distribution.
+
+Aside from this, no "installation" is necessary (or, yet, available); just unpack the EasyLatex directory the .tar.gz, and run it as "perl easylatex.pl".
+
+EasyLatex has only been tested a little bit on Windows, and there are probably still bugs. Please feel free to ask for help at easylatex-devel@lists.sourceforge.net.
+
+
+---------------------------------------------
+LINUX
+---------------------------------------------
+
+You must have Perl installed on your machine. Unfortunately, you must also install "psfrag", which is included with the easylatex distribution.
+
+The quickest way to start using EasyLatex is then to just change to the directory which came in the .tar file, and then run
+
+./quickInstall.pl
+
+If there are no problems with that, and everything works, then you don't need to read the rest of this file.
+
+---------
+
+Before installing easylatex.pl, you must have Perl installed already. You may want to have the Perl module "Getopt::Declare" installed, too. However, if you don't, easylatex.pl will run fine from this directory (see footnote below).
+
+If you use Debian, this package is available in package libgetopt-declare-perl.
+
+
+---------
+
+To install EasyLatex, simply copy the subdirectory "easylatex" to either "/usr/lib/easylatex" or "$HOME/.easylatex", where $HOME is your home directory.
+
+Please note that if there is a directory at "$HOME/.easylatex", but this directory does not contain the contents of the "easylatex" subdirectory, then easylatex will get confused and abort.
+
+In case you get confused, just download easylatex again and re-copy the easylatex subdirectory all over again.
+
+Support is available at the mailing list easylatex-devel@lists.sourceforge.net.
+
+
+-----
+
+footnote:
+ because I have already installed "Getopt::Declare" into this directory as a convenience; however, if you move the file "easylatex.pl", it won't be able to find this directory's Getopt::Declare, so in that case you should do a proper install of Getopt::Declare onto your system.
+
+
+NOTE: inserting latex into graphivz graphs doesn't work with graphviz 2.2 (and perhaps others), but it does work on some older versions. \ No newline at end of file
diff --git a/support/easylatex/MANUAL.txt b/support/easylatex/MANUAL.txt
new file mode 100644
index 0000000000..24c85daf5a
--- /dev/null
+++ b/support/easylatex/MANUAL.txt
@@ -0,0 +1,13 @@
+Not written yet :) Support is available by emailing the Easylatex mailing lists, easylatex-devel@lists.sourceforge.net.
+
+For now, take a look at the tutorial.
+
+Then, if you'd like, see the files testFiles/*.txt for examples of the kinds of input that easylatex can take. These are input test cases. They will be transformed by easylatex into the matching testFile/*.tex.correct files.
+
+----
+== Credits ==
+Most of EasyLatex was written by Bayle Shanks.
+
+Thanks to Brighten Godfrey for contributing Ladot, a program from which some of the graph code was derived. The Ladot web page is:
+
+http://brighten.bigw.org/projects/ladot
diff --git a/support/easylatex/README b/support/easylatex/README
new file mode 100644
index 0000000000..44b1f3f813
--- /dev/null
+++ b/support/easylatex/README
@@ -0,0 +1,8 @@
+EasyLaTeX converts simple text files into LaTeX documents and can also
+process them with LaTeX.
+
+Syntax of the source files takes ideas from wiki interfaces, and generates
+the LaTeX commands for several constructs, in the course of processing.
+
+Author: Bayle Shanks
+License type: gpl \ No newline at end of file
diff --git a/support/easylatex/TUTORIAL b/support/easylatex/TUTORIAL
new file mode 100644
index 0000000000..ff73f6d3ba
--- /dev/null
+++ b/support/easylatex/TUTORIAL
@@ -0,0 +1,53 @@
+This tutorial will walk you through the process of using easylatex.
+
+Please let us know if any part of this tutorial is confusing or incomplete. You can get support for EasyLatex via the mailing list easylatex-devel@lists.sourceforge.net
+
+Most of the tutorial is for Unix-like systems. In theory, easylatex might run under Windows, but it's never been tested.
+
+0. Pre-requisites
+Before you even install easylatex, you need to have the program "Perl" installed. You also have to have LaTeX installed, and also some standard modules that probably came with it (amsmath, amsfonts, amssymb, and psfrag).
+
+You don't need anything else if you will be running EasyLatex from the directory it comes in (in that case, skip to step 1); but if you plan to move to to another directory (say, /usr/local/bin), you'll need to install the Perl module "Getopt::Declare" installed.
+
+For instructions on installing that Perl module, see the web page http://easylatex.sourceforge.net/cgi-bin/wiki.pl?PerlModuleInstallationTutorial . Remember, you don't need to do this if you will be running EasyLatex from the directory it comes in.
+
+If you want to use the graph functionality, you must also have GraphViz preinstalled.
+
+1. Downloading EasyLatex
+Follow [this link], and download the latest version of the "easylatex" package.
+
+2. Installing EasyLatex
+First, unzip EasyLatex.
+
+tar -xovzf easylatex.tar.zip
+
+Next, go into the directory that you just unpacked:
+
+cd easylatex
+
+Now, run:
+
+./quickInstall.pl
+
+That's it! EasyLatex should now be installed.
+
+You might want to put the file "easylatex.pl" in your $PATH, or put it in some location like /usr/bin, so that you can run it from anywhere.
+
+3. Writing an EasyLatex source file
+
+For now, you can just look at the file "demo.txt" which comes with EasyLatex. A look at that file will show you some of the things that you can do with EasyLatex.
+
+4. Compiling the easylatex file to postscript
+Now, execute the file easylatex.pl like this:
+
+./easylatex.pl -ps demo.txt
+
+That's all; now you should have a file called demo.ps in your directory. You can view it with
+
+gv demo.ps
+
+
+If you DIDN'T install GraphViz, then trying to compile "demo.txt" will cause an error message (because that file tries to use the graph functionality). In this case, use the file "demo-no-graph.txt" instead, which should work:
+
+./easylatex.pl -ps demo-no-graph.txt
+gv demo-no-graph.ps
diff --git a/support/easylatex/Text/Balanced.pm b/support/easylatex/Text/Balanced.pm
new file mode 100644
index 0000000000..88218e8c84
--- /dev/null
+++ b/support/easylatex/Text/Balanced.pm
@@ -0,0 +1,997 @@
+# EXTRACT VARIOUSLY DELIMITED TEXT SEQUENCES FROM STRINGS.
+# FOR FULL DOCUMENTATION SEE Balanced.pod
+
+use 5.005;
+use strict;
+
+package Text::Balanced;
+
+use Exporter;
+use SelfLoader;
+use vars qw { $VERSION @ISA %EXPORT_TAGS };
+
+$VERSION = '1.83';
+@ISA = qw ( Exporter );
+
+%EXPORT_TAGS = ( ALL => [ qw(
+ &extract_delimited
+ &extract_bracketed
+ &extract_quotelike
+ &extract_codeblock
+ &extract_variable
+ &extract_tagged
+ &extract_multiple
+
+ &gen_delimited_pat
+ &gen_extract_tagged
+
+ &delimited_pat
+ ) ] );
+
+Exporter::export_ok_tags('ALL');
+
+# PROTOTYPES
+
+sub _match_bracketed($$$$$$);
+sub _match_variable($$);
+sub _match_codeblock($$$$$$$);
+sub _match_quotelike($$$$);
+
+# HANDLE RETURN VALUES IN VARIOUS CONTEXTS
+
+sub _failmsg {
+ my ($message, $pos) = @_;
+ $@ = bless { error=>$message, pos=>$pos }, "Text::Balanced::ErrorMsg";
+}
+
+sub _fail
+{
+ my ($wantarray, $textref, $message, $pos) = @_;
+ _failmsg $message, $pos if $message;
+ return ("",$$textref,"") if $wantarray;
+ return undef;
+}
+
+sub _succeed
+{
+ $@ = undef;
+ my ($wantarray,$textref) = splice @_, 0, 2;
+ my ($extrapos, $extralen) = @_>18 ? splice(@_, -2, 2) : (0,0);
+ my ($startlen) = $_[5];
+ my $remainderpos = $_[2];
+ if ($wantarray)
+ {
+ my @res;
+ while (my ($from, $len) = splice @_, 0, 2)
+ {
+ push @res, substr($$textref,$from,$len);
+ }
+ if ($extralen) { # CORRECT FILLET
+ my $extra = substr($res[0], $extrapos-$startlen, $extralen, "\n");
+ $res[1] = "$extra$res[1]";
+ eval { substr($$textref,$remainderpos,0) = $extra;
+ substr($$textref,$extrapos,$extralen,"\n")} ;
+ #REARRANGE HERE DOC AND FILLET IF POSSIBLE
+ pos($$textref) = $remainderpos-$extralen+1; # RESET \G
+ }
+ else {
+ pos($$textref) = $remainderpos; # RESET \G
+ }
+ return @res;
+ }
+ else
+ {
+ my $match = substr($$textref,$_[0],$_[1]);
+ substr($match,$extrapos-$_[0]-$startlen,$extralen,"") if $extralen;
+ my $extra = $extralen
+ ? substr($$textref, $extrapos, $extralen)."\n" : "";
+ eval {substr($$textref,$_[4],$_[1]+$_[5])=$extra} ; #CHOP OUT PREFIX & MATCH, IF POSSIBLE
+ pos($$textref) = $_[4]; # RESET \G
+ return $match;
+ }
+}
+
+# BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING
+
+sub gen_delimited_pat($;$) # ($delimiters;$escapes)
+{
+ my ($dels, $escs) = @_;
+ return "" unless $dels =~ /\S/;
+ $escs = '\\' unless $escs;
+ $escs .= substr($escs,-1) x (length($dels)-length($escs));
+ my @pat = ();
+ my $i;
+ for ($i=0; $i<length $dels; $i++)
+ {
+ my $del = quotemeta substr($dels,$i,1);
+ my $esc = quotemeta substr($escs,$i,1);
+ if ($del eq $esc)
+ {
+ push @pat, "$del(?:[^$del]*(?:(?:$del$del)[^$del]*)*)$del";
+ }
+ else
+ {
+ push @pat, "$del(?:[^$esc$del]*(?:$esc.[^$esc$del]*)*)$del";
+ }
+ }
+ my $pat = join '|', @pat;
+ return "(?:$pat)";
+}
+
+*delimited_pat = \&gen_delimited_pat;
+
+
+# THE EXTRACTION FUNCTIONS
+
+sub extract_delimited (;$$$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $wantarray = wantarray;
+ my $del = defined $_[1] ? $_[1] : qq{\'\"\`};
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my $esc = defined $_[3] ? $_[3] : qq{\\};
+ my $pat = gen_delimited_pat($del, $esc);
+ my $startpos = pos $$textref || 0;
+ return _fail($wantarray, $textref, "Not a delimited pattern", 0)
+ unless $$textref =~ m/\G($pre)($pat)/gc;
+ my $prelen = length($1);
+ my $matchpos = $startpos+$prelen;
+ my $endpos = pos $$textref;
+ return _succeed $wantarray, $textref,
+ $matchpos, $endpos-$matchpos, # MATCH
+ $endpos, length($$textref)-$endpos, # REMAINDER
+ $startpos, $prelen; # PREFIX
+}
+
+sub extract_bracketed (;$$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $ldel = defined $_[1] ? $_[1] : '{([<';
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my $wantarray = wantarray;
+ my $qdel = "";
+ my $quotelike;
+ $ldel =~ s/'//g and $qdel .= q{'};
+ $ldel =~ s/"//g and $qdel .= q{"};
+ $ldel =~ s/`//g and $qdel .= q{`};
+ $ldel =~ s/q//g and $quotelike = 1;
+ $ldel =~ tr/[](){}<>\0-\377/[[(({{<</ds;
+ my $rdel = $ldel;
+ unless ($rdel =~ tr/[({</])}>/)
+ {
+ return _fail $wantarray, $textref,
+ "Did not find a suitable bracket in delimiter: \"$_[1]\"",
+ 0;
+ }
+ my $posbug = pos;
+ $ldel = join('|', map { quotemeta $_ } split('', $ldel));
+ $rdel = join('|', map { quotemeta $_ } split('', $rdel));
+ pos = $posbug;
+
+ my $startpos = pos $$textref || 0;
+ my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel);
+
+ return _fail ($wantarray, $textref) unless @match;
+
+ return _succeed ( $wantarray, $textref,
+ $match[2], $match[5]+2, # MATCH
+ @match[8,9], # REMAINDER
+ @match[0,1], # PREFIX
+ );
+}
+
+sub _match_bracketed($$$$$$) # $textref, $pre, $ldel, $qdel, $quotelike, $rdel
+{
+ my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_;
+ my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0);
+ unless ($$textref =~ m/\G$pre/gc)
+ {
+ _failmsg "Did not find prefix: /$pre/", $startpos;
+ return;
+ }
+
+ $ldelpos = pos $$textref;
+
+ unless ($$textref =~ m/\G($ldel)/gc)
+ {
+ _failmsg "Did not find opening bracket after prefix: \"$pre\"",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ my @nesting = ( $1 );
+ my $textlen = length $$textref;
+ while (pos $$textref < $textlen)
+ {
+ next if $$textref =~ m/\G\\./gcs;
+
+ if ($$textref =~ m/\G($ldel)/gc)
+ {
+ push @nesting, $1;
+ }
+ elsif ($$textref =~ m/\G($rdel)/gc)
+ {
+ my ($found, $brackettype) = ($1, $1);
+ if ($#nesting < 0)
+ {
+ _failmsg "Unmatched closing bracket: \"$found\"",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ my $expected = pop(@nesting);
+ $expected =~ tr/({[</)}]>/;
+ if ($expected ne $brackettype)
+ {
+ _failmsg qq{Mismatched closing bracket: expected "$expected" but found "$found"},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ last if $#nesting < 0;
+ }
+ elsif ($qdel && $$textref =~ m/\G([$qdel])/gc)
+ {
+ $$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gc and next;
+ _failmsg "Unmatched embedded quote ($1)",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ elsif ($quotelike && _match_quotelike($textref,"",1,0))
+ {
+ next;
+ }
+
+ else { $$textref =~ m/\G(?:[a-zA-Z0-9]+|.)/gcs }
+ }
+ if ($#nesting>=0)
+ {
+ _failmsg "Unmatched opening bracket(s): "
+ . join("..",@nesting)."..",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ $endpos = pos $$textref;
+
+ return (
+ $startpos, $ldelpos-$startpos, # PREFIX
+ $ldelpos, 1, # OPENING BRACKET
+ $ldelpos+1, $endpos-$ldelpos-2, # CONTENTS
+ $endpos-1, 1, # CLOSING BRACKET
+ $endpos, length($$textref)-$endpos, # REMAINDER
+ );
+}
+
+sub revbracket($)
+{
+ my $brack = reverse $_[0];
+ $brack =~ tr/[({</])}>/;
+ return $brack;
+}
+
+my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*};
+
+sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $ldel = $_[1];
+ my $rdel = $_[2];
+ my $pre = defined $_[3] ? $_[3] : '\s*';
+ my %options = defined $_[4] ? %{$_[4]} : ();
+ my $omode = defined $options{fail} ? $options{fail} : '';
+ my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
+ : defined($options{reject}) ? $options{reject}
+ : ''
+ ;
+ my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}})
+ : defined($options{ignore}) ? $options{ignore}
+ : ''
+ ;
+
+ if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+ $@ = undef;
+
+ my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+
+ return _fail(wantarray, $textref) unless @match;
+ return _succeed wantarray, $textref,
+ $match[2], $match[3]+$match[5]+$match[7], # MATCH
+ @match[8..9,0..1,2..7]; # REM, PRE, BITS
+}
+
+sub _match_tagged # ($$$$$$$)
+{
+ my ($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore) = @_;
+ my $rdelspec;
+
+ my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 );
+
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg "Did not find prefix: /$pre/", pos $$textref;
+ goto failed;
+ }
+
+ $opentagpos = pos($$textref);
+
+ unless ($$textref =~ m/\G$ldel/gc)
+ {
+ _failmsg "Did not find opening tag: /$ldel/", pos $$textref;
+ goto failed;
+ }
+
+ $textpos = pos($$textref);
+
+ if (!defined $rdel)
+ {
+ $rdelspec = $&;
+ unless ($rdelspec =~ s/\A([[(<{]+)($XMLNAME).*/ quotemeta "$1\/$2". revbracket($1) /oes)
+ {
+ _failmsg "Unable to construct closing tag to match: $rdel",
+ pos $$textref;
+ goto failed;
+ }
+ }
+ else
+ {
+ $rdelspec = eval "qq{$rdel}";
+ }
+
+ while (pos($$textref) < length($$textref))
+ {
+ next if $$textref =~ m/\G\\./gc;
+
+ if ($$textref =~ m/\G(\n[ \t]*\n)/gc )
+ {
+ $parapos = pos($$textref) - length($1)
+ unless defined $parapos;
+ }
+ elsif ($$textref =~ m/\G($rdelspec)/gc )
+ {
+ $closetagpos = pos($$textref)-length($1);
+ goto matched;
+ }
+ elsif ($ignore && $$textref =~ m/\G(?:$ignore)/gc)
+ {
+ next;
+ }
+ elsif ($bad && $$textref =~ m/\G($bad)/gcs)
+ {
+ pos($$textref) -= length($1); # CUT OFF WHATEVER CAUSED THE SHORTNESS
+ goto short if ($omode eq 'PARA' || $omode eq 'MAX');
+ _failmsg "Found invalid nested tag: $1", pos $$textref;
+ goto failed;
+ }
+ elsif ($$textref =~ m/\G($ldel)/gc)
+ {
+ my $tag = $1;
+ pos($$textref) -= length($tag); # REWIND TO NESTED TAG
+ unless (_match_tagged(@_)) # MATCH NESTED TAG
+ {
+ goto short if $omode eq 'PARA' || $omode eq 'MAX';
+ _failmsg "Found unbalanced nested tag: $tag",
+ pos $$textref;
+ goto failed;
+ }
+ }
+ else { $$textref =~ m/./gcs }
+ }
+
+short:
+ $closetagpos = pos($$textref);
+ goto matched if $omode eq 'MAX';
+ goto failed unless $omode eq 'PARA';
+
+ if (defined $parapos) { pos($$textref) = $parapos }
+ else { $parapos = pos($$textref) }
+
+ return (
+ $startpos, $opentagpos-$startpos, # PREFIX
+ $opentagpos, $textpos-$opentagpos, # OPENING TAG
+ $textpos, $parapos-$textpos, # TEXT
+ $parapos, 0, # NO CLOSING TAG
+ $parapos, length($$textref)-$parapos, # REMAINDER
+ );
+
+matched:
+ $endpos = pos($$textref);
+ return (
+ $startpos, $opentagpos-$startpos, # PREFIX
+ $opentagpos, $textpos-$opentagpos, # OPENING TAG
+ $textpos, $closetagpos-$textpos, # TEXT
+ $closetagpos, $endpos-$closetagpos, # CLOSING TAG
+ $endpos, length($$textref)-$endpos, # REMAINDER
+ );
+
+failed:
+ _failmsg "Did not find closing tag", pos $$textref unless $@;
+ pos($$textref) = $startpos;
+ return;
+}
+
+sub extract_variable (;$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ return ("","","") unless defined $$textref;
+ my $pre = defined $_[1] ? $_[1] : '\s*';
+
+ my @match = _match_variable($textref,$pre);
+
+ return _fail wantarray, $textref unless @match;
+
+ return _succeed wantarray, $textref,
+ @match[2..3,4..5,0..1]; # MATCH, REMAINDER, PREFIX
+}
+
+sub _match_variable($$)
+{
+ my ($textref, $pre) = @_;
+ my $startpos = pos($$textref) = pos($$textref)||0;
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg "Did not find prefix: /$pre/", pos $$textref;
+ return;
+ }
+ my $varpos = pos($$textref);
+ unless ($$textref =~ m/\G(\$#?|[*\@\%]|\\&)+/gc)
+ {
+ _failmsg "Did not find leading dereferencer", pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci
+ or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0))
+ {
+ _failmsg "Bad identifier after dereferencer", pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ while (1)
+ {
+ next if _match_codeblock($textref,
+ qr/\s*->\s*(?:[a-zA-Z]\w+\s*)?/,
+ qr/[({[]/, qr/[)}\]]/,
+ qr/[({[]/, qr/[)}\]]/, 0);
+ next if _match_codeblock($textref,
+ qr/\s*/, qr/[{[]/, qr/[}\]]/,
+ qr/[{[]/, qr/[}\]]/, 0);
+ next if _match_variable($textref,'\s*->\s*');
+ next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc;
+ last;
+ }
+
+ my $endpos = pos($$textref);
+ return ($startpos, $varpos-$startpos,
+ $varpos, $endpos-$varpos,
+ $endpos, length($$textref)-$endpos
+ );
+}
+
+sub extract_codeblock (;$$$$$)
+{
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my $wantarray = wantarray;
+ my $ldel_inner = defined $_[1] ? $_[1] : '{';
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner;
+ my $rd = $_[4];
+ my $rdel_inner = $ldel_inner;
+ my $rdel_outer = $ldel_outer;
+ my $posbug = pos;
+ for ($ldel_inner, $ldel_outer) { tr/[]()<>{}\0-\377/[[((<<{{/ds }
+ for ($rdel_inner, $rdel_outer) { tr/[]()<>{}\0-\377/]]))>>}}/ds }
+ for ($ldel_inner, $ldel_outer, $rdel_inner, $rdel_outer)
+ {
+ $_ = '('.join('|',map { quotemeta $_ } split('',$_)).')'
+ }
+ pos = $posbug;
+
+ my @match = _match_codeblock($textref, $pre,
+ $ldel_outer, $rdel_outer,
+ $ldel_inner, $rdel_inner,
+ $rd);
+ return _fail($wantarray, $textref) unless @match;
+ return _succeed($wantarray, $textref,
+ @match[2..3,4..5,0..1] # MATCH, REMAINDER, PREFIX
+ );
+
+}
+
+sub _match_codeblock($$$$$$$)
+{
+ my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_;
+ my $startpos = pos($$textref) = pos($$textref) || 0;
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg qq{Did not match prefix /$pre/ at"} .
+ substr($$textref,pos($$textref),20) .
+ q{..."},
+ pos $$textref;
+ return;
+ }
+ my $codepos = pos($$textref);
+ unless ($$textref =~ m/\G($ldel_outer)/gc) # OUTERMOST DELIMITER
+ {
+ _failmsg qq{Did not find expected opening bracket at "} .
+ substr($$textref,pos($$textref),20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ my $closing = $1;
+ $closing =~ tr/([<{/)]>}/;
+ my $matched;
+ my $patvalid = 1;
+ while (pos($$textref) < length($$textref))
+ {
+ $matched = '';
+ if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc)
+ {
+ $patvalid = 0;
+ next;
+ }
+
+ if ($$textref =~ m/\G\s*#.*/gc)
+ {
+ next;
+ }
+
+ if ($$textref =~ m/\G\s*($rdel_outer)/gc)
+ {
+ unless ($matched = ($closing && $1 eq $closing) )
+ {
+ next if $1 eq '>'; # MIGHT BE A "LESS THAN"
+ _failmsg q{Mismatched closing bracket at "} .
+ substr($$textref,pos($$textref),20) .
+ qq{...". Expected '$closing'},
+ pos $$textref;
+ }
+ last;
+ }
+
+ if (_match_variable($textref,'\s*') ||
+ _match_quotelike($textref,'\s*',$patvalid,$patvalid) )
+ {
+ $patvalid = 0;
+ next;
+ }
+
+
+ # NEED TO COVER MANY MORE CASES HERE!!!
+ if ($$textref =~ m#\G\s*( [-+*x/%^&|.]=?
+ | =(?!>)
+ | (\*\*|&&|\|\||<<|>>)=?
+ | [!=][~=]
+ | split|grep|map|return
+ )#gcx)
+ {
+ $patvalid = 1;
+ next;
+ }
+
+ if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) )
+ {
+ $patvalid = 1;
+ next;
+ }
+
+ if ($$textref =~ m/\G\s*$ldel_outer/gc)
+ {
+ _failmsg q{Improperly nested codeblock at "} .
+ substr($$textref,pos($$textref),20) .
+ q{..."},
+ pos $$textref;
+ last;
+ }
+
+ $patvalid = 0;
+ $$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc;
+ }
+ continue { $@ = undef }
+
+ unless ($matched)
+ {
+ _failmsg 'No match found for opening bracket', pos $$textref
+ unless $@;
+ return;
+ }
+
+ my $endpos = pos($$textref);
+ return ( $startpos, $codepos-$startpos,
+ $codepos, $endpos-$codepos,
+ $endpos, length($$textref)-$endpos,
+ );
+}
+
+
+my %mods = (
+ 'none' => '[cgimsox]*',
+ 'm' => '[cgimsox]*',
+ 's' => '[cegimsox]*',
+ 'tr' => '[cds]*',
+ 'y' => '[cds]*',
+ 'qq' => '',
+ 'qx' => '',
+ 'qw' => '',
+ 'qr' => '[imsx]*',
+ 'q' => '',
+ );
+
+sub extract_quotelike (;$$)
+{
+ my $textref = $_[0] ? \$_[0] : \$_;
+ my $wantarray = wantarray;
+ my $pre = defined $_[1] ? $_[1] : '\s*';
+
+ my @match = _match_quotelike($textref,$pre,1,0);
+ return _fail($wantarray, $textref) unless @match;
+ return _succeed($wantarray, $textref,
+ $match[2], $match[18]-$match[2], # MATCH
+ @match[18,19], # REMAINDER
+ @match[0,1], # PREFIX
+ @match[2..17], # THE BITS
+ @match[20,21], # ANY FILLET?
+ );
+};
+
+sub _match_quotelike($$$$) # ($textref, $prepat, $allow_raw_match)
+{
+ my ($textref, $pre, $rawmatch, $qmark) = @_;
+
+ my ($textlen,$startpos,
+ $oppos,
+ $preld1pos,$ld1pos,$str1pos,$rd1pos,
+ $preld2pos,$ld2pos,$str2pos,$rd2pos,
+ $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 );
+
+ unless ($$textref =~ m/\G($pre)/gc)
+ {
+ _failmsg qq{Did not find prefix /$pre/ at "} .
+ substr($$textref, pos($$textref), 20) .
+ q{..."},
+ pos $$textref;
+ return;
+ }
+ $oppos = pos($$textref);
+
+ my $initial = substr($$textref,$oppos,1);
+
+ if ($initial && $initial =~ m|^[\"\'\`]|
+ || $rawmatch && $initial =~ m|^/|
+ || $qmark && $initial =~ m|^\?|)
+ {
+ unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcx)
+ {
+ _failmsg qq{Did not find closing delimiter to match '$initial' at "} .
+ substr($$textref, $oppos, 20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ $modpos= pos($$textref);
+ $rd1pos = $modpos-1;
+
+ if ($initial eq '/' || $initial eq '?')
+ {
+ $$textref =~ m/\G$mods{none}/gc
+ }
+
+ my $endpos = pos($$textref);
+ return (
+ $startpos, $oppos-$startpos, # PREFIX
+ $oppos, 0, # NO OPERATOR
+ $oppos, 1, # LEFT DEL
+ $oppos+1, $rd1pos-$oppos-1, # STR/PAT
+ $rd1pos, 1, # RIGHT DEL
+ $modpos, 0, # NO 2ND LDEL
+ $modpos, 0, # NO 2ND STR
+ $modpos, 0, # NO 2ND RDEL
+ $modpos, $endpos-$modpos, # MODIFIERS
+ $endpos, $textlen-$endpos, # REMAINDER
+ );
+ }
+
+ unless ($$textref =~ m{\G((?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc)
+ {
+ _failmsg q{No quotelike operator found after prefix at "} .
+ substr($$textref, pos($$textref), 20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+
+ my $op = $1;
+ $preld1pos = pos($$textref);
+ if ($op eq '<<') {
+ $ld1pos = pos($$textref);
+ my $label;
+ if ($$textref =~ m{\G([A-Za-z_]\w*)}gc) {
+ $label = $1;
+ }
+ elsif ($$textref =~ m{ \G ' ([^'\\]* (?:\\.[^'\\]*)*) '
+ | \G " ([^"\\]* (?:\\.[^"\\]*)*) "
+ | \G ` ([^`\\]* (?:\\.[^`\\]*)*) `
+ }gcx) {
+ $label = $+;
+ }
+ else {
+ $label = "";
+ }
+ my $extrapos = pos($$textref);
+ $$textref =~ m{.*\n}gc;
+ $str1pos = pos($$textref);
+ unless ($$textref =~ m{.*?\n(?=$label\n)}gc) {
+ _failmsg qq{Missing here doc terminator ('$label') after "} .
+ substr($$textref, $startpos, 20) .
+ q{..."},
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ $rd1pos = pos($$textref);
+ $$textref =~ m{$label\n}gc;
+ $ld2pos = pos($$textref);
+ return (
+ $startpos, $oppos-$startpos, # PREFIX
+ $oppos, length($op), # OPERATOR
+ $ld1pos, $extrapos-$ld1pos, # LEFT DEL
+ $str1pos, $rd1pos-$str1pos, # STR/PAT
+ $rd1pos, $ld2pos-$rd1pos, # RIGHT DEL
+ $ld2pos, 0, # NO 2ND LDEL
+ $ld2pos, 0, # NO 2ND STR
+ $ld2pos, 0, # NO 2ND RDEL
+ $ld2pos, 0, # NO MODIFIERS
+ $ld2pos, $textlen-$ld2pos, # REMAINDER
+ $extrapos, $str1pos-$extrapos, # FILLETED BIT
+ );
+ }
+
+ $$textref =~ m/\G\s*/gc;
+ $ld1pos = pos($$textref);
+ $str1pos = $ld1pos+1;
+
+ unless ($$textref =~ m/\G(\S)/gc) # SHOULD USE LOOKAHEAD
+ {
+ _failmsg "No block delimiter found after quotelike $op",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ pos($$textref) = $ld1pos; # HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN
+ my ($ldel1, $rdel1) = ("\Q$1","\Q$1");
+ if ($ldel1 =~ /[[(<{]/)
+ {
+ $rdel1 =~ tr/[({</])}>/;
+ _match_bracketed($textref,"",$ldel1,"","",$rdel1)
+ || do { pos $$textref = $startpos; return };
+ }
+ else
+ {
+ $$textref =~ /$ldel1[^\\$ldel1]*(\\.[^\\$ldel1]*)*$ldel1/gc
+ || do { pos $$textref = $startpos; return };
+ }
+ $ld2pos = $rd1pos = pos($$textref)-1;
+
+ my $second_arg = $op =~ /s|tr|y/ ? 1 : 0;
+ if ($second_arg)
+ {
+ my ($ldel2, $rdel2);
+ if ($ldel1 =~ /[[(<{]/)
+ {
+ unless ($$textref =~ /\G\s*(\S)/gc) # SHOULD USE LOOKAHEAD
+ {
+ _failmsg "Missing second block for quotelike $op",
+ pos $$textref;
+ pos $$textref = $startpos;
+ return;
+ }
+ $ldel2 = $rdel2 = "\Q$1";
+ $rdel2 =~ tr/[({</])}>/;
+ }
+ else
+ {
+ $ldel2 = $rdel2 = $ldel1;
+ }
+ $str2pos = $ld2pos+1;
+
+ if ($ldel2 =~ /[[(<{]/)
+ {
+ pos($$textref)--; # OVERCOME BROKEN LOOKAHEAD
+ _match_bracketed($textref,"",$ldel2,"","",$rdel2)
+ || do { pos $$textref = $startpos; return };
+ }
+ else
+ {
+ $$textref =~ /[^\\$ldel2]*(\\.[^\\$ldel2]*)*$ldel2/gc
+ || do { pos $$textref = $startpos; return };
+ }
+ $rd2pos = pos($$textref)-1;
+ }
+ else
+ {
+ $ld2pos = $str2pos = $rd2pos = $rd1pos;
+ }
+
+ $modpos = pos $$textref;
+
+ $$textref =~ m/\G($mods{$op})/gc;
+ my $endpos = pos $$textref;
+
+ return (
+ $startpos, $oppos-$startpos, # PREFIX
+ $oppos, length($op), # OPERATOR
+ $ld1pos, 1, # LEFT DEL
+ $str1pos, $rd1pos-$str1pos, # STR/PAT
+ $rd1pos, 1, # RIGHT DEL
+ $ld2pos, $second_arg, # 2ND LDEL (MAYBE)
+ $str2pos, $rd2pos-$str2pos, # 2ND STR (MAYBE)
+ $rd2pos, $second_arg, # 2ND RDEL (MAYBE)
+ $modpos, $endpos-$modpos, # MODIFIERS
+ $endpos, $textlen-$endpos, # REMAINDER
+ );
+}
+
+my $def_func =
+[
+ sub { extract_variable($_[0], '') },
+ sub { extract_quotelike($_[0],'') },
+ sub { extract_codeblock($_[0],'{}','') },
+];
+
+sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunknown)
+{
+ my $textref = defined($_[0]) ? \$_[0] : \$_;
+ my $posbug = pos;
+ my ($lastpos, $firstpos);
+ my @fields = ();
+
+ for ($$textref)
+ {
+ my @func = defined $_[1] ? @{$_[1]} : @{$def_func};
+ my $max = defined $_[2] && $_[2]>0 ? $_[2] : 1_000_000_000;
+ my $igunk = $_[3];
+
+ pos ||= 0;
+
+ unless (wantarray)
+ {
+ use Carp;
+ carp "extract_multiple reset maximal count to 1 in scalar context"
+ if $^W && defined($_[2]) && $max > 1;
+ $max = 1
+ }
+
+ my $unkpos;
+ my $func;
+ my $class;
+
+ my @class;
+ foreach $func ( @func )
+ {
+ if (ref($func) eq 'HASH')
+ {
+ push @class, (keys %$func)[0];
+ $func = (values %$func)[0];
+ }
+ else
+ {
+ push @class, undef;
+ }
+ }
+
+ FIELD: while (pos() < length())
+ {
+ my $field;
+ foreach my $i ( 0..$#func )
+ {
+ $func = $func[$i];
+ $class = $class[$i];
+ $lastpos = pos;
+ if (ref($func) eq 'CODE')
+ { ($field) = $func->($_) }
+ elsif (ref($func) eq 'Text::Balanced::Extractor')
+ { $field = $func->extract($_) }
+ elsif( m/\G$func/gc )
+ { $field = defined($1) ? $1 : $& }
+
+ if (defined($field) && length($field))
+ {
+ if (defined($unkpos) && !$igunk)
+ {
+ push @fields, substr($_, $unkpos, $lastpos-$unkpos);
+ $firstpos = $unkpos unless defined $firstpos;
+ undef $unkpos;
+ last FIELD if @fields == $max;
+ }
+ push @fields, $class
+ ? bless(\$field, $class)
+ : $field;
+ $firstpos = $lastpos unless defined $firstpos;
+ $lastpos = pos;
+ last FIELD if @fields == $max;
+ next FIELD;
+ }
+ }
+ if (/\G(.)/gcs)
+ {
+ $unkpos = pos()-1
+ unless $igunk || defined $unkpos;
+ }
+ }
+
+ if (defined $unkpos)
+ {
+ push @fields, substr($_, $unkpos);
+ $firstpos = $unkpos unless defined $firstpos;
+ $lastpos = length;
+ }
+ last;
+ }
+
+ pos $$textref = $lastpos;
+ return @fields if wantarray;
+
+ $firstpos ||= 0;
+ eval { substr($$textref,$firstpos,$lastpos-$firstpos)="";
+ pos $$textref = $firstpos };
+ return $fields[0];
+}
+
+
+sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options)
+{
+ my $ldel = $_[0];
+ my $rdel = $_[1];
+ my $pre = defined $_[2] ? $_[2] : '\s*';
+ my %options = defined $_[3] ? %{$_[3]} : ();
+ my $omode = defined $options{fail} ? $options{fail} : '';
+ my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}})
+ : defined($options{reject}) ? $options{reject}
+ : ''
+ ;
+ my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}})
+ : defined($options{ignore}) ? $options{ignore}
+ : ''
+ ;
+
+ if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; }
+
+ my $posbug = pos;
+ for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ }
+ pos = $posbug;
+
+ my $closure = sub
+ {
+ my $textref = defined $_[0] ? \$_[0] : \$_;
+ my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore);
+
+ return _fail(wantarray, $textref) unless @match;
+ return _succeed wantarray, $textref,
+ $match[2], $match[3]+$match[5]+$match[7], # MATCH
+ @match[8..9,0..1,2..7]; # REM, PRE, BITS
+ };
+
+ bless $closure, 'Text::Balanced::Extractor';
+}
+
+package Text::Balanced::Extractor;
+
+sub extract($$) # ($self, $text)
+{
+ &{$_[0]}($_[1]);
+}
+
+package Text::Balanced::ErrorMsg;
+
+use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" };
+
+1;
diff --git a/support/easylatex/clean.sh b/support/easylatex/clean.sh
new file mode 100644
index 0000000000..06c81bd8a7
--- /dev/null
+++ b/support/easylatex/clean.sh
@@ -0,0 +1,7 @@
+rm *.dvi
+rm *.log
+rm *.aux
+rm *.ps
+rm *.tex
+rm *.pdf
+rm easyLatexGraph*.eps
diff --git a/support/easylatex/demo-no-graph.txt b/support/easylatex/demo-no-graph.txt
new file mode 100644
index 0000000000..f8f27b5326
--- /dev/null
+++ b/support/easylatex/demo-no-graph.txt
@@ -0,0 +1,20 @@
+The identity matrix is the matrix for which a_ij = 1 when i = j, and 0 everywhere else. For example, in three dimensions, I = [1 0 0 ; 0 1 0 ; 0 0 1].
+
+Here is a column vector: [0 1 0]'.
+
+
+
+x \mapsto y_1...y_n
+
+
+
+1/3
+
+
+
+1 + 1 = 2
+1 \leq 3 - 1
+\leq 5
+
+
+
diff --git a/support/easylatex/demo.txt b/support/easylatex/demo.txt
new file mode 100644
index 0000000000..e4eff737f7
--- /dev/null
+++ b/support/easylatex/demo.txt
@@ -0,0 +1,26 @@
+The identity matrix is the matrix for which a_ij = 1 when i = j, and 0 everywhere else. For example, in three dimensions, I = [[1 0 0 ; 0 1 0 ; 0 0 1]].
+
+Here is a column vector: [[0 1 0]]'.
+
+
+x \mapsto y_1...y_n
+
+
+1/3
+
+
+1 + 1 = 2
+1 \leq 3 - 1
+\leq 5
+
+
+\begin{graph}
+ rankdir=LR
+ v_1
+ v_1 -> v_2
+ v_2 -> v_3
+ v_3 -> v_1
+\end{graph}
+
+%% note: dollar sign placement cannot be auto-detected on the v2->v3 edge
+%% because of the commas
diff --git a/support/easylatex/easylatex.pl b/support/easylatex/easylatex.pl
new file mode 100644
index 0000000000..a440195f75
--- /dev/null
+++ b/support/easylatex/easylatex.pl
@@ -0,0 +1,434 @@
+#!/usr/bin/perl
+
+use English;
+use Getopt::Declare;
+
+
+
+######################
+# ARGUMENT PROCESSING
+######################
+#$inFilename = $ARGV[0];
+
+use vars qw ($inFilename $POSTSCRIPT_OUTPUT $PDF_OUTPUT $PDFLATEX_OUTPUT $ALLOW_EMBEDDED_CODE $PARTIAL_DOCUMENT);
+
+use vars qw ($EASYLATEXSTORE_MAIN_RESERVED_WORD $StorageIndex);
+
+$StorageIndex = 0;
+
+$EASYLATEXSTORE_MAIN_RESERVED_WORD = 'EASYLATEXSTORE-MAIN-RESERVED-WORD';
+
+#test4
+
+
+$argSpecification = q(
+ -ps Create a postscript output file (by calling latex, and then dvips)
+ {$POSTSCRIPT_OUTPUT = 1;}
+
+ -pdf Create a pdf output file (by calling latex, and then dvipdf)
+ {$PDF_OUTPUT = 1;}
+
+ -pdflatex Create a pdf output file (by calling pdflatex -- use this if there's screwy errors in the file generated by -pdf)
+ {$PDFLATEX_OUTPUT = 1;}
+
+ --partial This file is not a full LaTeX document, just a partial one (to be \\include'd, for instance)
+ {$PARTIAL_DOCUMENT = 1;}
+
+ -e Allow execution of embedded code (advanced feature)
+ {$ALLOW_EMBEDDED_CODE = 1;}
+
+ <input> The input file
+ {$inFilename = $input;}
+ );
+
+
+
+$args = new Getopt::Declare($argSpecification);
+
+#print "ARG: $inFilename\n $j\nPO: $POSTSCRIPT_OUTPUT, PDF: $PDF_OUTPUT";
+
+######################
+# DEFINE GLOBAL CONSTANTS
+######################
+
+use vars qw($EASYLATEX_DIR @TRANSFORM_PATHS $PS_OUTPUT_COMMANDS $PDF_OUTPUT_COMMANDS $PDFLATEX_OUTPUT_COMMANDS $outFilename $stripFilename);
+
+# doing both ways; todo; clean up global var declr
+
+$PS_OUTPUT_COMMANDS = <<'EOF' ;
+system('latex',$outFilename);
+system('dvips',"${stripFilename}.dvi", "-o${stripFilename}.ps");
+EOF
+
+$PDF_OUTPUT_COMMANDS = <<'EOF' ;
+system('latex',$outFilename);
+system('dvipdf',"${stripFilename}.dvi");
+EOF
+
+$PDFLATEX_OUTPUT_COMMANDS = <<'EOF' ;
+
+
+while ($out =~ /\{([^}]+?\.eps)\}/g) {
+ push(@eps_files_to_convert, $1);
+}
+
+$out =~ s/\{([^}]+?)\.eps\}/{\1.pdf}/g;
+foreach $file (@eps_files_to_convert) {
+ system('epstopdf', $file);
+}
+
+open(OUT, '>'.$outFilename);
+print OUT $out;
+close(OUT);
+
+system('pdflatex',$outFilename);
+EOF
+
+
+#
+# I'll assume most distos have psfrag and leave this out for now...
+#
+# use Cwd;
+#$cwd = cwd();
+#$ENV{TEXINPUTS} .= ":$cwd/psfrag";
+#$ENV{DVIPSHEADERS} .= ":$cwd/psfrag";
+
+
+######################
+# MAIN
+######################
+
+init();
+
+$in = readFile($inFilename);
+$stripFilename = stripFilename($inFilename);
+$outFilename = $stripFilename . '.tex';
+
+### preprocess the file
+
+### 1) if it doesn't end with a newline, add one
+if (substr($in,-1) ne "\n") {$in = $in . "\n";}
+
+### 2) convert DOS-style newlines to UNIX-style (strip linefeeds)
+while ($in =~ s/\r$//g) {}
+
+### 3) store verbatims
+$in = storeVerbatims($in);
+
+
+## first, make a copy of the input
+open(OUT, '>'.$outFilename);
+print OUT $in;
+close(OUT);
+
+## now, run the transforms on it
+foreach $transform (@TRANSFORM_PATHS) {
+ if (-x $transform)
+ {
+ system("$transform", "$outFilename", "$EASYLATEX_DIR", @TRANSFORM_ARGS);
+
+ unlink "$outFilename.bak";
+ unlink "$outFilename.bak.bak";
+ }
+ elsif ($transform =~ /.*\.pl$/)
+ {
+ #print STDERR "about to do $transform\n";
+ #$ENV{'PERL5OPT'} = 'i';
+ use English;
+ #print STDERR "$EXECUTABLE_NAME -i.bak $transform $outFilename $EASYLATEX_DIR $TRANSFORM_ARGS[0]\n";
+ system("$EXECUTABLE_NAME -i.bak $transform", "$outFilename", "$EASYLATEX_DIR", @TRANSFORM_ARGS);
+
+ unlink "$outFilename.bak";
+ unlink "$outFilename.bak.bak";
+ }
+ else {
+ print STDERR "Skipping $transform -- can't figure out how to execute it\
+n";
+ }
+ #print "\n\nJUST DID $transform\n\n";
+
+ #print "\n\nJUST DID $transform on $outFilename\n\n";
+# system('cat', "$outFilename");
+}
+
+## first, make a copy of the input
+open(OUT, $outFilename);
+local undef $/;
+my $out = <OUT>;
+close(OUT);
+
+
+### 3) unstore verbatims
+$out = unstoreVerbatims($out);
+
+open(OUT, '>'.$outFilename);
+print OUT $out;
+close(OUT);
+
+
+## do post-processing if requested
+postProcess($out);
+
+
+######################
+# end of MAIN
+######################
+
+
+
+sub init
+{
+ findEasylatexDir();
+ initListOfTransforms();
+ if ($PARTIAL_DOCUMENT) {
+ push(@TRANSFORM_ARGS, '--partial');
+ }
+ $TRANSFORM_ARGS = join(' ', @TRANSFORM_ARGS);
+ #print "DBG: #$TRANSFORM_ARGS#\n";
+}
+
+sub postProcess {
+ my ($out) = @_;
+
+
+ open(FILE, $outFilename);
+ local undef $/;
+ my $file = <FILE>;
+ close(FILE);
+
+ #TODO: may not work with pdflatex
+ if ($file =~ /\\bibliography{(.*)\.bib}/) {
+ system('latex',$outFilename);
+ system('bibtex',$1);
+ }
+
+ system('latex',$outFilename);
+
+
+ if ($POSTSCRIPT_OUTPUT)
+ {
+ eval $PS_OUTPUT_COMMANDS;
+ }
+
+ if ($PDF_OUTPUT)
+ {
+ eval $PDF_OUTPUT_COMMANDS;
+ }
+
+ if ($PDFLATEX_OUTPUT)
+ {
+ eval $PDFLATEX_OUTPUT_COMMANDS;
+ }
+}
+
+
+###########################################################################
+# findEasylatexDir
+# looks through a searchpath for the easylatex directory.
+# die if it can't find it.
+###########################################################################
+sub findEasylatexDir {
+ local @easylatex_dir_searchpath;
+
+ push(@easylatex_dir_searchpath,"./easylatex");
+ push(@easylatex_dir_searchpath,"$ENV{HOME}/.easylatex");
+ push(@easylatex_dir_searchpath,'/usr/lib/easylatex');
+
+ $EASYLATEX_DIR = '';
+ foreach $path (@easylatex_dir_searchpath)
+ {
+ if (( -e $path && -d $path)) {
+ $EASYLATEX_DIR = $path;
+ }
+ }
+
+ errorCheckEasylatexDir();
+}
+
+####################################################
+# errorCheckEasylatexDir
+# if the easylatex or the transform directories
+# don't exist or aren't directories, then die
+####################################################
+sub errorCheckEasylatexDir {
+ if (! $EASYLATEX_DIR)
+ {
+ die "Can't find easylatex directory. The program probably isn't installed correctly; please see documentation or run quickInstall. Aborting (looked for the directory in " . join(', ', @easylatex_dir_searchpath) . ")";
+
+ }
+
+ if (! ( -e "$EASYLATEX_DIR/transforms" && -d "$EASYLATEX_DIR/transforms"))
+ {
+ die "I found the easylatex directory at $EASYLATEX_DIR, but didn't find the directory $EASYLATEX_DIR/transforms. The program probably isn't installed correctly; please see documentation. Aborting.";
+
+ }
+
+# TODO: add to docs
+}
+
+###########################################################################
+# initListOfTransforms
+# makes a list of the paths of the transforms to run
+# (1) lists the files in the transform directory,
+# (2) filters out files starting with '.' or '#' or ending with '~',
+# (3) sorts the resulting list,
+# (4) prepends the path to each file,
+# (5) leaves the result in the global variable @TRANSFORM_PATHS
+###########################################################################
+sub initListOfTransforms {
+
+ my %fullPath;
+
+##### list the files in the transform directory
+ opendir(TRANSFORMDIR, "$EASYLATEX_DIR/transforms") || die "can't opendir $EASYLATEX_DIR/transforms. The program probably isn't installed correctly; please see documentation. Aborting.";
+ @TRANSFORM_PATHS = readdir(TRANSFORMDIR);
+ closedir(TRANSFORMDIR);
+
+#### remember the path
+ foreach $path (@TRANSFORM_PATHS)
+ {
+ $fullPath{$path} = "$EASYLATEX_DIR/transforms/" . $path;
+ }
+
+
+##### if allowed, add the embedded code transforms
+ if ($ALLOW_EMBEDDED_CODE) {
+ opendir(EMBEDDED_CODE_TRANSFORMDIR,"$EASYLATEX_DIR/embed_transforms");
+ @EMBEDDED_CODE_TRANSFORM_PATHS = readdir(EMBEDDED_CODE_TRANSFORMDIR);
+ closedir(EMBEDDED_CODE_TRANSFORMDIR);
+
+ foreach $path (@EMBEDDED_CODE_TRANSFORM_PATHS)
+ {
+ $fullPath{$path} = "$EASYLATEX_DIR/embed_transforms/" . $path;
+ }
+
+ push(@TRANSFORM_PATHS, @EMBEDDED_CODE_TRANSFORM_PATHS);
+ # add this to the @TRANSFORM_PATHS list
+}
+
+
+
+##### filter
+ @TRANSFORM_PATHS = grep(!/^\./,@TRANSFORM_PATHS);
+ @TRANSFORM_PATHS = grep(!/^\#/,@TRANSFORM_PATHS);
+ @TRANSFORM_PATHS = grep(!/~$/,@TRANSFORM_PATHS);
+ @TRANSFORM_PATHS = grep(!/math_mode_symbol_list.txt/,@TRANSFORM_PATHS);
+ @TRANSFORM_PATHS = grep(!/config.txt/,@TRANSFORM_PATHS);
+
+#### sort
+ @TRANSFORM_PATHS = sort(@TRANSFORM_PATHS);
+
+
+#### prepend the path
+ foreach $path (@TRANSFORM_PATHS)
+ {
+ $path = $fullPath{$path};
+ }
+
+
+# use Data::Dumper; print Dumper(@TRANSFORM_PATHS);
+
+
+
+}
+
+######################
+# UTILITY SUBROUTINES
+######################
+
+######################
+# string readFile($fileName)
+# reads in and returns the contents of file $fileName
+######################
+
+sub readFile {
+ my ($fileName) = @_;
+ my $file;
+
+ local undef $INPUT_RECORD_SEPARATOR;
+ open(INFILE, $fileName);
+ $file = <INFILE>;
+ close INFILE;
+
+ return $file;
+}
+
+######################
+# string calculateOutFilename($inFilename)
+######################
+
+sub stripFilepath {
+ my ($inFilename) = @_;
+ my $stripFilepath;
+
+ $stripFilename = $inFilename;
+
+ $stripFilename =~ s/.txt//;
+
+ return $stripFilepath;
+
+}
+
+
+sub stripFilename {
+ my ($inFilename) = @_;
+ my $stripFilename;
+
+ $stripFilename = $inFilename;
+
+ $stripFilename =~ s/.txt//;
+
+ $stripFilename =~ s/.*\///;
+
+ return $stripFilename;
+
+}
+
+
+######################
+# "store" subroutines
+######################
+
+sub storeVerbatims {
+ my ($file) = @_;
+
+ ${notSlashRE_begin} = '(^|(?!\\).)';
+ ${notSlashRE} = '(?!\\).';
+
+ $file =~ s/(\\begin{verbatim}.*?\\end{verbatim})/store($1)/egs;
+ $file =~ s/\\begin{latex}(.*?)\\end{latex}/store($1)/egs;
+ $file =~ s/(\\newcommand.*)/store($1)/eg;
+ $file =~ s/(\\includegraphics(?:\[[^\]]*\])?{[^}]+})/store($1)/egs;
+ # TODO: there's a bug in the last line (i think, maybe)
+ $file =~ s/(%%.*)/store($1)/eg;
+
+
+ return $file;
+}
+
+sub unstoreVerbatims {
+ my ($file) = @_;
+
+# print STDERR "UNSTORE:\n\n".$file;
+
+ while ($file =~ s/ ?${EASYLATEXSTORE_MAIN_RESERVED_WORD}-(\d+)-${EASYLATEXSTORE_MAIN_RESERVED_WORD} ?/$Stored{$1}/egs) {}
+
+ $file =~ s/\\begin{latex}//g;
+ $file =~ s/\\end{latex}//g;
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+# print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ' '.${EASYLATEXSTORE_MAIN_RESERVED_WORD}.'-' . $StorageIndex++ . '-'.${EASYLATEXSTORE_MAIN_RESERVED_WORD}.' ';
+}
diff --git a/support/easylatex/easylatex/disabled/30autoAlignEquationsOutsideOfMathMode.pl b/support/easylatex/easylatex/disabled/30autoAlignEquationsOutsideOfMathMode.pl
new file mode 100755
index 0000000000..b0fff3fa03
--- /dev/null
+++ b/support/easylatex/easylatex/disabled/30autoAlignEquationsOutsideOfMathMode.pl
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -i
+
+use English;
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+
+my $notEqualsDoubleBackslashNotAmpersandRE = '(?:(?!\\\\\\\\)[^=&\n])*';
+
+my $lineWithOneEqualsRE = $notEqualsDoubleBackslashNotAmpersandRE . '=' . $notEqualsDoubleBackslashNotAmpersandRE . '\n';
+
+$file =~ s/(?:^|^\n|\n\n)($lineWithOneEqualsRE(?:$lineWithOneEqualsRE)+)(?:\n|$)/doBlock($1)/eg;
+
+
+
+
+
+print $file;
+
+
+sub doBlock {
+ my ($block) = @_;
+ $block =~ s/=/&=&/g;
+ $block =~ s/(=.*\n)/$1\\\\/g;
+ $block = substr($block, 0,-2); # remove trailing \\
+ $block = "\n\n".'\\begin{align*}' . "\n" . $block . '\\end{align*}' . "\n";
+ return $block;
+}
+
+
+
+
+
diff --git a/support/easylatex/easylatex/embed_transforms/25scriptedMatrix.pl b/support/easylatex/easylatex/embed_transforms/25scriptedMatrix.pl
new file mode 100644
index 0000000000..adad4e80ec
--- /dev/null
+++ b/support/easylatex/easylatex/embed_transforms/25scriptedMatrix.pl
@@ -0,0 +1,114 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR $file;
+
+## transform it
+
+my $openingSquareBracketsRE = '(?<!\\\\)\\[{3}';
+# in other words, we want '[[[', not preceded by a '\'
+
+my $closingSquareBracketsRE = '(?<!\\\\)\\]{3}';
+
+my $not3ClosingSquareBracketsRE = '((?!\\]3).)*?';
+
+$file =~ s/$openingSquareBracketsRE($not3ClosingSquareBracketsRE)$closingSquareBracketsRE/scriptedMatrixReplace($1)/egs;
+
+## print output
+print $file;
+#print "\n";
+#print STDERR $file;
+
+
+######################
+# subroutines
+######################
+
+sub scriptedMatrixReplace {
+ my ($expr) = @_;
+
+# print STDERR "******** here: $expr\n";
+
+ my @rows;
+ my $out;
+
+ @rows = createScriptedMatrix($expr);
+ $out = matrixToLatex(@rows);
+
+ return $out;
+}
+
+sub createScriptedMatrix {
+ my ($expr) = @_;
+
+ $expr =~ /(\d+),(\d+),(.*)/s;
+ my $numRows = $1;
+ my $numCols = $2;
+ my $script = $3;
+
+# print STDERR "$numRows, $numCols, S: $script\n";
+
+ my @rows;
+ my $cols;
+
+ for ($rowIndex = 0; $rowIndex < $numRows; $rowIndex++) {
+ $cols = [];
+ for ($colIndex = 0; $colIndex < $numCols; $colIndex++) {
+ local $i = $rowIndex + 1;
+ local $j = $colIndex + 1;
+ $cols->[$colIndex] = eval $script;
+# print STDERR "On $i,$j\n";
+ }
+ $rows[$rowIndex] = $cols;
+ }
+
+# use Data::Dumper;
+# print STDERR Dumper(@rows);
+
+ return @rows;
+}
+
+sub matrixToLatex {
+ my @rows = @_;
+
+ my @cols;
+ my ($row, $out);
+ my $colCount;
+ my $colSpecifier;
+ my $i;
+ my $out;
+
+ foreach $row (@rows) {
+ @cols = @$row;
+ $colCount = $#cols + 1;
+ # yeah, okay, so we do this for every row
+ # and we only need to do it once!
+ foreach $col (@cols) {
+ $out .= "$col & ";
+
+ }
+ $out = substr($out,0,-3);
+ ## STRIP OFF THE EXTRA & THAT WE PUT AFTER THE LAST COLUMN
+ $out .= "\n".'\\\\ ';
+ }
+
+ ## STRIP OFF THE \\ THAT WE PUT AFTER THE LAST LINE OF THE MATRIX
+ $out = substr($out,0,-3);
+
+ for ($i = 0; $i < $colCount; $i++) {
+ $colSpecifier .= 'l';
+ }
+
+ $out = '\left[ \begin{array}{'.$colSpecifier.'}'."\n".' ' . $out . '\end{array} \right]';
+
+# print STDERR "**************$out\n";
+
+ return $out;
+}
+
+
diff --git a/support/easylatex/easylatex/math_mode_symbol_list.txt b/support/easylatex/easylatex/math_mode_symbol_list.txt
new file mode 100644
index 0000000000..949c42962a
--- /dev/null
+++ b/support/easylatex/easylatex/math_mode_symbol_list.txt
@@ -0,0 +1,612 @@
+\Arrowvert
+\Bbbk
+\Box
+\Bumpeq
+\Cap
+\Cup
+\Delta
+\Diamond
+\Doteq
+\Downarrow
+\Eins
+\Finv
+\Game
+\Gamma
+\Im
+\Join
+\LHD
+\Lambda
+\Langle
+\Lbrack
+\Leftarrow
+\Leftrightarrow
+\Lleftarrow
+\Longleftarrow
+\Longleftrightarrow
+\Longrightarrow
+\Lparen
+\Lsh
+\Omega
+\P
+\Phi
+\Pi
+\Psi
+\RHD
+\Rangle
+\Rbrack
+\Re
+\Relbar
+\Rightarrow
+\Rparen
+\Rrightarrow
+\Rsh
+\S
+\Sigma
+\Subset
+\Supset
+\Theta
+\Uparrow
+\Updownarrow
+\Upsilon
+\Vdash
+\Vert
+\Vvdash
+\Xi
+\acute
+\aleph
+\alpha
+\amalg
+\angle
+\apprge
+\apprle
+\approx
+\approxeq
+\arrowaxisleft
+\arrowaxisright
+\arrowvert
+\ast
+\asymp
+\axisshort
+\backepsilon
+\backprime
+\backsim
+\backsimeq
+\backslash
+\bar
+\barwedge
+\bbalpha
+\bbbeta
+\bbchi
+\bbdelta
+\bbespilon
+\bbeta
+\bbgamma
+\bbiota
+\bbkappa
+\bblambda
+\bbmu
+\bbnu
+\bbomega
+\bbphi
+\bbpi
+\bbpsi
+\bbrho
+\bbsigma
+\bbtau
+\bbtheta
+\bbupsilon
+\bbxi
+\bbzeta
+\because
+\beta
+\beth
+\between
+\bigcap
+\bigcirc
+\bigcup
+\bigodot
+\bigoplus
+\bigotimes
+\bigsqcup
+\bigstar
+\bigtriangledown
+\bigtriangleup
+\biguplus
+\bigvee
+\bigwedge
+\bitand
+\blacklozenge
+\blacksquare
+\blacktriangle
+\blacktriangledown
+\blacktriangleleft
+\blacktriangleright
+\bot
+\bowtie
+\boxdot
+\boxminus
+\boxplus
+\boxtimes
+\braceld
+\bracelu
+\bracerd
+\braceru
+\bracevert
+\breve
+\bullet
+\bumpeq
+\cap
+\capprod
+\cdot
+\cdotp
+\cdots
+\centerdot
+\check
+\chi
+\circ
+\circeq
+\circlearrowleft
+\circlearrowright
+\circledS
+\circledast
+\circledcirc
+\circleddash
+\clubsuit
+\colon
+\comp
+\complement
+\cong
+\coprod
+\copyright
+\cup
+\cupprod
+\curlyeqprec
+\curlyeqsucc
+\curlyvee
+\curlywedge
+\curvearrowleft
+\curvearrowright
+\dag
+\dagger
+\daleth
+\dashdownarrow
+\dashleftarrow
+\dashrightarrow
+\dashuparrow
+\dashv
+\ddag
+\ddagger
+\ddot
+\ddots
+\defineequal
+\delta
+\diagdown
+\diagup
+\diamond
+\diamondsuit
+\digamma
+\div
+\divideontimes
+\dot
+\doteq
+\doteqdot
+\dotplus
+\dots
+\doublebarwedge
+\doublecap
+\doublecup
+\downarrow
+\downdownarrows
+\downharpoonleft
+\downharpoonright
+\ell
+\emptyset
+\epsilon
+\eqcirc
+\eqsim
+\eqslantgtr
+\eqslantless
+\equiv
+\eta
+\eth
+\exists
+\fallingdotseq
+\flat
+\forall
+\frown
+\gamma
+\ge
+\geq
+\geqq
+\geqslant
+\gets
+\gg
+\ggg
+\gggtr
+\gimel
+\gnapprox
+\gneq
+\gneqq
+\gnsim
+\grave
+\gtrapprox
+\gtrdot
+\gtreqless
+\gtreqqless
+\gtrless
+\gtrsim
+\gvertneqq
+\hat
+\hbar
+\heartsuit
+\hookleftarrow
+\hookrightarrow
+\hslash
+\iff
+\iiint
+\iint
+\image
+\imath
+\in
+\infty
+\int
+\intercal
+\intop
+\invneg
+\iota
+\jmath
+\kappa
+\lVert
+\lambda
+\land
+\langle
+\lbrace
+\lbrack
+\lceil
+\ldotp
+\le
+\leadsfrom
+\leadsto
+\leftarrow
+\leftarrowtail
+\leftharpoondown
+\leftharpoonup
+\leftleftarrows
+\leftrightarrow
+\leftrightarrows
+\leftrightharpoons
+\leftrightsquigarrow
+\leftsquigarrow
+\leftthreetimes
+\leq
+\leqq
+\leqslant
+\lessapprox
+\lessdot
+\lesseqgtr
+\lesseqqgtr
+\lessgtr
+\lesssim
+\lfloor
+\lgroup
+\lhd
+\lhook
+\ll
+\llcorner
+\lll
+\llless
+\lmoustache
+\lnapprox
+\lneq
+\lneqq
+\lnot
+\lnsim
+\logof
+\longleftarrow
+\longleftrightarrow
+\longmapsto
+\longrightarrow
+\looparrowleft
+\looparrowright
+\lor
+\lozenge
+\lrcorner
+\ltimes
+\lvert
+\lvertneqq
+\mapsto
+\mapstochar
+\mathdollar
+\mathparagraph
+\mathsection
+\mathsterling
+\mathunderscore
+\measuredangle
+\mho
+\mid
+\midintop
+\midointop
+\midsurfintop
+\models
+\mp
+\mu
+\multimap
+\nLeftarrow
+\nLeftrightarrow
+\nRightarrow
+\nVDash
+\nVdash
+\nabla
+\natural
+\ncong
+\ne
+\nearrow
+\neg
+\neq
+\nexists
+\ngeq
+\ngeqq
+\ngeqslant
+\ngtr
+\ni
+\nleftarrow
+\nleftrightarrow
+\nleq
+\nleqq
+\nleqslant
+\nless
+\nmid
+\not
+\notapprox
+\notasymp
+\notcong
+\notequiv
+\notin
+\notni
+\notsim
+\notsimeq
+\notsqsubseteq
+\notsqsupseteq
+\notsubset
+\notsubseteq
+\notsupset
+\notsupseteq
+\nparallel
+\nprec
+\npreceq
+\nrightarrow
+\nshortmid
+\nshortparallel
+\nsim
+\nsubseteq
+\nsubseteqq
+\nsucc
+\nsucceq
+\nsupseteq
+\nsupseteqq
+\ntriangleleft
+\ntrianglelefteq
+\ntriangleright
+\ntrianglerighteq
+\nu
+\nvDash
+\nvdash
+\nwarrow
+\ocircle
+\odot
+\oiint
+\oint
+\ointop
+\omega
+\omicron
+\ominus
+\openclubsuit
+\openspadesuit
+\oplus
+\original
+\oslash
+\otimes
+\owns
+\parallel
+\partial
+\period
+\perp
+\phi
+\pi
+\pitchfork
+\pm
+\pounds
+\powersetsymbol
+\prec
+\precapprox
+\preccurlyeq
+\preceq
+\precnapprox
+\precneqq
+\precnsim
+\precsim
+\prime
+\prod
+\propto
+\psi
+\rVert
+\rangle
+\rbrace
+\rbrack
+\rceil
+\rfloor
+\rgroup
+\rhd
+\rho
+\rhook
+\rightarrow
+\rightarrowtail
+\rightharpoondown
+\rightharpoonup
+\rightleftarrows
+\rightleftharpoons
+\rightrightarrows
+\rightsquigarrow
+\rightthreetimes
+\risingdotseq
+\rmoustache
+\rtimes
+\rvert
+\searrow
+\setdif
+\setminus
+\shadedclubsuit
+\shadedspadesuit
+\sharp
+\shortmid
+\shortparallel
+\sigma
+\sim
+\simeq
+\smallfrown
+\smallint
+\smallsetminus
+\smallsmile
+\smile
+\spadesuit
+\sphericalangle
+\sqcap
+\sqcup
+\sqsubset
+\sqsubseteq
+\sqsupset
+\sqsupseteq
+\square
+\star
+\subset
+\subseteq
+\subseteqq
+\subsetneq
+\subsetneqq
+\succ
+\succapprox
+\succcurlyeq
+\succeq
+\succnapprox
+\succneqq
+\succnsim
+\succsim
+\sum
+\supset
+\supseteq
+\supseteqq
+\supsetneq
+\supsetneqq
+\surd
+\surfintop
+\swarrow
+\tau
+\tccentigrade
+\tcmu
+\tcohm
+\tcpertenthousand
+\tcperthousand
+\textregistered
+\therefore
+\theta
+\thickapprox
+\thicksim
+\tilde
+\times
+\to
+\top
+\triangle
+\triangledown
+\triangleleft
+\trianglelefteq
+\triangleq
+\triangleright
+\trianglerighteq
+\twoheadleftarrow
+\twoheadrightarrow
+\ulcorner
+\unlhd
+\unrhd
+\upDelta
+\upOmega
+\upalpha
+\uparrow
+\upbeta
+\upchi
+\updelta
+\updownarrow
+\upepsilon
+\upeta
+\upgamma
+\upharpoonleft
+\upharpoonright
+\upiota
+\upkappa
+\uplambda
+\uplus
+\upmu
+\upnu
+\upomega
+\upphi
+\uppi
+\uppsi
+\uprho
+\upsigma
+\upsilon
+\uptau
+\uptheta
+\upuparrows
+\upupsilon
+\upvarepsilon
+\upxi
+\upzeta
+\urcorner
+\vDash
+\varDelta
+\varGamma
+\varLambda
+\varOmega
+\varPhi
+\varPi
+\varPsi
+\varSigma
+\varTheta
+\varUpsilon
+\varXi
+\varcirc
+\varepsilon
+\varint
+\varkappa
+\varnothing
+\varoint
+\varphi
+\varpi
+\varpropto
+\varrho
+\varsetminus
+\varsigma
+\varsubsetneq
+\varsubsetneqq
+\varsupsetneq
+\varsupsetneqq
+\vartheta
+\vartriangle
+\vartriangleleft
+\vartriangleright
+\vdash
+\vdots
+\vec
+\vee
+\veebar
+\vert
+\wasypropto
+\wedge
+\widehat
+\widetilde
+\wp
+\wr
+\xgeq
+\xi
+\xleq
+\zeta
+\ldots
diff --git a/support/easylatex/easylatex/transforms/20escapeInsideGraphs.pl b/support/easylatex/easylatex/transforms/20escapeInsideGraphs.pl
new file mode 100755
index 0000000000..775fe048c9
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/20escapeInsideGraphs.pl
@@ -0,0 +1,118 @@
+#!/usr/bin/perl -i.bak.bak
+
+use English;
+
+
+
+use vars qw($EASYLATEXSTORE_RESERVED_WORD);
+$EASYLATEXSTORE_RESERVED_WORD = 'EASYLATEXSTORE';
+use vars qw($StorageIndex @Stored);
+$StorageIndex = 0;
+
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR "********************** I got:\n\n" . $file . "\n";
+
+## transform it
+
+$file =~ s/(\\begin{graph}.*?\\end{graph})/processGraph($1)/sge;
+
+# print output
+print $file;
+
+
+###############
+# end of MAIN
+###############
+
+sub processGraph {
+ my ($block) = @_;
+
+ # to make it easier to put matrices in labels
+ $block =~ s/(\[\w+=[^"\]]+)(\[[^\]]+\])([^"\]]+\])/$1.store($2).$3/ge;
+# $block =~ s/\[\w+=([^"\]]+)(\[[^\]]+\])/$1$2 HELLOOOOOOOOOOOOOOOOOOO/g;
+
+ $block = storeMathModes($block);
+#print STDERR "in 20esc:\n $block\n";
+
+ $block =~ s/\[label=((?!${EASYLATEXSTORE_RESERVED_WORD})[^,"\]]+)([,\]])/[label=\$$1\$$2/g;
+# $block =~ s/\[label=([^"\]]+)\]/[label=\$$1\$]/g;
+# $block =~ s/\[label=([^\]]+)\]/[label=\$$1\$]/g;
+# $block =~ s/\[label=\$([^\]]+)(,[^\]=]*=[^\]]*)\$\]/[label=\$$1\$$2]/g;
+# $block =~ s/\[label=\$([^\]]+)(,[^\]=]*=[^\]]*)\$\]/[label=\$$1\$$2]/g;
+
+
+$block =~ s/=/\\=/g;
+#$block =~ s/\[([^]]+=[^]]+)]/\\[$1\\]/g;
+
+$block =~ s/^(.*\S.*)(?<!;)(<!{)\n/$1;\n/mg;
+$block =~ s/;//; # remove the ; we just added to "\begin{graph};"
+
+# default size limit, to keep graph from being bigger than the page
+#
+
+if (! ($block =~ /size\\=/i))
+{$block =~ s/\\begin{graph}/\\begin{graph} size="6,10";/}
+
+$block = unstoreMathModes($block);
+
+# print STDERR "escapeInsideGraph: $block\n";
+
+
+
+ return $block;
+}
+
+
+
+
+######################
+# "store" subroutines
+######################
+
+sub storeMathModes {
+ my ($file) = @_;
+
+ ${notSlashRE_begin} = '(^|(?!\\).)';
+ ${notSlashRE} = '(?!\\).';
+
+ $file =~ s/(\\begin{align}.*?\\end{align})/store($1)/egs;
+ $file =~ s/(\\begin{align\*}.*?\\end{align\*})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray}.*?\\end{eqnarray})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray\*}.*?\\end{eqnarray\*})/store($1)/egs;
+ $file =~ s/(\\begin{equation}.*?\\end{equation})/store($1)/egs;
+ $file =~ s/(\\begin{equation\*}.*?\\end{equation\*})/store($1)/egs;
+
+ $file =~ s/((?<!\\)\$.*?(?<!\\)\$)/store($1)/egs;
+
+ return $file;
+}
+
+sub unstoreMathModes {
+ my ($file) = @_;
+
+# print STDERR "UNSTORE:\n\n".$file;
+
+ while ($file =~ s/${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD}/$Stored{$1}/egs) {}
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+# print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex++ . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+}
+
diff --git a/support/easylatex/easylatex/transforms/25autoLinefeedInMathMode.pl b/support/easylatex/easylatex/transforms/25autoLinefeedInMathMode.pl
new file mode 100644
index 0000000000..17d11c2fbd
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/25autoLinefeedInMathMode.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+my $alignOrEqnarrayRE = '(?:align|eqnarray)\\*?';
+
+$file =~ s/(\\begin{($alignOrEqnarrayRE)}\n?)(.*?)(\\end{\2})/"$1".doBlock($3)."$4"/egs;
+
+
+# print output
+print $file;
+
+
+
+sub doBlock {
+ my ($block) = @_;
+
+ my $notEqualsNotDoubleBackslashCharRE = '((?!\\\\\\\\).)*?';
+ $block =~ s/(?<=\n)($notEqualsNotDoubleBackslashCharRE\n)/\\\\$1/gs;
+
+
+ return $block;
+}
+
+
+
diff --git a/support/easylatex/easylatex/transforms/25wiki.pl b/support/easylatex/easylatex/transforms/25wiki.pl
new file mode 100755
index 0000000000..e446faf536
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/25wiki.pl
@@ -0,0 +1,27 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR "*********** I got: $file\n";
+
+## transform it
+
+$file =~ s/^:(.*)/\n\\ \\ \\ \\ \\ $1\n\\\\\n/gm;
+$file =~ s/<pre>/\\begin{verbatim}/g;
+$file =~ s/<\/pre>/\\end{verbatim}/g;
+$file =~ s/-->/\\to/g;
+#s/http:\/\/([\w\/\.]+)~([\w\/\.]*)/http:\/\/$1\\~{}$2/g;
+$file =~ s/~/\\~{}/g;
+
+$file =~ s/\*\*([a-zA-Z][^\*]+)\*\*/\\textbf{$1}/g;
+$file =~ s/__([a-zA-Z][^_]+)__/\\emph{$1}/g;
+
+
+# print output
+print $file
+
+
diff --git a/support/easylatex/easylatex/transforms/30autoFractions.pl b/support/easylatex/easylatex/transforms/30autoFractions.pl
new file mode 100644
index 0000000000..9a2ca235af
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/30autoFractions.pl
@@ -0,0 +1,20 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+
+$numberRE = '-?\d+(?:\.\d+)?';
+$file =~ s/(^|\W)($numberRE(?:^.)?)\/($numberRE(?:\^.)?)(\W|$)/$1\\frac{$2}{$3}$4/;
+
+# print output
+print $file;
+
+
+
+
+
diff --git a/support/easylatex/easylatex/transforms/30dotsToLdots.pl b/support/easylatex/easylatex/transforms/30dotsToLdots.pl
new file mode 100755
index 0000000000..67221cf8d0
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/30dotsToLdots.pl
@@ -0,0 +1,20 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+
+$file =~ s/(?<!\\)\.\.\./\\ldots /g;
+$file =~ s/\\\.\.\./.../g;
+
+# print output
+print $file;
+
+
+
+
+
diff --git a/support/easylatex/easylatex/transforms/30superSubscripts.pl b/support/easylatex/easylatex/transforms/30superSubscripts.pl
new file mode 100644
index 0000000000..5640039e6a
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/30superSubscripts.pl
@@ -0,0 +1,84 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+
+use vars qw($EASYLATEXSTORE_RESERVED_WORD @MATH_MODE_SYMBOLS $MATH_MODE_SYMBOL_FILEPATH);
+
+$EASYLATEXSTORE_RESERVED_WORD = 'EASYLATEXSTORE';
+
+
+
+use vars qw($StorageIndex @Stored);
+
+$StorageIndex = 0;
+
+
+
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+
+$wordRE = '\w+';
+
+$file = storeUntouchables($file);
+
+#print STDERR "stored file: $file\n\n";
+
+$file =~ s/(^|\W)(${wordRE})\^(\w$wordRE)(\W|$)/$1$2^{$3}$4/mg;
+$file =~ s/(^|\W)(${wordRE})_(\w$wordRE)(\W|$)/$1$2_{$3}$4/mg;
+$file = unstoreUntouchables($file);
+
+# print output
+print $file;
+
+
+
+
+######################
+# "store" subroutines
+######################
+
+sub storeUntouchables {
+ my ($file) = @_;
+
+ $file =~ s/(\\documentclass{.*?})/store($1)/egs;
+ $file =~ s/\\documentclass{([^}]+)}/'\\documentclass{' . store($1) . '}'/egs;
+
+
+
+ return $file;
+}
+
+sub unstoreUntouchables {
+ my ($file) = @_;
+
+ while ($file =~ s/ ?${EASYLATEXSTORE_RESERVED_WORD}-(\d+)-${EASYLATEXSTORE_RESERVED_WORD} ?/$Stored{$1}/egs) {}
+
+ #print STDERR "UNSTOREd:\n\n".$file;
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+# print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ' '.${EASYLATEXSTORE_RESERVED_WORD}.'-' . $StorageIndex++ . '-'.${EASYLATEXSTORE_RESERVED_WORD}.' ';
+}
+
+
+
+
diff --git a/support/easylatex/easylatex/transforms/70autoMathMode.pl b/support/easylatex/easylatex/transforms/70autoMathMode.pl
new file mode 100644
index 0000000000..20a615c170
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/70autoMathMode.pl
@@ -0,0 +1,463 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+use vars qw($EASYLATEXSTORE_RESERVED_WORD @MATH_MODE_SYMBOLS $MATH_MODE_SYMBOL_FILEPATH);
+
+$EASYLATEXSTORE_RESERVED_WORD = 'EASYLATEXSTORE';
+
+
+
+$MATH_MODE_SYMBOL_FILEPATH = $ARGV[1].'/math_mode_symbol_list.txt';
+
+
+loadMathModeSymbols();
+
+
+
+
+
+
+
+use vars qw($StorageIndex @Stored);
+
+$StorageIndex = 0;
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+#$file .= <>;
+#print STDERR "********** here's what i got: $file \n\n ************** \n\n";
+
+
+
+
+## transform it
+
+$file = storeMathModes($file);
+
+$file = autoMathModeEqnArray($file);
+$file = storeMathModes($file);
+
+$file = autoMathModeEqnArrayNoEqualityInFirstEquation($file);
+$file = storeMathModes($file);
+$file = autoMathModeLeftRight($file);
+$file = storeMathModes($file);
+$file = autoMathModeFrac($file);
+$file = storeMathModes($file);
+$file = autoMathModeSqrt($file);
+$file = storeMathModes($file);
+$file = autoMathModeMathbbEtc($file);
+$file = storeMathModes($file);
+$file = autoMathModeSuperOrSubscript($file);
+
+$file = storeMathModes($file);
+$file = autoMathModeBinarySymbols($file);
+
+$file = storeMathModes($file);
+
+$file = autoMathModeSuperOrSubscript($file);
+ # done twice to cover this case: (f \circ g)^{-1}
+ # and this one: a_4 = 2^2
+$file = storeMathModes($file);
+$file = autoMathModeSimpleSymbols($file);
+
+$file = storeMathModes($file);
+$file = includeAdjacentParens($file);
+
+
+
+$file = autoMathModeUnEscapeEqualsSigns($file);
+#print STDERR "auto: $file\n";
+$file = unstoreMathModes($file);
+
+
+
+#print STDERR "auto: $file\n";
+print $file;
+
+sub autoMathModeLeftRight {
+ my ($file) = @_;
+
+ $file =~ s/(\\left\W.*?\\right\W)/\n\\begin{align*}\n$1\n\\end{align*}\n/gs;
+
+ return $file;
+}
+
+
+sub autoMathModeFrac {
+ my ($file) = @_;
+
+ $file =~ s/(\\frac{[^}]*}{[^}]*})/\$$1\$/g;
+
+ return $file;
+}
+
+
+sub autoMathModeSqrt {
+ my ($file) = @_;
+
+ $file =~ s/(\\sqrt{[^}]*})/\$$1\$/g;
+
+ return $file;
+}
+
+
+sub autoMathModeMathbbEtc {
+ my ($file) = @_;
+
+ $file =~ s/(\\mathbb{[^}]*})/\$$1\$/g;
+ $file =~ s/(\\mathcal{[^}]*})/\$$1\$/g;
+
+ return $file;
+}
+
+
+sub autoMathModeSuperOrSubscript {
+ my ($file) = @_;
+
+# print STDERR "superOrSub got $file\n";
+
+ ### some regular expression "primitives"
+ my $word_OrCharacterRE = '((?<!\\\\)\\\\?(?:(\w+|.)))';
+ my $wordWithoutUnderscores_OrCharacterRE = '((?<!\\\\)\\\\?(?:((?!_)\w)+|.))';
+
+ my $underscoreWhichIsNotEscapedRE = '(?<!\\\\)_';
+ my $carrotWhichIsNotEscapedRE = '(?<!\\\\)\\^';
+
+ my $bracketsWithoutNestingOrIsolatedCharacterRE = '((?<!\\\\){[^{]*?(?!=\\\\)}|.)(?!\w)';
+
+
+ ### parts of the regular expression for finding subscripts
+ my $subscriptBaseRE = "(?<!\w)(?!EASYLATEX)$wordWithoutUnderscores_OrCharacterRE";
+ my $subscriptOpRE = $underscoreWhichIsNotEscapedRE;
+ my $subscriptArgRE = $bracketsWithoutNestingOrIsolatedCharacterRE;
+
+ my $subscriptRE = $subscriptBaseRE . $subscriptOpRE . $subscriptArgRE;
+
+ ### parts of the regular expression for finding superscripts
+ my $superscriptBaseRE = "(?:(?<=[^a-zA-Z0-9_])|(?=\\\\))(?!EASYLATEX)$word_OrCharacterRE";
+ my $superscriptOpRE = $carrotWhichIsNotEscapedRE;
+ my $superscriptArgRE = $bracketsWithoutNestingOrIsolatedCharacterRE;
+
+ my $superscriptRE = $superscriptBaseRE . $superscriptOpRE . $superscriptArgRE;
+
+# $file =~ s/(${subscriptRE})/\$$1\$/g;
+# $file =~ s/(${superscriptRE})/\$$1\$/g;
+ $file =~ s/(${subscriptRE})/processSuperOrSubscript($1)/ge;
+ $file =~ s/(${superscriptRE})/processSuperOrSubscript($1)/ge;
+
+# experimental:
+#$file =~ s/${EASYLATEXSTORE_RESERVED_WORD}/processSuperOrSubscript($1)/ge;
+
+
+ return $file;
+}
+
+sub processSuperOrSubscript {
+ my ($block) = @_;
+
+# print STDERR "proc got $block\n";
+
+ $block = unstoreMathModes($block);
+ # so that the next line does something..
+ $block =~ s/\$//g;
+ $block = '$'.$block.'$';
+
+ return $block;
+}
+
+sub autoMathModeBinarySymbols {
+ my ($file) = @_;
+
+ @MATH_MODE_BINARY_SYMBOLS = map(quotemeta,@MATH_MODE_BINARY_SYMBOLS);
+ my $symbol_list = join('|',@MATH_MODE_BINARY_SYMBOLS);
+
+# print STDERR "pre: $file\n";
+
+ $file =~ s/(?<!\w)((?:(?!${EASYLATEXSTORE_RESERVED_WORD})\w)+ (?:$symbol_list) (?:(?!${EASYLATEXSTORE_RESERVED_WORD})\w)+)(?:(?!\w)|(?=\\))/\$$1\$/g;
+
+### now things like "x \mapsto EASYLATEXSTORE" --> "$x \mapsto$ EASYLATEXSTORE"
+ $file =~ s/(?<!\w)((?:(?!${EASYLATEXSTORE_RESERVED_WORD})\w)+ (?:$symbol_list))(?=\s*${EASYLATEXSTORE_RESERVED_WORD})/\$$1\$/g;
+
+### now things like "EASYLATEXSTORE \mapsto x" --> "EASYLATEXSTORE $\mapsto x$"
+ $file =~ s/(?<=${EASYLATEXSTORE_RESERVED_WORD})(\s*)((?:$symbol_list) (?:(?!${EASYLATEXSTORE_RESERVED_WORD})\w)+)(?:(?!\w)|(?=\\))/$1\$$2\$/g;
+
+
+# print STDERR "Repl binary: $file\n";
+
+ return $file;
+}
+
+sub autoMathModeSimpleSymbols {
+ my ($file) = @_;
+
+ @MATH_MODE_SYMBOLS = map(quotemeta,@MATH_MODE_SYMBOLS);
+ my $symbol_list = join('|',@MATH_MODE_SYMBOLS);
+
+ $file =~ s/(?:(?<!\w)|(?=\\))($symbol_list)(?!\w)/\$$1\$/g;
+
+# print STDERR "Repl simple: $file\n";
+
+ return $file;
+}
+
+
+
+# NOTE: this feature may require you to escape some = signs
+sub autoMathModeEqnArray {
+ my ($file) = @_;
+
+ $notEqualsRE = '[^\n=]*';
+# $lineWithOneEqualsRE = "^($notEqualsRE) (?<!\\\\)(?:=|\\\\geq|\\\\leq) ($notEqualsRE)\$";
+ $lineWithOneEqualsRE = "(?:($notEqualsRE) (?:=|\\\\geq|\\\\leq|<|>|\\\\propto|\\\\approx)(?<!\\\\=) ($notEqualsRE)\n)";
+
+# print STDERR "(?:^|\n\n)($lineWithOneEqualsRE+)(?:\n|$)";
+ $file =~ s/(?:^|\n\n)($lineWithOneEqualsRE+)(?:\n|$)/"\n\n".eqnArrayReplaceFn($1)."\n"/eg;
+
+
+ return $file;
+}
+
+sub eqnArrayReplaceFn {
+ $expr = $_[0];
+
+# print STDERR "called earfn: $expr\n";
+
+ $testExpr = $expr;
+ $testExpr =~ s/\\textrm{.*?}//g;
+ if ($testExpr =~ /EASYLATEXSTORE/)
+ {
+# print STDERR "not replacing\n";
+ return $expr;
+ }
+
+
+ if ($expr =~ /^.*=\s*$/)
+ {
+# print STDERR "not replacing\n";
+ return $expr;
+ }
+
+# allow multiple \leqs per line?
+# if ($expr =~ /\\leq.*\\leq/)
+# {
+# print STDERR "not replacing\n";
+# return $expr;
+# }
+
+ $expr =~ s/\n/\n\\\\/g;
+ $expr =~ s/(.*)\n\\\\/\1\n/s;
+ $expr = "\\begin{align*}\n".$expr."\\end{align*}";
+
+
+
+ return $expr;
+}
+
+
+
+# NOTE: this feature may require you to escape some = signs
+sub autoMathModeEqnArrayNoEqualityInFirstEquation {
+ my ($file) = @_;
+
+# print STDERR "arrayNoEq got: $file\n";
+
+ $notEqualsRE = '[^\n=]*';
+# $lineWithOneEqualsRE = "^($notEqualsRE) (?<!\\\\)(?:=|\\\\geq|\\\\leq) ($notEqualsRE)\$";
+ $lineWithOneEqualsRE = "(?:($notEqualsRE) ?(?:=|\\\\geq|\\\\leq|<|>|\\\\propto|\\\\approx) ($notEqualsRE)\n)";
+ $lineWithoutOneEqualsRE = "(?:$notEqualsRE\n)";
+
+
+ $file =~ s/(?:^|\n\n)($lineWithoutOneEqualsRE$lineWithOneEqualsRE+)(?:\n|$)/"\n\n".eqnArrayReplaceFn($1)."\n"/eg;
+# $file =~ s/($lineWithOneEqualsRE+)(?:\n|$)/"\n\n".eqnArrayReplaceFn($1)."\n"/eg;
+
+# print STDERR "arrayNoEq put: $file\n";
+
+ return $file;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+sub autoMathModeUnEscapeEqualsSigns {
+ my ($file) = @_;
+
+# @MATH_MODE_SYMBOLS = map(quotemeta,@MATH_MODE_SYMBOLS);
+# my $symbol_list = join('|',@MATH_MODE_SYMBOLS);
+
+ $notEqualsRE = '[^\n=]+';
+# $lineWithOneEscapedEqualsRE = "^($notEqualsRE) (?<=\\\\)= ($notEqualsRE)\$";
+
+# $file =~ s/\n\n($lineWithOneEqualsRE+)\n\n/"\n\n".unescapeEquals($1)."\n\n"/emg;
+ $file =~ s/\\=/=/g;
+
+ return $file;
+
+}
+
+sub unescapeEquals {
+ $expr = $_[0];
+
+
+# print STDERR "Unescaping $expr\n";
+
+ $expr =~ s/\\=/=/;
+
+ return $expr;
+}
+
+
+
+sub includeAdjacentParens {
+ my ($block) = @_;
+
+ $block =~ s/(\(\s* ?${EASYLATEXSTORE_RESERVED_WORD}_\d+_${EASYLATEXSTORE_RESERVED_WORD} ?)/processAdjParensLeft($1)/ge;
+ $block =~ s/( ?${EASYLATEXSTORE_RESERVED_WORD}_\d+_${EASYLATEXSTORE_RESERVED_WORD} ?\s*\))/processAdjParensRight($1)/ge;
+
+return $block;
+}
+
+sub processAdjParensLeft {
+ my ($block) = @_;
+
+ $block =~ /${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD}/;
+$storageID = $1;
+$Stored{$storageID} = '('.$Stored{$storageID};
+
+ $block = substr($block, 1);
+
+#print STDERR "NEWBLOCK($storageID=$Stored{$storageID}): $block\n";
+
+ return $block;
+}
+
+sub processAdjParensRight {
+ my ($block) = @_;
+
+ $block =~ /${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD}/;
+$storageID = $1;
+$Stored{$storageID} = $Stored{$storageID} . ')';
+
+$block = substr($block, 0, -1);
+
+#print STDERR "AP $block";
+
+ return $block;
+}
+
+######################
+# "store" subroutines
+######################
+
+#currently unused; TODO
+sub storeOther {
+ my ($file) = @_;
+
+ $file =~ s/\\documentclass{([^}]+)}/'\\documentclass{' . store($1) . '}'/egs;
+
+ return $file;
+}
+
+sub storeMathModes {
+ my ($file) = @_;
+
+ ${notSlashRE_begin} = '(^|(?!\\).)';
+ ${notSlashRE} = '(?!\\).';
+
+ $file =~ s/(\\begin{align}.*?\\end{align})/store($1)/egs;
+ $file =~ s/(\\begin{align\*}.*?\\end{align\*})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray}.*?\\end{eqnarray})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray\*}.*?\\end{eqnarray\*})/store($1)/egs;
+ $file =~ s/(\\begin{equation}.*?\\end{equation})/store($1)/egs;
+ $file =~ s/(\\begin{equation\*}.*?\\end{equation\*})/store($1)/egs;
+ $file =~ s/(\\begin{verbatim}.*?\\end{verbatim})/store($1)/egs;
+ $file =~ s/(\\documentclass{.*?})/store($1)/egs;
+ $file =~ s/\\documentclass{([^}]+)}/'\\documentclass{' . store($1) . '}'/egs;
+
+ $file =~ s/((?<!\\)\$.*?(?<!\\)\$)/store($1)/egs;
+
+ return $file;
+}
+
+sub unstoreMathModes {
+ my ($file) = @_;
+
+# print STDERR "UNSTORE:\n\n".$file;
+
+ while ($file =~ s/ ?${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD} ?/$Stored{$1}/egs) {}
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+# print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ' '.${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex++ . '_'.${EASYLATEXSTORE_RESERVED_WORD}.' ';
+}
+
+
+######################
+# utility subroutines
+######################
+
+
+sub loadMathModeSymbols {
+
+#I got the symbol tables by doing this on my own machine:
+# cd /usr/share/texmf/tex/latex
+# grep -r DeclareMathSymbol * > /tmp/t
+# perl -pi -e 's/.*?:\s*\\DeclareMathSymbol{?(\\\w+)}?(\s|{).*/$1/g' /tmp/t
+# perl -pi -e 's/.*?:\s*(\\\w+)(\s|$)/$1/gm' /tmp/t
+# perl -i -e 'while (<>) {if (!/:/) {print $_;}}' /tmp/t
+#
+# cd {src directory of "The not so Short Introduction to LaTeX"}
+# cat lssym.tex | perl -e 'undef $/; $_ = <>; while (/(?:{(\\\w+)}|\\verb\|(\\\w+)\|)/g) {print "$1$2\n";}' lssym.tex >> /tmp/t
+#
+# sort /tmp/t > /tmp/t2
+# uniq /tmp/t2 > /tmp/t
+# grep -v '\\DeclareMathSymbol' /tmp/t > /tmp/t2
+#
+#and then I moved /tmp/t2 into the file math_mode_symbol_list.txt
+#
+# and then manually added "\ldots" at the end of the file
+#
+
+ $INPUT_RECORD_SEPARATOR = "\n";
+
+ open(SYMBOLFILE, $MATH_MODE_SYMBOL_FILEPATH) or die "Can't open list of math mode symbols at $MATH_MODE_SYMBOL_FILEPATH";
+ while ($line = <SYMBOLFILE>)
+ {
+ chomp $line;
+ push(@MATH_MODE_SYMBOLS,$line);
+ push(@MATH_MODE_BINARY_SYMBOLS,$line);
+ }
+ close(SYMBOLFILE);
+
+ push(@MATH_MODE_BINARY_SYMBOLS,'+');
+ push(@MATH_MODE_BINARY_SYMBOLS,'-');
+ push(@MATH_MODE_BINARY_SYMBOLS,'*');
+ push(@MATH_MODE_BINARY_SYMBOLS,'/');
+ push(@MATH_MODE_BINARY_SYMBOLS,'=');
+
+
+}
+
diff --git a/support/easylatex/easylatex/transforms/80autoAlignEquations.pl b/support/easylatex/easylatex/transforms/80autoAlignEquations.pl
new file mode 100755
index 0000000000..b034018c72
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/80autoAlignEquations.pl
@@ -0,0 +1,264 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+$EASYLATEXSTORE_RESERVED_WORD = 'EASYLATEXSTORE';
+use vars qw($StorageIndex @Stored);
+$StorageIndex = 0;
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+ #print STDERR "I got:**********************\n".$file."***************\n";
+
+## transform it
+
+$equalsRE = '(?:=|\\\\Rightleftarrow|\\\\Rightarrow|\\\\Leftarrow|\\\\geq|\\\\leq)';
+#$equalsRE = '=';
+#$mathLinesepStuffRE = '(?:\\\\Rightleftarrow|\\\\Rightarrow|\\\\Leftarrow)?';
+$mathLinesepStuffRE = '';
+
+
+
+my $beginMathRE = '\\\\begin{(?:eqnarray|align)\\*?}';
+my $endMathRE = '\\\\end{(?:eqnarray|align)\\*?}';
+
+#my $notEqualsDoubleBackslashNotAmpersandRE = '(?:(?!\\\\\\\\)[^=&\n])*';
+my $notEqualsDoubleBackslashNotAmpersandRE = '(?:(?!\\\\\\\\)(?!\\\\)(?!'.$equalsRE.')[^\n&])*';
+my $notEqualsDoubleBackslashNotAmpersandRE = '(?:(?!\\\\\\\\)(?!'.$equalsRE.')[^\n&])*';
+ ## confusing!! aloowed ampersand without changing name!
+#my $doubleBlackslashOrEndRE = '(?:\n\\\\\\\\|\n)';
+my $doubleBlackslashOrEndRE = '(?:\n\\\\\\\\'.$mathLinesepStuffRE.'|\n)';
+
+
+my $lineInMathModeRE = '(?:(?!\\\\\\\\).)*' . $doubleBlackslashOrEndRE;
+my $lineWithOneEqualsRE = $notEqualsDoubleBackslashNotAmpersandRE . '(?:'.$equalsRE.'|\\\\geq|\\\\leq)' . $notEqualsDoubleBackslashNotAmpersandRE . $doubleBlackslashOrEndRE;
+
+
+
+$mainRegexp = "($beginMathRE\n?$lineInMathModeRE(?:$lineWithOneEqualsRE(?:$doubleBlackslashOrEndRE)*)+$endMathRE\n)";
+#$mainRegexp = "($beginMathRE\n$lineInMathModeRE$notEqualsDoubleBackslashNotAmpersandRE(?:$equalsRE)$notEqualsDoubleBackslashNotAmpersandRE$doubleBlackslashOrEndRE(.|\n)*?$endMathRE\n)";
+#$mainRegexp = "($beginMathRE\n$lineInMathModeRE$notEqualsDoubleBackslashNotAmpersandRE(?:$equalsRE)$notEqualsDoubleBackslashNotAmpersandRE(.|\n)*?$endMathRE\n)";
+#$mainRegexp = "(($beginMathRE\n)$lineInMathModeRE((?:$notEqualsDoubleBackslashNotAmpersandRE(?:$equalsRE)$notEqualsDoubleBackslashNotAmpersandRE$doubleBlackslashOrEndRE)+)(.|\n)*?$endMathRE\n)";
+
+
+
+#print STDERR "REGEXP=" . $mainRegexp . "\n";
+
+
+#$file =~ /$mainRegexp/;
+
+#$file =~ s/($beginMathRE\n$lineInMathModeRE(?:$lineWithOneEqualsRE)+$endMathRE\n)/processEqnArray($1)/eg;
+
+#print STDERR "1: $1\n\n";
+#print STDERR "2: $2\n\n";
+#print STDERR "3: $3\n\n";
+#print STDERR "4: $4\n\n";
+#print STDERR "5: $4\n\n";
+#print STDERR "6: $4\n\n";
+
+$file = storeTexts($file);
+
+ #print STDERR $file;
+$file =~ s/$mainRegexp/processEqnArray($1)/eg;
+$file = unstoreTexts($file);
+
+print $file;
+
+#print STDERR "I sent:**********************\n".$file."***************\n";
+
+##############
+# end MAIN
+##############
+
+
+
+
+
+
+
+
+
+sub processEqnArray {
+ my ($block) = @_;
+
+ #print STDERR "**************\nEntered EqnArray\n****************\n";
+ #print STDERR $block;
+
+$block = unstoreTexts($block);
+
+# if (! ($block =~ /$beginMathRE\n$lineWithOneEqualsRE(?:$lineWithOneEqualsRE)+$endMathRE\n/) )
+# {
+# $block =~ s/(}\n?)/$1&/; ## right after the \begin{}, add a '&'
+# }
+
+ $block = alignEquals($block);
+ $block = alignTextAtBeginningOrEndOfLine($block);
+
+ if ($block =~ /$beginMathRE\n\s*[^&].*\n(\s*\\\\\s*&.*\n)+$endMathRE\n/)
+ {
+ #print STDERR "*\n*\n*\nyes\n\n";
+ $block =~ s/(}\n?)/$1&/; ## right after the \begin{}, add a '&'
+ }
+
+
+ $block = blankLinesToIntertext($block);
+ $block = removeLinefeedAfterBeginOrIntertext($block);
+
+
+ return $block;
+}
+
+
+# sub processEqnArrayAndIndentFirstLine {
+# my ($block) = @_;
+
+# print STDERR $block;
+
+# $block =~ s/(}\n?)/$1&/; ## right after the \begin{}, add a '&&'
+# $block = processEqnArray($block);
+
+# return $block;
+# }
+
+
+sub alignEquals {
+ my ($block) = @_;
+
+
+ #print STDERR "AEb: $block";
+ $block = storeTexts($block);
+
+# $block =~ s/(?<!\\\\)($equalsRE)/&\1/g;
+ $block =~ s/($equalsRE)/&\1/g;
+ #$block =~ s/\\leq/&\\leq/g;
+ #$block =~ s/\\geq/&\\geq/g;
+
+ $block = unstoreTexts($block);
+
+ #print STDERR "AEf: $block";
+
+ return $block;
+}
+
+
+sub alignTextAtBeginningOrEndOfLine {
+ my ($block) = @_;
+
+ $block = alignTextAtBeginningOfLine($block);
+ $block = alignTextAtEndOfLine($block);
+
+ return $block;
+}
+
+sub alignTextAtBeginningOfLine {
+ my ($block) = @_;
+
+ $textAtBeginningOfLineRE = '^(\\\\\\\\\\\\textrm{[^}]*?)}';
+
+### if ($block =~ s/^((?:\\\\)*\s*\\textrm{[^}]*?)}/$1 } & /mg) {print STDERR "yes!\n"};
+# if ($block =~ s/^(\\\\\\textrm{[^}]*?)}/$1 } & /mg) {print STDERR "yes!\n"};
+ if ($block =~ /$textAtBeginningOfLineRE/mg)
+ {
+# print STDERR "found it!\n";
+
+ $block =~ s/$textAtBeginningOfLineRE/$1 } && /mg;
+ $block =~ s/\\\\/\\\\&& /g ;
+ $block =~ s/(}\n?)/$1&&/; ## right after the \begin{}, add a '&&'
+ $block =~ s/^\\\\&& \s*\\textrm{/\\\\ \\textrm{/mg;
+ }
+
+
+ return $block;
+}
+
+sub alignTextAtEndOfLine {
+ my ($block) = @_;
+
+# print STDERR $block;
+
+ $block =~ s/\\textrm{([^}]*?}\s*)$/& \\textrm{ $1/mg;
+ # if a line ends in \textrm{...}
+ # then indent the \textrm, and add a space to the text inside of it
+
+ return $block;
+}
+
+
+sub blankLinesToIntertext {
+ my ($block) = @_;
+
+ #print STDERR $block;
+ $block =~ s/\\\\\n/\\\\\\intertext{}\n/mg;
+
+
+ return $block;
+}
+
+sub removeLinefeedAfterBeginOrIntertext {
+ my ($block) = @_;
+
+ #print STDERR $block;
+
+ $block =~ s/(\\begin{align}(?:\\label{[^}]+})?|\\intertext{[^}]*})\n\\\\/$1/mg;
+
+
+ return $block;
+}
+
+
+
+
+
+
+
+###########
+# "store" subroutines
+###########
+
+
+######################
+# "store" subroutines
+######################
+
+sub storeTexts {
+ my ($file) = @_;
+
+# print STDERR "TESTING for storage:$file\n\n";
+
+ $file =~ s/(\\textrm{[^}]*})/store($1)/egs;
+ $file =~ s/((?<!\\begin)(?<!\\end){[^}]*})/store($1)/egs;
+
+ return $file;
+}
+
+sub unstoreTexts {
+ my ($file) = @_;
+
+# print STDERR "UNSTORE:\n\n".$file;
+
+ while ($file =~ s/${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD}/$Stored{$1}/egs) {}
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+ #print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex++ . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+}
+
+
+
+
diff --git a/support/easylatex/easylatex/transforms/80autoItemize.pl b/support/easylatex/easylatex/transforms/80autoItemize.pl
new file mode 100755
index 0000000000..6d751eabcd
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/80autoItemize.pl
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+$lineBeginningWithParensRE = '^\(.*?\)\W*\w+.*$';
+$wordOrDot = '(?:\w|\.)';
+$lineBeginningWithNumberedHalfParensRE = "^$wordOrDot+?\\).*\$";
+$lineBeginningWithStarRE = '^\*+ .*$';
+$lineBeginningWithNumberSignRE = '^#+ .*$';
+
+#TODO: Embedded lists
+
+$file =~ s/($lineBeginningWithParensRE\n($lineBeginningWithParensRE\n)+)/itemizeParens($1)/mge;
+
+$file =~ s/($lineBeginningWithNumberedHalfParensRE\n($lineBeginningWithNumberedHalfParensRE\n)+)/itemizeNumberedHalfParens($1)/mge;
+
+$file =~ s/($lineBeginningWithStarRE\n($lineBeginningWithStarRE\n)+)/itemizeStar($1)/mge;
+
+$file =~ s/($lineBeginningWithNumberSignRE\n($lineBeginningWithNumberSignRE\n)+)/itemizeNumberSign($1)/mge;
+
+
+
+
+
+# print output
+print $file;
+
+
+
+
+
+############
+# END OF MAIN
+############
+
+
+
+
+sub itemizeParens {
+ my $expr = $_[0];
+
+ $expr =~ s/^(\(.*?\))/\\item[$1]/mg;
+
+ $expr = "\\begin{itemize}\n".$expr."\\end{itemize}\n";
+
+ return $expr;
+}
+
+
+sub itemizeStar {
+ # this is essential the same as "itemizeNumberSign"
+
+ my $expr = $_[0];
+
+ $expr =~ s/^\* /\\item /mg;
+ $expr =~ s/^\*\*/*/mg;
+
+ $expr = "\\begin{itemize}\n".$expr."\\end{itemize}\n";
+
+ # recurse
+ $expr =~ s/(($lineBeginningWithStarRE\n)+)/itemizeStar($1)/mge;
+
+ return $expr;
+}
+
+sub itemizeNumberSign {
+ # this is essentially the same as "itemizeStar"
+
+ my $expr = $_[0];
+
+ $expr =~ s/^\# /\\item /mg;
+ $expr =~ s/^\#\#/#/mg;
+
+ $expr = "\\begin{enumerate}\n".$expr."\\end{enumerate}\n";
+
+ # recurse
+ $expr =~ s/(($lineBeginningWithNumberSignRE\n)+)/itemizeNumberSign($1)/mge;
+
+ return $expr;
+}
+
+
+
+sub itemizeNumberedHalfParens {
+ my $expr = $_[0];
+
+ $expr =~ s/^(.*?\))/\\item[$1]/mg;
+
+ $expr = "\\begin{itemize}\n".$expr."\\end{itemize}\n";
+
+ return $expr;
+}
+
+
diff --git a/support/easylatex/easylatex/transforms/80easyMatrices.pl b/support/easylatex/easylatex/transforms/80easyMatrices.pl
new file mode 100755
index 0000000000..8335ae9151
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/80easyMatrices.pl
@@ -0,0 +1,239 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+ use vars qw($EASYLATEXSTORE_RESERVED_WORD @MATH_MODE_SYMBOLS $MATH_MODE_SYMBOL_FILEPATH);
+
+ $EASYLATEXSTORE_RESERVED_WORD = 'EASYLATEXSTORE';
+ use vars qw($StorageIndex @Stored);
+
+ $StorageIndex = 0;
+
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+
+$openingSquareBracketRE = '(?:^|(?<=\s))\\[\\[';
+ # opening square bracket, either at the beginning of a line
+ # or preceded by whitespace (note: this won't trigger if preceded by
+ # brackets either)
+$closingSquareBracketRE = '(?<!\\\\)\\]\\]';
+
+$file =~ s/${openingSquareBracketRE}([^\]\]]*?)${closingSquareBracketRE}'/matlabStyleMatrixTransposeReplace($1)/emgs; # do transpose replaces first
+
+$file =~ s/${openingSquareBracketRE}([^\]\]]*?)${closingSquareBracketRE}/matlabStyleMatrixReplace($1)/emgs; # now do the normal ones
+
+
+## unescape \[ and \] s (which the user might use to escape things that weren't supposed to be easy matrices)
+#$file =~ s/\\\[/[/g;
+#$file =~ s/\\]/]/g;
+
+$file = easyMatricesToMathMode($file);
+
+
+## print output
+print $file;
+#print "\n";
+#print STDERR $file;
+
+
+######################
+# subroutines
+######################
+
+sub matlabStyleMatrixReplace {
+ my ($expr) = @_;
+
+ my @rows;
+ my $out;
+
+ @rows = readInMatlabStyleMatrix($expr);
+ $out = matrixToLatex(@rows);
+
+ return $out;
+}
+
+sub matlabStyleMatrixTransposeReplace {
+ my ($expr) = @_;
+
+ my @rows;
+ my $out;
+
+ @rows = readInMatlabStyleMatrix($expr);
+ @rows = transpose(@rows);
+ $out = matrixToLatex(@rows);
+
+ return $out;
+}
+
+
+sub readInMatlabStyleMatrix {
+ my ($expr) = @_;
+
+ my @inputRows;
+ my @inputCols;
+ my @rows;
+ my @cols;
+ my ($colIndex, $rowIndex);
+ my $row;
+ my $cols;
+
+ @inputRows = split(/;/, $expr);
+ for ($rowIndex = 0; $rowIndex <= $#inputRows; $rowIndex++) {
+ $row = $inputRows[$rowIndex];
+ $cols = []; $colIndex = 0;
+ @inputCols = split(/ /, $row);
+ foreach $col (@inputCols) {
+ if ($col =~ /^\W*$/) {next;} # bypass whitespace
+ if ($col =~ /&/) {$cols[$colIndex++] = ''; next;}
+ # bypass column separators;
+ # this can be used to indicate an empty
+ # column.
+
+ $cols->[$colIndex++] = $col;
+ }
+ $rows[$rowIndex] = $cols;
+ }
+
+# use Data::Dumper;
+# print Dumper(@rows);
+
+# print "ir = $#inputRows\n";
+
+ return @rows;
+}
+
+sub matrixToLatex {
+ my @rows = @_;
+
+ my @cols;
+ my ($row, $out);
+ my $colCount;
+ my $colSpecifier;
+ my $i;
+ my $out;
+
+ foreach $row (@rows) {
+ @cols = @$row;
+ $colCount = $#cols + 1;
+ # yeah, okay, so we do this for every row
+ # and we only need to do it once!
+ foreach $col (@cols) {
+ $out .= "$col & ";
+
+ }
+ $out = substr($out,0,-3);
+ ## STRIP OFF THE EXTRA & THAT WE PUT AFTER THE LAST COLUMN
+ $out .= "\n".'\\\\ ';
+ }
+
+ ## STRIP OFF THE \\ THAT WE PUT AFTER THE LAST LINE OF THE MATRIX
+ $out = substr($out,0,-3);
+
+ for ($i = 0; $i < $colCount; $i++) {
+ $colSpecifier .= 'l';
+ }
+
+ $out = '\left[ \begin{array}{'.$colSpecifier.'}'."\n".' ' . $out . '\end{array} \right]';
+
+# print STDERR "**************$out\n";
+
+ return $out;
+}
+
+
+sub transpose {
+ my @inRows = @_;
+ my ($rowIndex,$colIndex);
+ my @outRows;
+
+
+ #TODO: put in error checking in case the # of columns in each row is not the same
+
+
+
+ my @firstRow = @{$inRows[0]};
+
+
+
+ for($rowIndex=0;$rowIndex<=$#firstRow; $rowIndex++)
+ {
+ @outRows[$rowIndex] = [];
+ for($colIndex=0;$colIndex<=$#inRows; $colIndex++)
+ {
+# print STDERR "($rowIndex,$colIndex)";
+ @outRows[$rowIndex]->[$colIndex] = $inRows[$colIndex]->[$rowIndex];
+ }
+ }
+
+# use Data::Dumper;
+# print STDERR Dumper(@outRows);
+
+
+
+ return @outRows;
+}
+
+sub easyMatricesToMathMode {
+ my ($file) = @_;
+
+
+ $file = storeMathModes($file);
+ $file =~ s/(\\left\W.*?\\right\W)/\n\\begin{align*}\n$1\n\\end{align*}\n/gs;
+ $file = unstoreMathModes($file);
+
+ return $file;
+}
+
+
+######################
+# store subroutines
+######################
+
+
+sub storeMathModes {
+ my ($file) = @_;
+
+ ${notSlashRE_begin} = '(^|(?!\\).)';
+ ${notSlashRE} = '(?!\\).';
+
+ $file =~ s/(\\begin{align}.*?\\end{align})/store($1)/egs;
+ $file =~ s/(\\begin{align\*}.*?\\end{align\*})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray}.*?\\end{eqnarray})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray\*}.*?\\end{eqnarray\*})/store($1)/egs;
+ $file =~ s/(\\begin{equation}.*?\\end{equation})/store($1)/egs;
+ $file =~ s/(\\begin{equation\*}.*?\\end{equation\*})/store($1)/egs;
+ $file =~ s/(\\begin{verbatim}.*?\\end{verbatim})/store($1)/egs;
+
+ $file =~ s/((?<!\\)\$.*?(?<!\\)\$)/store($1)/egs;
+
+ return $file;
+}
+
+sub unstoreMathModes {
+ my ($file) = @_;
+
+# print STDERR "UNSTORE:\n\n".$file;
+
+ while ($file =~ s/ ?${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD} ?/$Stored{$1}/egs) {}
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+# print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ' '.${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex++ . '_'.${EASYLATEXSTORE_RESERVED_WORD}.' ';
+}
diff --git a/support/easylatex/easylatex/transforms/85sweepHalfEquationsIntoAdjacentMathMode.pl b/support/easylatex/easylatex/transforms/85sweepHalfEquationsIntoAdjacentMathMode.pl
new file mode 100755
index 0000000000..dac1340e48
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/85sweepHalfEquationsIntoAdjacentMathMode.pl
@@ -0,0 +1,125 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+use vars qw(@MATH_MODE_SYMBOLS $MATH_MODE_SYMBOL_FILEPATH);
+
+$MATH_MODE_SYMBOL_FILEPATH = $ARGV[1].'/math_mode_symbol_list.txt';
+
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR "*****here's what i got ******\n$file\n";
+
+## transform it
+
+loadMathModeSymbols();
+
+@MATH_MODE_BINARY_SYMBOLS = map(quotemeta,@MATH_MODE_BINARY_SYMBOLS);
+my $symbol_list = join('|',@MATH_MODE_BINARY_SYMBOLS);
+
+$beginMathModeRE = '(?:\\\\begin{(?:equation|align|eqnarray)\\*?}|\\$)';
+$endMathModeRE = '(?:\\\\end{(?:equation|align|eqnarray)\\*?}|\\$)';
+$beginMathModeWithCaptureRE = '(?:\\\\begin{((?:equation|align|eqnarray)\\*?)})';
+#$beginMathModeWithCaptureRE = '(?:\\\\begin{((?:eq\\$)';
+#$endMathModeWithCaptureRE = '(?:\\\\end{((?:equation|align|eqnarray)\\*?)}|\\$)';
+$endMathModeWithCaptureRE = '(?:\\\\end{((?:equation|align|eqnarray)\\*?)}|\\$)';
+
+$file =~ s/\$\$//g;
+
+
+$file =~ s/(?<!\w)(\w (?:$symbol_list))(\s+$beginMathModeRE)/\$$1\$$2/gs;
+
+$file =~ s/($endMathModeRE\s+)((?:$symbol_list) \w)(?!\w)/$1\$$2\$/gs;
+
+#$file =~ s/$endMathModeWithCaptureRE(\s+)\\begin{\1}/oneNewlineOrNothing($2)/esg;
+
+$file =~ s/\$(\s+)\$/oneNewlineOrNothing($1)/esg;
+
+
+while ($file =~ s/\$([^\$]+)\$(\s*)$beginMathModeWithCaptureRE\s*/"\\begin{$3}".$1.oneNewlineOrNothing($2).' '/esg)
+{
+# print STDERR "FOUND: $1, $2, $3\n\n\n";
+}
+
+# print output
+print $file;
+#print STDERR "Here's what I put: $file\n";
+
+
+sub oneNewlineOrNothing {
+ my ($expr) = @_;
+
+ my $count = 0;
+ my $i;
+ my $whitespace = '';
+
+ while ($expr =~ /\n/sg) {$count++;}
+
+ if ($expr =~ /\s/) {$whitespace = ' '};
+
+ if ($count == 0) {$expr = '';}
+ else {
+ $expr = "\n";
+ for ($i = 0; $i < ($count - 1); $i++) {
+ $expr .= '\\\\ ';
+ }
+ }
+
+ $expr = $whitespace . $expr;
+
+
+# print STDERR "*** count = $count; expr: $expr ***\n";
+
+ return $expr;
+}
+
+
+######################
+# utility subroutines
+######################
+
+
+sub loadMathModeSymbols {
+
+#I got the symbol tables by doing this on my own machine:
+# cd /usr/share/texmf/tex/latex
+# grep -r DeclareMathSymbol * > /tmp/t
+# perl -pi -e 's/.*?:\s*\\DeclareMathSymbol{?(\\\w+)}?(\s|{).*/$1/g' /tmp/t
+# perl -pi -e 's/.*?:\s*(\\\w+)(\s|$)/$1/gm' /tmp/t
+# perl -i -e 'while (<>) {if (!/:/) {print $_;}}' /tmp/t
+#
+# cd {src directory of "The not so Short Introduction to LaTeX"}
+# cat lssym.tex | perl -e 'undef $/; $_ = <>; while (/(?:{(\\\w+)}|\\verb\|(\\\w+)\|)/g) {print "$1$2\n";}' lssym.tex >> /tmp/t
+#
+# sort /tmp/t > /tmp/t2
+# uniq /tmp/t2 > /tmp/t
+# grep -v '\\DeclareMathSymbol' /tmp/t > /tmp/t2
+#
+#and then I moved /tmp/t2 into the file math_mode_symbol_list.txt
+
+
+ $INPUT_RECORD_SEPARATOR = "\n";
+
+ open(SYMBOLFILE, $MATH_MODE_SYMBOL_FILEPATH) or die "Can't open list of math mode symbols at $MATH_MODE_SYMBOL_FILEPATH";
+ while ($line = <SYMBOLFILE>)
+ {
+ chomp $line;
+ push(@MATH_MODE_SYMBOLS,$line);
+ push(@MATH_MODE_BINARY_SYMBOLS,$line);
+ }
+ close(SYMBOLFILE);
+
+ push(@MATH_MODE_BINARY_SYMBOLS,'+');
+ push(@MATH_MODE_BINARY_SYMBOLS,'-');
+ push(@MATH_MODE_BINARY_SYMBOLS,'*');
+ push(@MATH_MODE_BINARY_SYMBOLS,'/');
+ push(@MATH_MODE_BINARY_SYMBOLS,'=');
+
+}
+
+
+
diff --git a/support/easylatex/easylatex/transforms/90addHeaderAndFooter.pl b/support/easylatex/easylatex/transforms/90addHeaderAndFooter.pl
new file mode 100644
index 0000000000..ac8fff945e
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/90addHeaderAndFooter.pl
@@ -0,0 +1,123 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+use Getopt::Declare;
+
+######################
+# DEFINE GLOBAL CONSTANTS
+######################
+
+use vars qw($EASYLATEX_DIR @TRANSFORM_PATHS $LATEX_HEADER $LATEX_FOOTER $PARTIAL_DOCUMENT);
+
+
+$DEFAULT_DOCUMENTCLASS = <<'EOF' ;
+\documentclass{article}
+EOF
+
+$DEFAULT_USEPACKAGE = <<'EOF' ;
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+\usepackage{psfrag}
+EOF
+
+@usepackage_list = qw(amsmath amsfonts amssymb psfrag);
+%usepackage_options = qw(graphicx dvips);
+
+$BEGIN_DOCUMENT = <<'EOF' ;
+
+\begin{document}
+
+EOF
+
+# todo: eliminate DEFAULT_USEPACKAGE
+$LATEX_HEADER_FULL = $DEFAULT_DOCUMENTCLASS. $DEFAULT_USEPACKAGE. $BEGIN_DOCUMENT;
+
+
+$END_DOCUMENT = <<'EOF' ;
+
+\end{document}
+EOF
+
+
+$LATEX_FOOTER = $END_DOCUMENT;
+
+
+######################
+# BEGIN MAIN
+######################
+
+#print STDERR "DBG2: " . join(@ARGV);
+
+$argSpecification = q(
+ --partial This file is not a full LaTeX document, just a partial one (to be \\include'd, for instance)
+ {$PARTIAL_DOCUMENT = 1;}
+ );
+
+
+$args = new Getopt::Declare($argSpecification);
+
+if ($PARTIAL_DOCUMENT) {
+ #print STDERR 'PARTIAL DBG\n\n';
+ exit;
+}
+
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+if (!($file =~ /\\documentclass/))
+{
+# $file = $LATEX_HEADER_FULL . $file . $LATEX_FOOTER;
+ $file = $DEFAULT_DOCUMENTCLASS . $file;
+}
+
+if (!($file =~ /\\begin{document}/))
+{
+
+ $file =~ s/(.*\\documentclass{[^}]*}[^\n]*\n)/$1$BEGIN_DOCUMENT/s;
+ $file = $file . $END_DOCUMENT;
+
+
+ ## move usepackages, title, author, newcommand to within preamble
+ my @usepackages_in_file;
+ while ($file =~ s/(\\begin{document}.*?)(\\usepackage(\[[^\]]*])?{[^}]+}[^\n]*|\\title{[^}]*}|\\author{[^}]*}|\\newcommand{[^}]*}(?:\[[^\]]*\])?{[^}]*}[^\n]*(?=\n))/$1/sg) {
+ $pkg = $2;
+ #push(@usepackages_in_file, $1);
+ $file =~ s/(.*\\documentclass{[^}]*}[^\n]*\n)/$1$pkg\n/s;
+
+ ##NOTE: currently \newcommand is not moved, b/c it was protected from processing in easylatex.pl
+
+
+ }
+}
+
+# TODO: add code to add usepackages
+foreach $pkg (@usepackage_list) {
+ if (!($file =~ /\\usepackage(\[[^\]]*])?{$pkg}/))
+ {
+ if ($usepackage_options{$pkg}) {
+ $opt = $usepackage_options{$pkg};
+ $file =~ s/\\begin{document}/\\usepackage[$opt]{$pkg} %% pkg required by EasyLatex\n\\begin{document}/;
+ }
+ else {
+ $file =~ s/\\begin{document}/\\usepackage{$pkg} %% pkg required by EasyLatex\n\\begin{document}/;
+
+ }
+#print STDERR "*********** $pkg";
+ }
+
+}
+
+if (!($file =~ /\\usepackage(\[[^\]]*])?{graphicx}/) && !($file =~ /\\documentclass(\[[^\]]*\])?{prosper}/) && !($file =~ /\\dontusepackage{graphicx}/))
+{
+ $file =~ s/\\begin{document}/\\usepackage[dvips]{graphicx} %% pkg required by EasyLatex\n\\begin{document}/;
+ #print STDERR "*********** $pkg";
+}
+
+
+$file =~ s/\\dontusepackage{[^}]+}//g;
+
+
+print $file;
diff --git a/support/easylatex/easylatex/transforms/90doublePercentIsCommentSymbol.pl b/support/easylatex/easylatex/transforms/90doublePercentIsCommentSymbol.pl
new file mode 100755
index 0000000000..efb99d1faa
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/90doublePercentIsCommentSymbol.pl
@@ -0,0 +1,14 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+$file =~ s/(?<!%)%(?!%)/\\%/g;
+$file =~ s/%%/%/g;
+
+
+print $file;
+
diff --git a/support/easylatex/easylatex/transforms/90easyFigures.pl b/support/easylatex/easylatex/transforms/90easyFigures.pl
new file mode 100755
index 0000000000..f5cc73a73c
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/90easyFigures.pl
@@ -0,0 +1,67 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+$file =~ s/\\fig(?:\[(.+?)\])?{(.+?)}(?:{(.+?)})?(?:{(.+?)})?/easyFigure($2,$1, $3, $4)/ge;
+$file =~ s/\\cfig(?:\[(.+?)\])?{(.+?)}(?:{(.+?)})?(?:{(.+?)})?/easyFigure($2,$1 . ',center', $3, $4)/ge;
+
+
+
+print $file;
+
+
+
+
+sub easyFigure {
+ my ($file, $opts, $labelText, $captionText) = @_;
+
+ # DEFAULTS
+ my $centering = '';
+ my @includegraphicsOptions = ();
+ my $includegraphicsOptions = '';
+
+ @opts = split(/,/, $opts);
+ foreach $opt (@opts) {
+# print STDERR $opt;
+# print STDERR "\n\n";
+
+ if ($opt eq 'center') {
+ $center = '\\centering';
+ }
+ else {
+ push(@includegraphicsOptions, $opt);
+#print STDERR ('[' . join(',', @includegraphicsOptions) . ']\n\n');
+
+ }
+
+ }
+
+ if ($captionText) {
+ $caption = "\\caption{$captionText}";
+ }
+
+ if ($labelText) {
+ $label = "\\label{$labelText}";
+ }
+
+ if ($#includegraphicsOptions >= 0) {
+ $includegraphicsOptions = '[' . join(',', @includegraphicsOptions) . ']';
+ #print STDERR "$includegraphicsOptions\n\n";
+ }
+
+
+ my $ret = <<EOF;
+\\begin{figure}$label
+$center \\includegraphics${includegraphicsOptions}{$file} $caption
+\\end{figure}
+EOF
+
+ chop($ret);
+ #print STDERR $ret;
+ return $ret;
+
+}
diff --git a/support/easylatex/easylatex/transforms/90graphs.pl b/support/easylatex/easylatex/transforms/90graphs.pl
new file mode 100755
index 0000000000..1a5b7d6a4b
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/90graphs.pl
@@ -0,0 +1,192 @@
+#!/usr/bin/perl -i.bak
+
+# In case the version of File::Spec installed on this system is too old for File::Temp to use
+BEGIN {
+ unshift(@INC, ".");
+}
+
+
+#todo: take off trailing linefeeds inside a \begin{graph}\end{graph}; they cause errors
+
+use English;
+use File::Temp qw/ :POSIX /;
+use vars qw ($graphCounter $filenameBase);
+$graphCounter = 0;
+
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+
+#print STDERR "*********** I got: $file\n";
+
+$DONT_CENTER = 1;
+#if ($file =~ /\\dontcentergraphs/) {$DONT_CENTER = 1;}
+
+$file =~ s/\\dontcentergraphs//g;
+
+## transform it
+
+$file =~ s/\\begin{graph}\[nc\](.*?)\\end{graph}/processGraph($1, 'digraph', 0)/sge;
+$file =~ s/\\begin{ugraph}\[nc\](.*?)\\end{ugraph}/processGraph($1, 'undirected graph', 0)/sge;
+
+if (! $DONT_CENTER) {
+ $file =~ s/\\begin{graph}(.*?)\\end{graph}/processGraph($1, 'digraph', 1)/sge;
+ $file =~ s/\\begin{ugraph}(.*?)\\end{ugraph}/processGraph($1, 'undirected graph', 1)/sge;
+} else {
+ $file =~ s/\\begin{graph}(.*?)\\end{graph}/processGraph($1, 'digraph', 0)/sge;
+ $file =~ s/\\begin{ugraph}(.*?)\\end{ugraph}/processGraph($1, 'undirected graph', 0)/sge;
+}
+
+#TODO: remove DONT_CENTER primitive... it's just for dana for this paper..
+
+# print output
+print $file;
+
+
+###############
+# end of MAIN
+###############
+
+sub processGraph {
+ my ($block, $type, $centered) = @_;
+
+
+
+ $block =~ s/(\\begin{align\*?}.*?\\end{align\*?}\n?)/removeNewlines($1)/sge;
+ $block =~ s/\\begin{align\*?}(.*?)\\end{align\*?}/\$\1\$/g;
+
+ $block =~ s/((?:\$[^\$\n]*\$)*[^\$]*)\$([^\$]*)\$/$1.'$'.removeNewlines($2).'$'/ge;
+
+# print STDERR $block;
+
+ my $l = length($block);
+ $filenameBase = "easyLatexGraph${graphCounter}$l";
+
+ if ($type eq 'digraph') {
+ $block = "digraph $filenameBase {\n".$block."\n}";
+ ladot($block, 'dot');
+ }
+ elsif ($type eq 'undirected graph') {
+ $block = "graph $filenameBase {\n".$block."\n}";
+ ladot($block, 'neato');
+ }
+
+ $graphCounter = $graphCounter + 1;
+ rename("$filenameBase.ps", "$filenameBase.eps");
+
+ ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+ $atime,$mtime,$ctime,$blksize,$blocks)
+ = stat("$filenameBase.tex");
+
+ if (! $size) {
+ unlink("$filenameBase.tex");
+ if ($centered) {
+ return "\\begin{center}\\includegraphics{$filenameBase.eps}\\end{center}";
+ } else {
+ return "\\includegraphics{$filenameBase.eps}";
+ }
+ }
+ else
+ {
+ if ($centered) {
+ return "\\begin{center}\\input{$filenameBase.tex}\n\\includegraphics{$filenameBase.eps}\\end{center}";
+ } else {
+ return "\\input{$filenameBase.tex}\n\\includegraphics{$filenameBase.eps}";
+ }
+ }
+}
+
+sub removeNewlines {
+ my ($block) = @_;
+
+ $block =~ s/\n//g;
+
+ return $block;
+}
+
+
+
+
+
+# ladot version 2003-03-31
+# by Brighten Godfrey
+#
+
+
+sub ladot {
+
+ my ($block, $graphProgramName) = @_;
+
+# print STDERR "Ladot got:\n$block\n";
+
+ my @lines = split(/\n/, $block);
+
+ %paststubs = ();
+
+
+ ($dotout, $dotoutFilename) = tmpnam();
+
+# Open output file
+# open(DOTOUT, ">/tmp/$basename.dot");
+ open(TEXOUT, ">$filenameBase.tex");
+
+ foreach $line (@lines)
+ {
+ $line .= "\n";
+
+ # process each TEX{...}TEX segment on this line
+# while ($line =~ /(TEX(\((\d+)\))?\{(.*?)\}TEX)/) {
+ while ($line =~ /(\$.*?\$)(\((\d+)\))?/) {
+# print "LINE: $line";
+ $sizehint = $3;
+# print "SIZEHINT: $sizehint\n";
+ $tex = $1;
+ $stub = make_stub($tex, $sizehint);
+ $line =~ s/(\$.*?\$)(\((\d+)\))?/\"$stub\"/;
+ print TEXOUT "\\psfrag{$stub}[cc][cc]{$tex}\n";
+ }
+# print "FINAL LINE: $line";
+ print $dotout $line;
+ }
+
+ close($dotout);
+ close(TEXOUT);
+
+# print STDERR "dot -Tps $dotoutFilename > $filenameBase.ps";
+ system("$graphProgramName -Tps $dotoutFilename > $filenameBase.ps");
+
+}
+
+sub make_stub($$)
+{
+ # Make a placeholder (stub) for the TeX which will be substituted for the
+ # real formatted TeX later. This is tricky because the length of the stub
+ # that we choose affects how Dot formats the PostScript. We use the
+ # heuristic that the length of the LaTeX code is correlated with the
+ # amount of space needed to render the LaTeX code.
+
+ if ($paststubs{$_[0]}) {
+ return $paststubs{$_[0]};
+ }
+
+ my $length = int($_[1]);
+ if ($length == 0) {
+ # no sizehint given
+ $length = sqrt(length($_[0]));
+ }
+# print "LENGTH of $_[0]: $length\n";
+ $stub_charset="-_1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ my $stub = "";
+ for (my $i = 1; $i <= $length; $i++) {
+ $stub .= substr($stub_charset, int(rand(length($stub_charset))), 1);
+ #$stub = $stub . int(rand(length($stub_charset)));
+ }
+ #print "NEW STUB for $_[0]: $stub\n";
+ $paststubs{$_[0]} = $stub;
+ return $stub;
+ }
+
+
diff --git a/support/easylatex/easylatex/transforms/90numberSign.pl b/support/easylatex/easylatex/transforms/90numberSign.pl
new file mode 100755
index 0000000000..eed7018be0
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/90numberSign.pl
@@ -0,0 +1,12 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+$file =~ s/#/\\#/g;
+
+print $file;
+
diff --git a/support/easylatex/easylatex/transforms/90removeWhitespaceAroundEquations.pl b/support/easylatex/easylatex/transforms/90removeWhitespaceAroundEquations.pl
new file mode 100755
index 0000000000..80370df0d4
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/90removeWhitespaceAroundEquations.pl
@@ -0,0 +1,13 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+$file =~ s/\n\\begin{align\*}/\\begin{align\*}/g;
+
+
+print $file;
+
diff --git a/support/easylatex/easylatex/transforms/91easyQuotes.pl b/support/easylatex/easylatex/transforms/91easyQuotes.pl
new file mode 100755
index 0000000000..6c602830db
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/91easyQuotes.pl
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -i.bak
+
+#print STDERR "\n\n\n\n\n************I SAID:\n$file\n\n\n\n\n\n";
+
+use English;
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+$file =~ s/(?<!\\)"(.+?(?<!\\))"/``\1''/g;
+#$file =~ s/"(.+?)"/``\1''/g;
+
+
+
+print $file;
+
diff --git a/support/easylatex/easylatex/transforms/91easySections.pl b/support/easylatex/easylatex/transforms/91easySections.pl
new file mode 100755
index 0000000000..78dbfae5f9
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/91easySections.pl
@@ -0,0 +1,106 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+use vars qw($EASYLATEXSTORE_RESERVED_WORD @MATH_MODE_SYMBOLS $MATH_MODE_SYMBOL_FILEPATH);
+
+$EASYLATEXSTORE_RESERVED_WORD = 'EASYLATEXSTORE';
+use vars qw($StorageIndex @Stored);
+
+$StorageIndex = 0;
+
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+## transform it
+
+$file = storeMathModes($file);
+
+if (($file =~ /\\documentclass(\[[^\]]*\])?{article}/) || ($file =~ /\\documentclass(\[[^\]]*\])?{report}/) )
+{
+ $file =~ s/^====(.*)====\s*$/\\subsubsection*{$1}/mg;
+ $file =~ s/^===(.*)===\s*$/\\subsection*{$1}/mg;
+ $file =~ s/^==(.*)==\s*$/\\section*{$1}/mg;
+}
+elsif ($file =~ /\\documentclass(\[[^\]]*\])?{seminar}/)
+{
+ $file =~ s/^=======(.*)=======\s*$/\\begin{scriptsize}$1\\end{scriptsize}/mg;
+ $file =~ s/^=====(.*)=====\s*$/\\begin{small}$1\\end{small}/mg;
+ $file =~ s/^====(.*)====\s*$/\\textbf{$1}/mg;
+ $file =~ s/^===(.*)===\s*$/\\slidesubheading{$1}/mg;
+ $file =~ s/^==(.*)==\s*$/\\slideheading{$1}/mg;
+
+ $file =~ s/^---$/\\smallskip\\hrulefill\\smallskip/mg;
+}
+elsif ($file =~ /\\documentclass(\[[^\]]*\])?{prosper}/)
+{
+ $file =~ s/^=======(.*)=======\s*$/\\begin{scriptsize}$1\\end{scriptsize}/mg;
+ $file =~ s/^=====(.*)=====\s*$/\\begin{small}$1\\end{small}/mg;
+ $file =~ s/^====(.*)====\s*$/\\textbf{$1}/mg;
+ $file =~ s/^===(.*)===\s*$/\\begin{large}$1\\end{large}/mg;
+ $file =~ s/^==(.*)==\s*$/\\begin{huge}$1\\end{huge}/mg;
+
+ $file =~ s/^---$/\\smallskip\\hrulefill\\smallskip/mg;
+}
+else {
+ $file =~ s/^====(.*)====\s*$/\\subsubsection*{$1}/mg;
+ $file =~ s/^===(.*)===\s*$/\\subsection*{$1}/mg;
+ $file =~ s/^==(.*)==\s*$/\\section*{$1}/mg;
+}
+
+
+$file = unstoreMathModes($file);
+
+# print output
+print $file;
+
+
+######################
+# "store" subroutines
+######################
+
+sub storeMathModes {
+ my ($file) = @_;
+
+ ${notSlashRE_begin} = '(^|(?!\\).)';
+ ${notSlashRE} = '(?!\\).';
+
+ $file =~ s/(\\begin{align}.*?\\end{align})/store($1)/egs;
+ $file =~ s/(\\begin{align\*}.*?\\end{align\*})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray}.*?\\end{eqnarray})/store($1)/egs;
+ $file =~ s/(\\begin{eqnarray\*}.*?\\end{eqnarray\*})/store($1)/egs;
+ $file =~ s/(\\begin{equation}.*?\\end{equation})/store($1)/egs;
+ $file =~ s/(\\begin{equation\*}.*?\\end{equation\*})/store($1)/egs;
+
+ $file =~ s/((?<!\\)\$.*?(?<!\\)\$)/store($1)/egs;
+
+ return $file;
+}
+
+sub unstoreMathModes {
+ my ($file) = @_;
+
+# print STDERR "UNSTORE:\n\n".$file;
+
+ while ($file =~ s/${EASYLATEXSTORE_RESERVED_WORD}_(\d+)_${EASYLATEXSTORE_RESERVED_WORD}/$Stored{$1}/egs) {}
+
+ return $file;
+}
+
+
+
+sub store {
+ # got this idea from UseMod
+ my ($toBeStored) = @_;
+
+ $Stored{$StorageIndex} = $toBeStored;
+# print STDERR "STORED: $toBeStored\n";
+
+# print STDERR "REPLACEDW: ".${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+
+ return ${EASYLATEXSTORE_RESERVED_WORD}.'_' . $StorageIndex++ . '_'.${EASYLATEXSTORE_RESERVED_WORD};
+}
+
+
diff --git a/support/easylatex/easylatex/transforms/91seminarAddSlidesec.pl b/support/easylatex/easylatex/transforms/91seminarAddSlidesec.pl
new file mode 100755
index 0000000000..8a9e5a73be
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/91seminarAddSlidesec.pl
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+######################
+# DEFINE GLOBAL CONSTANTS
+######################
+@usepackage_list = qw(slidesec);
+
+######################
+# BEGIN MAIN
+######################
+
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR "*********** I got: $file\n";
+
+
+if ($file =~ /\\documentclass{seminar}/)
+{
+
+ foreach $pkg (@usepackage_list) {
+ if (!( $file =~ /\\usepackage(\[[^\]]*\])?{$pkg}/ ))
+ {
+ $file =~ s/\\begin{document}/\\usepackage{$pkg} % pkg required by EasyLatex\n\\begin{document}/;
+ #
+ }
+ }
+}
+
+
+
+print $file;
diff --git a/support/easylatex/easylatex/transforms/91seminarEnvAddSlide.pl b/support/easylatex/easylatex/transforms/91seminarEnvAddSlide.pl
new file mode 100755
index 0000000000..0dda922be1
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/91seminarEnvAddSlide.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+
+######################
+# DEFINE GLOBAL CONSTANTS
+######################
+
+
+######################
+# BEGIN MAIN
+######################
+
+
+
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR "*****************I got: $file\n";
+
+if ($file =~ /\\documentclass{(seminar|prosper)}/)
+{
+ if (!($file =~ /\\begin{slide\*?}/))
+ {
+ $file =~ s/\\begin{document}/\\begin{document}\n\\begin{slide}/i;
+ $file =~ s/\\end{document}/\\end{slide}\n\\end{document}/i;
+ $file =~ s/^----\n/\\end{slide}\n\\begin{slide}\n/mg;
+ }
+
+
+
+}
+
+
+print $file;
diff --git a/support/easylatex/easylatex/transforms/92seminarFlushHeadingsTop.pl b/support/easylatex/easylatex/transforms/92seminarFlushHeadingsTop.pl
new file mode 100755
index 0000000000..931b6aa5c1
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/92seminarFlushHeadingsTop.pl
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR $file;
+
+## transform it
+
+if ($file =~ /\\documentclass(\[[^\]]*\])?{seminar}/
+ &&
+ $file =~ /\\flushheadingstop/)
+{
+ $file =~ s/\\flushheadingstop//g;
+ $file =~ s/(\\begin{slide}\s*)(\\slideheading{.*?}.*?)(\\end{slide})/$1 . processSlide($2) . $3/egs;
+}
+
+
+
+# print output
+print $file;
+
+
+
+sub processSlide {
+ ($slide) = @_;
+
+# print STDERR "Got slide: $slide\n";
+
+ if ($slide =~ /((?:\\slideheading{[^\n]+}\s*)+)(.*)/s) {
+ return "$1\n" . '\vspace*{\fill}' . "\n" . "$2\n" . '\vspace*{\fill}' . "\n";
+ }
+
+ else {
+ return $slide;
+ }
+}
diff --git a/support/easylatex/easylatex/transforms/92tempKludges.pl b/support/easylatex/easylatex/transforms/92tempKludges.pl
new file mode 100644
index 0000000000..deec8d8326
--- /dev/null
+++ b/support/easylatex/easylatex/transforms/92tempKludges.pl
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -i.bak
+
+use English;
+
+## get input
+undef $INPUT_RECORD_SEPARATOR;
+$file = <>;
+
+#print STDERR "*********** I got: $file\n";
+
+## transform it
+
+#$file =~ s/\$\\mathbb{R}\$\^(.))/\$mathbb{R}^$1\$/g;
+#$file =~ s/\$\\mathbb{R}\$\^(.))/hi/g;
+
+# print output
+print $file
diff --git a/support/easylatex/psfrag/00readme.txt b/support/easylatex/psfrag/00readme.txt
new file mode 100644
index 0000000000..948a8c46fc
--- /dev/null
+++ b/support/easylatex/psfrag/00readme.txt
@@ -0,0 +1,82 @@
+This is the 00readme.txt file to accompany PSfrag, a system for LaTeX to
+integrate LaTeX equations with Encapsulated PostScript figures.
+
+These files compose the April 11, 1998 release of PSfrag 3.04. This is a
+maintenance release, and fixes some bugs and shortcomings in version 3.03. If
+you decide to install this release, you should not need to re-compile any of
+your files, unless you happened to encounter one of the bugs in an earlier
+version.
+
++-------------------------------+
+|QUICK INSTALLATION INSTRUCTIONS|
++-------------------------------+
+
+1. Run LaTeX on psfrag.ins, generating the package file psfrag.sty and
+ the PostScript header file psfrag.pro.
+2. Place psfrag.sty anywhere in your TeX search path; for kpathsea-based
+ systems such as teTeX, this is determined by the TEXINPUTS variable.
+3. Place psfrag.pro where your DVI-to-PostScript driver (e.g., dvips)
+ can find it. For kpathsea-based systems such as teTeX, this is
+ determined by the DVIPSHEADERS variable. For dvips in particular,
+ this includes the directory containing tex.pro and special.pro.
+
+More complete instructions are found in pfgguide.{tex,ps}. The files
+example.eps and testfig.eps are needed to typeset the documentation, so
+do not delete them if you want to re-generate pfgguide.ps. In fact, a
+good test to see if your TeX/LaTeX/PSfrag installation is working
+properly is to rename pfgguide.ps, generate a new pfgguide.ps from the
+.tex file, and compare the two files.
+
++------------------------------------+
+|IMPORTANT NOTES FOR PSFRAG 2.X USERS|
++------------------------------------+
+
+Note that PSfrag 3.x is quite a bit different from previous versions.
+The interface has been preserved, but the most notable difference is
+the absence of the preprocessing script ps2frag. That's right: _you
+will no longer need to run the ps2frag script_. This is a relief, of
+course, to users who could never get Perl working on their OS.
+
+However, PLEASE HEED the following differences between PSfrag 2.x and
+PSfrag 3.x! You will be soundly flogged with wet noodles if you ask
+about these and you haven't read this warning or the ones in pfgguide:
+1) PSfrag replacements no longer show up in their proper positions when
+ viewing the file with Xdvi. Instead, they show up in a vertical list
+ along the left side of the figure. So, you can check if they are
+ typeset properly in Xdvi, but you can't make sure they are properly
+ placed. To do that, you should use a PostScript previewer like
+ GhostView and GhostScript. This is an unforunate but necessary
+ consequence of the elimination of the preprocessing step.
+2) If you use the \tex command, note that it has been _deprecated_.
+ Now, you have to explicitly turn it on, either for the entire
+ LaTeX document or for each file individually. pfgguide.{tex,ps}
+ describe how to do this in detail. The reasons for this once
+ again turn to the elimination of the preprocessing step.
+I think that the elimination of the ps2frag script far outweighs
+either of these two (possible) disadvantages.
+
++---------------+
+| RELEASE NOTES |
++---------------+
+
+This is a bug-fix release, which fixes the following bugs encountered
+in PSfrag 3.03:
+
+1. Attempting to use EPS figures as PSfrag replacements would cause
+ an infinite loop. This should work properly now.
+2. Since the last release, the DVI-to-PS driver DVIPSone changed in
+ a way that made PSfrag replacements appear upside down.
+3. Small improvements to the psfrag.pro file have been made, which
+ will hopefully allow you to make EPS files out of PSfrag-ged
+ figures. I can't make any guarantees about this yet.
+4. The manual has been improved slightly; the known issues for
+ XFig and Seminar are now discussed. In addition, a more complete
+ discussion about ``valid'' tags is included.
+
+Bug reports and suggestions should go to psfrag@rascals.stanford.edu,
+the PSfrag maintainer's email-list. However, before submitting a bug
+report, please make sure that it is not already covered in the "Known
+issues" section of pfgguide.tex!
+
+Michael C. Grant
+
diff --git a/support/easylatex/psfrag/announce.txt b/support/easylatex/psfrag/announce.txt
new file mode 100644
index 0000000000..6263b05fc1
--- /dev/null
+++ b/support/easylatex/psfrag/announce.txt
@@ -0,0 +1,63 @@
+A brand-spankin' new version of PSfrag, version 3.04, for LaTeX2e can be
+found at CTAN sites in the directory
+
+macros/latex/contrib/supported/psfrag.
+
+PSfrag 3.04 fixes some bugs discovered in PSfrag 3.03.
+
+What is PSfrag?
+---------------
+
+Many drawing and graphing packages produce output in the Encapsulated
+PostScript (EPS) format, but few can easily produce the equations and
+other scientific text of which LaTeX is capable. On the other hand, many
+LaTeX-based drawing packages are not as expressive or easy-to-use as the
+many advanced drawing packages that produce EPS output.
+
+PSfrag provides the best of both worlds by allowing the user to
+precisely overlay Encapsulated PostScript (EPS) files with arbitrary
+LaTeX constructions. In order to accomplish this, the user places a
+simple text ``tag'' in the graphics file, as a ``position marker'' of
+sorts. Then, using simple LaTeX commands, the user instructs PSfrag to
+remove that tag from the figure, and replace it with a properly sized,
+aligned, and rotated LaTeX equation.
+
+The full documentation for PSfrag found in the release contains examples
+and usage instructions.
+
+To use PSfrag...
+----------------
+
+...you will need:
+
+* LaTeX2e and the "graphics" package. (You can use the old epsf.sty
+ macros with PSfrag, but you still need the graphics package.) Please
+ make sure to get the newest versions of these packages from CTAN
+ before submitting bug reports.
+
+* If you plan to use PSfrag with the Seminar package, make sure you
+ get the 10/97 release of this package.
+
+* Any DVI-to-PostScript program that is well-supported by the "graphics"
+ package. This author uses Tom Rokicki's "dvips"; I recommend it.
+ PSfrag has also been verified for DVIPSone from Y&Y (using Level 2
+ PostScript printers).
+
+Bugs? What Bugs?
+----------------
+
+PSfrag 3.04 is bug-free. Of course, we're kidding. That's what we said
+about PSfrag 3.0, in fact, and look where it got us.
+
+If you have problems, bug reports, or improvement suggestions, please
+send them to the PSfrag maintainer's mailing list,
+
+psfrag@rascals.stanford.edu
+
+Please supply an example .tex file and .eps figure to demonstrate the
+behavior you wish to have corrected or improved.
+
+This is a majordomo mailing list; feel free to join if you would like to
+actively participate in PSfrag development.
+
+Thanks for using PSfrag!
diff --git a/support/easylatex/psfrag/example.eps b/support/easylatex/psfrag/example.eps
new file mode 100644
index 0000000000..4074a32b45
--- /dev/null
+++ b/support/easylatex/psfrag/example.eps
@@ -0,0 +1,389 @@
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: MATLAB, The Mathworks, Inc.
+%%Title: example.eps
+%%CreationDate: 11/05/96 21:16:44
+%%DocumentNeededFonts: Helvetica
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%Pages: 1
+%%BoundingBox: 97 197 502 604
+%%EndComments
+
+%%BeginProlog
+
+% MathWorks dictionary
+/MathWorks 150 dict begin
+
+% definition operators
+/bdef {bind def} bind def
+/ldef {load def} bind def
+/xdef {exch def} bdef
+/xstore {exch store} bdef
+
+% operator abbreviations
+/c /clip ldef
+/cc /concat ldef
+/cp /closepath ldef
+/gr /grestore ldef
+/gs /gsave ldef
+/mt /moveto ldef
+/np /newpath ldef
+/cm /currentmatrix ldef
+/sm /setmatrix ldef
+/rc {rectclip} bdef
+/rf {rectfill} bdef
+/rm /rmoveto ldef
+/rl /rlineto ldef
+/s /show ldef
+/sc {setcmykcolor} bdef
+/sr /setrgbcolor ldef
+/w /setlinewidth ldef
+/j /setlinejoin ldef
+/cap /setlinecap ldef
+
+% page state control
+/pgsv () def
+/bpage {/pgsv save def} bdef
+/epage {pgsv restore} bdef
+/bplot /gsave ldef
+/eplot {stroke grestore} bdef
+
+% orientation switch
+/portraitMode 0 def
+/landscapeMode 1 def
+
+% coordinate system mappings
+/dpi2point 0 def
+
+% font control
+/FontSize 0 def
+/FMS {
+ /FontSize xstore %save size off stack
+ findfont
+ [FontSize 0 0 FontSize neg 0 0]
+ makefont
+ setfont
+ }bdef
+
+/reencode {
+exch dup where
+{pop load} {pop StandardEncoding} ifelse
+exch
+dup 3 1 roll
+findfont dup length dict begin
+ { 1 index /FID ne {def}{pop pop} ifelse } forall
+ /Encoding exch def
+ currentdict
+end
+definefont pop
+} bdef
+
+/isroman {
+findfont /CharStrings get
+/Agrave known
+} bdef
+
+/FMSR {
+3 1 roll 1 index
+dup isroman
+{reencode} {pop pop} ifelse
+exch FMS
+} bdef
+
+/csm {
+ 1 dpi2point div -1 dpi2point div scale
+ neg translate
+ landscapeMode eq {90 rotate} if
+ } bdef
+
+% line types: solid, dotted, dashed, dotdash
+/SO { [] 0 setdash } bdef
+/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+/DA { [6 dpi2point mul] 0 setdash } bdef
+/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+
+% macros for lines and objects
+/L {
+ lineto
+ stroke
+ } bdef
+/MP {
+ 3 1 roll moveto
+ 1 sub {rlineto} repeat
+ } bdef
+/AP {
+ {rlineto} repeat
+ } bdef
+/PP {
+ closepath fill
+ } bdef
+/DP {
+ closepath stroke
+ } bdef
+/MR {
+ 4 -2 roll moveto
+ dup 0 exch rlineto
+ exch 0 rlineto
+ neg 0 exch rlineto
+ closepath
+ } bdef
+/FR {
+ MR stroke
+ } bdef
+/PR {
+ MR fill
+ } bdef
+/L1i {
+ { currentfile picstr readhexstring pop } image
+ } bdef
+
+/tMatrix matrix def
+/MakeOval {
+ newpath
+ tMatrix currentmatrix pop
+ translate scale
+ 0 0 1 0 360 arc
+ tMatrix setmatrix
+ } bdef
+/FO {
+ MakeOval
+ stroke
+ } bdef
+/PO {
+ MakeOval
+ fill
+ } bdef
+
+/PD {
+ 2 copy moveto lineto stroke
+ } bdef
+
+
+currentdict end def
+%%EndProlog
+
+%%BeginSetup
+MathWorks begin
+
+0 cap
+
+end
+%%EndSetup
+
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 97 197 502 604
+MathWorks begin
+bpage
+%%EndPageSetup
+
+%%BeginObject: graph1 1
+bplot
+
+/dpi2point 12 def
+portraitMode 0216 7344 csm
+
+ 956 91 4862 4883 MR c np
+76 dict begin %Colortable dictionary
+/c0 { 0 0 0 sr} bdef
+/c1 { 1 1 1 sr} bdef
+/c2 { 1 0 0 sr} bdef
+/c3 { 0 1 0 sr} bdef
+/c4 { 0 0 1 sr} bdef
+/c5 { 1 1 0 sr} bdef
+/c6 { 1 0 1 sr} bdef
+/c7 { 0 1 1 sr} bdef
+%%IncludeResource: font Helvetica
+/Helvetica /ISOLatin1Encoding 144 FMSR
+
+1 j
+c1
+ 0 0 6912 5185 PR
+6 w
+DO
+4 w
+c0
+1463 4613 mt 1463 388 L
+1463 388 mt 1463 388 L
+2308 4613 mt 2308 388 L
+2308 388 mt 2308 388 L
+3153 4613 mt 3153 388 L
+3153 388 mt 3153 388 L
+3999 4613 mt 3999 388 L
+3999 388 mt 3999 388 L
+4844 4613 mt 4844 388 L
+4844 388 mt 4844 388 L
+5689 4613 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+5689 4613 mt 5689 4613 L
+1463 4191 mt 5689 4191 L
+5689 4191 mt 5689 4191 L
+1463 3768 mt 5689 3768 L
+5689 3768 mt 5689 3768 L
+1463 3346 mt 5689 3346 L
+5689 3346 mt 5689 3346 L
+1463 2923 mt 5689 2923 L
+5689 2923 mt 5689 2923 L
+1463 2501 mt 5689 2501 L
+5689 2501 mt 5689 2501 L
+1463 2078 mt 5689 2078 L
+5689 2078 mt 5689 2078 L
+1463 1655 mt 5689 1655 L
+5689 1655 mt 5689 1655 L
+1463 1233 mt 5689 1233 L
+5689 1233 mt 5689 1233 L
+1463 811 mt 5689 811 L
+5689 811 mt 5689 811 L
+1463 388 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+SO
+6 w
+1463 4613 mt 5689 4613 L
+1463 388 mt 5689 388 L
+5689 4613 mt 5689 388 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 4613 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 1463 4571 L
+1463 388 mt 1463 430 L
+1423 4782 mt
+(0) s
+2308 4613 mt 2308 4571 L
+2308 388 mt 2308 430 L
+2268 4782 mt
+(2) s
+3153 4613 mt 3153 4571 L
+3153 388 mt 3153 430 L
+3113 4782 mt
+(4) s
+3999 4613 mt 3999 4571 L
+3999 388 mt 3999 430 L
+3959 4782 mt
+(6) s
+4844 4613 mt 4844 4571 L
+4844 388 mt 4844 430 L
+4804 4782 mt
+(8) s
+5689 4613 mt 5689 4571 L
+5689 388 mt 5689 430 L
+5609 4782 mt
+(10) s
+1463 4613 mt 1505 4613 L
+5689 4613 mt 5647 4613 L
+1264 4666 mt
+(-1) s
+1463 4191 mt 1505 4191 L
+5689 4191 mt 5647 4191 L
+1144 4244 mt
+(-0.8) s
+1463 3768 mt 1505 3768 L
+5689 3768 mt 5647 3768 L
+1144 3821 mt
+(-0.6) s
+1463 3346 mt 1505 3346 L
+5689 3346 mt 5647 3346 L
+1144 3399 mt
+(-0.4) s
+1463 2923 mt 1505 2923 L
+5689 2923 mt 5647 2923 L
+1144 2976 mt
+(-0.2) s
+1463 2501 mt 1505 2501 L
+5689 2501 mt 5647 2501 L
+1348 2554 mt
+(0) s
+1463 2078 mt 1505 2078 L
+5689 2078 mt 5647 2078 L
+1228 2131 mt
+(0.2) s
+1463 1655 mt 1505 1655 L
+5689 1655 mt 5647 1655 L
+1228 1708 mt
+(0.4) s
+1463 1233 mt 1505 1233 L
+5689 1233 mt 5647 1233 L
+1228 1286 mt
+(0.6) s
+1463 811 mt 1505 811 L
+5689 811 mt 5647 811 L
+1228 864 mt
+(0.8) s
+1463 388 mt 1505 388 L
+5689 388 mt 5647 388 L
+1348 441 mt
+(1) s
+1463 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 388 L
+1463 388 mt 1463 388 L
+5689 388 mt 5689 388 L
+gs 1463 388 4227 4226 MR c np
+42 183 43 192 42 200 42 206 42 210 43 211 42 210 42 208
+42 204 43 196 42 188 42 177 42 165 43 151 42 135 42 119
+42 100 43 82 42 61 42 42 42 20 43 -1 42 -22 42 -43
+42 -63 43 -83 42 -102 42 -120 43 -137 42 -152 42 -166 42 -178
+43 -188 42 -197 42 -204 42 -208 43 -211 42 -211 42 -209 42 -206
+43 -199 42 -192 42 -182 42 -170 43 -157 42 -142 42 -126 42 -108
+43 -89 42 -70 42 -50 43 -29 42 -8 42 13 42 34 43 55
+42 75 42 94 42 113 43 130 42 146 42 160 42 173 43 185
+42 193 42 202 42 206 43 210 42 211 42 211 42 207 43 202
+42 195 42 186 42 176 43 162 42 149 42 132 43 116 42 97
+42 79 42 58 43 37 42 17 42 -4 42 -26 43 -46 42 -67
+42 -86 42 -105 43 -123 42 -139 42 -155 42 -168 43 -180 42 -190
+42 -198 42 -205 43 -209 1505 2290 100 MP stroke
+42 -211 1463 2501 2 MP stroke
+42 -106 43 -87 42 -67 42 -48 42 -26 43 -5 42 15 42 37
+42 57 43 78 42 96 42 115 42 132 43 148 42 162 42 175
+42 185 43 195 42 202 42 207 42 210 43 211 42 211 42 206
+42 202 43 194 42 185 42 174 43 161 42 146 42 131 42 113
+43 95 42 76 42 56 42 35 43 14 42 -7 42 -28 42 -49
+43 -69 42 -89 42 -107 42 -125 43 -141 42 -157 42 -169 42 -182
+43 -191 42 -199 42 -205 43 -210 42 -211 42 -210 42 -209 43 -204
+42 -197 42 -189 42 -179 43 -166 42 -153 42 -137 42 -121 43 -103
+42 -84 42 -64 42 -44 43 -22 42 -2 42 19 42 40 43 61
+42 81 42 99 42 118 43 135 42 150 42 164 43 177 42 187
+42 197 42 203 43 207 42 211 42 211 42 210 43 206 42 200
+42 193 42 183 43 172 42 158 42 144 42 128 43 110 42 92
+42 73 42 52 43 31 1505 399 100 MP stroke
+42 11 1463 388 2 MP stroke
+
+gr
+3194 4942 mt
+(\\tex[t][t]{$t$}) s
+1090 3419 mt -90 rotate
+(\\tex[B][B]{$\\sin\(t\)$, $\\cos\(t\)$}) s
+90 rotate
+2314 273 mt
+(\\tex[B][B]{Plot of $\\sin\(t\)$ and $\\cos\(t\)$}) s
+2689 2048 mt
+(p1) s
+3956 3343 mt
+(p2) s
+5224 1495 mt
+(p2) s
+3486 2178 mt -78 rotate
+(p3) s
+78 rotate
+
+end
+
+eplot
+%%EndObject graph 1
+
+epage
+end
+
+showpage
+
+%%Trailer
+%%EOF
diff --git a/support/easylatex/psfrag/pfgguide.ps b/support/easylatex/psfrag/pfgguide.ps
new file mode 100644
index 0000000000..f24202202b
--- /dev/null
+++ b/support/easylatex/psfrag/pfgguide.ps
@@ -0,0 +1,3935 @@
+%!PS-Adobe-2.0
+%%Creator: dvips(k) 5.78 Copyright 1998 Radical Eye Software (www.radicaleye.com)
+%%Title: pfgguide.dvi
+%%Pages: 11
+%%PageOrder: Ascend
+%%BoundingBox: 0 0 612 792
+%%DocumentFonts: Helvetica
+%%EndComments
+%DVIPSCommandLine: C:\TEX\BIN\WIN32\DVIPS.EXE pfgguide -o
+%DVIPSParameters: dpi=600, compressed
+%DVIPSSource: TeX output 1998.05.04:0923
+%%BeginProcSet: texc.pro
+%!
+/TeXDict 300 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N
+/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72
+mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1}
+ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale
+isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div
+hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul
+TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if}
+forall round exch round exch]setmatrix}N /@landscape{/isls true N}B
+/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B
+/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{
+/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N
+string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N
+end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{
+/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]
+N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup
+length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{
+128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub
+get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data
+dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N
+/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup
+/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx
+0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff
+setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff
+.1 sub]/id ch-image N /rw ch-width 7 add 8 idiv string N /rc 0 N /gp 0 N
+/cp 0 N{rc 0 ne{rc 1 sub /rc X rw}{G}ifelse}imagemask restore}B /G{{id
+gp get /gp gp 1 add N dup 18 mod S 18 idiv pl S get exec}loop}B /adv{cp
+add /cp X}B /chg{rw cp id gp 4 index getinterval putinterval dup gp add
+/gp X adv}B /nd{/cp 0 N rw exit}B /lsh{rw cp 2 copy get dup 0 eq{pop 1}{
+dup 255 eq{pop 254}{dup dup add 255 and S 1 and or}ifelse}ifelse put 1
+adv}B /rsh{rw cp 2 copy get dup 0 eq{pop 128}{dup 255 eq{pop 127}{dup 2
+idiv S 128 and or}ifelse}ifelse put 1 adv}B /clr{rw cp 2 index string
+putinterval adv}B /set{rw cp fillstr 0 4 index getinterval putinterval
+adv}B /fillstr 18 string 0 1 17{2 copy 255 put pop}for N /pl[{adv 1 chg}
+{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{
+adv rsh nd}{1 add adv}{/rc X nd}{1 add set}{1 add clr}{adv 2 chg}{adv 2
+chg nd}{pop nd}]dup{bind pop}forall N /D{/cc X dup type /stringtype ne{]
+}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup
+length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{
+cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin
+0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul
+add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict
+/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook
+known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X
+/IE 256 array N 2 string 0 1 255{IE S dup 360 add 36 4 index cvrs cvn
+put}for pop 65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N
+/RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley
+X /rulex X V}B /V{}B /RV statusdict begin /product where{pop false[
+(Display)(NeXT)(LaserWriter 16/600)]{dup length product length le{dup
+length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}
+forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false
+RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1
+false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform
+round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg
+rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail
+{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M}
+B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{
+4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{
+p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p
+a}B /bos{/SS save N}B /eos{SS restore}B end
+
+%%EndProcSet
+%%BeginProcSet: psfrag.pro
+%%
+%% This is file `psfrag.pro',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% psfrag.dtx (with options: `filepro')
+%%
+%% Copyright (c) 1996 Craig Barratt, Michael C. Grant, and David Carlisle.
+%% All rights reserved.
+%%
+%% This file is part of the PSfrag package.
+%%
+userdict begin
+/PSfragLib 90 dict def
+/PSfragDict 6 dict def
+/PSfrag { PSfragLib begin load exec end } bind def
+end
+PSfragLib begin
+/RO /readonly load def
+/CP /currentpoint load def
+/CM /currentmatrix load def
+/B { bind RO def } bind def
+/X { exch def } B
+/MD { { X } forall } B
+/OE { end exec PSfragLib begin } B
+/S false def
+/tstr 8 string def
+/islev2 { languagelevel } stopped { false } { 2 ge } ifelse def
+[ /sM /tM /srcM /dstM /dM /idM /srcFM /dstFM ] { matrix def } forall
+sM currentmatrix RO pop
+dM defaultmatrix RO idM invertmatrix RO pop
+srcFM identmatrix pop
+/Hide { gsave { CP } stopped not newpath clip { moveto } if } B
+/Unhide { { CP } stopped not grestore { moveto } if } B
+/setrepl islev2 {{ /glob currentglobal def true setglobal array astore
+ globaldict exch /PSfrags exch put glob setglobal }}
+ {{ array astore /PSfrags X }} ifelse B
+/getrepl islev2 {{ globaldict /PSfrags get aload length }}
+ {{ PSfrags aload length }} ifelse B
+/convert {
+ /src X src length string
+ /c 0 def src length {
+ dup c src c get dup 32 lt { pop 32 } if put /c c 1 add def
+ } repeat
+} B
+/Begin {
+ /saver save def
+ srcFM exch 3 exch put
+ 0 ne /debugMode X 0 setrepl
+ dup /S exch dict def { S 3 1 roll exch convert exch put } repeat
+ srcM CM dup invertmatrix pop
+ mark { currentdict { end } stopped { pop exit } if } loop
+ PSfragDict counttomark { begin } repeat pop
+} B
+/End {
+ mark { currentdict end dup PSfragDict eq { pop exit } if } loop
+ counttomark { begin } repeat pop
+ getrepl saver restore
+ 7 idiv dup /S exch dict def {
+ 6 array astore /mtrx X tstr cvs /K X
+ S K [ S K known { S K get aload pop } if mtrx ] put
+ } repeat
+} B
+/Place {
+ tstr cvs /K X
+ S K known {
+ bind /proc X tM CM pop
+ CP /cY X /cX X
+ 0 0 transform idtransform neg /aY X neg /aX X
+ S K get dup length /maxiter X
+ /iter 1 def {
+ iter maxiter ne { /saver save def } if
+ tM setmatrix aX aY translate
+ [ exch aload pop idtransform ] concat
+ cX neg cY neg translate cX cY moveto
+ /proc load OE
+ iter maxiter ne { saver restore /iter iter 1 add def } if
+ } forall
+ /noXY { CP /cY X /cX X } stopped def
+ tM setmatrix noXY { newpath } { cX cY moveto } ifelse
+ } {
+ Hide OE Unhide
+ } ifelse
+} B
+/normalize {
+ 2 index dup mul 2 index dup mul add sqrt div
+ dup 4 -1 roll exch mul 3 1 roll mul
+} B
+/replace {
+ aload pop MD
+ CP /bY X /lX X gsave sM setmatrix
+ str stringwidth abs exch abs add dup 0 eq
+ { pop } { 360 exch div dup scale } ifelse
+ lX neg bY neg translate newpath lX bY moveto
+ str { /ch X ( ) dup 0 ch put false charpath ch Kproc } forall
+ flattenpath pathbbox [ /uY /uX /lY /lX ] MD
+ CP grestore moveto
+ currentfont /FontMatrix get dstFM copy dup
+ 0 get 0 lt { uX lX /uX X /lX X } if
+ 3 get 0 lt { uY lY /uY X /lY X } if
+ /cX uX lX add 0.5 mul def
+ /cY uY lY add 0.5 mul def
+ debugMode { gsave 0 setgray 1 setlinewidth
+ lX lY moveto lX uY lineto uX uY lineto uX lY lineto closepath
+ lX bY moveto uX bY lineto lX cY moveto uX cY lineto
+ cX lY moveto cX uY lineto stroke
+ grestore } if
+ dstFM dup invertmatrix dstM CM srcM
+ 2 { dstM concatmatrix } repeat pop
+ getrepl /temp X
+ S str convert get {
+ aload pop [ /rot /scl /loc /K ] MD
+ /aX cX def /aY cY def
+ loc {
+ dup 66 eq { /aY bY def } { % B
+ dup 98 eq { /aY lY def } { % b
+ dup 108 eq { /aX lX def } { % l
+ dup 114 eq { /aX uX def } { % r
+ dup 116 eq { /aY uY def } % t
+ if } ifelse } ifelse } ifelse } ifelse pop
+ } forall
+ K srcFM rot tM rotate dstM
+ 2 { tM concatmatrix } repeat aload pop pop pop
+ 2 { scl normalize 4 2 roll } repeat
+ aX aY transform
+ /temp temp 7 add def
+ } forall
+ temp setrepl
+} B
+/Rif {
+ S 3 index convert known { pop replace } { exch pop OE } ifelse
+} B
+/XA { bind [ /Kproc /str } B /XC { ] 2 array astore def } B
+/xs { pop } XA XC
+/xks { /kern load OE } XA /kern XC
+/xas { pop ax ay rmoveto } XA /ay /ax XC
+/xws { c eq { cx cy rmoveto } if } XA /c /cy /cx XC
+/xaws { ax ay rmoveto c eq { cx cy rmoveto } if }
+ XA /ay /ax /c /cy /cx XC
+/raws { xaws { awidthshow } Rif } B
+/rws { xws { widthshow } Rif } B
+/rks { xks { kshow } Rif } B
+/ras { xas { ashow } Rif } B
+/rs { xs { show } Rif } B
+/rrs { getrepl dup 2 add -1 roll //restore exec setrepl } B
+PSfragDict begin
+islev2 not { /restore { /rrs PSfrag } B } if
+/show { /rs PSfrag } B
+/kshow { /rks PSfrag } B
+/ashow { /ras PSfrag } B
+/widthshow { /rws PSfrag } B
+/awidthshow { /raws PSfrag } B
+end PSfragDict RO pop
+end
+
+
+%%EndProcSet
+%%BeginProcSet: 8r.enc
+% @@psencodingfile@{
+% author = "S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry",
+% version = "0.6",
+% date = "22 June 1996",
+% filename = "8r.enc",
+% email = "kb@@mail.tug.org",
+% address = "135 Center Hill Rd. // Plymouth, MA 02360",
+% codetable = "ISO/ASCII",
+% checksum = "119 662 4424",
+% docstring = "Encoding for TrueType or Type 1 fonts to be used with TeX."
+% @}
+%
+% Idea is to have all the characters normally included in Type 1 fonts
+% available for typesetting. This is effectively the characters in Adobe
+% Standard Encoding + ISO Latin 1 + extra characters from Lucida.
+%
+% Character code assignments were made as follows:
+%
+% (1) the Windows ANSI characters are almost all in their Windows ANSI
+% positions, because some Windows users cannot easily reencode the
+% fonts, and it makes no difference on other systems. The only Windows
+% ANSI characters not available are those that make no sense for
+% typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen
+% (173). quotesingle and grave are moved just because it's such an
+% irritation not having them in TeX positions.
+%
+% (2) Remaining characters are assigned arbitrarily to the lower part
+% of the range, avoiding 0, 10 and 13 in case we meet dumb software.
+%
+% (3) Y&Y Lucida Bright includes some extra text characters; in the
+% hopes that other PostScript fonts, perhaps created for public
+% consumption, will include them, they are included starting at 0x12.
+%
+% (4) Remaining positions left undefined are for use in (hopefully)
+% upward-compatible revisions, if someday more characters are generally
+% available.
+%
+% (5) hyphen appears twice for compatibility with both ASCII and Windows.
+%
+/TeXBase1Encoding [
+% 0x00 (encoded characters from Adobe Standard not in Windows 3.1)
+ /.notdef /dotaccent /fi /fl
+ /fraction /hungarumlaut /Lslash /lslash
+ /ogonek /ring /.notdef
+ /breve /minus /.notdef
+% These are the only two remaining unencoded characters, so may as
+% well include them.
+ /Zcaron /zcaron
+% 0x10
+ /caron /dotlessi
+% (unusual TeX characters available in, e.g., Lucida Bright)
+ /dotlessj /ff /ffi /ffl
+ /.notdef /.notdef /.notdef /.notdef
+ /.notdef /.notdef /.notdef /.notdef
+ % very contentious; it's so painful not having quoteleft and quoteright
+ % at 96 and 145 that we move the things normally found there down to here.
+ /grave /quotesingle
+% 0x20 (ASCII begins)
+ /space /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three /four /five /six /seven
+ /eight /nine /colon /semicolon /less /equal /greater /question
+% 0x40
+ /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O
+% 0x50
+ /P /Q /R /S /T /U /V /W
+ /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o
+% 0x70
+ /p /q /r /s /t /u /v /w
+ /x /y /z /braceleft /bar /braceright /asciitilde
+ /.notdef % rubout; ASCII ends
+% 0x80
+ /.notdef /.notdef /quotesinglbase /florin
+ /quotedblbase /ellipsis /dagger /daggerdbl
+ /circumflex /perthousand /Scaron /guilsinglleft
+ /OE /.notdef /.notdef /.notdef
+% 0x90
+ /.notdef /.notdef /.notdef /quotedblleft
+ /quotedblright /bullet /endash /emdash
+ /tilde /trademark /scaron /guilsinglright
+ /oe /.notdef /.notdef /Ydieresis
+% 0xA0
+ /.notdef % nobreakspace
+ /exclamdown /cent /sterling
+ /currency /yen /brokenbar /section
+ /dieresis /copyright /ordfeminine /guillemotleft
+ /logicalnot
+ /hyphen % Y&Y (also at 45); Windows' softhyphen
+ /registered
+ /macron
+% 0xD0
+ /degree /plusminus /twosuperior /threesuperior
+ /acute /mu /paragraph /periodcentered
+ /cedilla /onesuperior /ordmasculine /guillemotright
+ /onequarter /onehalf /threequarters /questiondown
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /multiply
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /divide
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /ydieresis
+] def
+
+%%EndProcSet
+%%BeginProcSet: special.pro
+%!
+TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N
+/vs 792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP 0 N /rwiSeen
+false N /rhiSeen false N /letter{}N /note{}N /a4{}N /legal{}N}B
+/@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{@scaleunit
+div /vsc X}B /@hsize{/hs X /CLIP 1 N}B /@vsize{/vs X /CLIP 1 N}B /@clip{
+/CLIP 2 N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{
+10 div /rwi X /rwiSeen true N}B /@rhi{10 div /rhi X /rhiSeen true N}B
+/@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X}B /magscale
+true def end /@MacSetUp{userdict /md known{userdict /md get type
+/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup
+length 20 add dict copy def}if end md begin /letter{}N /note{}N /legal{}
+N /od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath
+clippath mark{transform{itransform moveto}}{transform{itransform lineto}
+}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{
+itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{
+closepath}}pathforall newpath counttomark array astore /gc xdf pop ct 39
+0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}N
+/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1
+scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get
+ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip
+not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0
+TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR
+pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1
+-1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg
+TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg
+sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr
+0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add
+2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N /cp
+{pop pop showpage pm restore}N end}if}if}N /normalscale{Resolution 72
+div VResolution 72 div neg scale magscale{DVImag dup scale}if 0 setgray}
+N /psfts{S 65781.76 div N}N /startTexFig{/psf$SavedState save N userdict
+maxlength dict begin /magscale true def normalscale currentpoint TR
+/psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts
+/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx
+psf$llx sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy
+scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR
+/showpage{}N /erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{
+psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
+roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
+moveto}N /endTexFig{end psf$SavedState restore}N /@beginspecial{SDict
+begin /SpecialSave save N gsave normalscale currentpoint TR
+@SpecialDefaults count /ocount X /dcount countdictstack N}N /@setspecial
+{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
+closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
+sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
+}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
+CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
+lineto closepath clip}if /showpage{}N /erasepage{}N /copypage{}N newpath
+}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{
+end}repeat grestore SpecialSave restore end}N /@defspecial{SDict begin}
+N /@fedspecial{end}B /li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{
+/SaveX currentpoint /SaveY X N 1 setlinecap newpath}N /st{stroke SaveX
+SaveY moveto}N /fil{fill SaveX SaveY moveto}N /ellipse{/endangle X
+/startangle X /yrad X /xrad X /savematrix matrix currentmatrix N TR xrad
+yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end
+
+%%EndProcSet
+TeXDict begin 40258431 52099146 1000 600 600 (pfgguide.dvi)
+@start
+%DVIPSBitmapFont: Fa cmssi10 10.95 6
+/Fa 6 115 df<0107B67E17F017FC17FF4916809126F0000313C09338007FE0EF1FF017
+0F4948EC07F8A2EF03FCA349481401A31703494815F8A3EF07F0A249C8EA0FE0171FEF3F
+C0EF7F8017FF484802031300EE0FFEEE7FF890B75A4816C05F04FCC7FC16F001FCCAFC48
+5AA5485AA5485AA4485AA5485AA548CBFCA2363F78BE3A>80 D<ED07FF037F13F04AB512
+FC020714FF4A15C0023F158091387FF8039139FFC0007F4990C7EA1F00D903FC80494880
+4A1402494891C7FCA2495AA2495AA680A28080EB1FFCECFF806D13F86DEBFF806D14E06D
+14F86D14FE6E7F020F801401DA001F7F03037FED007F163F707EA2160FA21607A44C5AA3
+5F161F121000384B5A003C4BC7FC003E5D007F4A5A01C0EB07FCD8FFF0EB1FF801FFEB7F
+F06C90B55A001F15806C92C8FC000114FC6C6C13F0010390C9FC32437BC033>83
+D<EC1FF0903801FFFC010F13FF013F14804914C0A29138803FE09038FC001F01F0EB0FF0
+13C049130790C7FCA5ED0FE0A3EC0FFF49B5FC011F14C0137F48B6FC0007EBFC1F380FFE
+00D81FF0EB3F80EA3F8048C7FC127E48EC7F00A25DA26C13036C495AEBC03F6CB5FCA214
+FE6CEBF9FC6C13C1D807FCC8FC242B7AA92C>97 D<ED7FC0913803FFF05C141F5C4A13E0
+ECFF80903901FC0020494813005C13075C130FA3495AA4495AA5007FB57EA5B6C7FCC648
+C8FCA3485AA5485AA5485AA5485AA4485AA5485AA548C9FCA2244078BF1C>102
+D<037FEB0FE0913903FFC0FF4A13F7021F90B5FC5C5C9126FF03FEC7FC903801FC004948
+137E4A137F49487FA2495AA34948137EA35EA26E485A010F13036E485A9138F81FE091B5
+5A495C4991C8FC5D90387C7FF8EC1FC001FCCAFCA47F90B512FEEDFFC016F016FC488100
+07815A391FF000074901007FD83F80147F127F90C8123FA200FE4BC7FCA26C5D4B5A6C6C
+495A01E0EB1FF8D83FFCEBFFF06CB65A6C5D6C92C8FC000114FC6C6C13F0010F90C9FC33
+3D80A82D>I<017E133E9038FC01FC1407141F147F14FFD801F913809038FBFC00EBFFF0
+5C485B5C91C7FC5B5B12075B5BA3485AA5485AA4485AA548C8FCA512FEA21F2979A81F>
+114 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fb line10 10 2
+/Fb 2 12 df<1718173C177CA217F8A2EE01F0A2EE03E0A2EE07C0A2EE0F80A2EE1F00A2
+163EA25EA25EA24B5AA24B5AA24B5AA24B5AA24BC7FCA2153EA25DA25DA24A5AA24A5AA2
+4A5A140F5D4AC8FCA2143EA25CA25CA2495AA2495AA2495AA2495AA249C9FCA2133EA25B
+A25BA2485AA2485AA2485AA2485AA248CAFCA2123EA25AA25AA25A12602E5782D42A>1
+D<1208120EEA0F8013E013F813FE6D7E14E014F814FEECFF80A24814005C14F85C5C5C5C
+49C7FC5B5B485A5B5B5B90C8FC123E5A12781270126012405A192280A22A>11
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fc cmti7 7 1
+/Fc 1 66 df<ED0780150FA2151FA2153F157FA215EFEDE7C0EC01C714031587EC0707A2
+140E141E141C02387F1503147014F014E0EB01C0A2EB038049B5FC8290380E0001A25B5B
+A25B13F05B12014848801207120FD8FFF890381FFF80A2292A7CA932>65
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fd cmssbx10 12 13
+/Fd 13 121 df<91397FC00FFE903A03FFF81FFF010F4A13805B5B5B90B5FCECF8784814
+3814F01518481400701300705A93C8FCAA003F9039FFF00FFF5AB66C481380A36C14F0A2
+0003EBF000B3B36C496D13007E31467EC53A>12 D<003FB612F04815FFB812E017F817FE
+83188018C0A249C714E0041F13F0827013F88282A218FC82A95E18F8A25E4C13F05E4C13
+E093B5FC90B812C0188018005F17F817E0178004F0C7FC49CAFCB3A76C5A123F364577C4
+46>80 D<EC3FFF0103B512F0010F14FE013F6E7E90B712E04816F85A5A5A5F48EBF00391
+38C0003F4890C7120F1607491403007F6F5A491400176094C7FCA37FA27F80806C13F014
+FF15F06C14FF6C15E016F86C15FE6C816C16C06C826D817F010F81010381EB007F020780
+EC007F03077F15016F7E701380A282A282A312301238123C007F5D6D160001E05C01F85C
+01FE91B5FC9026FFE0035BB8FC5FA25F003F5E6C5E00075EC693C7FC013F14FC010314F0
+D9003F90C8FC31497BC63D>83 D<903801FFF8011F13FF90B612E0000381000F15FC82A2
+49C66C7E01F86D1380D807E07F5B496D13C090C7FC1206C8FCA60207B5FC49B6FC131F13
+7F48B512EF0007EBF80F4813C0481380481300485A5B12FF5BA45D7F5D6C6C5B92B5FC38
+3FFF8391B6FC6C14EF6C14CF6C148F6CD9FE071380C613F8D93FC0C8FC2A317DAF34>97
+D<EC7FF80103B57E011F14E0017F8090B612FC48815A489038F03FFF48D9C00F1380EC80
+0348010014C048804915E0A248487FA217F012FFA25BA390B7FCA317E0A201F8C9FCA37F
+127FA37F003F16C016016C6C14036E13076C6DEB1FE06E137F6C9038F803FF6C90B6FC7E
+6C1680013FECFE00010F14F8010114E09026003FFEC7FC2C317DAF33>101
+D<EC1FFE49B512C01307131F5B5B90B6FCECFC0F48EBF8031501ECF000481500AD003FEB
+FFE05AB67EA36C5CA2000301F0C7FCB3B36C5B7E22467EC521>I<DAFFF0EB0FC0010F01
+FF13FF013F14C390B8FC4817E05A48EDFE0F489039C03FFF004A6C140048496C7FA2497F
+003F82A9001F5E6D5BA26C6D4890C7FC6E5A6C90B55A6C5D6C5D485D4815C0018F91C8FC
+018013F0000F90CAFC7FA27F7F90B612E016FF17C06C16F017FC836C82A2000F1780123F
+A2D87FF0C7003F13C049140348488082A46D5CA26C6C4A138001FC140F263FFFC090B512
+006C90B65A6C5E6C5E6C5EC66C1580011F4AC7FC010014C033447EAE37>I<EA3FFC127F
+EAFFFEAAEA7FFCA2C7FCAAEA1FFC123FEA7FFEB3B3A6EA3FFC121F0F467CC519>105
+D<D83FF0D97FE049B47E007F902603FFFC010F13F026FFF80F01FF013F13FC4A6E487F02
+7F02C1B6FC91B612C301F903E71580DAF80FECE03F9026FBE0079038EF801FD9FFC0DAFF
+0014C04A6C497FA202005C495DA3495DB3AB6C486D496D1380003F6E814A2F7AAE57>
+109 D<D83FF0EB7FC0007F903803FFF826FFF80F13FE023F7F4A148091B6FC01F915C0EC
+F81F9026FBE00F13E0EBFFC04A7E1400A25BA35BB3AB6C486D13C0123F2B2F7AAE38>I<
+D83FF013F8007F130338FFF80F141F147FA214FF13F913FBA290B5120014F85C5C5C5C91
+C7FC5BA35BB3A76C5A123F1D2F7AAE25>114 D<EB0FFF017F13F048B512FC000714FF48
+15C05AA2383FF8039039F0007F80151F4848130F15071503ED01006D90C7FC7F13FEEBFF
+E014FF6C14C015F06C80816C806C806C1580C6FC013F14C0130FD9007F13E01407140180
+12200070147F1278127C127ED87F8013FF01E014C038FFFC0390B6FC16801600123F000F
+5C000314F8C614E0010F90C7FC23317DAF2A>I<D83FF0ECFFC0486C4913E06D5B6D4913
+C06C6C5B6C16806C6D4813006C6D485A6C6D485A14F06C4A5A6C01F95BD97FFD5B6DB5FC
+5E6D5C6D91C7FC6D5B7F6D5B5D6D5B147F4A7E5B497F497F8149804980EB3FFDD97FF87F
+4A7F01FF6D7E48496C7E4813C06F7E48496C7E4801001480486E13C048486D13E05B007F
+6E13F048486D13F85B6C48EC3FF02D2E7EAD32>120 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fe cmsy10 10 2
+/Fe 2 106 df<14C0EB01E01303A214C01307A21480130FA2EB1F00A2131E133EA25BA2
+137813F8A2485AA25B1203A25B1207A2485AA290C7FC5AA2123EA2123C127CA2127812F8
+A41278127CA2123C123EA27EA27E7FA26C7EA212037FA212017FA26C7EA21378137CA27F
+A2131E131FA2EB0F80A2130714C0A2130314E0A21301EB00C0135278BD20>104
+D<126012F07EA21278127CA2123C123EA27EA27E7FA26C7EA212037FA26C7EA212007FA2
+1378137CA27FA2131E131FA2EB0F80A2130714C0A2130314E0A414C01307A21480130FA2
+EB1F00A2131E133EA25BA2137813F8A25B1201A2485AA25B1207A2485AA290C7FC5AA212
+3EA2123C127CA2127812F8A25A126013527CBD20>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ff cmti10 10 17
+/Ff 17 121 df<0107B8FCA3903A000FF000034BEB007F183E141F181E5DA2143FA25D18
+1C147FA29238000380A24A130718004A91C7FC5E13015E4A133E167E49B512FEA25EECF8
+000107147C163C4A1338A2010F147818E04A13701701011F16C016004A14031880013F15
+0718004A5CA2017F151E173E91C8123C177C4915FC4C5A4914070001ED7FF0B8FCA25F38
+397BB838>69 D<0107B512FCA25E9026000FF8C7FC5D5D141FA25DA2143FA25DA2147FA2
+92C8FCA25CA25CA21301A25CA21303A25CA21307A25CA2130F170C4A141CA2011F153C17
+384A1478A2013F157017F04A14E01601017F140317C091C71207160F49EC1F80163F4914
+FF000102071300B8FCA25E2E397BB834>76 D<0007B812E0A25AD9F800EB001F01C049EB
+07C0485AD900011403121E001C5C003C17801403123800785C00701607140700F0170048
+5CA2140FC792C7FC5DA2141FA25DA2143FA25DA2147FA292C9FCA25CA25CA21301A25CA2
+1303A25CA21307A25CA2130FA25CEB3FF0007FB512F8B6FCA2333971B83B>84
+D<49B5D8F007B5FCA3D9000790C713E0DA03FCEC7F00187C020115786F5C4D5A02005D6F
+495A4DC7FC6F5BEE801E5F033F5BEEC0705F92381FC1C016E3EEE780DB0FEFC8FC16FE6F
+5A5EA2150382A2150782150F151CED3CFF5D4B7EDA01E07FEDC03FDA03807FEC0700020E
+131F021E805C4A130F0270805C49481307494880130749C71203011E81133E01FE81D807
+FF1407B500E090387FFFFC93B5FC6040397CB83E>88 D<14F8EB07FE90381F871C90383E
+03FE137CEBF801120148486C5A485A120FEBC001001F5CA2EA3F801403007F5C1300A214
+07485C5AA2140F5D48ECC1C0A2141F15831680143F1587007C017F1300ECFF076C485B90
+38038F8E391F0F079E3907FE03FC3901F000F0222677A42A>97 D<147F903803FFC09038
+0FC1E090381F0070017E13784913383901F801F83803F003120713E0120FD81FC013F091
+C7FC485AA2127F90C8FCA35A5AA45AA3153015381578007C14F0007EEB01E0003EEB03C0
+EC0F806CEB3E00380F81F83803FFE0C690C7FC1D2677A426>99 D<147F903803FFC09038
+0FC1E090383F00F0017E13785B485A485A485A120F4913F8001F14F0383F8001EC07E0EC
+1F80397F81FF00EBFFF891C7FC90C8FC5A5AA55AA21530007C14381578007E14F0003EEB
+01E0EC03C06CEB0F806CEB3E00380781F83803FFE0C690C7FC1D2677A426>101
+D<EC07C0EC3FF09138FC38E0903901F01FF0EB03E0903807C00FEB0F80011F1307D93F00
+13E05B017E130F13FE4914C01201151F1203491480A2153F1207491400A25DA249137EA2
+15FEA25D00031301140314076C6C485A0000131FEB787BEB3FF390380FC3F0EB00031407
+A25DA2140F5D121C007E131F5D00FE49C7FC147E5C387801F8387C07E0381FFF80D803FE
+C8FC24367CA426>103 D<EB0FC0EA07FFA3EA001F1480A2133FA21400A25BA2137EA213
+FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121FA25BA2123FA290C7FCA2
+5AA2EA7E0EA212FE131EEAFC1CA2133C133812F81378EA7870EA7CE0121FEA0F80123B79
+B915>108 D<D801E001FEEB07F03C07F803FF801FFC3C0E3C0F07C0783E3C1E3E3C03E1
+E01F261C1F78D9F3C013803C383FF001F7800F02E01400007801C013FE007018C002805B
+4A4848EB1F80EAF07FD8E07E5CA200000207143F01FE1700495CA2030F5C0001177E495C
+18FE031F5C120349DA8001131C18F8033F153C00070403133849020013F0A24B1570000F
+17E049017E15F019E003FEECE1C0001FEE01E34949903800FF000007C70038143C3E2679
+A444>I<D801E013FE3A07F803FF803A0E3C0F07C03A1E3E3C03E0261C1F787F39383FF0
+0114E0007813C000708114804A485AEAF07FEAE07EA20000140701FE5C5BA2150F00015D
+5B151F5E12034990383F8380160316070007027F130049137EA2160E000F147C49141E16
+1C5E001FEC3C7849EB1FE00007C7EA0780292679A42F>I<147F903803FFC090380FC1F0
+90381F00F8017E137C5B4848137E4848133E0007143F5B120F485AA2485A157F127F90C7
+FCA215FF5A4814FEA2140115FC5AEC03F8A2EC07F015E0140F007C14C0007EEB1F80003E
+EB3F00147E6C13F8380F83F03803FFC0C648C7FC202677A42A>I<9039078007C090391F
+E03FF090393CF0787C903938F8E03E9038787FC00170497EECFF00D9F0FE148013E05CEA
+01E113C15CA2D80003143FA25CA20107147FA24A1400A2010F5C5E5C4B5A131F5EEC8003
+5E013F495A6E485A5E6E48C7FC017F133EEC70FC90387E3FF0EC0F8001FEC9FCA25BA212
+01A25BA21203A25B1207B512C0A3293580A42A>I<3903C003F0390FF01FFC391E783C0F
+381C7C703A3C3EE03F8038383FC0EB7F800078150000701300151CD8F07E90C7FCEAE0FE
+5BA2120012015BA312035BA312075BA3120F5BA3121F5BA3123F90C9FC120E212679A423
+>114 D<14FE903807FF8090380F83C090383E00E04913F00178137001F813F000011303
+13F0A215E00003EB01C06DC7FC7FEBFFC06C13F814FE6C7F6D13807F010F13C01300143F
+141F140F123E127E00FE1480A348EB1F0012E06C133E00705B6C5B381E03E06CB45AD801
+FEC7FC1C267AA422>I<EB0380EB07C0130FA4131F1480A3133F1400A35B137E007FB5FC
+A2B6FC3800FC00A312015BA312035BA312075BA3120F5BA3121FEB801CA2143C003F1338
+EB0078147014F014E0EB01C0EA3E03381F0780380F0F00EA07FCEA01F0183579B31C>I<
+903907E007C090391FF81FF89039787C383C9038F03E703A01E01EE0FE3803C01F018013
+C0D8070014FC481480000E1570023F1300001E91C7FC121CA2C75AA2147EA214FEA25CA2
+1301A24A1370A2010314F016E0001C5B007E1401010714C000FEEC0380010F1307010EEB
+0F0039781CF81E9038387C3C393FF03FF03907C00FC027267CA427>120
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fg cmtt10 10 57
+/Fg 57 126 df<121C127FEAFF80B1EA7F00AF123EC7FCA8121C127FA2EAFF80A3EA7F00
+A2121C09346FB32C>33 D<EB01C0497EA6EB0FFC90387FFF8048B512E00007804880391F
+FBEFFC393FC3E1FE903803E07F007E80127C00FC158012F8157FA300FCEC3F00A2007E91
+C7FC127FEA3FC313FBEA1FFF6C13FC6C13FF000114C06C6C7F011F13F801037F14E7ECE1
+FEECE07F81001880007E1580150F12FFA312FE151F1600007E5C007F143ED83F8313FE90
+38C3E1FC391FFBEFF86CB55A6C5C6C5CC691C7FCEB1FF8EB03E0A66D5A21417BB92C>36
+D<EA0F80EA1FC0EA3FE013F0A213F8A2121F120F1200A4120113F0A2120313E01207EA0F
+C0121FEA3F80EA7F0012FE5A5A12700D1B71B22C>39 D<143814FC13011303EB07F8EB0F
+F0EB1FC0EB3F80EB7F0013FE485A485A5B12075B120F5B485AA2123F90C7FCA25A127EA3
+12FE5AAC7E127EA3127F7EA27F121FA26C7E7F12077F12037F6C7E6C7E137FEB3F80EB1F
+C0EB0FF0EB07F8EB03FC130113001438164272B92C>I<127012FC7E7E6C7E6C7EEA0FE0
+6C7E6C7E6C7E6C7E137F7F1480131F14C0130FEB07E0A214F01303A214F81301A314FC13
+00AC130114F8A3130314F0A2130714E0A2EB0FC0131F1480133F14005B13FE485A485A48
+5A485AEA3FC0485A48C7FC5A5A1270164279B92C>I<EB0380497EA60020140800F8143E
+00FE14FE00FF13C1EBC7C7EBE7CF003FB512F8000F14E0000314806C140038007FFCA248
+B5FC481480000F14E0003F14F839FFE7CFFEEBC7C7EB07C100FE13C000F8143E00201408
+00001400A66D5A1F247AAA2C>I<EA0F80EA1FE0EA3FF0EA7FF8A213FCA3123F121F120F
+120013F8A21201EA03F01207EA1FE0EA7FC0EAFF80130012FC12700E17718A2C>44
+D<007FB6FCB71280A46C150021067B9B2C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F
+80EA1F000B0B708A2C>I<1507ED0F80151FA2153F16005D157E15FE5D14015D14035DA2
+14075D140F5D141F5D143F92C7FC5C147E14FE5CA213015C13035C13075C130F5C131F5C
+A2133F91C8FC5B137E13FE5B12015B12035B12075BA2120F5B121F5B123F90C9FC5A127E
+12FE5AA25A127821417BB92C>I<EB03F8EB0FFE90383FFF80497F90B57E3901FE0FF039
+03F803F848486C7EEBE0004848137EA248487FA248C7EA1F80A2003E140F007E15C0A300
+7C140700FC15E0AC6C140F007E15C0A46CEC1F80A36C6CEB3F00A26C6C137E6D13FE0007
+5CEBF0016C6C485A3901FE0FF06CB55A6D5B6D5BD90FFEC7FCEB03F823357CB32C>I<13
+07497EA2131FA2133F137F13FF5A1207127FB5FC13DF139FEA7C1F1200B3AE007FB512E0
+B612F0A36C14E01C3477B32C>I<EB0FF890387FFF8048B512E00007804814FC391FF80F
+FE393FE001FF903880007F48C7EA3F80007E141F00FE15C0150F6C15E01507A3127E123C
+C8FCA2150F16C0151F1680153F16005D15FE4A5A14034A5A4A5A4A5A4A5AECFF804948C7
+FC495A495A495AEB3FE0EB7F8049C8FC485A4848EB03C04848EB07E0EA1FE0485A48B6FC
+B7FCA36C15C023347CB32C>I<EB0FFC90387FFF8048B512E0000714F84880391FF807FE
+EBC0004848137F6D7F1680151FA26C5A6CC7FCC8FC153F16005D15FE14014A5AEC1FF890
+381FFFF0495BA215F86D7F90380007FEEC00FF81ED3F80ED1FC0150FA216E01507A2123C
+127EB4FC150F16C0A248141F007FEC3F806DEB7F006C6C5B391FF807FE6CB55A6C5C6C14
+E0C66C1380D90FFCC7FC23357CB32C>I<000FB512FE4880A35D0180C8FCADEB83FE9038
+9FFF8090B512E015F8819038FE03FE9038F000FF01C07F49EB3F8090C7121F6C15C0C812
+0FA2ED07E0A4123C127EB4FC150F16C0A248141F007EEC3F80007FEC7F006C6C5B6D485A
+391FF80FFC6CB55A6C5C000114C06C6C90C7FCEB0FF823347CB22C>53
+D<EC3FC0903801FFF801077F011F7F497F90387FE07F9039FF003F804848137FEA03F848
+5A5B000FEC3F004848131E4990C7FC123F90C9FCA25A127EEB03FE90381FFF80D8FC7F13
+E000FDB57EB67E9038FE07FC9038F001FE9038C0007F49EB3F8090C7121F16C048140F16
+E01507A3127EA47E150F6D14C0001F141F6D1480000F143F6DEB7F003907F801FE3903FE
+07FC6CB55A6C5C6D5B011F1380D907FCC7FC23357CB32C>I<EB07FC90383FFF8090B512
+E0000314F84880390FFC07FE391FF001FF9038C0007F4848EB3F8090C7121F4815C0007E
+140FA56CEC1F80A26C6CEB3F006D5B390FF001FE3903FC07F86CB55A6C6C13C0D907FCC7
+FC90387FFFC048B512F03903FC07F8390FF001FE391FC0007F497F48C7EA1F80007EEC0F
+C0A248EC07E0A7007EEC0FC0A2007F141F6C6CEB3F806C6CEB7F009038F001FF390FFC07
+FE6CB55A6C5CC614E0013F1380D907FCC7FC23357CB32C>56 D<EB07FCEB3FFF90B512C0
+488048803907FC07F8390FF001FC48486C7ED83F80137E157F48C77E007EEC1F8012FE5A
+ED0FC0A416E0A37E127E007F141F7E6D133F6C6C137F390FF001FF3807FC0F6CB6FC6C14
+F76C14C7013F130FD90FF813C090C7FCA2151F1680153F1600000F5C486C137E486C13FE
+4A5A4A5A14079038801FF0391FE07FE090B55A6C91C7FC6C5B000113F838007FC023357C
+B32C>I<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F00C7FCAE121FEA3F80EA7FC0
+EAFFE0A5EA7FC0EA3F80EA1F000B2470A32C>I<EA0F80EA1FC0EA3FE0EA7FF0A5EA3FE0
+EA1FC0EA0F80C7FCAEEA0F80EA1FC0EA3FE0127F13F0A4123F121F120F1201120313E012
+07EA0FC0A2EA3F80EA7F005A5A12F812700C3071A32C>I<007FB612F0B712F8A4003F15
+F0CAFCA8003FB612F0B712F8A46C15F025147DA22C>61 D<14FE497EA4497FA214EFA213
+0781A214C7A2010F7FA314C390381F83F0A590383F01F8A490387E00FCA549137E90B512
+FEA34880A29038F8003FA34848EB1F80A4000715C049130FD87FFEEBFFFC6D5AB514FE6C
+15FC497E27347EB32C>65 D<007FB512E015F8B612FE6C8016C03903F0003FED0FE0ED07
+F01503A2ED01F8A6ED03F0A21507ED0FE0ED1FC0EDFF8090B612005D5D15FF16C09039F0
+001FE0ED07F0ED03F81501ED00FCA216FE167EA616FE16FC1501ED03F8150FED3FF0007F
+B612E016C0B712806CECFE0015F027337FB22C>I<D87FFEEBFFFCB54813FEA36C486C13
+FCD807E0EB0FC0B190B6FCA59038E0000FB3D87FFEEBFFFCB54813FEA36C486C13FC2733
+7EB22C>72 D<007FB512C0B612F88115FF6C15802603F00013C0153FED0FE0ED07F0A215
+0316F81501A6150316F01507A2ED0FE0ED3FC015FF90B61280160015FC5D15C001F0C8FC
+B0387FFF80B57EA36C5B25337EB22C>80 D<387FFFFCB67E15E015F86C803907E007FE14
+01EC007F6F7E151FA26F7EA64B5AA2153F4BC7FCEC01FE140790B55A5D15E081819038E0
+07FCEC01FE1400157F81A8160FEE1F80A5D87FFEEB1FBFB5ECFF00815E6C486D5AC8EA01
+F029347EB22C>82 D<D87FFCEB7FFC486CEBFFFEA36C48EB7FFCD80FC0EB07E06D130F00
+0715C0A36D131F00031580A36D133F00011500A36D5B0000147EA4017E5BA46D485AA490
+381F83F0A4010F5B14C7A301075BA214EFA201035BA214FFA26D90C7FCA46D5A27347EB2
+2C>86 D<387FFFFCB512FEA314FC00FCC7FCB3B3B3B512FC14FEA36C13FC17416FB92C>
+91 D<127812F87EA27E127E127F7E7F121F7F120F7F1207A27F12037F12017F12007F13
+7E137F7F80131FA280130F801307801303801301801300A280147E147F8081141F81140F
+811407811403A281140181140081157E157F811680151FA2150FED070021417BB92C>I<
+387FFFFCB512FEA37EC7127EB3B3B3387FFFFEB5FCA36C13FC17417DB92C>I<3801FFF0
+000713FE001F6D7E15E048809038C01FF81407EC01FC381F80000006C77EC8127EA3ECFF
+FE131F90B5FC1203120F48EB807E383FF800EA7FC090C7FC12FE5AA47E007F14FEEB8003
+383FE01F6CB612FC6C15FE6C14BF0001EBFE1F3A003FF007FC27247CA32C>97
+D<EA7FF0487EA3127F1201AAEC1FE0ECFFF801FB13FE90B6FC16809138F07FC09138801F
+E091380007F049EB03F85BED01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036D
+EB07F0150F9138801FE09138E07FC091B51280160001FB5B01F813F83900F03FC027337F
+B22C>I<903803FFE0011F13F8017F13FE48B5FC48804848C6FCEA0FF0485A49137E4848
+131890C9FC5A127EA25AA8127EA2127F6C140F6DEB1F806C7E6D133F6C6CEB7F003907FE
+03FF6CB55A6C5C6C6C5B011F13E0010390C7FC21247AA32C>I<EC0FFE4A7EA380EC003F
+AAEB07F8EB3FFE90B512BF4814FF5A3807FC0F380FF00348487E497E48487F90C7FC007E
+80A212FE5AA87E007E5CA2007F5C6C7E5C6C6C5A380FF0073807FC1F6CB612FC6CECBFFE
+6C143FEB3FFC90390FF01FFC27337DB22C>I<EB03FE90381FFFC0017F13F048B57E4880
+3907FE03FE390FF800FFD81FE0EB3F805B4848EB1FC090C7120F5A007E15E015075AB7FC
+A416C000FCC9FC7E127EA2127F6CEC03C06DEB07E06C7ED80FF0130F6C6CEB3FC001FF13
+FF000190B512806C1500013F13FC010F13F00101138023247CA32C>I<EC0FF8EC3FFE91
+B5FC4914805B903807FC7F14F090390FE03F0014C092C7FCA6007FB512FEB7FCA36C5C26
+000FC0C7FCB3A8003FB512F04880A36C5C21337DB22C>I<ED03F8903907F80FFC90391F
+FE3FFE017FB6FC48B7FC48ECFE7F9038FC0FF82607F003133E3A0FE001FC1CD9C0001300
+001F8049137EA66D13FE000F5CEBE0016C6C485A3903FC0FF048B5FC5D481480D99FFEC7
+FCEB87F80180C8FCA37F6C7E90B512F06C14FE48ECFF804815E04815F03A3FC0001FF848
+C7EA03FC007E1400007C157C00FC157E48153EA46C157E007E15FCD87F801303D83FE0EB
+0FF8D81FFCEB7FF06CB612E0000315806C1500D8003F13F8010713C028387EA42C>I<EA
+7FF0487EA3127F1201AAEC1FE0EC7FFC9038F9FFFE01FB7F90B6FC9138F03F80ECC01F02
+807FEC000F5B5BA25BB3267FFFE0B5FCB500F11480A36C01E0140029337FB22C>I<1307
+EB1FC0A2497EA36D5AA20107C7FC90C8FCA7387FFFC080B5FC7EA2EA0007B3A8007FB512
+FCB612FEA36C14FC1F3479B32C>I<EA7FE0487EA3127F1201AA91381FFFF04A13F8A36E
+13F0913800FE004A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FEEBF1FC13F3EBF7FE90B5FCA2
+EC9F80EC0FC001FE7FEBFC07496C7E496C7E811400157E811680151F3A7FFFC0FFFCB500
+E113FEA36C01C013FC27337EB22C>107 D<387FFFE0B57EA37EEA0003B3B3A5007FB612
+80B712C0A36C158022337BB22C>I<3A7F83F007E09039CFFC1FF83AFFDFFE3FFCD87FFF
+13FF91B57E3A07FE1FFC3E01FCEBF83F496C487E01F013E001E013C0A301C01380B33B7F
+FC3FF87FF0027F13FFD8FFFE6D13F8D87FFC4913F0023F137F2D2481A32C>I<397FF01F
+E039FFF87FFC9038F9FFFE01FB7F6CB6FC00019038F03F80ECC01F02807FEC000F5B5BA2
+5BB3267FFFE0B5FCB500F11480A36C01E0140029247FA32C>I<EB07FCEB1FFF017F13C0
+48B512F048803907FC07FC390FF001FE48486C7E0180133F003F158090C7121F007EEC0F
+C0A348EC07E0A76C140F007E15C0A2007F141F6C15806D133F6C6CEB7F006D5B6C6C485A
+3907FC07FC6CB55A6C5C6C6C13C0011F90C7FCEB07FC23247CA32C>I<397FF01FE039FF
+F8FFF801FB13FE90B6FC6C158000019038F07FC09138801FE091380007F049EB03F85BED
+01FC491300A216FE167EA816FE6D14FCA2ED01F86D13036DEB07F0150F9138801FE09138
+E07FC091B51280160001FB5B01F813F8EC3FC091C8FCAD387FFFE0B57EA36C5B27367FA3
+2C>I<903903FC078090391FFF0FC0017F13CF48B512EF4814FF3807FE07380FF0014848
+7E49137F4848133F90C7FC48141F127E150F5AA87E007E141FA26C143F7F6C6C137F6D13
+FF380FF0033807FC0F6CB6FC6C14EF6C6C138F6D130FEB07F890C7FCAD0203B5FC4A1480
+A36E140029367DA32C>I<D87FFEEB3FC0B53801FFF0020713F8021F13FC6C5B39003F7F
+E1ECFF019138FC00F84A13704A13005CA25C5CA391C8FCAF007FB512E0B67EA36C5C2624
+7EA32C>I<90387FF8700003B512F8120F5A5A387FC00F387E00034813015AA36CEB00F0
+007F140013F0383FFFC06C13FE6CEBFF80000314E0C66C13F8010113FCEB0007EC00FE00
+78147F00FC143F151F7EA26C143F6D133E6D13FE9038F007FC90B5FC15F815E000F81480
+39701FFC0020247AA32C>I<131E133FA9007FB6FCB71280A36C1500D8003FC8FCB1ED03
+C0ED07E0A5EC800F011FEB1FC0ECE07F6DB51280160001035B6D13F89038003FE0232E7E
+AD2C>I<3A7FF003FF80486C487FA3007F7F0001EB000FB3A3151FA2153F6D137F3900FE
+03FF90B7FC6D15807F6D13CF902603FE07130029247FA32C>I<3A7FFF01FFFCB514FE14
+8314016C15FC3A03E0000F80A26D131F00011500A26D5B0000143EA26D137E017C137CA2
+017E13FC013E5BA2EB3F01011F5BA21483010F5BA214C701075BA214EF01035BA214FF6D
+90C7FCA26D5A147C27247EA32C>I<D87FFFEB7FFF6EB5FCB515806C16004A7ED807C0EB
+01F0A66C6C495AA3143E147FA2D801F0495AECFF87A214F7A201F113C700005D9038F9E3
+CFA201FB13EFA3D97BC190C7FC017F13FFA21480A2013F5B90381F007C29247FA32C>I<
+3A3FFF03FFF048018713F8A36C010313F03A00FC007E005D90387E01F8013F5BEB1F83EC
+87E090380FCFC0903807EF80EB03FF6D90C7FC5C6D5A147C14FE130180903803EF809038
+07CFC0EB0FC7EC83E090381F01F0013F7FEB7E00017C137C49137E0001803A7FFF01FFFC
+1483B514FE6C15FC140127247EA32C>I<3A7FFF01FFFCB5008113FE148314816C010113
+FC3A03E0000F806C7E151F6D140012005D6D133E137C017E137E013E137CA2013F13FC6D
+5BA2EB0F815DA2EB07C1ECC3E0A2EB03E3ECE7C0130114F75DEB00FFA292C7FC80A2143E
+A2147E147CA214FC5CA2EA0C01003F5BEA7F83EB87E0EA7E0F495A387FFF806C90C8FC6C
+5A6C5AEA07E027367EA32C>I<003FB612E04815F0A4007EC7EA1FE0ED3FC0ED7F80EDFF
+004A5A003C495AC7485A4A5A4A5A4A5A4A5A4AC7FCEB01FC495AEB0FF0495A495A495A49
+C8FC4848EB01E04848EB03F0485A485A485A485A485AB7FCA46C15E024247DA32C>I<15
+FF02071380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF007F5BB55A
+49C8FC6D7E6C7FC67F131FEB07F01303B380EB01FEECFFC06D13FF6E1380141F14070200
+130021417BB92C>I<EA7FC0EAFFF813FE6D7E6C7FC67F131FEB07F01303B380EB01FEEC
+FFC06D13FF6E1380141F147F91B512004913C04AC7FCEB03F85CB31307EB1FE013FF007F
+5BB55A49C8FC13F8EA7FC021417BB92C>125 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fh cmti8 8 1
+/Fh 1 66 df<16E01501821503A21507150FA2151FA2153B157B157315E382EC01C11403
+1581EC0701A2140EA2141C143C143802707F15005C13015C49B5FCA249C7FCA2130E131E
+131C4980167E5B13F0485AA21203D80FF014FFD8FFFC011F13F0A22C2F7CAE35>65
+D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fi cmti10 10.95 36
+/Fi 36 122 df<933807FF80043F13E09338FE00F8DB01F0133EDB07E0130E4B48131F4C
+137F031F14FF4BC7FCA218FE157E1878180015FE5DA31401A25DA414030103B712F0A218
+E0903A0003F000070207140F4B14C0A3171F020F15805DA2173F1800141F5D5F177EA214
+3F92C712FE5FA34A1301027EECF81CA3160302FEECF03C4A1538A21878187013014A0101
+13F018E0933800F1C0EF7F804948EC1F0094C7FCA35C1307A2001E5B127F130F00FF5BA2
+49CAFC12FEEAF81EEA703CEA7878EA1FF0EA07C0385383BF33>12
+D<143C14FEEB01FF5BA414FE1307A214FCA314F8130FA214F0A314E0131FA214C0A31480
+133FA21400A3133E137EA2137CA3137813F8A25BA35B1201A26C5A90C7FCA8120FEA3FC0
+127FA212FFA35B6CC7FC123C184177C01C>33 D<EA01E0EA07F8120F13FC121FA4120FEA
+03D8EA0018A2133813301370136013E013C01201EA038013005A120E5A5A5A5A5A0E1C6D
+BE1C>39 D<387FFFFEA3B5FCA21705799521>45 D<120FEA3FC0127FA212FFA31380EA7F
+00123C0A0A77891C>I<171C173C177CA217FCA216011603A21607A24C7EA2161DA21639
+1679167116E1A2ED01C1A2ED038115071601150EA2031C7FA24B7EA25D15F05D4A5AA24A
+5AA24AC7FC5C140E5C021FB6FC4A81A20270C7127FA25C13015C495AA249C8FCA2130E13
+1E131C133C5B01F882487ED807FEEC01FFB500E0017FEBFF80A25C39417BC044>65
+D<49B812F8A390260003FEC7121F18074B14031801F000F014075DA3140F5D19E0A2141F
+4B1338A2EF7801023F027013C04B91C7FCA217F0027F5CED80011603160F91B65AA3ED00
+1F49EC07805CA3010392C8FC5CF003804C13070107020E14005C93C75A180E010F161E4A
+151C183CA2011F5E5C60A2013F15014A4A5A1707017F150F4D5A4A147F01FF913807FF80
+B9FCA295C7FC3D3E7BBD3E>69 D<49B6FC5BA2D9000313005D5DA314075DA3140F5DA314
+1F5DA3143F5DA3147F5DA314FF92C7FCA35B5CA313035CA313075CA3130F5CA3131F5CA3
+133F5CA2137FA25C497EB67EA3283E7BBD23>73 D<49B612C0A25FD9000390C8FC5D5DA3
+14075DA3140F5DA3141F5DA3143F5DA3147F5DA314FF92C9FCA35B5CA313035C18C0EF01
+E0010716C05C17031880130F4A140718005F131F4A141EA2173E013F5D4A14FC1601017F
+4A5A16074A131F01FFECFFF0B8FCA25F333E7BBD39>76 D<49B77E18F018FC903B0003FE
+0003FEEF00FF4BEC7F80F03FC00207151F19E05DA2020F16F0A25DA2141FF03FE05DA202
+3F16C0187F4B1580A2027FEDFF00604B495A4D5A02FF4A5A4D5A92C7EA3FC04CB4C7FC49
+90B512FC17E04ACAFCA21303A25CA21307A25CA2130FA25CA2131FA25CA2133FA25CA213
+7FA25C497EB67EA33C3E7BBD3E>80 D<92390FF001C0ED7FFE4AB5EA0380913907F80FC7
+91390FC003EF91391F8001FF4AC71300027E805C495A4948143EA2495AA2010F153C5CA3
+011F1538A38094C7FC80A214FC6DB4FC15F015FE6DEBFFC06D14F06D14FC6D80143F020F
+7F020180EC001F150303007F167F163FA2161FA212075A5F120EA2001E153F94C7FCA216
+3E003E157E167C003F15FC4B5A486C5C4B5A6D495AD87DE0EB1F80D8F8F849C8FC017F13
+FE39F03FFFF8D8E00F13E048C690C9FC32427ABF33>83 D<48B9FCA25A903AFE001FF001
+01F89138E0007FD807E0163E49013F141E5B48C75BA2001E147FA2001C4B131C123C0038
+14FFA2007892C7FC12704A153C00F01738485CC716001403A25DA21407A25DA2140FA25D
+A2141FA25DA2143FA25DA2147FA25DA214FFA292C9FCA25BA25CA21303A25CEB0FFE003F
+B67E5AA2383D71BC41>I<91B690383FFFFC605E020101E0010F13006E49EB07F84C6D5A
+19C06F6C495A96C7FC033F140E705B183C031F5C705B4D5A030F5C70485A4DC8FC030713
+0EEEFC1E5F03035BEEFE705F6F6C5A5FA26F90C9FC83A2707EA216FF4B7F5DED079FEE1F
+F0150EED1C0F03387F1578EDF007DA01E07F15C09138038003DA07007F140E021E13014A
+805C02707F4A81495A4948147F01078249C8FC013F6F7E496C147F2603FFC049487EB500
+F8011FEBFFE0A261463E7CBD44>88 D<147E49B47E903907C1C38090391F80EFC090383F
+00FF017E137F4914804848133F485AA248481400120F5B001F5C157E485AA215FE007F5C
+90C7FCA21401485C5AA21403EDF0385AA21407EDE078020F1370127C021F13F0007E013F
+13E0003E137FECF3E1261F01E313C03A0F8781E3803A03FF00FF00D800FC133E252977A7
+2E>97 D<EB1FC0EA0FFF5CA2EA003FA291C7FCA25BA2137EA213FEA25BA21201A25BA212
+03A25B147E3907F1FF809038F783E09038EF01F013FE390FF800F8A24913FC49137C485A
+157E5B15FE123FA290C7FCA248130115FC127EA2140300FE14F85AA2EC07F0A215E04813
+0F15C0141F15800078EB3F00127C147E003C5B383E01F8381E03E06C485A6CB4C7FCEA01
+F81F4076BE2A>I<EC1FE0ECFFF8903803F03E903807C00F90381F8007D93F001380017E
+131F49137F485A485A000715005B000F147E484890C7FCA2485AA3127F90C9FCA35A5AA6
+481403007E5C5D151E003E5C5D6C5CEC03E0390F800F802603E07EC7FC3801FFF838003F
+C0212977A72A>I<EE3F80ED1FFF1700A2ED007FA2167EA216FEA25EA21501A25EA21503
+A25EA21507A25E147E903801FF8F903807C1CF90391F80EFC090383F00FF017E137F5B48
+486D5A485AA2485A000F92C7FC5B001F5CA24848137EA215FE127F90C75AA214015A485C
+A2140316384814F0A21407167891380FE070127C021F13F0007E013F5B003E137FECF3E1
+261F01E35B3A0F8781E3802703FF00FFC7FCD800FC133E294077BE2E>I<EC3F80903801
+FFE0903807E0F890381F803CEB3E0001FC131E485A485A12074848133E49133C121F4848
+137C15F8EC03F0397F000FE0ECFF80B5EAFC0014C048C8FCA45AA61506150E151E007C14
+3C15786C14F0EC01E06CEB07C0390F801F003807C0FC3801FFF038007F801F2976A72A>
+I<167C4BB4FC923807C78092380F83C0ED1F87161FED3F3FA2157EA21780EE0E004BC7FC
+A414015DA414035DA30103B512F8A390260007E0C7FCA3140F5DA5141F5DA4143F92C8FC
+A45C147EA414FE5CA413015CA4495AA4495AA4495A121E127F5C12FF49C9FCA2EAFE1EEA
+F83C1270EA7878EA3FE0EA0F802A5383BF1C>I<EC03F0EC0FFC91383E0E1C9138FC077E
+903901F003FE1303903807E001D90FC013FCEB1F80A2EB3F004914F8137E01FE1303A248
+4814F0A2150712034914E0A2150F12074914C0A2151FA216805B153F1203ED7F006D5BA2
+00015B0000495A9038F80F7E90387C1EFEEB1FF8903807E0FC90C7FC1401A25DA21403A2
+5D001C1307007F5C48130F5D4A5A4AC7FC48137E00F85B387C03F0381FFFC0D803FEC8FC
+273B7CA72A>I<EB01FC13FF5CA21303A25CA21307A25CA2130FA25CA2131FA25CA2133F
+A291C8FCEC03F890387F0FFE91383E0F80D97E7813C0ECE007D9FFC013E014801400A248
+5A5BA25B0003140F16C05BA20007141F16805BA2000F143F16005B5D001F147EEDFE0749
+13FCA2003F0101130FEDF80E1300161E48ECF01CA2007E1538A200FE1570020013E048EC
+7FC00038EC1F0028407ABE2E>I<1478EB01FCA21303A314F8EB00E01400AD137C48B4FC
+38038F80EA0707000E13C0121E121CEA3C0F1238A2EA781F00701380A2EAF03F14001200
+5B137E13FE5BA212015BA212035B1438120713E0000F1378EBC070A214F0EB80E0A2EB81
+C01383148038078700EA03FEEA00F8163E79BC1C>I<EB07F0EA03FF14E0A2EA000FA214
+C0A2131FA21480A2133FA21400A25BA2137EA213FEA25BA21201A25BA21203A25BA21207
+A25BA2120FA25BA2121FA25BA2123FA290C7FCA25A1307127EA2EAFE0F130E12FCA2131E
+131CA2EA7C381378EA3C70EA1FE0EA0780144079BE17>108 D<D801F0D93F80137F3D07
+FC01FFE003FFC03D0F3E07C1F80F83F03D0E1F0F00FC1E01F8001E011C90387C3800001C
+49D97E707F003C01F05C0038157F4A5C26783FC05C12704A91C7FC91C7127E00F003FE13
+01494A5CEA007EA20301140301FE5F495CA203031407000160495C180F03075D0003051F
+13E0494A1480A2030FEC3F810007F001C0495CA2031F91383E0380120F494AEC0700A203
+3F150E001FEF1E1C4991C7EA0FF80007C7000EEC03E0432979A74A>I<D801F0EB3F803A
+07FC01FFE03A0F3E07C1F83A0E1F0F00FC001E011C137C001C49137E003C13F012385C38
+783FC012705C91C7FC00F015FE495CEA007EA2150101FE5C5BA2150300015D5B15075E00
+03020F13704914C0A2031F13F00007ED80E05B1681EE01C0120F49EC0380A2EE0700001F
+EC0F0E49EB07FC0007C7EA01F02C2979A733>I<EC1FC0ECFFF8903803F07C90380FC01F
+EB1F8090393F000F80017E14C0491307484814E0485A12075B000F15F0485AA2485AA2ED
+0FE0127F90C7FCA2151F4815C05AA2ED3F80A2ED7F00A248147E007C5C007E13015D4A5A
+003E495A6C495A4A5A260F803EC7FC3807C0FC3801FFF038003F80242977A72E>I<9039
+03E001F890390FF807FE903A1E7C1E0F80903A1C3E3C07C0013C137801389038E003E0EB
+783F017001C013F0ED80019038F07F0001E015F8147E1603000113FEA2C75AA201011407
+17F05CA20103140F17E05CA20107EC1FC0A24A1480163F010F15005E167E5E131F4B5A6E
+485A4B5A90393FB80F80DA9C1FC7FCEC0FFCEC03E049C9FCA2137EA213FEA25BA21201A2
+5BA21203A2387FFFE0B5FCA22D3A80A72E>I<027E1360903901FF81E0903807C1C39039
+1F80E7C090383F00F7017E137F5B4848EB3F80485AA2485A000F15005B121F5D4848137E
+A3007F14FE90C75AA3481301485CA31403485CA314074A5A127C141F007E133F003E495A
+14FF381F01EF380F879F3903FF1F80EA00FC1300143F92C7FCA35C147EA314FE5CA21301
+130390B512F05AA2233A77A72A>I<D801F013FC3A07FC07FF803A0F3E0F03C0260E1F1C
+13E0001EEB380F001C1370003CEBE01F123814C0D8783F14C00070903880070092C7FC91
+C8FC12F05BEA007EA313FE5BA312015BA312035BA312075BA3120F5BA3121F5B0007C9FC
+232979A726>I<EC7F80903801FFE0903807C0F890381F003C013E131C013C131E017C13
+3E49137E15FEA2000114FCA215706D13007FEBFFC014FC6C13FF15806D13C06D13E0010F
+13F01300140F14071403120C123F387F80011403D8FF0013E0A300FCEB07C000F0EB0F80
+12700078EB1F006C133C381F01F83807FFE0C690C7FC1F297AA725>I<EB01C0EB03F013
+07A25CA2130FA25CA2131FA25CA2133FA291C7FCA2007FB51280B6FC1500D8007EC7FC13
+FEA25BA21201A25BA21203A25BA21207A25BA2120FA25BA2121F141C1380A2003F133C14
+38EB0078147014F05C495AEA1F03495A6C48C7FCEA07FCEA01F0193A78B81E>I<137C48
+B4141C26038F80137EEA0707000E7F001E15FE121CD83C0F5C12381501EA781F00700180
+5BA2D8F03F1303140000005D5B017E1307A201FE5C5B150F1201495CA2151F0003EDC1C0
+491481A2153F1683EE0380A2ED7F07000102FF13005C01F8EBDF0F00009038079F0E9039
+7C0F0F1C90391FFC07F8903907F001F02A2979A731>I<017CEB01C048B4EB07F038038F
+80EA0707000E01C013F8121E001C1403EA3C0F0038EC01F0A2D8781F130000705BA2EAF0
+3F91C712E012005B017E130116C013FE5B1503000115805BA2ED07001203495B150EA25D
+A25D1578000114706D5B0000495A6D485AD97E0FC7FCEB1FFEEB03F0252979A72A>I<01
+7C167048B491387001FC3A038F8001F8EA0707000E01C015FE001E1403001CEDF000EA3C
+0F0038177C1507D8781F4A133C00701380A2D8F03F130F020049133812005B017E011F14
+784C137013FE5B033F14F0000192C712E05BA2170100034A14C049137E17031880A2EF07
+0015FE170E00010101141E01F86D131C0000D9039F5BD9FC076D5A903A3E0F07C1E0903A
+1FFC03FFC0902703F0007FC7FC372979A73C>I<903903F001F890390FFC07FE90393C1E
+0E0F9026780F1C138001F0EBB83FD801E013F89039C007F07FEA0380000714E0D9000F14
+0048151C000E4AC7FCA2001E131FA2C75BA2143F92C8FCA35C147EA314FE4A131CA30101
+143C001E1538003F491378D87F811470018314F000FF5D9039077801C039FE0F7C033A7C
+0E3C078027783C1E1EC7FC391FF80FFC3907E003F029297CA72A>I<137C48B414382603
+8F8013FCEA0707000E7F001E1401001C15F8EA3C0F12381503D8781F14F000701380A2D8
+F03F1307020013E012005B017E130F16C013FE5B151F1201491480A2153F000315005BA2
+5D157EA315FE5D00011301EBF8030000130790387C1FF8EB3FF9EB07E1EB00035DA21407
+000E5CEA3F80007F495AA24A5AD8FF0090C7FC143E007C137E00705B387801F0383803E0
+381E0FC06CB4C8FCEA03F8263B79A72C>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fj cmbx12 12 36
+/Fj 36 123 df<ED0FFF4AB512C0020F14F0027F80903A01FFF803FC499038C000FE010F
+EB00034948497E49485B5C495A4C138001FF6E13005CA3705AEE01F893C8FCA74BB51280
+B9FCA5C69038E00003B3B0007FD9FFC1B6FCA538467EC53E>12 D<EA07C0EA1FF0EA3FF8
+EA7FFCEAFFFEA7EA7FFCEA3FF8EA1FF0EA07C00F0F788E1F>46 D<EC03C01407141F147F
+EB03FF133FB6FCA413C3EA0003B3B3ADB712FCA5264177C038>49
+D<ECFFE0010F13FE013F6D7E90B612E0000315F82607FC0313FE3A0FE0007FFFD81F806D
+138048C7000F13C0488001C015E001F07F00FF6E13F07F17F881A46C5A6C5A6C5AC9FC17
+F05DA217E05D17C04B13804B1300A2ED1FFC4B5A5E4B5A4B5A4A90C7FC4A5A4A5AEC0FF0
+4A5AEC3F804AC7127814FE495A494814F8D907E014F0495A495A49C8FC017C1401491403
+48B7FC4816E05A5A5A5A5AB8FC17C0A42D417BC038>I<ECFFF0010713FF011F14C0017F
+14F049C66C7ED803F8EB3FFED807E06D7E81D80FF86D138013FE001F16C07FA66C5A6C48
+15806C485BC814005D5E4B5A4B5A4B5A4A5B020F1380902607FFFEC7FC15F815FF16C090
+C713F0ED3FFCED0FFEEEFF80816F13C017E0A26F13F0A217F8A3EA0FC0EA3FF0487EA248
+7EA217F0A25D17E06C5A494913C05BD83F80491380D81FF0491300D80FFEEBFFFE6CB612
+F800015D6C6C14C0011F49C7FC010113E02D427BC038>I<0007150301E0143F01FFEB07
+FF91B6FC5E5E5E5E5E16804BC7FC5D15E092C8FC01C0C9FCAAEC3FF001C1B5FC01C714C0
+01DF14F09039FFE03FFC9138000FFE01FC6D7E01F06D13804915C0497F6C4815E0C8FC6F
+13F0A317F8A4EA0F80EA3FE0487E12FF7FA317F05B5D6C4815E05B007EC74813C0123E00
+3F4A1380D81FC0491300D80FF0495AD807FEEBFFFC6CB612F0C65D013F1480010F01FCC7
+FC010113C02D427BC038>53 D<121E121F13FC90B712FEA45A17FC17F817F017E017C0A2
+481680007EC8EA3F00007C157E5E00785D15014B5A00F84A5A484A5A5E151FC848C7FC15
+7E5DA24A5A14035D14074A5AA2141F5D143FA2147F5D14FFA25BA35B92C8FCA35BA55BAA
+6D5A6D5A6D5A2F447AC238>55 D<EC7FF00103B5FC010F14C0013F14F090397F801FFC3A
+01FC0003FE48486D7E497F4848EC7F80163F484815C0A2001F151FA27FA27F7F01FE143F
+6D158002C0137F02F014006C01FC5B6E485A6C9038FF83FCEDE7F86CECFFE06C5D6C92C7
+FC6D14C06D80010F14F882013F8090B7FC48013F14802607FC0F14C0260FF80314E04848
+C6FC496D13F0003F141F48481307496D13F8150000FF157F90C8123F161F160FA21607A3
+6D15F0127F160F6D15E06C6C141F6DEC3FC06C6CEC7F80D80FFE903801FF003A07FFC00F
+FE6C90B55AC615F0013F14C0010F91C7FC010013F02D427BC038>I<DCFFF01470031F01
+FF14F04AB6EAE0010207EDF803023FEDFE0791B539E001FF0F4949C7EA3F9F010701F0EC
+0FFF4901C0804990C87E4948814948814948167F4849163F4849161F5A4A160F485B1907
+4890CAFC19035A5BA2007F1801A34994C7FC12FFAE127F7F1AF0A2123FA27F6C18011AE0
+6C7F19036C6D17C06E16077E6C6DEE0F806C6DEE1F006D6C5E6D6C167E6D6C6C5D6D6D4A
+5A6D01F0EC07F0010101FEEC1FE06D903AFFF001FF80023F90B6C7FC020715FC020115F0
+DA001F1480030001F8C8FC44467AC451>67 D<BA12F8A485D8001F90C71201EF003F180F
+180318011800A2197E193EA3191EA21778A285A405F890C7FCA316011603161F92B5FCA5
+ED001F160316011600A2F101E01778A2F103C0A494C7FC1907A21A80A2190FA2191FA219
+3FF17F0061601807181F4DB5FCBBFC61A443447DC34A>69 D<BA1280A419C026003FFEC7
+121F1701EF007F183F181F180F180719E01803A31801A3EE01E0F000F0A419001603A316
+07160F167F91B6FCA59138FE007F160F16071603A31601A693C9FCAFB712F0A53C447CC3
+46>I<B9FC18F018FE727E19E0D8001F90C7000F7F05017F716C7E727E727E721380A21A
+C084A21AE0A91AC0A24E1380A21A00604E5A4E5A4D485A050F5B92B712C096C7FC18FC18
+C092CBFCB3A7B712E0A543447DC34D>80 D<DAFFE0131C010701FE133C013F9038FF807C
+90B6EAE0FC4815F9489038801FFF3907FC00014848EB007F4848143F4848140F49140700
+7F15035B1601160012FF177CA27FA26D153C7F7F6D92C7FC6C7EEBFFE014FE6CEBFFF015
+FF6C15E016FC6C816C6F7E6C826C826C6C81011F810107811300020F80140003077FED00
+7F82040F1380828212F082A282A27EA218007EA26C5D6C5E6D14036D5D6D140701F84A5A
+01FFEC3FF002F8EBFFE0486CB65AD8FC1F92C7FCD8F80714FC48C614F048010713803146
+7AC43E>83 D<B76C010FB512F8A526003FFEC93803E000B3B3A9011F17076280190F6D60
+6F151F6D95C7FC6D6D5D197E6D6D5D6D6D1403DA7FFC4A5A6EB4EC3FF0020F9039F003FF
+E06E90B61280020193C8FC6E6C14FC030F14E09226007FFEC9FC4D457CC356>85
+D<903801FFE0011F13FE017F6D7E48B612E03A03FE007FF84848EB1FFC6D6D7E486C6D7E
+A26F7FA36F7F6C5A6C5AEA00F090C7FCA40203B5FC91B6FC1307013F13F19038FFFC0100
+0313E0000F1380381FFE00485A5B127F5B12FF5BA35DA26D5B6C6C5B4B13F0D83FFE013E
+EBFFC03A1FFF80FC7F0007EBFFF86CECE01FC66CEB8007D90FFCC9FC322F7DAD36>97
+D<EB7FC0B5FCA512037EB1ED0FF892B57E02C314E002CF14F89139DFC03FFC9139FF000F
+FE02FCEB03FF4A6D13804A15C04A6D13E05CEF7FF0A218F8173FA318FCAC18F8A2177F18
+F0A3EFFFE06E15C06E5B6E491380027C491300496C495A903AFC1FC07FFC496CB512F0D9
+F00314C049C691C7FCC8EA1FF036467DC43E>I<EC3FFC49B512C0010F14F0013F14FC90
+397FF003FE9039FFC001FF0003495A48494813805B120F485AA2485A6F1300007F6E5AED
+00784991C7FCA212FFAC6C7EA3123F6DEC03C0A26C6C1407000F16806D140F6C6DEB1F00
+6C6D133E6C01F05B3A007FFC03F86DB55A010F14C0010391C7FC9038003FF82A2F7CAD32
+>I<EE03FEED07FFA5ED001F160FB1EC3FE0903803FFFC010FEBFF8F013F14CF9039FFF8
+07FF48EBC00148903880007F4890C7123F4848141F49140F121F485AA3127F5BA212FFAC
+127FA37F123FA26C6C141FA26C6C143F0007157F6C6C91B5FC6CD9C00314FC6C9038F01F
+EF6DB5128F011FEBFE0F010713F89026007FC0EBF80036467CC43E>I<EC3FF80103B57E
+010F14E0013F8090397FF83FF89039FFC007FC48496C7E48496C7E48486D1380485A001F
+ED7FC05B003FED3FE0A2127F5B17F0161F12FFA290B7FCA401F0C9FCA5127FA27FA2123F
+17F06C7E16016C6C15E06C6C14036C6DEB07C06C6DEB0F806C01F0EB3F0090397FFE01FE
+011FB55A010714F0010114C09026001FFEC7FC2C2F7DAD33>I<EDFF80020F13E0027F13
+F049B512F849EB8FFC90390FFE0FFE90381FFC1F14F8133FEB7FF0A2ED0FFCEBFFE0ED03
+F0ED00C01600ABB612F8A5C601E0C7FCB3B0007FEBFFE0A527467DC522>I<DAFFE0137E
+010F9039FE03FF80013FEBFF8F90B812C048D9C07F133F489038001FF84848EB0FFC4848
+903907FE1F80001F9238FF0F00496D90C7FCA2003F82A8001F93C7FCA26D5B000F5D6C6C
+495A6C6C495A6C9038C07FF04890B55A1680D8078F49C8FC018013E0000F90CAFCA47F7F
+7F90B612C016FC6CEDFF8017E06C826C16FC7E000382000F82D81FF0C77ED83FC0140748
+48020113808248C9FC177FA46D15FF007F17006D5C6C6C4A5A6C6C4A5AD80FFEEC3FF83B
+07FFC001FFF0000190B612C06C6C92C7FC010F14F8D9007F90C8FC32427DAC38>I<EB7F
+C0B5FCA512037EB1ED07FE92383FFF8092B512E002C114F89139C7F03FFC9138CF801F91
+39DF000FFE14DE14FC4A6D7E5CA25CA35CB3A7B60083B512FEA537457CC43E>I<137C48
+B4FC4813804813C0A24813E0A56C13C0A26C13806C1300EA007C90C7FCAAEB7FC0EA7FFF
+A512037EB3AFB6FCA518467CC520>I<EB7FC0B5FCA512037EB293387FFFE0A593380FE0
+004C5A4CC7FC167E5EED03F8ED07E04B5A4B5A037FC8FC15FEECC1FCECC3FE14C7ECDFFF
+91B57E82A202F97F02E17F02C07FEC807F6F7E826F7E816F7F836F7F816F7F83707E163F
+B60003B512F8A535457DC43B>107 D<EB7FC0B5FCA512037EB3B3B3A3B61280A519457C
+C420>I<90277F8007FEEC0FFCB590263FFFC090387FFF8092B5D8F001B512E002816E48
+80913D87F01FFC0FE03FF8913D8FC00FFE1F801FFC0003D99F009026FF3E007F6C019E6D
+013C130F02BC5D02F86D496D7EA24A5D4A5DA34A5DB3A7B60081B60003B512FEA5572D7C
+AC5E>I<90397F8007FEB590383FFF8092B512E0028114F8913987F03FFC91388F801F00
+0390399F000FFE6C139E14BC02F86D7E5CA25CA35CB3A7B60083B512FEA5372D7CAC3E>
+I<EC1FFC49B512C0010714F0011F14FC90397FF80FFF9026FFC0017F48496C7F4848C7EA
+3FE000078248486E7E49140F001F82A2003F82491407007F82A400FF1780AA007F1700A4
+6C6C4A5AA2001F5E6D141F000F5E6C6C4A5AA26C6C6CEBFFE06C6D485B27007FF80F90C7
+FC6DB55A010F14F8010114C09026001FFCC8FC312F7DAD38>I<90397FC00FF8B590B57E
+02C314E002CF14F89139DFC03FFC9139FF001FFE000301FCEB07FF6C496D13804A15C04A
+6D13E05C7013F0A2EF7FF8A4EF3FFCACEF7FF8A318F017FFA24C13E06E15C06E5B6E4913
+806E4913006E495A9139DFC07FFC02CFB512F002C314C002C091C7FCED1FF092C9FCADB6
+7EA536407DAC3E>I<90387F807FB53881FFE0028313F0028F13F8ED8FFC91389F1FFE00
+0313BE6C13BC14F8A214F0ED0FFC9138E007F8ED01E092C7FCA35CB3A5B612E0A5272D7D
+AC2E>114 D<90391FFC038090B51287000314FF120F381FF003383FC00049133F48C712
+1F127E00FE140FA215077EA27F01E090C7FC13FE387FFFF014FF6C14C015F06C14FC6C80
+0003806C15806C7E010F14C0EB003F020313E0140000F0143FA26C141F150FA27EA26C15
+C06C141FA26DEB3F8001E0EB7F009038F803FE90B55A00FC5CD8F03F13E026E007FEC7FC
+232F7CAD2C>I<EB01E0A51303A41307A2130FA2131FA2133F137F13FF1203000F90B512
+80B7FCA4C601E0C7FCB3A3ED01E0A9150302F013C0137F150790393FF80F8090391FFC1F
+006DB5FC6D13FC01015B9038003FE023407EBE2C>I<D97FC049B4FCB50103B5FCA50003
+EC000F6C81B3A85EA25EA25E7E6E491380017FD901F713FE9138F807E76DB512C7010F14
+07010313FE9026007FF0EBFC00372E7CAC3E>I<B6903803FFFCA5000101E09038003E00
+6C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13076D5DED800F6D92C7
+FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15FD021F5B15FF6E5BA3
+6E5BA26E90C8FCA26E5AA26E5AA21578362C7EAB3B>I<B6903803FFFCA5000101E09038
+003E006C163C80017F5D8017F8013F5D6E1301011F5D6E1303010F5D6E13076D5DED800F
+6D92C7FC15C05E6DEBE01E163E6D143CEDF07C027F1378EDF8F8023F5B15FD021F5B15FF
+6E5BA36E5BA26E90C8FCA26E5AA26E5AA21578A215F85D14015D001F1303D83F805B387F
+C007D8FFE05B140F92C9FC5C143E495A387FC1F8EB07F06CB45A6C5B000790CAFCEA01FC
+36407EAB3B>121 D<001FB71280A49026FC001F130001E0495A5B49495A90C7485A4849
+5B123E4A5B4A5B003C495BA24A90C7FC4A5A4A5AC7FC4A5A495B495BA2495B4990388007
+80491300A2495A4948130F49481400A2485B48495B485BA248495B4890C75A48485C1503
+4848EB1FFEB7FCA4292C7DAB32>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fk cmtt10 10.95 64
+/Fk 64 126 df<1438147C14FCA4EB03FF011F13E090B512FC4880000780481580261FFE
+FD13C09039F0FC3FE0D83FC0131FD87F80EB0FF001001307007E15F800FE14035A1507A3
+6CEC03F0A2007F91C7FC138013C0EA3FF0EA1FFE13FF6C13FF6C14E0000114F86C6C7F01
+1F7F01037F0100148002FD13C09138FC7FE0151FED0FF015070018EC03F8127E1501B4FC
+A35AA26CEC03F07E01801307ED0FE0D83FC0131F01F0EB7FC0D81FFEB512806CB612006C
+5C6C5CC614F0013F13C0D907FEC7FCEB00FCA5147C143825477BBE30>36
+D<141E147F14FF5BEB03FEEB07FCEB0FF0EB1FE0EB3FC0EB7F80EBFF00485A5B12035B48
+5A120F5BA2485AA2123F5BA2127F90C7FCA412FEAD127FA47F123FA27F121FA26C7EA27F
+12076C7E7F12017F6C7EEB7F80EB3FC0EB1FE0EB0FF0EB07FCEB03FEEB01FF7F147F141E
+184771BE30>40 D<127812FE7E7F6C7E6C7EEA0FF06C7E6C7E6C7E6C7EEB7F80133F14C0
+131FEB0FE014F01307A2EB03F8A214FC1301A214FE1300A4147FAD14FEA4130114FCA213
+0314F8A2EB07F0A2130F14E0EB1FC0133F1480137FEBFF00485A485A485A485AEA3FE048
+5A485A90C7FC5A1278184778BE30>I<14E0497E497EA60038EC0380007EEC0FC0D8FF83
+EB3FE001C3137F9038F3F9FF267FFBFB13C06CB61280000FECFE00000314F86C5C6C6C13
+C0011F90C7FC017F13C048B512F04880000F14FE003FECFF80267FFBFB13C026FFF3F913
+E09038C3F87F0183133FD87E03EB0FC00038EC0380000091C7FCA66D5A6D5A23277AAE30
+>I<143EA2147FAF007FB7FCA2B81280A36C1600A2C76CC8FCAF143EA229297DAF30>I<EA
+03E0EA0FF0EA1FF813FCEA3FFEA213FFA27EA27E1203EA007FA2137E13FEEA01FC1203EA
+07F8EA3FF0127FEAFFE0EA7F801300123C1019708B30>I<120FEA3FC0EA7FE0A2EAFFF0
+A4EA7FE0A2EA3FC0EA0F000C0C6E8B30>46 D<16F01501ED03F8A21507A2ED0FF0A2ED1F
+E0A2ED3FC0A2ED7F80A2EDFF00A24A5AA25D1403A24A5AA24A5AA24A5AA24A5AA24A5AA2
+4AC7FCA2495AA25C1303A2495AA2495AA2495AA2495AA2495AA249C8FCA2485AA25B1203
+A2485AA2485AA2485AA2485AA2485AA248C9FCA25AA2127CA225477BBE30>I<14FE9038
+07FFC0497F013F13F8497F90B57E48EB83FF4848C6138049137F4848EB3FC04848EB1FE0
+49130F001F15F0491307A24848EB03F8A290C712014815FCA400FEEC00FEAD6C14016C15
+FCA36D1303003F15F8A26D1307001F15F0A26D130F6C6CEB1FE0A26C6CEB3FC06C6CEB7F
+806D13FF2601FF8313006CEBFFFE6D5B6D5B010F13E06D5BD900FEC7FC273A7CB830>I<
+EB03C0497EA2130FA2131FA2133F137F13FF1203123FB5FCA213EF138FEA7E0F1200B3B0
+003FB512F84814FCB612FEA26C14FC6C14F81F3977B830>I<EB07FC90383FFFC090B512
+F00003804814FE4880261FF80F1380263FE00113C09038C0007F4848EB3FE090C7121FED
+0FF04814075A6C15F81503A3127E1218C8FCA2150716F0150F16E0151F16C0153FED7F80
+15FF4A13005DEC07FC4A5A4A5A4A5A4A5A4A5A4990C7FC495A495AEB0FF0EB3FE0495A49
+5A4890C8FC4848EB01F04848EB03F8485AEA1FE048B6FCB7FCA37E6C15F025397BB830>
+I<EB03FF013F13E090B512F84814FE4880481580260FFE0113C09038F0007F4848EB1FE0
+150F16F01507A26C5A6C5AC8FC150F16E0A2151FED3FC0157FEDFF8002071300903807FF
+FE495B5D8115FF6D1480D9000113C09138003FE0ED1FF0ED07F8150316FC150116FE1500
+A21218127EB4FCA2150116FC4814036C15F86C6C13076DEB1FF0D83FF0133F3A1FFE01FF
+E06CB612C06C15806CECFE00C65C013F13F001031380273A7CB830>I<EC03FC4A7E140F
+141FA2143F147F157E14FEA2EB01FCEB03F8A2EB07F0A2EB0FE0EB1FC0A2EB3F80A2EB7F
+0013FEA2485A485AA2485AA2485A485AA2485AA248C7FC12FEB8FC1780A46C1600C8007E
+C7FCAA91387FFFFE91B6FCA46E5B29397DB830>I<000FB612804815C05AA316800180C8
+FCAEEB83FF019F13C090B512F015FC8181D9FE0313809039F0007FC049133F0180EB1FE0
+6CC7120F000E15F0C81207A216F81503A31218127EA2B4FC150716F048140F6C15E06C14
+1F6DEB3FC06D137F3A3FE001FF80261FFC0F13006CB55A6C5C6C5C6C14E06C6C1380D90F
+FCC7FC25397BB730>I<127CB712FC16FEA416FC48C7EA0FF816F0ED1FE0007CEC3FC0C8
+EA7F80EDFF00A24A5A4A5A5D14075D140F5D4A5AA24A5AA24AC7FCA25C5C13015CA21303
+5CA213075CA4495AA6131F5CA96D5A6DC8FC273A7CB830>55 D<49B4FC011F13F0017F13
+FC90B57E0003ECFF804815C048010113E03A1FF8003FF049131FD83FC0EB07F8A24848EB
+03FC90C71201A56D1303003F15F86D13076C6CEB0FF06C6CEB1FE0D807FCEB7FC03A03FF
+83FF806C90B512006C6C13FC011F13F0497F90B512FE48802607FE0013C0D80FF8EB3FE0
+D81FE0EB0FF04848EB07F8491303007F15FC90C712014815FE481400A66C14016C15FC6D
+1303003F15F86D1307D81FF0EB1FF06D133F3A0FFF01FFE06C90B512C06C1580C6ECFE00
+6D5B011F13F0010190C7FC273A7CB830>I<49B4FC010F13E0013F13F890B57E48804880
+48010113803A0FFC007FC0D81FF0EB3FE04848131F49EB0FF048481307A290C7EA03F85A
+4815FC1501A416FEA37E7E6D130315076C7E6C6C130F6D133FD80FFC13FF6CB6FC7E6C14
+FE6C14F9013FEBE1FC010F138190380060011400ED03F8A2150716F0150F000F15E0486C
+131F486CEB3FC0157FEDFF804A1300EC07FE391FF01FFC90B55A6C5C6C5C6C1480C649C7
+FCEB3FF0273A7CB830>I<120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F00C7FC
+AF120FEA3FC0EA7FE0A2EAFFF0A4EA7FE0A2EA3FC0EA0F000C276EA630>I<007FB7FCA2
+B81280A36C16006C5DCBFCA7003FB612FE4881B81280A36C1600A229157DA530>61
+D<EC1FE0ECFFF8010313FE010F7F4914804914C090397FF03FE09038FF800F4890380007
+F0D803FC13033A07F801FBF89038F007FF380FE01F4A13FCEA1FC0495A003FEBFF0F9038
+00FE07903901FC03FE007FEBF801EA7E03ECF000A2EAFE0700FC49137EAA00FE6D13FED8
+7E0314FCA2ECF801D87F0114F8003FEBFC03903900FE07F0903880FF0F001F90387FFFE0
+6D6C13C0EA0FE06E13803A07F007FE009038F801F86C6CC7127C6CB414FE6CEB80039038
+7FF01F6DB512FC6D14F86D14E0010314C00100EBFE00EC1FF0273A7CB830>64
+D<147F4A7EA2497FA4497F14F7A401077F14E3A3010F7FA314C1A2011F7FA490383F80FE
+A590387F007FA4498049133F90B6FCA34881A39038FC001F00038149130FA40007814913
+07A2D87FFFEB7FFFB56CB51280A46C496C130029397DB830>I<007FB512F0B612FE6F7E
+82826C813A03F8001FF815076F7E1501A26F7EA615015EA24B5A1507ED1FF0ED7FE090B6
+5A5E4BC7FC6F7E16E0829039F8000FF8ED03FC6F7E1500167FA3EE3F80A6167F1700A25E
+4B5A1503ED1FFC007FB6FCB75A5E16C05E6C02FCC7FC29387EB730>I<91387F803C9039
+03FFF03E49EBFC7E011F13FE49EBFFFE5B9038FFE07F48EB801F3903FE000F484813075B
+48481303A2484813015B123F491300A2127F90C8FC167C16005A5AAC7E7EA2167C6D14FE
+123FA27F121F6D13016C6C14FCA26C6CEB03F86D13076C6CEB0FF03901FF801F6C9038E0
+7FE06DB512C06D14806D1400010713FC6D13F09038007FC0273A7CB830>I<003FB512E0
+4814FCB67E6F7E6C816C813A03F8007FF0ED1FF8150F6F7E6F7E15016F7EA2EE7F80A216
+3F17C0161FA4EE0FE0AC161F17C0A3163F1780A2167F17005E4B5A15034B5A150F4B5AED
+7FF0003FB65A485DB75A93C7FC6C14FC6C14E02B387FB730>I<007FB7FCB81280A47ED8
+03F8C7123FA8EE1F0093C7FCA4157C15FEA490B5FCA6EBF800A4157C92C8FCA5EE07C0EE
+0FE0A9007FB7FCB8FCA46C16C02B387EB730>I<3B3FFF800FFFE0486D4813F0B56C4813
+F8A26C496C13F06C496C13E0D803F8C7EAFE00B290B6FCA601F8C7FCB3A23B3FFF800FFF
+E0486D4813F0B56C4813F8A26C496C13F06C496C13E02D387FB730>72
+D<007FB6FCB71280A46C1500260007F0C7FCB3B3A8007FB6FCB71280A46C1500213879B7
+30>I<D83FFC90381FFF80486C4913C0B54913E0A26C6D6C13C06C6E13800003913801F8
+00EBF7C0A3EBF3E0A314F013F1A214F8A213F014FCA2147C147EA2143E143FA2141FA215
+81A2140F15C1A2140715E1A2140315F1A21401A215F91400A3157DA3153FEA3FFF481380
+B5EAC01FA26CEB800F6C496C5A2B387EB730>78 D<007FB512F0B612FE6F7E16E0826C81
+3903F8003FED0FFCED03FE15016F7EA2821780163FA6167F17005EA24B5A1503ED0FFCED
+3FF890B6FC5E5E16804BC7FC15F001F8C9FCB0387FFFC0B57EA46C5B29387EB730>80
+D<003FB57E4814F0B612FC15FF6C816C812603F8017F9138003FF0151F6F7E1507150382
+1501A515035E1507150F4B5A153F4AB45A90B65A5E93C7FC5D8182D9F8007FED3FE0151F
+150F821507A817F8EEF1FCA53A3FFF8003FB4801C0EBFFF8B56C7E17F06C496C13E06C49
+EB7FC0C9EA1F002E397FB730>82 D<90390FF803C0D97FFF13E048B512C74814F74814FF
+5A381FF80F383FE001497E4848137F90C7123F5A48141FA2150FA37EED07C06C91C7FC7F
+7FEA3FF0EA1FFEEBFFF06C13FF6C14E0000114F86C80011F13FF01031480D9003F13C014
+019138007FE0151FED0FF0A2ED07F8A2007C140312FEA56C140716F07F6DEB0FE06D131F
+01F8EB3FC001FF13FF91B51280160000FD5CD8FC7F13F8D8F81F5BD878011380253A7BB8
+30>I<003FB712C04816E0B8FCA43AFE003F800FA8007CED07C0C791C7FCB3B1011FB5FC
+4980A46D91C7FC2B387EB730>I<3B7FFFC007FFFCB56C4813FEA46C496C13FCD803F8C7
+EA3F80B3B16D147F00011600A36C6C14FE6D13016D5CEC800390393FE00FF890391FF83F
+F06DB55A6D5C6D5C6D91C7FC9038007FFCEC1FF02F3980B730>I<D87FFE90380FFFC0B5
+4913E06E5AA24A7E6C486D13C0D807F0903801FC00A26D130300035DA46C6C495AA46C6C
+495AA46D131F6D5CA3EC803F013F5CA46D6C48C7FCA490380FE0FEA401075B14F1A30103
+5BA314FB01015BA314FFA26D5BA46E5A6E5A2B397EB730>I<3A3FFF01FFF84801837F02
+C77FA202835B6C01015B3A01FC007F806D91C7FC00005C6D5BEB7F01EC81FCEB3F8314C3
+011F5B14E7010F5B14FF6D5BA26D5BA26D5BA26D90C8FCA4497FA2497FA2815B81EB0FE7
+81EB1FC381EB3F8181EB7F0081497F49800001143F49800003141F49800007140FD87FFE
+EB7FFFB590B5128080A25C6C486D130029387DB730>88 D<007FB5FCB61280A4150048C8
+FCB3B3B3A5B6FC1580A46C140019476DBE30>91 D<127CA212FEA27EA26C7EA26C7EA26C
+7EA26C7EA26C7EA26C7EA212017FA26C7EA26D7EA26D7EA26D7EA26D7EA26D7EA26D7EA2
+130180A26D7EA26E7EA26E7EA26E7EA26E7EA26E7EA26E7EA2140181A26E7EA2ED7F80A2
+ED3FC0A2ED1FE0A2ED0FF0A2ED07F8A21503A2ED01F0150025477BBE30>I<007FB5FCB6
+1280A47EC7123FB3B3B3A5007FB5FCB6FCA46C140019477DBE30>I<EB3FFC48B57E4814
+E04880488048809038F00FFE9038E001FF806F7E6C48133F6C4880C8121FA491B5FC130F
+137F48B6FC12075A48EBC01F383FFC00EA7FE0138048C7FC5AA46C143FA26C6C137F9038
+C001FF263FF80FEBFFC06CB712E0A2000714F76C14C3C6020013C0D93FF090C7FC2B2A7C
+A830>97 D<EA3FFC487E12FFA2127F123F1200AAEC03FE91381FFF80027F13E091B57E90
+B612FC82ECFE079138F001FF4A6C13804A137F4AEB3FC091C7121F4915E0160FA217F016
+07A8160FA217E07F161F6EEB3FC0A26EEB7F806E13FFDAF00313009138FC0FFE91B55A5E
+495CD97E7F13C0D93C1F90C7FC90380003FC2C3980B730>I<ECFFE0010713FC011F7F01
+7F7F90B612804815C048EB807F3907FC003F485A485A49EB1F804848EB0F004990C7FC12
+7F90C9FCA25A5AA87E7EA27F003FEC07C06DEB0FE06C7E6D131F6C6C14C0D807FE133F90
+39FFC0FF806C90B5FCC615006D5B011F13F801075B01011380232A7AA830>I<913801FF
+E04A7F5CA28080EC0007AAEB03FE90381FFF874913E790B6FC5A5A481303380FFC00D81F
+F0133F49131F485A150F4848130790C7FCA25AA25AA87E6C140FA27F003F141F6D133F6C
+7E6D137F390FF801FF2607FE07EBFFC06CB712E06C16F06C14F76D01C713E0011F010313
+C0D907FCC8FC2C397DB730>I<49B4FC010713E0011F13F8017F7F90B57E488048018113
+803A07FC007FC04848133FD81FE0EB1FE0150F484814F0491307127F90C7FCED03F85A5A
+B7FCA516F048C9FC7E7EA27F003FEC01F06DEB03F86C7E6C7E6D1307D807FEEB1FF03A03
+FFC07FE06C90B5FC6C15C0013F14806DEBFE00010713F8010013C0252A7CA830>I<EDFF
+80020713E0021F13F05C4A13F891B5FC491387903803FE079138FC03F0903907F800C04A
+1300A8003FB612C04815E0B7FCA36C15C0260007F0C7FCB3A9003FB512FE4880B71280A2
+6C15006C5C25397DB830>I<D903FC13FF90261FFF8713C04913DF90B712E05A5A2607FE
+07138F903AF801FE07C048486C6CC7FCA2497F001F8149133FA56D137F000F92C7FC6D5B
+A26C6C485AEBFE0790B55A5D485C15C001DF5BD9C3FCC8FC01C0C9FCA37F7F6CB512F015
+FF6C15C04815F0488148813A3FE0001FFE0180130148C8127F007E8100FE168048151FA5
+6C153F007FED7F006D5C6C6C495A01F013076CB4EB7FFC6C90B55A6C5D000115C06C6C91
+C7FC011F13FC010113C02B3E7DA730>I<EA3FFC487E12FFA2127F123F1200AAEC01FE91
+380FFF80023F13E091B57E90B67EA29138FE07FCECF8039138E001FE14C0EC8000A291C7
+FCA25BB3A23B3FFFF81FFFF8486D4813FCB500FE14FEA26C01FC14FC6C496C13F82F3880
+B730>I<14E0EB03F8A2497EA36D5AA2EB00E091C8FCA9381FFFF8487F5AA27E7EEA0001
+B3A9003FB612C04815E0B7FCA27E6C15C023397AB830>I<EC01C0EC07F0A2EC0FF8A3EC
+07F0A2EC01C091C7FCA990B512F04814F8A47EEB0003B3B3A5EC07F0A2123C007EEB0FE0
+B4131FEC3FC0147F90B512806C14005C6C5B000F13F0000313C01D4E7CB830>I<EA7FF8
+487EA4127F1200AB0203B512804A14C017E0A217C06E14809139001FE0004B5A4B5A4BC7
+FC4A5A4A5AEC0FF84A5A4A5A4A5A4A5A01FD7F90B57E8114F7ECE3F8ECC1FCEC81FEEC00
+FF497F496D7E6F7E826F7E15076F7E6F7E3B7FFFF81FFFE0B56C4813F017F8A217F06C49
+6C13E02D387FB730>I<387FFFF8B57EA47EEA0001B3B3A8007FB612F0B712F8A46C15F0
+25387BB730>I<02FC137E3B7FC3FF01FF80D8FFEF01877F90B500CF7F15DF92B57E6C01
+0F13872607FE07EB03F801FC13FE9039F803FC01A201F013F8A301E013F0B3A23C7FFE0F
+FF07FF80B548018F13C0A46C486C01071380322881A730>I<EC01FE3A3FFC0FFF80267F
+FE3F13E000FF90B57E90B67E7E6C9038FE07FCC6EBF8039138E001FE14C0EC8000A291C7
+FCA25BB3A23B3FFFF81FFFF8486D4813FCB500FE14FEA26C01FC14FC6C496C13F82F2880
+A730>I<49B4FC010F13E0013F13F8497F90B57E0003ECFF8014013A07FC007FC04848EB
+3FE0D81FE0EB0FF0A24848EB07F8491303007F15FC90C71201A300FEEC00FEA86C14016C
+15FCA26D1303003F15F86D13076D130F6C6CEB1FF06C6CEB3FE06D137F3A07FF01FFC06C
+90B512806C15006C6C13FC6D5B010F13E0010190C7FC272A7CA830>I<EC03FE3A3FFC1F
+FF80267FFE7F13E000FF90B57E90B612FC6C816CEBFE07C69038F001FF4A6C13804A137F
+4AEB3FC091C7121F4915E0160FA217F01607A8160FA217E07F161F6EEB3FC0A26EEB7F80
+6E13FFDAF00313009138FC0FFE91B55A5E495C6E13C0021F90C7FCEC03FC91C9FCAD383F
+FFF8487FB57EA26C5B6C5B2C3C80A730>I<ED07F83A3FFF803FFF486DB51280B512C302
+CF14C06C13DF6C9038FFFC3FD8001F13E09238801F809238000F004A90C7FC5C5C5CA25C
+A45CAF003FB512FC4880B7FCA26C5C6C5C2A287EA730>114 D<90381FFC1E48B5129F00
+0714FF5A5A5A387FF007EB800100FEC7FC4880A46C143E007F91C7FC13E06CB4FC6C13FC
+6CEBFF806C14E0000114F86C6C7F01037F9038000FFF02001380007C147F00FEEC1FC0A2
+150F7EA27F151F6DEB3F806D137F9039FC03FF0090B6FC5D5D00FC14F0D8F83F13C02678
+0FFEC7FC222A79A830>I<EB0780497E131FA9003FB612E04815F0B7FCA36C15E026001F
+C0C7FCB216F8ED01FCA5ECE003010FEB07F814F09138FC1FF06DB512E06D14C016806D14
+009038007FFCEC1FF026337EB130>I<D83FFCEB3FFC486C497E00FF14FFA2007F147F00
+3F143F00001400B3A41501A2150315076D130F903A7FC07FFFF891B612FC6D15FE7F6D49
+13FC6D9038F87FF8010001C0C7FC2F2880A630>I<3B3FFFC01FFFE0486D4813F0B515F8
+A26C16F06C496C13E0D807E0C7EA3F00A26D5C0003157EA56D14FE00015DEC0F80EC1FC0
+EC3FE0A33A00FC7FF1F8A2147DA2ECFDF9017C5C14F8A3017E13FBA290393FF07FE0A3EC
+E03FA2011F5C90390F800F802D277FA630>119 D<3A3FFF81FFFC4801C37FB580A26C5D
+6C01815BC648C66CC7FC137FEC80FE90383F81FC90381FC3F8EB0FE3ECE7F06DB45A6D5B
+7F6D5B92C8FC147E147F5C497F81903803F7E0EB07E790380FE3F0ECC1F890381F81FC90
+383F80FE90387F007E017E137F01FE6D7E48486D7E267FFF80B5FCB500C1148014E3A214
+C16C0180140029277DA630>I<3B3FFFC07FFF80486DB512C0B515E0A26C16C06C496C13
+803B01FC0003F000A2000014076D5C137E150F017F5C7F151FD91F805BA214C0010F49C7
+FCA214E00107137EA2EB03F0157C15FCEB01F85DA2EB00F9ECFDF0147D147FA26E5AA36E
+5AA35DA2143F92C8FCA25C147EA2000F13FE486C5AEA3FC1EBC3F81387EB8FF0EBFFE06C
+5B5C6C90C9FC6C5AEA01F02B3C7EA630>I<001FB612FC4815FE5AA316FC90C7EA0FF8ED
+1FF0ED3FE0ED7FC0EDFF80003E491300C7485A4A5A4A5A4A5A4A5A4A5A4A5A4990C7FC49
+5A495A495A495A495A495A4948133E4890C7127F485A485A485A485A485A48B7FCB8FCA4
+6C15FE28277DA630>I<ED3FF0913803FFF8140F5C147F16F09138FFF00092C7FC495A5C
+B3A21303495A133F383FFFF0B55A5C91C8FC14C080003F7F38003FF813076D7E1301B3A2
+806D7E15F091387FFFF016F8141F8014039138003FF025477BBE30>I<EA7FE0EAFFFE6D
+7E8014F07EC66C7E13076D7E1301B3A2806D7E15E091387FFFE06E13F8801407141F5C4A
+13E09138FFE00092C7FC495A5CB3A21303495A137F387FFFF0B5FC14C05C49C8FCEA7FE0
+25477BBE30>125 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fl cmmi10 10.95 5
+/Fl 5 122 df<EC07F8EC3FFF9138FC0F80903903F003E090270FC001F01370D91F806D
+13F0017FC714E001FE804848147E000316014916C04848143F000FEE03805B001F160700
+3F1700495D170E007F161E49151C173C5F00FF167090C813F05F5F5FA294C7FC7EA25E6C
+5D4B7F6C6C9039079F81C0ED0F1F6C6C90383C0F836C6C01F014803C01F80FC007C7003B
+007FFF0003FED91FF0EB00F834297DA73A>11 D<EC1FF0903801FFFC010713FF011F14C0
+90397FC01FE09038FC0007D801F01301D803C090C7FC485AA290C9FC5A120EA2120F7E7F
+3803CFFF6CB57E023FC7FC3803DFFE380780E0000EC9FC5A123C5A127012F05AA515066C
+140E5D00785C007C14F0393F8007E06CB55A000791C7FC000113FC38007FE0232B7DA82A
+>34 D<147014FC1301A25CA21303A25CA21307A25CA2130FA25CA2007FB512F0B6FC15E0
+39001F8000133FA291C7FCA25BA2137EA213FEA25BA21201A25BA21203A25BA21207EC01
+C013E01403000F1480A2EBC0071500140E141E5C000713385C3803E1E03801FF80D8003E
+C7FC1C3A7EB821>116 D<D901F8133FD907FEEBFFE0903A1E0F83C0F0903A3807C780F8
+90397003CF0301E013FED801C0EBFC071203018013F8D8070015F0EE01C0000E4AC7FCA2
+001E1307A2C75BA2140F5DA3141F5DA3143F92380001C0A34A1303001E1680003F017E13
+07267F80FE14005ED8FF81141ED901DF131CD8FE035C3A7C078F80F03A3C0F07C1E03A1F
+FC03FF802707F0007EC7FC2D297EA734>120 D<137C48B4EC03802603C7C0EB0FC0EA07
+03000F7F000E151F001C168013071238163FD8780F150000705BA2D8F01F5C4A137E1200
+133F91C712FE5E5B137E150113FE495CA2150300015D5BA215075EA2150F151F00005D6D
+133F017C137F017E13FF90393F03DF8090380FFF1FEB01FC90C7123F93C7FCA25DD80380
+137ED80FE013FE001F5C4A5AA24848485A4A5A6CC6485A001C495A001E49C8FC000E137C
+380781F03803FFC0C648C9FC2A3B7EA72D>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fm cmsy10 10.95 6
+/Fm 6 106 df<EB03C0A2805CA600F0140F00FC143F00FE147F00FF14FF393FC3C3FC39
+0FE187F03903F18FC03900FDBF00EB3FFCEB0FF0EB03C0EB0FF0EB3FFCEBFDBF3903F18F
+C0390FE187F0393FC3C3FC39FF03C0FF00FE147F00FC143F00F0140F00001400A6805CA2
+20277AA92D>3 D<EB0FFCEB3FFF90B512C0000314F04880488048804880A2481580A3B7
+12C0AA6C1580A36C1500A26C5C6C5C6C5C6C5CC614C0013F90C7FCEB0FFC22227BA72D>
+15 D<153FEC03FFEC0FE0EC3F80EC7E00495A5C495AA2495AB3AA130F5C131F495A91C7
+FC13FEEA03F8EA7FE048C8FCEA7FE0EA03F8EA00FE133F806D7E130F801307B3AA6D7EA2
+6D7E80EB007EEC3F80EC0FE0EC03FFEC003F205B7AC32D>102 D<12FCEAFFC0EA07F0EA
+01FCEA007E6D7E131F6D7EA26D7EB3AA801303806D7E1300147FEC1FC0EC07FEEC00FFEC
+07FEEC1FC0EC7F0014FC1301495A5C13075CB3AA495AA2495A133F017EC7FC485AEA07F0
+EAFFC000FCC8FC205B7AC32D>I<146014F01301A214E01303A214C01307A2EB0F80A214
+005BA2131E133EA25BA2137813F8A25B1201A25B1203A2485AA25B120FA290C7FC5AA212
+3EA2123C127CA2127812F8A41278127CA2123C123EA27EA27E7FA212077FA26C7EA21201
+7FA212007FA21378137CA27FA2131E131FA27F1480A2EB07C0A2130314E0A2130114F0A2
+13001460145A77C323>I<126012F07EA21278127CA2123C123EA27EA27E7FA212077FA2
+6C7EA212017FA212007FA21378137CA27FA2131E131FA27F1480A2EB07C0A2130314E0A2
+130114F0A414E01303A214C01307A2EB0F80A214005BA2131E133EA25BA2137813F8A25B
+1201A25B1203A2485AA25B120FA290C7FC5AA2123EA2123C127CA2127812F8A25A126014
+5A7BC323>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fn cmr8 8 1
+/Fn 1 66 df<4A7E4A7EA34A7EA24A7EA3EC1BF81419A2EC30FCA2EC70FEEC607EA24A7E
+A349486C7EA2010380EC000FA201066D7EA3496D7EA2011FB57EA29038180001496D7EA3
+49147EA201E0147F4980A20001ED1F801203000716C0D80FF0EC3FE0D8FFFC0103B5FCA2
+302F7EAE35>65 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fo cmssbx10 14.4 6
+/Fo 6 115 df<001FB712E0007F16FF18E0B912FC84727E85858585859138C00001DC00
+3F7F050F7F838371148083A37213C0AC95B51280A35F4D14005F4D5B173F4CB55A91B85A
+A26161198096C7FC18FC18F0188005E0C8FC02C0CBFCB3AB7E5C001F90CCFC425376D254
+>80 D<913803FFFC027FEBFFE049B612FC010FEDFF804916E0017F16F890B812FE5A5AA2
+5A485FED801F489038F800014AEB007F4801C0141F17074A6E5A17014890C9FC18781838
+181095C7FCA280A38080806C13FC14FF15F06CECFF8016F86C15FF17E06C16F86C826C16
+FF6C836D826D826D826D820103826D82EB003F020F81140003071580ED007F040F14C016
+0316007113E083A283A283A312101238123C123F6D5D6D17C0EA7FF06D5D01FE5D6D6C91
+B5128002F013039126FF801F1400BAFC60A26060003F5F000F5F00035FC65F013F4BC7FC
+010715F8D9007F14C0020301FCC8FC3B597AD549>83 D<91381FFFE00103B512FE011F6E
+7E90B712E0000316F84882488283ECFE07DAE001148091C7FC01FC6E13C06C5A13E0496E
+13E05B90C8FC1202C9FCA50307B5FC020FB6FC49B7FC130F133F90B6123F000314E04814
+004813F8485B485B5C485BA2B5FC91C7FCA45E8093B5FC6C5C6E5A6E5A6CEBF83F91B7FC
+6C15BF6C153F6C14FE6C14FC6C14F06C4A6C13C0013FD9800F1380D90FFCC9FC333A7CB8
+3F>97 D<913803FFF8023FEBFF8091B6FC1303130F5B5BA25B90B5EAE07FED801F48EC00
+0716034AEB01004892C7FCAF001F90B5FC007F8182B7FCA46C5D6C92C7FC000349C8FCB3
+B3A77E5C6C6C5A29547DD328>102 D<91263FFFC0EB0FC00103B500FCEBFFE0010FECFF
+03013F15CF4992B5FC90B912F05A5A48EEFE0748D9FC039038FF0070DAF000150048496D
+7FA34A7F4883AA6C5F6E5BA36C6D90B5C7FCECFC036C90B65A6C5E6C5E6C5E485E5FD803
+EF92C8FC01E314FC2607E03F13C091CBFC7FA27F13FE90B712C017FCEFFF8018E018F86C
+83846C83A2198012074818C05A5A4848C7000114E049EC001F48481507A283A36D5DA26C
+6C4B13C06D5D02C0147F6C01FC0107B512806C90B812006C5F6C5F6C5F6C5F6C6C16C001
+1F93C7FC010315F8D9001F91C8FC3C517DB742>I<D81FFCEB07E0D87FFE131F6D137FB5
+13FF14035C5CA25C5CA25CEDFC00ECFFE015804AC7FC5C5C5C5CA25CA35CB3AB7E91C8FC
+EA1FFE233879B72D>114 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fp cmss10 10.95 31
+/Fp 31 121 df<027E13FF49B47E13075B5BA2EB3F8314004990C7FC137EA213FEADB6EA
+807FA6C648C7FCB3B028407FBF31>12 D<B512FEA617067F961E>45
+D<EB0FF8EB3FFF90B512C04814F048804880390FF01FFE391FC003FF4848C6138090C712
+7F48EC3FC0127EED1FE012FE48140F007C15F0123C1238001814071208C8FCA2150FA216
+E0A2151F16C0153F1680ED7F005D5D4A5A4A5A4A5A4A5A4A5A4A5A4AC7FC14FE495A495A
+495A495A495A495A49C8FC13FC485A485A485A485A485A48C9FC48B612F0B7FCA6243E7C
+BD2D>50 D<B612F8EDFF8016E016F88290C7EA1FFF03037F03007F707EEE1FF0707E707E
+1603707EA2707EEF7F80A2173F18C0A2171F18E0A2170FA218F0AC18E0171FA318C0173F
+A2EF7F80A2EFFF00A24C5A16034C5A4C5A4C5A4C5AEEFFC003035B031F90C7FC90B65A16
+F816E0168003F8C8FC343F78BE42>68 D<B8FCA690CAFCB3A390B612FCA690CAFCB3A590
+B71280A7293F78BE36>I<12FFB3B3B3A9083F78BE19>73 D<D8FFF015FEA27FA27FA27F
+12FE137FA280133F80131F80130F801307801303801301801300808081143F81141F8114
+0F81140781140381140181140081811680153F16C0151F16E0150F16F0150716F8150316
+FC1501A2ED00FE16FF167FA2163FA2161FA22F3F78BE40>78 D<4AB47E020F13F0027F13
+FE91B6FC010315C04981011F010013F8D93FF8EB1FFCD97FE0EB07FE4A130349486D7E48
+90C813804848ED7FC049153F4848ED1FE04848ED0FF0A24848ED07F8A2491503003F17FC
+A2491501007F17FEA390CAFC4817FFAC6D5D007F17FEA46D1503003F17FCA26D1507001F
+17F86D150F000F17F06D151F6C6CED3FE0A26C6CED7FC06C6CEDFF806C6D4913006E5BD9
+7FF0EB0FFE6D6C495A6DB4EBFFF8010790B512E06D5D010092C7FC6E5B020F13F0020113
+8038437BC043>I<B612F015FEEDFFC08216F890C7EA3FFCED07FEED01FF6F1380167FEE
+3FC0EE1FE0A2160F17F01607A6160F17E0161FA2EE3FC0167FEEFF804B1300ED07FEED3F
+FC90B65A5E16C093C7FC15FC90CAFCB3A92C3F78BE3A>I<ECFFF0010713FF011F14C001
+7F14F890B67E5A48EB803F3A07FC0007F848481301D81FE0EB0078491438003F15184991
+C7FCA248CAFCA67FA26C7E7F7F6C7EEA0FFEEBFFC06C13FC6CEBFFC06C14F86C14FE013F
+6D7E010F80010380D9003F7F02037F9138007FFC150F6F7E15018281821780163FA7EE7F
+0012601270007815FE007C1401007F4A5AD8FFC0130701F0EB1FF801FFEB7FF06C90B55A
+001F5D000792C7FC00015CD8003F13F8010113C029437CC033>83
+D<B912FEA6C890C8FCB3B3B3A2373E7DBD3E>I<B46CEE1FC0007FEF3F807F003FEF7F00
+A27F001F17FE7F000F4C5AA27F00074C5AA26C6C4B5AA27F00014C5AA27F6C4C5A80017F
+4B5AA280013F4BC7FCA26D6C14FEA280010F4A5AA26D6C5C1603A26D6C495AA26D6C5C16
+0FA26D6C5C161FA2DA7F805B163FDA3FC090C8FC5EA291381FE07E16FE020F5B15F015F1
+02075B15F902035B15FB15FF6E5BA26E5BA36F5A3A3F7FBE3D>86
+D<D87FC0ED0FF86C6CED1FF06D16E0001FEE3FC06C6C157F6C6CEDFF806C6C16004C5A6C
+6C14036C6D5C6D6C495A160F6D6C495A6D6C5C6D6C495A167F6D6C5C6D6C49C7FC010149
+5A903800FF03ED83FC91387FC7F8EC3FCF91381FEFF0EDFFE06E5B806E5B93C8FC6E5A81
+4A7F5C824A7F91381FEFF015CF91383FC7F891387F83FC9138FF03FE150149486C7E4948
+6D7E0107814A6D7E4948131F49486D7E8349486D7E4948130301FF8191C76C7E48486E13
+800003167F484816C049ED3FE04848ED1FF0001F17F849150F4848ED07FC007FEE03FE48
+4816FF90C97E383F7EBE3D>88 D<EB0FF890B5FC00031480000F14E04814F0A29038F00F
+F890388003FC381E0001001814FE00101300C812FF157FA7EC7FFF010FB5FC137F48B6FC
+120748EBF07F383FFC0013C048C7FC12FE5AA315FF7E5C387F8007EBE01F6CB6FCA26C14
+7F6C13FC6C13F0000190C7FC202B7CA92C>97 D<49B47E010F13F0013F13FC4913FF90B6
+12805A481300D807FCEB1F00D80FF0130748487F4990C7FC123F5B127F90C9FCA312FEAA
+127FA36C7EA26C6C14406DEB01C06C6C13036C6C131F01FF13FF6C90B5FC7E6C6C14806D
+EBFE00010F13F001011380222B7DA928>99 D<ED07F0B3A4EB07F8EB3FFF4913C748B512
+F74814FF5A1480390FFC003FD81FF0131F49130F48481307A2485A90C7FCA312FEAA127F
+A37F003F140F7F6C6C131F6D133F6C6C137F9038FF01FF6C90B5FC6C14F76C14E76C1487
+90383FFE07D90FF0C7FC24407DBE2F>I<EB03F8EB1FFF017F13C090B57E488048803807
+FE07390FF801FC9038E000FE4848137E003F143E49133F90C77E5A127EED0F80B7FCA600
+FCC9FCA37E127EA2127FA26C7EA26C7E6D14806C6C1303D807FC131F01FF13FF6C90B5FC
+7E6C6C14006D13FC010F13E0010190C7FC212B7DA928>I<EC1FF0ECFFFC5B13075BA290
+381FE03C90383F800491C7FC5B137E13FEADB6FCA6C648C7FCB3B01E407FBF1C>I<D903
+FC133F90390FFF03FF013F13DF4990B5128090B7FC5A9026FE07FCC7FC3803F80148486C
+7E49137EA248487FA86C6C137EA26D13FE6C6C485A3901FE07F848B5FC5D485C5DD80FCF
+90C8FCEBC3FC0180C9FC7FA37F6CB512F015FF6C15C0824881001F81823A3FE0001FFED8
+7F80130390C8FC48814881A46C5D6C5D01C01303D83FF0EB0FFCD81FFEEB7FF86CB65A6C
+5D6C5DC692C7FC011F13F8010313C0293D7EA82D>I<12FEB3A449B4FC010713C0011F13
+F0017F13F890B512FCB6FC9038F80FFEEBE003EBC00190388000FFA290C7127FA35AB3A9
+203F79BE2F>I<12FFA81200AF127FB3B3A4083F7ABE16>I<12FEB3A5EDFF804A13004A5A
+4A5A4A5A4A5A4A5A4A5A4A5A4990C7FC495A495A495A5C495A495A497E13FFB57E8013FB
+EBF1FCEBE0FE497E497E496C7E488048131F6E7E8114076E7E8114016E7E157F1680153F
+ED1FC016E0233F79BE2C>107 D<26FC01FFECFF800107D9C00313E0011FD9F00F13F801
+7FD9F83F7F90B56C487F00FD92B5FC3CFFF80FFFFC07FFD9E003EBF001496C497E496C49
+EB7F80A290C76C48133FA34892C7FCB3A9392979A848>109 D<38FC01FF010713C0011F
+13F0017F13F890B512FC12FD39FFF80FFEEBE003EBC00190388000FFA290C7127FA35AB3
+A9202979A82F>I<14FFD8FE0713E0011F7F017F7FB67E819038F80FFFEBE003D9800013
+8090C7EA7FC0153F5AED1FE0A2150FA216F01507A8150F16E0A2151FA2ED3FC06C147F6D
+EBFF805CD9E00313009038F81FFE90B55A485C6D5B6D5B010F1380D901FEC7FC90C9FCB1
+243B79A82F>112 D<00FC137CEB03FC130F131F133F137FEBFFC038FDFE00EAFFF85B5B
+5BA25BA290C7FCA25AB3A6162979A81F>114 D<EB1FF890B51280000314E04814F85A5A
+393FE00FF0EB8000007F143090C8FCA57F6C7E13F06CB4FC14F06C13FE6C7F000114C06C
+14E0011F13F013019038001FF81407EC03FCA21401A3124012700078EB03F8007E130738
+FFE01F90B512F015E06C14C0001F14800003EBFE0038003FF01E2B7EA923>I<EA01F8AC
+B612E0A6D801F8C7FCB3A77F152015E03800FE0790B512F0A27F6D13C06D1300EB0FF01C
+357EB321>I<B415FE6CEC01FCA26C6CEB03F8A27F001FEC07F0A27F000FEC0FE0A26C6C
+EB1FC0A27F0003EC3F80A26C6C14005DA26C6C137E15FEA2017F5B1401013F5B14811483
+011F5B14C314C7010F5BA2903807E7C014EFA26DB45AA36D90C7FCA227287FA72A>118
+D<00FEDA7F80EB0FE0007F6F14C0181F15FF6C6C6E148003FB143F140101C013F3001F6F
+EB7F00140315F1D80FE06E137E03E114FE1407D807F0D9E0FC5B170115C0140FD803F802
+7E5B1703EC1F8000015F01FC143F17070000D93F005C161F01FE1587023E148F017E5E02
+7E130F17CFD93E7C5D013FEC07DFA21478D91FF86DB4C7FCA25C010F5D16013B287FA73E
+>I<D87F80EB01FE003F5D6C6C495A6C6C13076D495A6C6C495A6C6C5C00014A5A6C6C49
+C7FC017F5B90383F81FEECC1FC90381FE3F890380FE7F06DB45A7F6D5B6D5B92C8FC147E
+14FF497F81497F903807E7F090380FE3F8EB1FC190383F80FC4A7E49137F01FE6D7E4848
+6D7E4848800007140F496D7E48486D7E48486D7E003F8148486D7E48C8EA7F80292880A7
+2A>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fq cmr10 10.95 76
+/Fq 76 125 df<4AB4EB0FE0021F9038E03FFC913A7F00F8FC1ED901FC90383FF03FD907
+F090397FE07F80494801FF13FF4948485BD93F805C137F0200ED7F00EF003E01FE6D91C7
+FC82ADB97EA3C648C76CC8FCB3AE486C4A7E007FD9FC3FEBFF80A339407FBF35>11
+D<4AB4FC021F13C091387F01F0903901FC0078D907F0131C4948133E494813FF49485A13
+7F1400A213FE6F5A163893C7FCAA167FB8FCA33900FE00018182B3AC486CECFF80007FD9
+FC3F13FEA32F407FBF33>I<4AB47E021F13F791387F00FFEB01F8903807F001EB0FE0EB
+1FC0EB3F80137F14008101FE80AEB8FCA3C648C77EB3AE486CECFF80007FD9FC3F13FEA3
+2F407FBF33>I<121EEA7F80EAFFC0A9EA7F80ACEA3F00AC121EAB120CC7FCA8121EEA7F
+80A2EAFFC0A4EA7F80A2EA1E000A4179C019>33 D<001E130F397F803FC000FF137F01C0
+13E0A201E013F0A3007F133F391E600F3000001300A401E01370491360A3000114E04913
+C00003130101001380481303000EEB070048130E0018130C0038131C003013181C1C7DBE
+2D>I<EC0FC0EC3FF0ECF878903801F01CEB03E049487E130FEC800F011F7FA2EB3F00A5
+EC800EA25DA25DA25D6D6C5AECC1C0A2ECC38002E7C7387FFFFCEB0FEE14FC4A020713C0
+6D48913801FE006E5DEF00F06D7E4D5A496C5D010F1503D91DFF4A5A013893C7FC496C6C
+5B01E0150E48486C6C131E00036E131C2607801F143C000F6E5B001F6D6C1370263F0007
+14F06F485A48D903FE5B913801FF03486D495A0487C8FCED7FCFED3FFE6F4814386D6D5A
+A2007F6E6C14786D6D6C14704B6C14F06C6C496C6C13E0001F91393E3FC0016C6C903AFC
+1FF003C03D07FC07F007FC1F800001B5D8C001B512006C6C90C7EA7FFCD90FF8EC0FF03E
+437CC047>38 D<121EEA7F8012FF13C0A213E0A3127FEA1E601200A413E013C0A3120113
+80120313005A120E5A1218123812300B1C79BE19>I<1430147014E0EB01C0EB03801307
+EB0F00131E133E133C5B13F85B12015B1203A2485AA2120F5BA2121F90C7FCA25AA3123E
+127EA6127C12FCB2127C127EA6123E123FA37EA27F120FA27F1207A26C7EA212017F1200
+7F13787F133E131E7FEB07801303EB01C0EB00E014701430145A77C323>I<12C07E1270
+7E7E121E7E6C7E7F12036C7E7F12007F1378137CA27FA2133F7FA21480130FA214C0A313
+0714E0A6130314F0B214E01307A614C0130FA31480A2131F1400A25B133EA25BA2137813
+F85B12015B485A12075B48C7FC121E121C5A5A5A5A145A7BC323>I<1506150FB3A9007F
+B912E0BA12F0A26C18E0C8000FC9FCB3A915063C3C7BB447>43 D<121EEA7F8012FF13C0
+A213E0A3127FEA1E601200A413E013C0A312011380120313005A120E5A1218123812300B
+1C798919>I<B512FEA617067F961E>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A79
+8919>I<ED0180ED03C01507A21680150FA216005DA2151E153EA2153C157CA2157815F8
+A25D1401A25D1403A25D1407A25D140FA24AC7FCA2141E143EA2143C147CA2147814F8A2
+5C1301A25C1303A25C1307A25C130FA291C8FC5BA2131E133EA25BA2137813F8A25B1201
+A25B1203A25B1207A25B120FA290C9FC5AA2121E123EA2123C127CA2127812F8A25A1260
+225B7BC32D>I<EB01FE90380FFFC090383F03F090387C00F849137C48487F48487F4848
+EB0F80A2000F15C04848EB07E0A3003F15F0A290C712034815F8A64815FCB3A26C15F8A5
+6C6CEB07F0A3001F15E0A36C6CEB0FC0A26C6CEB1F80000315006C6C133E6C6C5B017C5B
+90383F03F090380FFFC0D901FEC7FC263F7DBC2D>I<EB01C013031307131F137FEA07FF
+B5FC139FEAF81F1200B3B3ACEB7FF0B612F8A31D3D78BC2D>I<EB07FC90383FFF8090B5
+12E03903F01FF83907C007FC390F0001FE001E6D7E001C1580003CEC7FC05AED3FE01270
+B4FC6DEB1FF07FA56C5A6CC7FC120CC813E0153FA216C0157F168015FF16004A5A5D4A5A
+4A5A5D4A5A4A5A4AC7FC147E147C5C495A495A495A495A49C71270133E133C5B4914E048
+5A485A485A48C7120148B6FCA25A4815C0B7FCA3243D7CBC2D>I<EB07FC90383FFF8090
+38F80FE03901E003F839078001FCD80F007F000E6D7E001E1580D81F80137F486C14C07F
+A27F5BA2121F6C5AC8138015FF1600A24A5AA24A5A5DEC07E04A5A023FC7FCEB1FFCECFF
+809038000FE0EC07F86E7E6E7E6E7E1680ED7FC0A216E0153FA216F0A2120C123F487E48
+7EA316E0A249137F6CC713C01278EDFF807E6C4913006C495A3907C007FC3903F80FF0C6
+B55A013F1380D907F8C7FC243F7CBC2D>I<150E151E153EA2157EA215FE1401A21403EC
+077E1406140E141CA214381470A214E0EB01C0A2EB0380EB0700A2130E5BA25B5BA25B5B
+1201485A90C7FC5A120E120C121C5AA25A5AB8FCA3C8EAFE00AC4A7E49B6FCA3283E7EBD
+2D>I<00061403D80780131F01F813FE90B5FC5D5D5D15C092C7FC14FCEB3FE090C9FCAC
+EB01FE90380FFF8090383E03E090387001F8496C7E49137E497F90C713800006141FC813
+C0A216E0150FA316F0A3120C127F7F12FFA416E090C7121F12FC007015C012780038EC3F
+80123C6CEC7F00001F14FE6C6C485A6C6C485A3903F80FE0C6B55A013F90C7FCEB07F824
+3F7CBC2D>I<EC1FE0ECFFF8903803F03E90380FC00F90391F000780133E017EEB1FC049
+133F4848137F12035B12074848EB3F80ED1F00001F91C7FC5BA2123FA3485AA214FE9038
+87FF8039FF8F07E090389C01F09038B800FC01B0137E13F0497F16804914C0A2ED1FE0A3
+4914F0A5127FA6123F6D14E0A2121FED3FC0A26C6C1480A20007EC7F006C6C137E6C6C5B
+6C6C485A90387E07F06DB45A010F1380D903FCC7FC243F7CBC2D>I<1238123C123F90B6
+12FCA316F85A16F016E00078C712010070EC03C0ED078016005D48141E151C153C5DC812
+7015F04A5A5D14034A5A92C7FC5C141EA25CA2147C147814F8A213015C1303A31307A313
+0F5CA2131FA6133FAA6D5A0107C8FC26407BBD2D>I<EB03FC90381FFF8090387C07E090
+38F001F83901E0007C48487F48487F48C7FCED0F80121E16C0003E1407A4123FA26DEB0F
+807F6C6C131F6D140001FC133E6C6C5B9038FF80786C6D5A6CEBF3E06CEBFF806C91C7FC
+133F6D13C06D7F013F13F801787F48486C7E3903E01FFF48486C1380260F800313C04848
+7E489038007FE0003E143F007E141F007CEC0FF01507481403A31501A46C15E0007C1403
+A2007E15C06C14076CEC0F806DEB1F006C6C133ED807F05B3901FC03F86CB512E0011F13
+80D903FCC7FC243F7CBC2D>I<EB03FCEB1FFF90387E07C09038FC03F048486C7E48486C
+7E4848137C000F147E4848137F81003F15805B007F15C0A2151F12FF16E0A516F0A5127F
+153FA36C7EA2001F147F120F6C6C13FF6D13DF000313013900F8039F90387E0F1FD91FFE
+13E0EB07F090C7FCA2ED3FC0A41680157FD80F801400487E486C13FEA24A5A5D49485AEB
+8007391E000FE0001F495A260FC07FC7FC3803FFFE6C13F838003FC0243F7CBC2D>I<12
+1EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3121EEA7F80A2EAFFC0A4EA7F80A2EA1E00
+0A2779A619>I<121EEA7F80A2EAFFC0A4EA7F80A2EA1E00C7FCB3121E127FEAFF80A213
+C0A4127F121E1200A412011380A3120313005A1206120E120C121C5A1230A20A3979A619
+>I<15074B7EA34B7EA34B7EA34B7EA34B7E15E7A2913801C7FC15C3A291380381FEA34A
+C67EA3020E6D7EA34A6D7EA34A6D7EA34A6D7EA34A6D7EA349486D7E91B6FCA249819138
+800001A249C87EA24982010E157FA2011E82011C153FA2013C820138151FA2017882170F
+13FC00034C7ED80FFF4B7EB500F0010FB512F8A33D417DC044>65
+D<B712FCEEFF8017F00001903980000FF86C6CC7EA03FE707E701380EF7FC0EF3FE0A2EF
+1FF0A218F8A3170F171FA318F0A2EF3FE0177F18C0EFFF804C1300EE03FCEE0FF8EE7FE0
+91B6C7FC17E091C7EA07FCEE01FE933800FF80EF7FC0EF3FE0EF1FF018F8170F18FC1707
+A218FEA718FC170FA2EF1FF818F0173FEF7FE0EFFFC00403138048486C90380FFE00B85A
+17E094C7FC373E7DBD40>I<DB3FF01306912603FFFE130E020F9038FF801E913A3FF007
+E03E9139FF8000F8D903FEC7EA7C7ED907F8EC1EFE4948140FD93FE0140749481403495A
+91C812014848150012034848167E5B000F173EA24848161EA2123F5B180E127FA3491600
+12FFAC127F7F180EA2123FA27F001F171E181C6C7EA20007173C6D16386C6C1678000117
+706C6C16F06EEC01E06D6C15C06D6C1403D90FF0EC07806D6CEC1F00D903FE143E902600
+FF8013F891393FF007F0020FB512C0020391C7FC9138003FF037427BBF42>I<B712FCEE
+FF8017E000019039C0001FF86C6C48EB03FEEE00FF717E717EEF0FE084717E717E170184
+717EA21980187F19C0A3F03FE0A519F0AB19E0A5F07FC0A21980A218FF19004D5AA24D5A
+6017074D5A4D5AEF7FC04DC7FCEE03FE48486CEB1FF8B85A178004FCC8FC3C3E7DBD45>
+I<B912E0A300019038C000016C6C48EB001FEF0FF01703A217011700A31870A41838161C
+A41800A2163CA2167C16FC150391B5FCA3EC80031500167C163CA2161CA21807A3180E93
+C7FCA4181E181CA2183CA2187CA218F8170117031707171F48486CEB01FFB912F0A3383E
+7DBD3E>I<B91280A300019038C000036C6C48EB007FEF1FC0170F1707A21703A31701A4
+EF00E0A21638A31800A31678A216F81501150791B5FCA3EC8007150115001678A21638A6
+93C8FCAF3801FFE0B612F0A3333E7DBD3B>I<DB3FE0130C912603FFFE131C021F9038FF
+803C913A7FF00FC07C9139FF0001F0D903FC90380078FC4948143DD91FE0141F4948140F
+4948140701FF15034890C8FC491501485A000716005B000F177C5B001F173CA2485AA218
+1C127FA25B95C7FC12FFAB041FB512F0127FA26D9139000FFE00EF03FC123FA27F121FA2
+6C7EA212077F12036C7E7F6C7F6D6C14076D7E6D6C140FD907F8141ED903FEEC3C7C9026
+00FF80EBF83C913A7FF007F01C021FB5EAC00C020391C8FC9138003FF03C427BBF47>I<
+B6D8C01FB512F8A3000101E0C7383FFC0026007F80EC0FF0B3A691B7FCA30280C7120FB3
+A92601FFE0EC3FFCB6D8C01FB512F8A33D3E7DBD44>I<B612F0A3C6EBF000EB3FC0B3B3
+B2EBFFF0B612F0A31C3E7EBD21>I<B612F8A3000101E0C9FC38007F80B3B0EF0380A517
+071800A45FA35FA25F5F5F4C5A160748486C133FB8FCA3313E7DBD39>76
+D<B500C093383FFFF0A300016D93387FF800D8007F18E0D977F016EFA3D973F8ED01CFA2
+D971FCED038FA3D970FEED070FA26E150E80A26E6C141CA36E6C1438A26E6C1470A36E6C
+14E0A26E6CEB01C0A36E6CEB0380A36E6CEB0700A2037F130EA36F6C5AA26F6C5AA36F6C
+5AA25FED07F0A2923803F9C0A36FB45AA26F90C7FCA213F8486C147ED807FFEF3FF8B500
+F8013C011FB512F0A34C3E7DBD53>I<B56C91B512F88080D8007F030713006EEC01FC6E
+6E5A1870EB77FCEB73FEA2EB71FF01707FA26E7E6E7EA26E7E6E7EA26E7E6E7EA26E7E6E
+7FA26F7E6F7EA26F7E6F7EA26F7E6F7EA26F7E6F1380A2EE7FC0EE3FE0A2EE1FF0EE0FF8
+A2EE07FCEE03FEA2EE01FF7013F0A2177F173FA2171F170FA2170701F81503487ED807FF
+1501B500F81400A218703D3E7DBD44>I<ED7FE0913807FFFE91391FC03F8091397E0007
+E04948EB03F8D907F0EB00FE4948147F49486E7E49486E7E49C86C7E01FE6F7E00018349
+150300038348486F7EA248486F7EA2001F188049167F003F18C0A3007F18E049163FA300
+FF18F0AC007F18E06D167FA4003F18C0A26C6CEEFF80A36C6C4B1300A26C6C4B5A00035F
+6D150700015F6C6C4B5A6D5E6D6C4A5A6D6C4A5A6D6C4AC7FC6D6C14FED901FCEB03F8D9
+007FEB0FE091391FC03F80912607FFFEC8FC9138007FE03C427BBF47>I<B712F8EEFF80
+17E000019039C0003FF86C6C48EB07FCEE01FE707EEF7F80EF3FC018E0A2EF1FF0A218F8
+A818F0A2EF3FE0A218C0EF7F80EFFF004C5AEE07FCEE3FF091B612C04CC7FC0280C9FCB3
+A73801FFE0B612C0A3353E7DBD3E>I<B712C016FCEEFF800001D9C00013E06C6C48EB1F
+F0EE07FCEE01FE707E84717EA2717EA284A760177F606017FF95C7FCEE01FCEE07F8EE1F
+E0EEFF8091B500FCC8FC16F091388001FCED003FEE1FC0707E707E83160383160183A383
+A484A4F0C004190EA28218E0057F131E2601FFE0161CB600C0EB3FF094381FF838050713
+70CA3801FFE09438003F803F407DBD43>82 D<D907FC130C90391FFF801C017FEBF03C39
+01FC03F83A03F0007E7CD807C0EB1FFC4848130F001F140748C71203003E1401007E1400
+A2007C157C12FCA2163CA36C151CA27EA26C6C14007F7FEA3FF8EBFF806C13F86CEBFF80
+6C14F06C14FC6C14FF6C15C0013F14E0010714F0EB007F020713F89138007FFC150FED07
+FE15031501ED00FFA200E0157FA3163FA27EA3163E7E167E6C157C6C15FC6C15F86D1301
+6DEB03F06DEB07E0D8F9FCEB0FC03AF07F803F8090391FFFFE00D8E00713F839C0007FC0
+28427BBF33>I<003FB91280A3903AF0007FE001018090393FC0003F48C7ED1FC0007E17
+07127C00781703A300701701A548EF00E0A5C81600B3B14B7E4B7E0107B612FEA33B3D7D
+BC42>I<B600C090B512F8A3000101E0C70007130026007F80EC01FC715A1870B3B3A401
+3F16F06E5DA21701011F5E80010F15036E4A5A010793C7FC6D6C5C6D6C141E6D6C5C027F
+14F86E6C485A91390FF00FE00203B51280020049C8FCED1FF03D407DBD44>I<B691380F
+FFFEA3000301E0020113E06C01809138007F806CEF3F00017F163E181C6E153C013F1638
+A26E1578011F1670A26D6C5DA26E140101075EA26E140301035EA26D6C4AC7FCA2806D15
+0EA26F131E027F141CA26F133C023F1438A26E6C5BA26F13F0020F5CA2EDF80102075CA2
+6E6C485AA2EDFE07020191C8FCA26F5A6E130EA2ED7F9CA216DCED3FF8A36F5AA36F5AA2
+6F5AA36F5A3F407EBD44>I<B500FE017FB5D88007B5FCA3000301C0010101E0C713F86C
+90C849EC3FE07148EC0F807E7215006E143F017F190E84A26D6C60A24D7E6D6C60A2EFE7
+F86D6C60A2933801C3FC6E18F001076104037F6E0281140101036104077F17006D6C4D5A
+A2040EEB7F806D6C4DC7FCA24CEB3FC0DA7F80160EA24CEB1FE003C0161E023F171C0478
+14F0DBE070010F133C021F173804F014F84C1307DA0FF05EA2DBF1C0EB03FCDA07F95EA2
+DBFB80EB01FEDA03FF6F5AA293C8FCA26E5FA24B157F020094C8FCA24B81037C153EA203
+78151E0338151C58407EBD5D>I<007FB5D8C003B512E0A3C649C7EBFC00D93FF8EC3FE0
+6D48EC1F806D6C92C7FC171E6D6C141C6D6C143C5F6D6C14706D6D13F04C5ADA7FC05B02
+3F13036F485ADA1FF090C8FC020F5BEDF81E913807FC1C163C6E6C5A913801FF7016F06E
+5B6F5AA26F7E6F7EA28282153FED3BFEED71FF15F103E07F913801C07F0203804B6C7EEC
+07004A6D7E020E6D7E5C023C6D7E02386D7E14784A6D7E4A6D7F130149486E7E4A6E7E13
+0749C86C7E496F7E497ED9FFC04A7E00076DEC7FFFB500FC0103B512FEA33F3E7EBD44>
+I<B66C0103B51280A3000101F0C8EBF8006C6C48ED3FC0725A013F041EC7FC6D7E606D6C
+15386D6C1578606D6C5D6E14016D5E6D6D1303606E6C49C8FC6E6C5B170E6E6C131E171C
+6E6C5B6E6C137817706E6C13F06F5B6E13016EEB83C05FED7FC7DB3FE7C9FC16EFED1FFE
+5E150F6F5AB3A4ED1FFC020FB512FCA3413E7FBD44>I<486C13C0000313010100138048
+1303000EEB070048130E0018130C0038131C003013180070133800601330A300E0137048
+1360A400CFEB678039FFC07FE001E013F0A3007F133FA2003F131F01C013E0390F000780
+1C1C73BE2D>92 D<EB0FF8EBFFFE3903F01F8039078007E0000F6D7E9038E001F8D81FF0
+7F6E7EA3157F6C5AEA0380C8FCA4EC1FFF0103B5FC90381FF87FEB7F803801FC00EA07F8
+EA0FE0485A485AA248C7FCEE038012FEA315FFA3007F5BEC03BF3B3F80071F8700261FC0
+0E13CF3A07F03C0FFE3A01FFF807FC3A003FC001F0292A7DA82D>97
+D<EA01FC12FFA3120712031201B1EC03FC91381FFF8091387C07E09039FDE001F09039FF
+C000FC4A137E91C77E49158049141F17C0EE0FE0A217F0A2160717F8AA17F0A2160FA217
+E0161F17C06D1580EE3F006D5C6E13FE9039F3C001F89039F1E003F09039E0780FC09026
+C03FFFC7FCC7EA07F82D407EBE33>I<49B4FC010F13E090383F00F8017C131E4848131F
+4848137F0007ECFF80485A5B121FA24848EB7F00151C007F91C7FCA290C9FC5AAB6C7EA3
+003FEC01C07F001F140316806C6C13076C6C14000003140E6C6C131E6C6C137890383F01
+F090380FFFC0D901FEC7FC222A7DA828>I<ED01FC15FFA3150715031501B114FF010713
+E190381F80F990387E003D49131FD803F81307485A49130348481301121F123F5B127FA2
+90C7FCA25AAA7E7FA2123FA26C7E000F14037F000714076C6C497E6C6C497ED8007C0179
+13F890383F01F190380FFFC1903A01FE01FC002D407DBE33>I<EB01FE90380FFFC09038
+3F03F09038FC01F848486C7E4848137E48487F000F158049131F001F15C04848130FA212
+7F16E090C7FCA25AA290B6FCA290C9FCA67EA27F123F16E06C7E1501000F15C06C6C1303
+6DEB07806C6C1400C66C131E017E5B90381F80F8903807FFE0010090C7FC232A7EA828>
+I<EC1FC0EC7FF8903801F83C903807E07E90380FC0FFEB1FC1EB3F811401137FEC00FE01
+FE137C1500AEB6FCA3C648C7FCB3AE487E007F13FFA320407EBF1C>I<167C903903F801
+FF903A1FFF078F8090397E0FDE1F9038F803F83803F001A23B07E000FC0600000F6EC7FC
+49137E001F147FA8000F147E6D13FE00075C6C6C485AA23901F803E03903FE0FC026071F
+FFC8FCEB03F80006CAFC120EA3120FA27F7F6CB512E015FE6C6E7E6C15E06C810003813A
+0FC0001FFC48C7EA01FE003E140048157E825A82A46C5D007C153E007E157E6C5D6C6C49
+5A6C6C495AD803F0EB0FC0D800FE017FC7FC90383FFFFC010313C0293D7EA82D>I<EA01
+FC12FFA3120712031201B1EC01FE913807FFC091381E07E091387803F09138E001F8D9FD
+C07F148001FF6D7E91C7FCA25BA25BB3A6486C497EB5D8F87F13FCA32E3F7DBE33>I<EA
+01E0EA07F8A2487EA46C5AA2EA01E0C8FCACEA01FC127FA3120712031201B3AC487EB512
+F0A3143E7DBD1A>I<1478EB01FEA2EB03FFA4EB01FEA2EB00781400AC147FEB7FFFA313
+017F147FB3B3A5123E127F38FF807E14FEA214FCEB81F8EA7F01387C03F0381E07C0380F
+FF803801FC00185185BD1C>I<EA01FC12FFA3120712031201B292B51280A392383FFC00
+16E0168093C7FC153C5D5D4A5AEC07C04A5A4AC8FC143E147F4A7E13FD9038FFDFC0EC9F
+E0140F496C7E01FC7F496C7E1401816E7E81826F7E151F826F7EA282486C14FEB539F07F
+FFE0A32B3F7EBE30>I<EA01FC12FFA3120712031201B3B3B1487EB512F8A3153F7DBE1A>
+I<2701F801FE14FF00FF902707FFC00313E0913B1E07E00F03F0913B7803F03C01F80007
+903BE001F87000FC2603F9C06D487F000101805C01FBD900FF147F91C75B13FF4992C7FC
+A2495CB3A6486C496CECFF80B5D8F87FD9FC3F13FEA347287DA74C>I<3901F801FE00FF
+903807FFC091381E07E091387803F000079038E001F82603F9C07F0001138001FB6D7E91
+C7FC13FF5BA25BB3A6486C497EB5D8F87F13FCA32E287DA733>I<14FF010713E090381F
+81F890387E007E01F8131F4848EB0F804848EB07C04848EB03E0000F15F04848EB01F8A2
+003F15FCA248C812FEA44815FFA96C15FEA36C6CEB01FCA3001F15F86C6CEB03F0A26C6C
+EB07E06C6CEB0FC06C6CEB1F80D8007EEB7E0090383F81FC90380FFFF0010090C7FC282A
+7EA82D>I<3901FC03FC00FF90381FFF8091387C0FE09039FDE003F03A03FFC001FC6C49
+6C7E91C7127F49EC3F805BEE1FC017E0A2EE0FF0A3EE07F8AAEE0FF0A4EE1FE0A2EE3FC0
+6D1580EE7F007F6E13FE9138C001F89039FDE007F09039FC780FC0DA3FFFC7FCEC07F891
+C9FCAD487EB512F8A32D3A7EA733>I<02FF131C0107EBC03C90381F80F090397F00387C
+01FC131CD803F8130E4848EB0FFC150748481303121F485A1501485AA448C7FCAA6C7EA3
+6C7EA2001F14036C7E15076C6C130F6C7E6C6C133DD8007E137990383F81F190380FFFC1
+903801FE0190C7FCAD4B7E92B512F8A32D3A7DA730>I<3901F807E000FFEB1FF8EC787C
+ECE1FE3807F9C100031381EA01FB1401EC00FC01FF1330491300A35BB3A5487EB512FEA3
+1F287EA724>I<90383FC0603901FFF8E03807C03F381F000F003E1307003C1303127C00
+78130112F81400A27E7E7E6D1300EA7FF8EBFFC06C13F86C13FE6C7F6C1480000114C0D8
+003F13E0010313F0EB001FEC0FF800E01303A214017E1400A27E15F07E14016C14E06CEB
+03C0903880078039F3E01F0038E0FFFC38C01FE01D2A7DA824>I<131CA6133CA4137CA2
+13FCA2120112031207001FB512C0B6FCA2D801FCC7FCB3A215E0A912009038FE01C0A2EB
+7F03013F138090381F8700EB07FEEB01F81B397EB723>I<D801FC14FE00FF147FA30007
+14030003140100011400B3A51501A31503120015076DEB06FF017E010E13806D4913FC90
+381FC078903807FFE00100903880FE002E297DA733>I<B539E00FFFE0A32707FE000313
+006C48EB00FC5E00015D7F00005DA26D13016D5CA26D6C485AA2ECC007011F91C7FCA290
+380FE00EA2ECF01E0107131CA26D6C5AA2ECFC7801011370A2ECFEF001005BA2EC7FC0A3
+6E5AA26EC8FCA3140E2B287EA630>I<B53BC3FFFE03FFF8A3290FFE003FE00013C06C48
+6D48EB3F806C4817006D010F141E00016F131C15076D163C00004A6C1338A2017F5E4B7E
+151DD93F805DED3DFC1538D91FC04A5AED78FE9238707E03D90FE0017F5BEDE03F02F014
+0701070387C7FC9138F1C01F02F9148F010315CE9138FB800F02FF14DE6D15FCED00076D
+5DA24A1303027E5CA2027C1301023C5C023813003D287EA642>I<B539F01FFFE0A30003
+D9C00F1300C690388007F8D97F0013E002805BD93FC05B011F49C7FC90380FE00EECF01E
+6D6C5A01035B6D6C5A6E5AEB00FF6E5A6E5A81141F814A7E81147BECF1FC903801E1FEEC
+C0FF01037F49486C7ED90F007F011E6D7E013E130F496D7E01FC80486C80000F4A7EB539
+803FFFF8A32D277FA630>I<B539E00FFFE0A32707FE000313006C48EB01FC6F5A00015D
+7F00005DA2017F495AA2EC8003013F5CA26D6C48C7FCA26E5A010F130EA26D6C5AA2ECF8
+3C01031338A26D6C5AA2ECFEF001005BA2EC7FC0A36E5AA36EC8FCA2140EA2141E141C14
+3C1438A2147800181370127EB45BA2495AA248485AD87E07C9FCEA780EEA3C3CEA1FF8EA
+07E02B3A7EA630>I<001FB61280A2EBE0000180140049485A001E495A121C4A5A003C49
+5A141F00385C4A5A147F5D4AC7FCC6485AA2495A495A130F5C495A90393FC00380A2EB7F
+80EBFF005A5B484813071207491400485A48485BA248485B4848137F00FF495A90B6FCA2
+21277EA628>I<BE12C0A25A0280985B>124 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fr cmssbx10 10.95 6
+/Fr 6 115 df<003FB67E4815FCB8FC17C017F08383839038FC000703007F163F701380
+A28218C0A282A75E1880A25EA24C130093B5FC03075B90B75A5F5F5F17804CC7FC16F001
+FCCAFCB3A56C5A123F323F78BE40>80 D<EC7FFC0107B512E0013F14FC4914FF48B712C0
+5A5A5A481680ECE0074890C7FC49143F49141F160F4848EC0700160193C7FCA37FA27F7F
+806C13F014FF6C14F015FF6C15C016F06C15FC6C816C816C1680013F15C0010F15E01303
+D9007F14F01407DA007F13F81507816F13FC81167FA2163FA312201238007C157F007F16
+F86D14FF13E001FC5B9026FFC00F13F0B8FC17E0A217C0003F1680000F1600000315FCC6
+6C14F0010F14C09026007FFCC7FC2E437CC038>83 D<903803FFE0013F13FC48B6FC0007
+15C0001F15E016F016F8EBF80001E014FC6C48137F90C713FE000E143F120CC8FCA5EC07
+FF0103B5FC133F90B6FC1203000FEBF03F481380383FFE00485A5B12FF5BA3157FA26D13
+FFA2387FFC036D5A6CB6FC15BF6C143F6C13FE6C9038F81FFC000113E06C6CC8FC272D7D
+AB30>97 D<EC7FF80103B5FC130F133F5B90B6FC5AECF01F48EBE007150348EBC000AC00
+3FEBFF805AB612C0A36C1480A20007EBC000B3AF6C5B7E20407EBF1F>102
+D<903A03FFC001F8011FEBF80F017FEBFE3F48B7FC4816FC5A4815F00281140C3B1FFE00
+7FF800A249133F003F81A9001F5D6D137FA23A0FFF81FFF091B5FC6C5D6C5D5E484AC7FC
+019F13F8D80F8313C00180C9FC7FA27F90B6FC16F016FC16FF6C16C0A217E0001F16F05A
+5A9026F0000313F84848EB007F49143F161FA46D143F6C6CEC7FF06D14FF01FF13076C90
+B612E06C16C06C16806C1600000115FCD8003F14E0010349C7FC2E3F7EAA32>I<393FE0
+03E0007F130F38FFF03F147F14FF13F113F313F7A29038FFFC0014F014C05C91C7FC5BA2
+5BA25BB3A56C5A123F1B2B7BAA22>114 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fs cmbx10 10.95 41
+/Fs 41 121 df<EA0FC0EA1FE0EA3FF0EA7FF8EAFFFCA313FEA3127F123F121FEA0FDEEA
+001EA2133E133CA2137C1378A213F8EA01F0A2EA03E0EA07C0EA0F80121FEA3F00121E12
+0C0F20798D1D>44 D<140F143F5C495A130F48B5FCB6FCA313F7EAFE071200B3B3A8B712
+F0A5243C78BB34>49 D<903803FF80013F13F890B512FE00036E7E4881260FF80F7F261F
+C0037F4848C67F486C6D7E6D6D7E487E6D6D7EA26F1380A46C5A6C5A6C5A0007C7FCC8FC
+4B1300A25E153F5E4B5AA24B5A5E4A5B4A5B4A48C7FC5D4A5AEC1FE04A5A4A5A9139FF00
+0F80EB01FC495A4948EB1F00495AEB1F8049C7FC017E5C5B48B7FC485D5A5A5A5A5AB7FC
+5EA4293C7BBB34>I<903801FFE0010F13FE013F6D7E90B612E04801817F3A03FC007FF8
+D807F06D7E82D80FFC131F6D80121F7FA56C5A5E6C48133FD801F05CC8FC4B5A5E4B5A4A
+5B020F5B902607FFFEC7FC15F815FEEDFFC0D9000113F06E6C7E6F7E6F7E6F7E1780A26F
+13C0A217E0EA0FC0487E487E487E487EA317C0A25D491580127F49491300D83FC0495A6C
+6C495A3A0FFE01FFF86CB65A6C5DC61580013F49C7FC010313E02B3D7CBB34>I<ED01F8
+15031507A2150F151F153FA2157F15FF5C5CA25C5CEC1FBFEC3F3F143E147C14FCEB01F8
+14F0EB03E01307EB0FC0EB1F801400133E137E5B485A5B485A1207485A5B48C7FC5A127E
+5AB812F8A5C8387FF800AA49B612F8A52D3C7DBB34>I<00071538D80FE0EB01F801FE13
+3F90B6FC5E5E5E5E93C7FC5D15F85D15C04AC8FC0180C9FCA9ECFFC0018713FC019F13FF
+90B67E020113E09039F8007FF0496D7E01C06D7E5B6CC77FC8120F82A31780A21207EA1F
+C0487E487E12FF7FA21700A25B4B5A6C5A01805C6CC7123F6D495AD81FE0495A260FFC07
+5B6CB65A6C92C7FCC614FC013F13F0010790C8FC293D7BBB34>I<EC07FF023F13C049B5
+12F001078049EB03FC90383FF80090397FE001FE9038FFC0034849487E48495AA2485A12
+0FA2485A6F5A003F6E5A6F5A92C8FC485AA21402EC3FFE00FF496C7E01F9B512E001FB80
+9138E03FF89039FF800FFC4A6C7E825B6F13804915C0A317E05BA4127FA5123FA26D15C0
+121FA2000F4A13806D150012076C6C495A6C6D485A6C9038E07FF86DB55A6D5C6D148001
+0749C7FC010013F02B3D7CBB34>I<121F7F13F890B712F0A45A17E017C0178017005E5E
+5A007EC7EA01F84B5A007C4A5A4B5A4B5A93C7FC485C157E5DC7485A4A5AA24A5A140F5D
+141F143F5D147FA214FF92C8FC5BA25BA3495AA3130FA5131FAA6D5A6D5A6D5A2C3F7ABD
+34>I<ECFFF0010713FE011F6D7E017F14E09039FFC07FF03A01FE001FF848486D7E4848
+6D7E1503485A8281121FA27F7F7F6D5B02C05B14F06C6D485A9138FE0FF89138FF9FF06C
+ECFFE06C5D5E6C92C7FC6C816D14E0011F80498090B67E48812607FE3F7F48486C148038
+1FF807D9F00114C048486C7E007F8049010F13E0150348487F81167FA2163FA36D15C012
+7FEE7F807F6C6CECFF006C6C5B01FEEB07FE3A0FFFC03FFC6C90B55A000115E06C6C5C01
+1F49C7FC010113F02B3D7CBB34>I<903801FFE0010F13FC013F13FF90B612C04801E07F
+489038003FF048486D7E000F6E7E485A6F7E123F48488081178012FFA217C0A517E0A400
+7F5CA4003F5C6C7E5D6C7E00075C3903FF80FB6C13FF6C6C13F36D13C3010F018313C090
+380008031400A24B1380EA03F0487E486C1500487E4B5AA25E151F4B5A495C6C48EBFFE0
+49485B2607FC0F5B6CB6C7FC6C14FC6C14F06D13C0D90FFEC8FC2B3D7CBB34>I<90381F
+FF8090B512F0000314FC000F14FF261FF8071380263FC00113C0018014E0486C7E486C14
+F07FA56C5A4A13E0EA3FC0260F000313C0C714804A13004A5A4A5A15F04A5A4A5A5D92C7
+FC14FE5C13015CA25CAA90C9FCA8EB03F0497E497E497E497EA66D5A6D5A6D5A6D5A2440
+7ABF31>63 D<16FCA24B7EA24B7EA34B7FA24B7FA34B7FA24B7FA34B7F157C03FC7FEDF8
+7FA2020180EDF03F0203804B7E02078115C082020F814B7E021F811500824A81023E7F02
+7E81027C7FA202FC814A147F49B77EA34982A2D907E0C7001F7F4A80010F835C83011F83
+91C87E4983133E83017E83017C81B500FC91B612FCA5463F7CBE4F>65
+D<922607FFC0130E92B500FC131E020702FF133E023FEDC07E91B7EAE1FE01039138803F
+FB499039F80003FF4901C01300013F90C8127F4948151FD9FFF8150F48491507485B4A15
+03481701485B18004890CAFC197E5A5B193E127FA349170012FFAC127F7F193EA2123FA2
+7F6C187E197C6C7F19FC6C6D16F86C6D150119F06C6D15036C6DED07E0D97FFEED0FC06D
+6CED3F80010F01C0ECFF006D01F8EB03FE6D9039FF801FFC010091B55A023F15E0020715
+80020002FCC7FC030713C03F407ABE4C>67 D<BAFCA4198026003FFEC7123F1707170183
+183FA2181FF00FC0A31807EE07C0A3F003E0A3160F95C7FC161F163F16FF91B6FCA54AC6
+FC163F161F040F147CA2160719F8A593C71201A219F01803A21807A2180FF01FE0183F18
+FF1703173FBAFCA219C0A33E3D7DBC45>69 D<B71280A526003FFEC7FCB3B3B0B71280A5
+213E7DBD28>73 D<ED3FFF0203B512F0021F14FE027F6E7E902701FFF80713E00107D9C0
+0013F84990C7EA3FFCD93FFCEC0FFF49486E7F49486E7F48496E7F4A80488448496F7EA2
+4890C96C7E4884A249161F003F84A34848701380A400FF19C0AD007F19806D5EA3003F19
+00A26D5E6C60A26C6D4B5AA26C6D4B5A6C6D4A5BA26C6D4A5B6C6D4A5B6D6C4A5B6DB402
+3F90C7FC6D01C0EBFFFE0107D9F80713F8010190B612E06D5E021F4AC8FC020314F0DA00
+3F90C9FC42407ABE4F>79 D<B812F017FF18C018F018FC26003FFCC77FEF1FFF71138071
+13C07113E0A27113F0A319F8A819F0A34D13E019C05F4D1380053F1300EFFFFE91B712F8
+60188005FCC7FC4ACAFCB3A4B77EA53D3E7DBD47>I<003FB912FCA5903BFE003FFE003F
+D87FF0EE0FFE01C0160349160190C71500197E127EA2007C183EA400FC183F48181FA5C8
+1600B3AF010FB712F8A5403D7CBC49>84 D<B76C90B61280A526003FFEC9003EC7FCB3B3
+A4197E011F177C80A26D17FC616D6D14014E5A6D6D4A5A6D6D140F6D01F8EC3FC0DA7FFE
+ECFF8091273FFFC00F90C8FC020F90B512FC02035D020015E0031F1480030101F8C9FC49
+3F7DBD50>I<B6D8FC03B600F090B512FEA5C601FCC7000301F0C8EA7E00017F6F177C85
+6E6E17FC013F63856D6C037F4B5AA26F4A6C14036D634D7F6F18076D634D806F02EF150F
+6D636F01076E131F6D04C793C7FC050F806F02835D6D1A3E051F806F0201157E027F197C
+6F013F6E13FC023FDA3E005D057E806F017C017F13016E6105FC14FE7048013F13036E61
+04C1EDFF076E4A6D5C04C31687DCE3E06D138F6E6104E716CFDCF7C06D13DF6E96C8FC04
+FF16FF6E4A6D5BA294C77E6F5FA24C80033F5FA26F486F5AA24C153F030F5FA24C151F03
+075FA26F486F5A673F7EBD6C>87 D<903807FFC0013F13F848B6FC48812607FE037F260F
+F8007F6DEB3FF0486C806F7EA36F7EA26C5A6C5AEA01E0C8FC153F91B5FC130F137F3901
+FFFE0F4813E0000F1380381FFE00485A5B485A12FF5BA4151F7F007F143F6D90387BFF80
+6C6C01FB13FE391FFF07F36CEBFFE100031480C6EC003FD91FF890C7FC2F2B7DA933>97
+D<13FFB5FCA512077EAFEDFFE0020713FC021FEBFF80027F80DAFF8113F09139FC003FF8
+02F06D7E4A6D7E4A13074A80701380A218C082A318E0AA18C0A25E1880A218005E6E5C6E
+495A6E495A02FCEB7FF0903AFCFF01FFE0496CB55AD9F01F91C7FCD9E00713FCC7000113
+C033407DBE3A>I<EC7FF00107B5FC011F14C0017F14E09039FFF01FF0489038800FF848
+EB001F4848EB3FFC120F485AA2485AA2007FEC1FF849EB0FF0ED03C000FF91C7FCAB127F
+7FA3003F153E7F001F157E6C6C147C6C6C14FC91388001F86C9038C003F0C69038F81FE0
+6DB512C0011F14800107EBFE009038007FF0272B7DA92E>I<EE07F8ED07FFA5ED003F16
+1FAFEC7FF0903807FFFE011FEBFF9F017F14DF9039FFF01FFF48EBC00348EB00014848EB
+007F485A001F153F5B123FA2127F5BA212FFAA127FA37F123FA26C6C147F120F6D14FF6C
+6C01037F6C6D48EBFFE06CEBF03F6C6CB512BF6D143F010713FC010001E0EBE00033407D
+BE3A>I<ECFFF0010713FE011F6D7E017F809039FFE07FE0489038801FF048496C7E4848
+6D7E48486D7E121F491301003F81A2485A6F1380A212FFA290B7FCA401F0C9FCA5127FA2
+7F123FEE0F806C7E161F6C6C15006C6C5C6C6D137E6C9038E001FC6C9038F80FF8013FB5
+5A6D14C0010391C7FC9038007FF8292B7DA930>I<903A03FF8007F0013F9038F83FF849
+9038FCFFFC48B712FE48018313F93A07FC007FC34848EB3FE1001FEDF1FC4990381FF0F8
+1700003F81A7001F5DA26D133F000F5D6C6C495A3A03FF83FF8091B5C7FC4814FC01BF5B
+D80F03138090CAFCA2487EA27F13F06CB6FC16F016FC6C15FF17806C16C06C16E0120700
+1F16F0393FE000034848EB003F49EC1FF800FF150F90C81207A56C6CEC0FF06D141F003F
+16E001F0147FD81FFC903801FFC02707FF800F13006C90B55AC615F8013F14E0010101FC
+C7FC2F3D7DA834>103 D<13FFB5FCA512077EAFED1FF8EDFFFE02036D7E4A80DA0FE07F
+91381F007F023C805C4A6D7E5CA25CA35CB3A4B5D8FE0FB512E0A5333F7CBE3A>I<EA01
+F8487E487E487E481380A66C13006C5A6C5A6C5AC8FCA913FFB5FCA512077EB3ABB512F8
+A515407CBF1D>I<13FFB5FCA512077EB092380FFFFEA5DB01FEC7FC4B5AED07F0ED1FE0
+4B5A4B5A4BC8FCEC03FC4A5A4A5A141FEC7FF84A7EA2818102E77F02C37F148102007F82
+6F7E6F7E151F6F7E826F7F6F7F816F7FB5D8FC07EBFFC0A5323F7DBE37>107
+D<13FFB5FCA512077EB3B3AFB512FCA5163F7CBE1D>I<01FFD91FF8ECFFC0B590B50107
+13F80203DAC01F13FE4A6E487FDA0FE09026F07F077F91261F003FEBF8010007013EDAF9
+F0806C0178ECFBC04A6DB4486C7FA24A92C7FC4A5CA34A5CB3A4B5D8FE07B5D8F03FEBFF
+80A551297CA858>I<01FFEB1FF8B5EBFFFE02036D7E4A80DA0FE07F91381F007F000701
+3C806C5B4A6D7E5CA25CA35CB3A4B5D8FE0FB512E0A533297CA83A>I<EC7FF0903803FF
+FE011FEBFFC0017F14F09039FFE03FF8489038800FFC3A03FE0003FE48486D7E000F1680
+48486D13C0A2003F16E049147F007F16F0A400FF16F8AA007F16F0A46C6CECFFE0A2001F
+16C06C6C491380A26C6C4913003A03FF800FFE6C9038E03FFC6C6CB512F0011F14C00107
+91C7FC9038007FF02D2B7DA934>I<01FFEBFFE0B5000713FC021FEBFF80027F80DAFF81
+13F09139FC007FF8000301F06D7E4A6D7E4A130F4A6D7E1880A27013C0A38218E0AA4C13
+C0A318805E18005E6E5C6E495A6E495A02FCEBFFF0DAFF035B92B55A029F91C7FC028713
+FC028113C00280C9FCACB512FEA5333B7DA83A>I<3901FE01FE00FF903807FF804A13E0
+4A13F0EC3F1F91387C3FF8000713F8000313F0EBFFE0A29138C01FF0ED0FE091388007C0
+92C7FCA391C8FCB3A2B6FCA525297DA82B>114 D<90383FFC1E48B512BE000714FE5A38
+1FF00F383F800148C7FC007E147EA200FE143EA27E7F6D90C7FC13F8EBFFE06C13FF15C0
+6C14F06C806C806C806C80C61580131F1300020713C014000078147F00F8143F151F7EA2
+7E16806C143F6D140001E013FF9038F803FE90B55A15F0D8F87F13C026E00FFEC7FC222B
+7DA929>I<EB07C0A5130FA4131FA3133F137FA213FF5A1207001FEBFFFEB6FCA40001EB
+C000B3151FA96CEBE03EA2017F137EECF8FC90383FFFF86D13F0010713E001001380203B
+7EB929>I<D9FF80EB0FF8B5EB0FFFA50007EC007F6C153FB3A5167FA316FF6C5C4B7F6C
+903AC007DFFFE09138F01F9F6DB5121F6D13FE010F13F8010101E0EBE000332A7CA83A>
+I<B500FC90383FFFC0A5000101C0903803E0006E1307A26C5E6E130F017F5D6E131F013F
+92C7FC6E5B011F143E6E137E010F147C6E13FCA26D5C15816D5C15C36D5C15E76D5C15FF
+6E5BA36E90C8FCA26E5AA26E5AA26E5AA26E5AA232287EA737>I<B53CFC3FFFFC03FFFE
+A50003D980009039C0000F806E161F6C037F15006E496C5B6C183E836E48157E017F177C
+6E486D13FC013F02EF5C83DAFC071401011F02C75CDAFE0FEBFE03010F02835C17FFDAFF
+1F14076D02015C03BF148F6DD9BE005C18CF03FE14DF6D49017F90C7FC18FF6D496D5AA3
+6E486D5AA26E486D5AA36E486D5AA26E486D5A47287EA74C>I<B5D8FC03B51280A5C690
+26E0007FC7FC6E13FE6D6C5B6D6C485A6D6C485A010F13076D6C485AED9FC06DEBFF806D
+91C8FC6D5B6E5AA2143F6E7E140F814A7F4A7F4A7F02FE7F903801FC7F49486C7E02F07F
+49486C7E49486C7E011F7F49486C7FD97F008001FE6D7FB5D8C007EBFFC0A532287EA737
+>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Ft cmbx12 14.4 41
+/Ft 41 121 df<EA07F0EA1FF8487E487E7FB5FC1480A314C0A37EA27E7EEA07F3EA0003
+A213071480A3130F1400A25B131E133E133C137C5BA2485A485A485A485A48C7FC121E12
+0C1228769025>44 D<157815FC14031407141F14FF130F0007B5FCB6FCA2147F13F0EAF8
+00C7FCB3B3B3A6007FB712FEA52F4E76CD43>49 D<EC3FFE0103B512E0010F14FC013F14
+FF90B712C048D9C07F7F2703FE000F13F8D807F801037FD80FE06D7F48486D7F48488001
+F01680486C6E13C07F486C6E13E07FA27013F0A56C5AA26C5AEA0FF0EA03C0C914E05EA2
+18C05E1880A24C13005F4C5A4B5B5F4B5B5F4B5B4B90C7FC4B5A5E4B5AED7FE04B5A4A5B
+4A48C8FC4A5A5D4A48EB01F04A5AEC3F804AC7FC02FEEC03E0495A495A495A495AD91F80
+140749C8FC013E150F017FB7FC90B812C05A5A5A5A5A5A5AB9FC1880A4344E79CD43>I<
+91380FFFC091B512FC0107ECFF80011F15E090263FF8077F9026FF800113FC4848C76C7E
+D803F86E7E491680D807FC8048B416C080486D15E0A4805CA36C17C06C5B6C90C75AD801
+FC1680C9FC4C13005FA24C5A4B5B4B5B4B13C04B5BDBFFFEC7FC91B512F816E016FCEEFF
+80DA000713E0030113F89238007FFE707E7013807013C018E07013F0A218F8A27013FCA2
+18FEA2EA03E0EA0FF8487E487E487EB57EA318FCA25E18F891C7FC6C17F0495C6C4816E0
+01F04A13C06C484A1380D80FF84A13006CB44A5A6CD9F0075BC690B612F06D5D011F1580
+010302FCC7FCD9001F1380374F7ACD43>I<177C17FEA2160116031607160FA2161F163F
+167FA216FF5D5DA25D5DED1FBFED3F3F153E157C15FCEC01F815F0EC03E01407EC0FC015
+80EC1F005C147E147C5C1301495A495A5C495A131F49C7FC133E5B13FC485A5B485A1207
+485A485A90C8FC123E127E5ABA12C0A5C96C48C7FCAF020FB712C0A53A4F7CCE43>I<D8
+0380150ED807E0157E01FEEC03FED9FFF0137F91B65A5F5F5F5F5F94C7FC5E5E16F016C0
+93C8FC15F801E190C9FC01E0CAFCABEC0FFF027F13F001E3B512FE01E76E7E9026FFF807
+7FDAC0017F49C713F8496E7E49143F4981496E7E6C481680C9FC18C08218E0A418F0A3EA
+0FE0487E487E487E487EA418E0A35B6C484A13C05B491680003EC85A003F17006C6C4A5A
+6D5D6C6C4A5AD807F8495BD803FE01075B2701FFC03F5B6C90B65A013F4AC7FC6D14F801
+0314C09026007FF8C8FC344F79CD43>I<ED0FFF92B512E0020780021F14FC91397FFE03
+FE903A01FFF0007F4901C0EB3F804990C7121F4948EC7FC0494814FF49484913E049485B
+01FF5C485BA2485B5AA2486F13C04A6D1380486F1300177E94C7FC5AA291CAFC5AA21508
+913801FFF8020713FFB54814C04A14F04AC66C7E023C6D7E4A6D7E4A6D7E7013804A15C0
+A24A15E07013F05C18F8A491C714FCA37EA67EA46C17F880A27E18F06C5D18E06C6D15C0
+7E6E4913806C6D15006D6C495A6D6CEB7FFC6DB448485A6D90B55A010315C0010092C7FC
+023F13FC020713C0364F7ACD43>I<121F7F7FEBFF8091B81280A45A1900606060A26060
+60485F0180C86CC7FC007EC95A4C5A007C4B5A5F4C5A160F4C5A484B5A4C5A94C8FC16FE
+C812014B5A5E4B5A150F4B5AA24B5AA24B5A15FFA24A90C9FCA25C5D1407A2140FA25D14
+1FA2143FA4147F5DA314FFA55BAC6D5BA2EC3FC06E5A395279D043>I<913807FFC0027F
+13FC0103B67E010F15E090261FFC0113F8903A3FE0003FFCD97F80EB0FFE49C76C7E4848
+8048486E1380000717C04980120F18E0177FA2121F7FA27F7F6E14FF02E015C014F802FE
+4913806C7FDBC00313009238F007FE6C02F85B9238FE1FF86C9138FFBFF06CEDFFE01780
+6C4BC7FC6D806D81010F15E06D81010115FC010781011F81491680EBFFE748018115C048
+D9007F14E04848011F14F048487F48481303030014F8484880161F4848020713FC160182
+4848157F173FA2171FA2170FA218F8A27F007F17F06D151FA26C6CED3FE0001F17C06D15
+7F6C6CEDFF806C6C6C010313006C01E0EB0FFE6C01FCEBFFFC6C6CB612F06D5D010F1580
+010102FCC7FCD9000F13C0364F7ACD43>I<91380FFF8091B512F8010314FE010F6E7E49
+01037F90267FF8007F4948EB3FF048496D7E484980486F7E484980824817805A91C714C0
+5A7013E0A218F0B5FCA318F8A618FCA46C5DA37EA25E6C7F6C5DA26C5D6C7F6C6D137B6C
+6D13F390387FF803011FB512E36D14C30103028313F89039007FFE03EC00401500A218F0
+5EA3D801F816E0487E486C16C0487E486D491380A218005E5F4C5A91C7FC6C484A5A494A
+5A49495B6C48495BD803FC010F5B9027FF807FFEC7FC6C90B55A6C6C14F06D14C0010F49
+C8FC010013F0364F7ACD43>I<91B5FC010F14F8017F14FF90B712C00003D9C00F7F2707
+FC00017FD80FE06D7F48486E7E48C87FD87FE06E7E7F7F486C1680A66C5A18006C485C6C
+5AC9485A5F4B5B4B5B4B5B4B5B4B90C7FC16FC4B5A4B5A16C04B5A93C8FC4A5A5D14035D
+5D14075DA25D140FA25DAB91CAFCAAEC1FC04A7EECFFF8497FA2497FA76D5BA26D5BEC3F
+E06E5A315479D340>63 D<171F4D7E4D7EA24D7EA34C7FA24C7FA34C7FA34C7FA24C7FA3
+4C8083047F80167E8304FE804C7E03018116F8830303814C7E03078116E083030F814C7E
+031F81168083033F8293C77E4B82157E8403FE824B800201835D840203834B800207835D
+844AB87EA24A83A3DA3F80C88092C97E4A84A2027E8202FE844A82010185A24A82010385
+4A82010785A24A82010F855C011F717FEBFFFCB600F8020FB712E0A55B547BD366>65
+D<932601FFFCEC01C0047FD9FFC013030307B600F81307033F03FE131F92B8EA803F0203
+DAE003EBC07F020F01FCC7383FF0FF023F01E0EC0FF94A01800203B5FC494848C9FC4901
+F8824949824949824949824949824990CA7E494883A2484983485B1B7F485B481A3FA248
+49181FA3485B1B0FA25AA298C7FC5CA2B5FCAE7EA280A2F307C07EA36C7FA21B0F6C6D19
+80A26C1A1F6C7F1C006C6D606C6D187EA26D6C606D6D4C5A6D6D16036D6D4C5A6D6D4C5A
+6D01FC4C5A6D6DEE7F806D6C6C6C4BC7FC6E01E0EC07FE020F01FEEC1FF80203903AFFE0
+01FFF0020091B612C0033F93C8FC030715FCDB007F14E0040101FCC9FC525479D261>67
+D<BC1280A5D8000701F8C7000114C0F0001F19071901851A7F1A3F1A1FA2F20FE0A21A07
+A31A03A318F81BF01A01A497C7FC1701A317031707170F177F92B6FCA59238F8007F170F
+170717031701A317001B3EA31B7CA395C8FCA21BFCA21BF8A21A01A31A031BF01A071A0F
+A21A1F1A3FF27FE0F101FF1907191F0603B5FCBCFCA21BC0A34F517CD058>69
+D<B812C0A5D8000701F8C7FCB3B3B3B2B812C0A52A527CD132>73
+D<93380FFFC00303B6FC031F15E092B712FC0203D9FC0013FF020F01C0010F13C0023F90
+C7000313F0DA7FFC02007F494848ED7FFE4901E0ED1FFF49496F7F49496F7F4990C96C7F
+49854948707F4948707FA24849717E48864A83481B804A83481BC0A2481BE04A83A2481B
+F0A348497113F8A5B51AFCAF6C1BF86E5FA46C1BF0A26E5F6C1BE0A36C6D4D13C0A26C6D
+4D1380A26C1B006C6D4D5A6E5E6C626D6C4C5B6D6D4B5B6D6D4B5B6D6D4B5B6D6D4B5B6D
+6D4B90C7FC6D6D4B5A6D01FF02035B023F01E0011F13F0020F01FC90B512C0020390B7C8
+FC020016FC031F15E0030392C9FCDB001F13E0565479D265>79 D<BAFC19F819FF1AE086
+D8000701F0C7001F13FC060113FF726C13807313C0070F13E01BF0857313F81BFCA27313
+FEA41BFFA81BFEA31BFC61A21BF84F13F04F13E0614F13C04F13004E485A061F5B92B812
+F01AC04FC7FC19E003F8CBFCB3AEB812C0A550527CD15C>I<003FBC1280A59126C0003F
+9038C0007F49C71607D87FF8060113C001E08449197F49193F90C8171FA2007E1A0FA300
+7C1A07A500FC1BE0481A03A6C994C7FCB3B3AC91B912F0A553517BD05E>84
+D<B800C00103B612FCA5D8000701F8CAEBF000F31F80B3B3B11B3FA26D97C7FC81637F1B
+7E6D6D17FE505A6E7E505A6E6D15076E4D5A6E6D4B5A6E6D4B5A6E01F84B5A6E6DDA03FF
+C8FC6E6CB46CEB0FFE6F9039F001FFF8030F90B65A030316C0DB007F92C9FC040F14F8DC
+007F13805E537CD167>I<B700FC017FB600FE91B612F0A5D8003F01C0C8001F01E0C9EB
+F8006F71EE0FC06D7161876F1C1F6D7196C7FC6F8373606D1E3E6F836D7160876F1CFC6D
+666F4B801F016D66704A806E525A88704A17076E059F5F70021F80080F160F6E6570023F
+806EDC3E074CC8FC8870027E5F6EDC7C03163E7002FC804F6C167E6E1C7C700101814F6C
+16FC6E745B70010317016E4C6D5D060716C00580496D14036F63DDC00F16E04F6D14076F
+07F05BDDE01F170F6F92C76C5D1DF8DDF03E6E141F6F98C9FCDDF87E16FC067C6E5C6FF1
+FE3EDDFCFC177E6F4A6E147C1DFFDDFFF06E14FC6F62A24E816F62A270496F5BA24E8170
+61A295C97E7061A270487090CAFCA37048705AA24D1601040360A27048705A84537DD18B
+>87 D<EC7FFF0107B512F0013F14FE90B77E48D9E00F7F2703FE000113F0486C6D7F6EEB
+3FFC48826E131F83707FA36C496D7FA26C90C7FC6C5AC9FCA6037FB5FC020FB6FC91B7FC
+01071487013FEBF0074913803901FFFC004813F0485B485B485B4890C7FC5A5BA2485AA4
+5EA26D5C007F151D163D6C6C02797F6C6D01F113F86C9026C003E1EBFFE06C9026F81FC0
+14F06C90B5487EC6ED001F011F01FC010713E0010101E090C8FC3C387CB641>97
+D<EB3FF0B5FCA51203C6FCB3A4923801FFE0030F13FE033FEBFFC092B612F002F301017F
+913AF7F8003FFEDAFFE0EB0FFF03806D7F92C76C7F4A6E7F4A824A6E7FA2727EA285A285
+84A31A80AC1A00A44E5AA36118FF616E4A5BA26E4A5B6E4A5B6F495BDACFC04990C7FCDA
+87F0EB7FFC913A03FE03FFF849C6B612E0496D148049011F01FCC8FC90C7000313C04154
+7BD24B>I<913801FFF8021FEBFF8091B612F0010315FC010F9038C00FFE903A1FFE0001
+FFD97FFC491380D9FFF05B4817C048495B5C5A485BA2486F138091C7FC486F1300705A48
+92C8FC5BA312FFAD127F7FA27EA2EF03E06C7F17076C6D15C07E6E140F6CEE1F806C6DEC
+3F006C6D147ED97FFE5C6D6CEB03F8010F9038E01FF0010390B55A01001580023F49C7FC
+020113E033387CB63C>I<4DB47E0407B5FCA5EE001F1707B3A4913801FFE0021F13FC91
+B6FC010315C7010F9038E03FE74990380007F7D97FFC0101B5FC49487F4849143F484980
+485B83485B5A91C8FC5AA3485AA412FFAC127FA36C7EA37EA26C7F5F6C6D5C7E6C6D5C6C
+6D49B5FC6D6C4914E0D93FFED90FEFEBFF80903A0FFFC07FCF6D90B5128F0101ECFE0FD9
+003F13F8020301C049C7FC41547CD24B>I<913803FFC0023F13FC49B6FC010715C04901
+817F903A3FFC007FF849486D7E49486D7E4849130F48496D7E48178048497F18C0488191
+C7FC4817E0A248815B18F0A212FFA490B8FCA318E049CAFCA6127FA27F7EA218E06CEE01
+F06E14037E6C6DEC07E0A26C6DEC0FC06C6D141F6C6DEC3F806D6CECFF00D91FFEEB03FE
+903A0FFFC03FF8010390B55A010015C0021F49C7FC020113F034387CB63D>I<DA3FFF14
+FF0103B5D8F00713C0010FDAFC1F13E0013FECFF7F90267FFC0F9038FF9FF09026FFE001
+EBF83F48496C13E0484990387FF01F4890C7D83FF813E0489338FC0FC0F0078048486E6C
+C7FCA2003F82A9001F5EA26C6C4A5AA26C5E6C6D495A6C6D495A6C6D485BDAFC0F5B4890
+B6C8FCD803EF14FC01C314F02607C03F90C9FC91CBFCA2120FA37FA213F813FE90B7FC6C
+16F817FF18C06C836C836C836D828448B9FC12074848C700031480D81FF8EC003F484815
+0748486F13C083485A83A56D5D007F18806D5D003F18006C6C4B5AD80FFEED1FFC6C6C6C
+EC7FF86C01E049485A6C01FE011F5B6C6CB71280010F03FCC7FC010115E0D9000F01FCC8
+FC3C4F7CB543>103 D<EB3FF0B5FCA51203C6FCB3A4EE1FFC93B512C0030314F0030F80
+92391FE07FFC92393F001FFE037C8003F07FDAF1E081ECF3C0DAF7807F8502FFC7FC5CA2
+5CA45CB3ACB6D8F807B612C0A542537BD24B>I<137F497E000313E0487FA2487FA76C5B
+A26C5BC613806DC7FC90C8FCADEB3FF0B5FCA512017EB3B3A6B612E0A51B547BD325>I<
+EB3FF0B5FCA51203C6FCB3A54CB512F8A59339003FFE00EF1FF0EF3FC04D5A4DC7FCEE03
+FEEE07F84C5A4C5AEE7FC04CC8FC4B5A4B5AED0FF8ED1FE04B7E4B7EECF1FF02F37F02F7
+7F91B6FC83159F030F7F02FE80DAF8077F4A7E6F7F6F7F83707E82707F84707F707F8270
+7F84707F177F717E4D13C0B6D8F003B6FCA540537CD247>107 D<EB3FF0B5FCA512017E
+B3B3B3B1B612F0A51C537BD225>I<D93FF0D91FFCEDFFE0B591B500C0010713FE030302
+F0011F6D7E030F6E017F8092271FE07FFCD9FF037F922A3F001FFE01F8007F0003027C91
+26FF03E080C602F06DD90780137FDAF1E0038FC77FDAF3C0159EDAF7806D01BC143F07FC
+8102FFC75C4A5EA24A5EA44A5EB3ACB6D8F807B6D8C03FB512FEA567367BB570>I<D93F
+F0EB1FFCB591B512C0030314F0030F8092391FE07FFC92393F001FFE0003027C80C602F0
+7FDAF1E081ECF3C0DAF7807F8502FFC7FC5CA25CA45CB3ACB6D8F807B612C0A542367BB5
+4B>I<913801FFE0021F13FE91B612C0010315F0010F9038807FFC903A1FFC000FFED97F
+F86D6C7E49486D7F48496D7F48496D7F4A147F48834890C86C7EA24883A248486F7EA300
+7F1880A400FF18C0AC007F1880A3003F18006D5DA26C5FA26C5F6E147F6C5F6C6D4A5A6C
+6D495B6C6D495B6D6C495BD93FFE011F90C7FC903A0FFF807FFC6D90B55A010015C0023F
+91C8FC020113E03A387CB643>I<903A3FF001FFE0B5010F13FE033FEBFFC092B612F002
+F301017F913AF7F8007FFE0003D9FFE0EB1FFFC602806D7F92C76C7F4A824A6E7F4A6E7F
+A2717FA285187F85A4721380AC1A0060A36118FFA2615F616E4A5BA26E4A5B6E4A5B6F49
+5B6F4990C7FC03F0EBFFFC9126FBFE075B02F8B612E06F1480031F01FCC8FC030313C092
+CBFCB1B612F8A5414D7BB54B>I<90397FE003FEB590380FFF80033F13E04B13F09238FE
+1FF89139E1F83FFC0003D9E3E013FEC6ECC07FECE78014EF150014EE02FEEB3FFC5CEE1F
+F8EE0FF04A90C7FCA55CB3AAB612FCA52F367CB537>114 D<903903FFF00F013FEBFE1F
+90B7FC120348EB003FD80FF81307D81FE0130148487F4980127F90C87EA24881A27FA27F
+01F091C7FC13FCEBFFC06C13FF15F86C14FF16C06C15F06C816C816C81C681013F158001
+0F15C01300020714E0EC003F030713F015010078EC007F00F8153F161F7E160FA27E17E0
+7E6D141F17C07F6DEC3F8001F8EC7F0001FEEB01FE9039FFC00FFC6DB55AD8FC1F14E0D8
+F807148048C601F8C7FC2C387CB635>I<143EA6147EA414FEA21301A313031307A2130F
+131F133F13FF5A000F90B6FCB8FCA426003FFEC8FCB3A9EE07C0AB011FEC0F8080A26DEC
+1F0015806DEBC03E6DEBF0FC6DEBFFF86D6C5B021F5B020313802A4D7ECB34>I<D93FF8
+913801FFC0B50207B5FCA50003ED001FC61607B3AE5FA35FA2017F5D173B177B6D6C14F3
+DC01E313F06D6CD907C3EBFFC0903A0FFFC03F836D90B51203010114FE6D6C13F8020701
+E091C7FC42377BB54B>I<B600F00107B5FCA5000101F8C8EA7FE06C6DED3F00A2017F16
+3E6E157E013F167C6E15FC6D5E6F13016D5E8117036D5E6F13076D5E6F130F6D5E6F131F
+6D93C7FC815F6E6C133E177E023F147C6F13FC6E5C16816E5C16C3A26EEBE3E016E76E5C
+16FF6E5CA26E91C8FCA26F5AA36F5AA26F5AA26F5AA26F5A6F5A40367DB447>I<B6D8E0
+7FB5D8C003B512C0A5000101F0C701F0C7381FF8006E027FED07E06C715DA26E023F150F
+017F705DA26E181F013F4B6C92C7FC6E606D70143E94B5FC6F177E6D4A6E137C03C001F3
+15FC6D715B160303E001E114016D020702E05B03F013C06D71485A160F03F8D9807F1307
+6D05F85B93381F003F03FC160F027F4902FC5BDBFE3E011F131F023F04FE90C8FC167EDB
+FF7C010F5B6E01FCECFF3E4C6D137E6E5FA24C7F6E5F4C7F6E5FA24C7F6E5F4C147FA26E
+5F93C8123F6F5EA2033E6FC9FC5A367DB461>I<007FB500F090387FFFFEA5C66C48C700
+0F90C7FC6D6CEC07F86D6D5C6D6D495A6D4B5A6F495A6D6D91C8FC6D6D137E6D6D5B9138
+7FFE014C5A6E6C485A6EEB8FE06EEBCFC06EEBFF806E91C9FCA26E5B6E5B6F7E6F7EA26F
+7F834B7F4B7F92B5FCDA01FD7F03F87F4A486C7E4A486C7E020F7FDA1FC0804A486C7F4A
+486C7F02FE6D7F4A6D7F495A49486D7F01076F7E49486E7E49486E7FEBFFF0B500FE49B6
+12C0A542357EB447>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fu cmtt12 12 16
+/Fu 16 118 df<121FEA3F80EA7FC0EAFFE0A5EA7FC0EA3F80EA1F000B0B6C8A33>46
+D<EC07F8EC3FFF91B57E010314E0010F80498090383FFC0F90397FE003FC9038FF800148
+90C77ED803FC147E49EB7E7F0007903801FFBFD9F00713FF4848481480495A001F5B0180
+13C3003FEB7F810100010013C002FE137F4849133FEA7E014A131FA212FEEAFC034A130F
+A96E131FD8FE011580127EA26E133FD87F0015006C6D5B027F13FE01801381001F90383F
+C3FC01C013FF000F6D5B6D6C5B6C6C6C5BD9F80113800003D9007EC7FC6D9038000F806C
+B4EC1FC06C6D133FD97FE013FF90263FFC0713806DB612006D5C010314F801005C023F13
+80DA07FCC7FC2A3F7CBD33>64 D<EB1FFC90B57E000314E048804814FC48809038F007FF
+EBE0016E7F153F6C48806C48131FC87F150FA5EC0FFF49B5FC131F137F48B6FC0007140F
+4813C0381FFC00EA3FF0EA7FC05B48C7FC5AA56C141F7E6D137FD83FE0497ED9F807EBFF
+F06CB712F87E6C14F36C14C1C69138003FF0D91FF090C7FC2D2E7BAC33>97
+D<ECFFF0010713FE011FEBFF804914C04914E048B612F048EBC01F9038FE000F485A485A
+4848EB07E049EB03C0484890C7FC5BA2127F90C9FCA25A5AA97E7EA27F003FEC01F06DEB
+03F86C7E6D13076C6C14F06C6C130F01FFEB1FE06CEBE07F6C90B512C06C1580013F1400
+6D13FC01075B010013C0252E79AC33>99 D<ED7FF84B7E5CA280157F1501ABEB01FF0107
+13C1011F13F1017F13F990B6FC5A4813813907FE003FD80FF8131F49130F484813074913
+03123F491301127F90C7FCA25A5AA97E7E15037F123F6D1307A26C6C130F6D131F6C6C13
+3F6C6C137F2603FF81B512F091B612F8C602FD13FC6D13F96D01E113F8010F018013F0D9
+01FEC8FC2E3E7DBC33>I<ECFF80010713F0011F13FC497F90B6FC48158048018013C03A
+07FE003FE001F8EB0FF048481307484814F8491303003F15FC491301127F90C7FC16FE15
+005A5AB7FCA516FC48C9FC7E7EA36C7E167C6C6C14FE7F6C7E6D13016C6CEB03FC6CB413
+0F6C9038C03FF86C90B512F06D14E06D14C0010F1400010313FC9038007FE0272E7BAC33
+>I<ED3FE0913801FFFC020713FE141F4A13FF5CECFFC015004948137E4A133C01031400
+5CA8003FB612F84815FCB7FCA36C15F8260003F8C7FCB3AD003FB612804815C0A46C1580
+283E7DBD33>I<D901FEEB1FE0903A0FFFC0FFF0013F01F313F84990B512FC90B7FC5A48
+010313E12607FC00EB80F849017F1360484890383FC00049131FA2001F8149130FA66D13
+1F000F5DA26D133F6C6C495A6D13FF2603FF0390C7FCECFFFE485C5D5DD80FCF13C0D981
+FEC8FC0180C9FCA27FA26C7E7F90B512FC6CECFFC06C15F0000715FC4815FF4816809038
+E0000748489038007FC090C8EA1FE048150F007E150700FE16F0481503A56C1507007E16
+E0007F150F6C6CEC1FC001E0147FD81FF8903801FF80270FFF801F13006C90B55A6C5DC6
+15F0013F14C0010F91C7FC010013F02E447DAB33>I<383FFFFC487FB5FCA27E7EC7FCB3
+B3AD003FB612F84815FCB712FEA26C15FC6C15F8273D7ABC33>108
+D<4AB4FC263FFC0713C0267FFE1F13F000FF017F7F91B5FC6CB67E6CEC07FEC6EBF801EC
+F0004A7F4A7F5CA291C7FCA35BB3A43B3FFFF80FFFFC486D4813FEB56C4813FFA26C496C
+13FE6C496C13FC302C7FAB33>110 D<EB01FE90380FFFC0013F13F0497F90B57E488048
+EB03FF2607FC0013804848EB7FC049133F4848EB1FE049130F4848EB07F0A2007F15F890
+C71203A300FEEC01FCAA6C14036C15F8A26D1307003F15F06D130FA26C6CEB1FE06D133F
+6C6CEB7FC06C6CEBFF802603FF0313006CEBFFFE6C5C6D5B6D5B010F13C0D901FEC7FC26
+2E7AAC33>I<EC01FE3A3FFC0FFFC0486C4813F000FF017F7F91B512FE6CB7FC6CEBFE07
+C6D9F800138002E0EB7FC04AEB3FE04A131FEE0FF091C7FC16074915F81603A217FC1601
+A9160317F8A26D140717F06E130F17E06E131FEE3FC06E137F9139F801FF80DAFE071300
+91B55A495C6E5B6E13E0020F1380DA03FEC7FC91C9FCAF383FFFF8487FB57EA26C5B6C5B
+2E427FAB33>I<ED03FE3B7FFF801FFF80B5D8C07F13E002C1B5FC02C314F014C76C9038
+CFFE0F39001FDFF09139FFC007E092388003C092C8FC5C5C5CA25CA25CA35CB2007FB512
+FEB7FCA46C5C2C2C7DAB33>114 D<90381FFE0F90B5EA8F80000314FF120F5A5AEBF007
+387F800190C7FC00FE147F5A153FA37E007FEC1F0001C090C7FCEA3FF8EBFFC06C13FF6C
+14E0000314F8C680011F13FF01001480020713C0EC007FED1FE0007C140F00FEEC07F015
+03A27EA27F15076D14E06D130F6DEB3FC09038FE01FF90B61280160000FD5C00FC14F8D8
+F83F13E0D8780790C7FC242E79AC33>I<EB03C0497E130FAA003FB612FC4881B7FCA36C
+5D26000FE0C8FCB3A3161FEE3F80A5167F6E140001075C6E5A9138FE07FE6DB55A6D5C6D
+5C6E5B021F1380DA07FCC7FC29387EB633>I<D83FFCEB1FFE486C497E00FF5CA2007F80
+003F800000EC007FB3A75EA25DA26D5B90387F800FDAE03F13FC6DB612FE17FF6D806D01
+FE13FE01039038F83FFC010001C0C7FC302C7FAA33>I E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fv cmr12 12 22
+/Fv 22 119 df<121EEA7F80A2EAFFC0A4EA7F80A2EA1E000A0A78891B>46
+D<143014F013011303131F13FFB5FC13E713071200B3B3B0497E497E007FB6FCA3204278
+C131>49 D<14FF010713E0011F13F890387F00FE01FC133FD801F0EB1F804848EB0FC049
+EB07E00007EC03F048481301A290C713F8481400A47FA26D130116F07F6C6CEB03E013FC
+6C6CEB07C09039FF800F806C9038C01F006CEBF03EECF87839007FFEF090383FFFC07F01
+077F6D13F8497F90381E7FFFD97C1F1380496C13C02601E00313E048486C13F000079038
+007FF84848EB3FFC48C7120F003EEC07FE150148140016FF167F48153FA2161FA56C151E
+007C153EA2007E153C003E157C6C15F86DEB01F06C6CEB03E06C6CEB07C0D803F8EB1F80
+C6B4EBFF0090383FFFFC010F13F00101138028447CC131>56 D<14FF010713E0011F13F8
+90387F80FC9038FC007E48487F4848EB1F804848EB0FC0000FEC07E0485AED03F0485A16
+F8007F140190C713FCA25AA216FE1500A516FFA46C5CA36C7E5D121F7F000F5C6C6C1306
+150E6C6C5B6C6C5BD8007C5B90383F01E090390FFF80FE903801FE0090C8FC150116FCA4
+ED03F8A216F0D80F801307486C14E0486C130F16C0ED1F80A249EB3F0049137E001EC75A
+001C495A000F495A3907E01FE06CB51280C649C7FCEB1FF028447CC131>I<16C04B7EA3
+4B7EA34B7EA34B7EA3ED19FEA3ED30FFA203707FED607FA203E07FEDC03FA2020180ED80
+1FA2DA03007F160FA20206801607A24A6D7EA34A6D7EA34A6D7EA20270810260147FA202
+E08191B7FCA249820280C7121FA249C87F170FA20106821707A2496F7EA3496F7EA3496F
+7EA201788313F8486C83D80FFF03037FB500E0027FEBFFC0A342477DC649>65
+D<DB0FFE146092B500C013E0020314F0913A0FFC01FC0191393FC0003E02FFC7EA0F83D9
+03FCEC03C74948EC01E74948EC00FF4948157F4948153F4948151F49C9120F485A491607
+120348481603A248481601A248481600A2123FA2491760127FA31900485AAE6C7EA21960
+A2123F7FA2001F18E07F000F18C0A26C6C160119806C6C160312016DEE07006C6C16066D
+6C150E6D6C5D6D6C5D6D6C15786D6C5D6D6C4A5AD900FFEC0780DA3FC0011FC7FCDA0FFC
+13FC0203B512F0020014C0DB0FFEC8FC3B487BC546>67 D<B8FC17F017FC00019039C000
+07FF6C499038007FC0017FED1FE0EF07F0EF03FC717E717E84727E727E727EA2727E8518
+0385A2180185A38584A31A80AD1A00A36061A361180361180761180F614E5A183F614EC7
+FC18FEEF03FC4D5AEF1FE001FFED7FC0486DD907FFC8FCB812FC17F094C9FC41447CC34B
+>I<DB0FFE146092B500C013E0020314F0913A0FFC01FC0191393FC0003E02FFC7EA0F83
+D903FCEC03C74948EC01E74948EC00FF4948157F4948153F4948151F49C9120F485A4916
+07120348481603A248481601A248481600A2123FA2491760127FA396C7FC485AAD4CB612
+C06C7EA293C7387FF000725A003F171F7FA2121F7F120FA26C7EA26C7E6C7EA26C7E6D7E
+6D6C153F6D7E6D6C157F6D6C15E7D903FEEC01C7D900FFEC0383DA3FE0EB0F01DA0FFCEB
+FE000203B500F81360020002E090C7FCDB0FFEC9FC42487BC54D>71
+D<B56C933807FFFC6E5EA20001F1FE0026006FE0EE1BF8A3D967F01633A2D963F81663A3
+D961FC16C3A3D960FEED0183A2027FED0303A36E6C1406A36E6C140CA26E6C1418A36E6C
+1430A36E6C1460A26E6C14C0A36E6CEB0180A3037FEB0300A292383F8006A36F6C5AA36F
+6C5AA26F6C5AA36F6C5AA36F6C5AA26FB45AA370C7FC13F0A2486C143ED80FFFEF0FFEB5
+00F0011C0107B512FCA34E447BC359>77 D<EB07FC90383FFF809038F80FE03903C003F0
+48C66C7E000E6D7ED80FC0137E486C137F6D6D7EA36F7EA26C5AEA0380C8FCA4EC0FFF49
+B5FC90380FFE1FEB3FC0EBFF00EA03FC485A485A485A485A127F5B176048C7FCA3153FA3
+6D137F007F14EF6D9038C7E0C0003F13013A1FE00783F13B07F81E03FF802701FFFC0113
+003A001FE0007C2B2E7CAC31>97 D<EC7F80903803FFF090380FC07C90383F000F01FCEB
+03804848EB01C00003140F4848EB1FE049133F120F485AA2485AED1FC0007FEC070092C7
+FCA290C9FC5AAB7E7FA2123F16307F001F15706C6C146016E06C6C14C06C6C13010001EC
+03806C6CEB0700013F131E90381FC078903807FFF001001380242E7DAC2B>99
+D<167FED3FFFA315018182B3EC7F80903803FFF090380FC07C90383F000E017E1307496D
+5AD803F87F48487F5B000F81485AA2485AA2127FA290C8FC5AAB7E7FA2123FA26C7EA200
+0F5D7F6C6C5B00035C6C6C9038077F806C6C010E13C0013F011C13FE90380FC0F8903803
+FFE09026007F0013002F467DC436>I<EB01FE903807FFC090381F03F090387E00FC4913
+7E48487F485A4848EB1F80000F15C049130F121F484814E01507A2007F15F090C7FCA25A
+A390B6FCA290C9FCA67EA27FA2123F16306C7E1670000F15606D14E06C6C14C000031401
+6C6CEB03806C6CEB0700013E131E90381F80F8903803FFE0010090C7FC242E7DAC2B>I<
+EA01FC12FFA3120712031201B3EC01FE913807FFC091381E07F091383801F802707FECE0
+00D9FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FEA32F457DC436
+>104 D<EA01E0EA07F8A2487EA46C5AA2EA01E0C8FCADEA01FC12FFA3120712031201B3
+B0487EB512F8A315437DC21C>I<EA01FC12FFA3120712031201B3B3B3A5487EB512F8A3
+15457DC41C>108 D<3901FC01FE00FF903807FFC091381E07F091383801F8000701707F
+0003EBE0002601FDC07F5C01FF147F91C7FCA25BA35BB3A8486CECFF80B5D8F83F13FEA3
+2F2C7DAB36>110 D<3901FC03FC00FF90380FFF8091383C07E091387001F83A07FDE000
+FE00010180137F01FFEC3F8091C7EA1FC04915E049140F17F0160717F8160317FCA3EE01
+FEABEE03FCA3EE07F8A217F0160F6D15E0EE1FC06D143F17806EEB7E00D9FDC05B9039FC
+F003F891383C0FE091381FFF80DA03FCC7FC91C9FCAE487EB512F8A32F3F7DAB36>112
+D<3903F803F000FFEB1FFCEC3C3EEC707F0007EBE0FF3803F9C000015B13FBEC007E153C
+01FF13005BA45BB3A748B4FCB512FEA3202C7DAB26>114 D<90383FE0183901FFFC3839
+07E01F78390F0003F8001E1301481300007C1478127800F81438A21518A27EA27E6C6C13
+006C7E13FC383FFFE06C13FC6C13FF6C14C06C14E0C614F0011F13F81300EC0FFC140300
+C0EB01FE1400157E7E153EA27EA36C143C6C147C15786C14F86CEB01F039F38003E039F1
+F00F8039E07FFE0038C00FF01F2E7DAC26>I<1306A5130EA4131EA3133E137EA213FE12
+011207001FB512F0B6FCA2C648C7FCB3A4150CAA017E131C017F1318A26D133890381F80
+30ECC070903807E0E0903801FFC09038007F001E3E7EBC26>I<B539F001FFFCA3000790
+C7EA7FE06C48EC1F8000011600160E1200160C017F5CA280013F5CA26E1370011F146080
+010F5CA2ECF00101075CA26D6C48C7FCA26E5A01011306A26D6C5AA214FF6E5AA215B8EC
+3FB015F06E5AA36E5AA26E5AA36EC8FC2E2C7EAA33>118 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fw cmss17 17.28 6
+/Fw 6 115 df<B8FC17F017FE717E18E018F8848401F0C700076D7EDC007F7F051F7F05
+077F8305007F727E183F727EA2727E841A80A284A21AC0A284A660A21A80A260A21A0060
+4E5AA24E5A187F4E5A5F05075B051F5B057F5B0407B55A90B9C7FC6018F86018C095C8FC
+17FC17C001F0CCFCB3B3A6426474E356>80 D<ED7FFE0207B512E0021F14FE91B77E4916
+E0010716F84916FE49825B5B90B5D8C0035B4849C7123F4801F8140F4801E014034A1400
+4849153E91C9121C4848160C491604003F94C7FC5BA3485AA77FA2123F7FA27F6C7E806C
+7F806C13F814FE6CEBFFC06C14FC6CECFFC016F86DECFF80011F15E06D15F86D15FE0101
+816D16C0021F81020781DA007F80030F80030080160F04017F706C138083050F13C08371
+13E0A27113F083A2187F19F8A2183FA9F07FF0A21220003017FF003818E0007C5E007F4C
+13C07F01E04B13806D5D01FE033F1300B56C4A5A02F0EB01FF9126FF801F5B6C91B65A00
+1F5F6C5F00035FC694C7FC013F5D010F15F8010115E0D9001F91C8FC020013F03D687AE5
+4B>83 D<EC1FFE0103B512C0011F14F0017F14FC48B67E00078148168017C017E0DAC003
+13F049C713F8D807F0147F01C0EC3FFC5B0006C8EA1FFE0004150FC9FCA2EE07FFAA163F
+92B6FC141F91B7FC1307133F5B48B8FC48ECFC074814004813F04813804848C7FC485A5B
+5B485AA55E7F5E6C6C5C6D91B5FC01FF13036CEBC01F91B7FC7EA26C15F76C15C76C1507
+6C14FC6C6C13E0D91FFCC8FC30417ABF41>97 D<ED1FFE92B512C01403140F5C5C5C91B6
+FC5BEDF007499038C000404990C8FC5C130F5C131F5CA3133FB3A2B712E0A926003FF8C8
+FCB3B3B12A657DE429>102 D<DA07FCEC1FE0913A3FFF8003FF91B5EAE01F010302F8B5
+FC4991B6FC5B4917F05B90387FFC079026FFF00101E0C7FC489039C0007FF04A133F4882
+91C7121F48486E7EA448486E7EA96C6C4A5AA46C6C4A5A6E133F6C5E6E137F6C9039F001
+FFE0DAFC075B91B65A4893C8FC485D5ED807FB5C01F814E0023F13809026F007FCC9FC00
+0F90CBFCA37FA37F6CB4FC91B512FCEEFFE06C16FC17FF6C17C06C834883488348834883
+488349C712034848DA003F138049150F48488149817113C0485A83A56D5D007F18806D5D
+A2D83FFC030F13006C6C4B5A6D6C147F6C01E049485A6C01FE011F5B6C90B75A6C5F6C6C
+16806D93C7FC010F15FC010115E0D9003F91C8FC020313F03C5D7CBE43>I<ED1F80D8FF
+C013FF14075C143F5C01C1B5FC13C313C713CFEDF00001DF1380D9FFFCC7FC5C14E05C5C
+91C8FC5BA25BA25BA25BA35BB3B2213F76BE2E>114 D E
+%EndDVIPSBitmapFont
+%DVIPSBitmapFont: Fx cmr17 17.28 14
+/Fx 14 122 df<120FEA3FC0EA7FE012FF13F0A313F8A2127F123FEA0F381200A71378A2
+1370A313F013E0A2120113C012031380120713005A121EA25A5A127012300D28748B24>
+44 D<913803FF80023F13F849B512FE01076E7E90261FFC0013E0D93FC0EB3FF8017EC7
+EA0FFC01F86E7E48486E7E48486E13804848804916C048C9EA7FE013E013F8486CED3FF0
+7FA66C5A6C5AEA01E0CAEA7FE0A318C017FF18805E18005E5F4C5A4C5A4C5A4C5AEE7F80
+4CC7FCED03FC913801FFF091B512C05E16F891380001FE9238003F80EE1FE0EE07F8707E
+707E83701380EF7FC018E0173F18F018F8171FA218FCA2170F18FEA21207EA1FC0EA7FF0
+A2487EA5EF1FFC5B5B6C4816F80078C9123F18F07EEF7FE07E001FEEFFC06C6C4A13806C
+7E6C6C4A1300D801F84A5AD800FEEC1FF8D93FC0495A903A1FFC01FFE00107B612800101
+4AC7FCD9003F13F00203138037607BDD42>51 D<003FBC12F8A49126C000039038C00003
+01FCC76C49EB007F01F0190F01C019074848F103FC90C81701007E1A00007C1B7CA30078
+1B3CA400701B1CA600F01B1E481B0EA7C91800B3B3B3A54C7FA2041F13F84AB87EA45762
+7CE160>84 D<EC03FE91381FFFE091B512F8903901FE03FE903A07F0007F8049486D7ED9
+3FC06D7E49C76C7E496E7E49140348488148481401000782491400000F8283485A188012
+3F49153FA2007F17C0A35BA212FF90B8FCA30180CAFCA9127F7FA3123FA27F121FEF01C0
+6C7E17036C6C1680A26C6C15070001EE0F006D150E6C6C151E6D6C5C6D6C5C6D6C5CD907
+F0EB03E0D903FC495A902700FF803FC7FC91383FFFFC020F13F00201138032417CBF3A>
+101 D<EB03C0EA07FFB5FCA41201EA007FA2133FB3AAEE7FE0923803FFFC030F13FFDB3F
+0013C00378EB1FE04B6D7EDAC1C06D7EDAC3808002C7C7120302CE81170114DC14D802F8
+6E7E5CA35CA35CB3B3496C4A7F496C4A7FB6D8F003B612C0A442647DE349>104
+D<133C13FF487F487FA66C5B6C90C7FC133C90C8FCB3A2EB03C0EA07FF127FA41201EA00
+7FA2133FB3B3AC497E497EB612E0A41B5F7DDE23>I<D903C0D9FFC0EC07FED807FF0103
+01F891381FFFC0B5010F01FE027F13F0923D3F00FF8001F807FC0378903B3FC003C001FE
+DAC1E090261FE00FC77E0001D9C3C090260FF01E6E7ED8007F49902607F81C6E7E02C7C7
+5CD93FCE6E6C486E7E02CC166002DC16E002D85E02F8DA01FF6F7E4A5EA24A93C8FCA44A
+5DB3B3496C4A6C4B7E496C4A6D4A7EB6D8F007B6D8803FB512FCA4663F7CBE6F>109
+D<D903C0EB7FE0D807FF903803FFFCB5010F13FFDB3F0013C00378EB1FE04B6D7E0001D9
+C1C06D7E27007FC3808002C7C71203D93FCE81170114DC14D802F86E7E5CA35CA35CB3B3
+496C4A7F496C4A7FB6D8F003B612C0A4423F7DBE49>I<EDFF80020F13F8023F13FE9139
+FF007F80D903FCEB1FE0D907F0EB07F0D90FC0EB01F8D93F80EB00FE49C8127F017E8149
+6F7E48486F7E00038349150700078348486F7EA2001F83491501A2003F83A348486F7EA4
+00FF1880AC007F1800A26D5DA2003F5FA36C6C4B5AA36C6C4B5A00075FA26C6C4B5A6C6C
+4B5AA26C6C4B5A017F4BC7FC6D6C14FE6D6C495AD90FF0EB07F8D903FCEB1FE0D900FFEB
+7F806EB5C8FC020F13F8020113C039417CBF42>I<9039078003F8D807FFEB0FFFB5013F
+13C092387C0FE0913881F01F9238E03FF00001EB838039007F8700148FEB3F8E029CEB1F
+E0EE0FC00298EB030002B890C7FCA214B014F0A25CA55CB3B0497EEBFFF8B612FCA42C3F
+7CBE33>114 D<9139FFE00180010FEBFC03017FEBFF073A01FF001FCFD803F8EB03EFD8
+07E0EB01FF48487F4848147F48C8123F003E151F007E150F127CA200FC1507A316037EA2
+7E7F6C7E6D91C7FC13F8EA3FFE381FFFF06CEBFF806C14F86C14FF6C15C06C6C14F0011F
+80010714FED9007F7F02031480DA003F13C01503030013E0167F00E0ED1FF0160F17F86C
+15071603A36C1501A37EA26C16F016037E17E06D14076DEC0FC06D1580D8FDF0141FD8F8
+F8EC7F00013E14FC3AF01FC00FF80107B512E0D8E001148027C0003FF8C7FC2D417DBF34
+>I<1438A71478A414F8A31301A31303A21307130F131FA2137F13FF1203000F90B6FCB8
+FCA3260007F8C8FCB3AE17E0AE6D6CEB01C0A316036D6C148016076D6C14006E6C5A9138
+3FC01E91381FF07C6EB45A020313E09138007F802B597FD733>I<B66C49B512E0A40001
+01F8C8387FFE0026007FE0ED1FF819E0013F705A61131F6E93C7FC130F180E6E151E0107
+161C8001035EA26E157801011670806D5EA26F1301027F5DA26E6C495AA26F1307021F92
+C8FCA26E6C130EA26F131E0207141CA26F133C020314388102015CA26F13F06E5C168092
+387F81C0A216C3033F5B16E3DB1FE7C9FCA216FF6F5AA26F5AA36F5AA26F5AA36F5A433F
+7FBD46>118 D<B66C49B512E0A4000101F8C8387FFE0026007FE0ED1FF819E0013F705A
+61131F6E93C7FC010F160EA26D6C5DA26E153C01031638A26D6C5DA26E15F06D5EA26E6C
+495AA26F1303023F5DA26F1307021F92C8FC6F5B020F140EA26F131E0207141C6F133C02
+031438A26F1378020114706F13F06E5CA21681037F5B16C3033F5BA216E7031F90C9FC16
+FF6F5AA36F5AA26F5AA36F5AA26F5AA215015E15035EA2150793CAFC5D150EA2151E151C
+153CD81F801338487E486C5BA25D14015D49485A383F80074948CBFC001E133E380FC0FC
+6CB45A000113E06C6CCCFC435B7FBD46>121 D E
+%EndDVIPSBitmapFont
+end
+%%EndProlog
+%%BeginSetup
+%%Feature: *Resolution 600dpi
+TeXDict begin
+
+%%EndSetup
+%%Page: 1 1
+1 0 bop 1041 456 a Fx(The)44 b Fw(PSfrag)h Fx(system,)d(v)l(ersion)i(3)
+1093 758 y Fv(Mic)m(hael)32 b(C.)h(Gran)m(t)g(and)f(Da)m(vid)g
+(Carlisle)1188 874 y Fu(psfrag@rascals.stanford.)q(edu)1592
+1128 y Fv(11)g(April)f(1998)0 1563 y Ft(Con)l(ten)l(ts)0
+1767 y Fs(1)84 b(What)35 b(is)g Fr(PSfrag)q Fs(?)2841
+b(1)0 1971 y(2)84 b Fr(PSfrag)35 b Fs(necessities)2784
+b(2)136 2084 y Fq(2.1)94 b(Cho)s(osing)29 b(a)i(P)m(ostScript)f(driv)m
+(er)82 b(.)46 b(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g
+(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)132
+b(2)0 2288 y Fs(3)84 b(Installing)37 b Fr(PSfrag)2824
+b Fs(3)0 2492 y(4)84 b(Usage)3300 b(3)0 2695 y(5)84 b(Commands)33
+b(and)i(En)m(vironmen)m(ts)2191 b(4)136 2808 y Fq(5.1)94
+b(Em)m(b)s(edding)30 b Fp(PSfrag)h Fq(op)s(erations)f(in)m(to)g(EPS)f
+(\014les)44 b(.)i(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g
+(.)g(.)f(.)h(.)g(.)f(.)h(.)132 b(5)0 3012 y Fs(6)84 b(P)m(ac)m(k)-6
+b(age)37 b(Options)2815 b(6)0 3216 y(7)84 b(An)35 b(Example)3002
+b(7)136 3329 y Fq(7.1)94 b(Figure)30 b(scaling)g(and)g(resizing)f(.)46
+b(.)f(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g
+(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)132
+b(8)0 3533 y Fs(8)84 b(Common)34 b(mistak)m(es,)g(kno)m(wn)h(problems,)
+g(and)f(bugs)1448 b(9)136 3646 y Fq(8.1)94 b(Using)31
+b Fp(PSfrag)g Fq(tags)h(prop)s(erly)89 b(.)45 b(.)h(.)g(.)f(.)h(.)g(.)f
+(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)
+f(.)h(.)g(.)f(.)h(.)132 b(9)136 3758 y(8.2)94 b(Problems)29
+b(using)g(some)i Fp(x\014g)h Fq(\014gures)81 b(.)45 b(.)h(.)g(.)f(.)h
+(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g(.)f(.)
+h(.)g(.)f(.)h(.)87 b(11)136 3871 y(8.3)94 b(Problems)29
+b(using)g(old)h(v)m(ersions)g(of)g(the)h Fp(semina)m(r)h
+Fq(pac)m(k)-5 b(age)60 b(.)45 b(.)h(.)g(.)g(.)f(.)h(.)g(.)f(.)h(.)g(.)g
+(.)f(.)h(.)g(.)f(.)h(.)87 b(11)0 4075 y Fs(9)d(The)35
+b Fr(PSfrag)g Fs(mailing)f(list)2478 b(11)0 4411 y Ft(1)135
+b(What)45 b(is)g Fo(PSfrag)r Ft(?)0 4664 y Fq(Man)m(y)38
+b(dra)m(wing)d(and)h(graphing)g(pac)m(k)-5 b(ages)39
+b(pro)s(duce)c(output)i(in)e(the)i(Encapsulated)f(P)m(ostScript)h
+(\(EPS\))0 4777 y(format,)46 b(but)41 b(few)i(can)f(easily)g(pro)s
+(duce)f(the)h(equations)g(and)g(other)h(scien)m(ti\014c)e(text)j(of)e
+(whic)m(h)f(T)3539 4797 y(E)3589 4777 y(X)i(is)0 4890
+y(so)37 b(capable.)59 b(On)35 b(the)i(other)g(hand,)g(man)m(y)g(L)1602
+4873 y Fn(A)1641 4890 y Fq(T)1692 4910 y(E)1742 4890
+y(Xbased)f(dra)m(wing)g(pac)m(k)-5 b(ages)38 b(are)f(not)g(as)f
+(expressiv)m(e)h(or)0 5003 y(easy-to-use)32 b(as)f(these)g(stand-alone)
+f(to)s(ols.)0 5166 y Fp(PSfrag)h Fq(pro)m(vides)e(the)i(b)s(est)f(of)g
+(b)s(oth)g(w)m(orlds)f(b)m(y)h(allo)m(wing)f(the)i(user)f(to)h
+(precisely)e(o)m(v)m(erla)m(y)j(Encapsulated)0 5279 y(P)m(ostScript)27
+b(\(EPS\))g(\014les)f(with)g(arbitrary)g(L)1504 5262
+y Fn(A)1543 5279 y Fq(T)1594 5298 y(E)1644 5279 y(X)h(constructions.)39
+b(In)27 b(order)f(to)i(accomplish)e(this,)h(the)g(user)0
+5391 y(places)38 b(a)g(simple)e(text)j(\\tag")i(in)36
+b(the)i(graphics)f(\014le,)j(as)e(a)h(\\p)s(osition)d(mark)m(er")j(of)f
+(sorts.)64 b(Then,)39 b(using)0 5504 y(simple)g(L)318
+5488 y Fn(A)357 5504 y Fq(T)408 5524 y(E)458 5504 y(X)j(commands,)h
+(the)f(user)e(instructs)g Fp(PSfrag)h Fq(to)h(remo)m(v)m(e)h(that)f
+(tag)g(from)e(the)i(\014gure,)h(and)0 5617 y(replace)36
+b(it)g(with)f(a)h(prop)s(erly)e(sized,)k(aligned,)e(and)g(rotated)h(L)
+2207 5601 y Fn(A)2246 5617 y Fq(T)2297 5637 y(E)2347
+5617 y(X)g(equation.)58 b Fp(PSfrag)37 b Fq(also)f(allo)m(ws)f(the)0
+5730 y(user)30 b(to)h(place)f(L)560 5713 y Fn(A)599 5730
+y Fq(T)650 5750 y(E)700 5730 y(X)h(constructs)g(directly)e(in)m(to)h
+(the)g(EPS)g(\014le)g(itself.)1858 6065 y(1)p eop
+%%Page: 2 2
+2 1 bop 0 91 a Fq(Dr.)33 b(Craig)e(Barratt)j(wrote)f(the)f(original)f
+(v)m(ersion)g(of)40 b Fp(PSfrag)33 b Fq(as)g(a)g(graduate)g(studen)m(t)
+f(at)h(Stanford)e(Uni-)0 204 y(v)m(ersit)m(y)-8 b(.)40
+b(The)26 b(in)m(terface)i(has)e(c)m(hanged)i(v)m(ery)f(little)e(since)h
+(then,)i(but)e(the)h(in)m(ternals)e(ha)m(v)m(e)j(b)s(een)e(completely)0
+317 y(re-written.)45 b(The)32 b(curren)m(t)g(v)m(ersion)g(of)g(PSfrag)g
+(is)f(main)m(tained)g(b)m(y)h(Mic)m(hael)g(Gran)m(t)h(and)e(Da)m(vid)i
+(Carlisle.)0 430 y(Man)m(y)c(thanks)f(go)i(to)f(the)g(mem)m(b)s(ers)f
+(of)h(the)f Fp(PSfrag)i Fq(mailing)c(list,)i(and)g(to)h(ev)m(ery)m(one)
+i(who)d(has)g(submitted)0 543 y(a)j(bug)f(rep)s(ort)f(or)i(suggestion.)
+0 879 y Ft(2)135 b Fo(PSfrag)46 b Ft(necessities)0 1132
+y Fq(In)30 b(order)g(to)h(use)f Fp(PSfrag)p Fq(,)g(y)m(ou)h(will)c
+(need)j(the)h(follo)m(wing)e(to)s(ols:)136 1369 y Fm(\017)46
+b Fq(A)e(recen)m(t)h(v)m(ersion)f(of)g(L)1087 1353 y
+Fn(A)1126 1369 y Fq(T)1177 1389 y(E)1227 1369 y(X)14
+b(2)1354 1383 y Fl(")1445 1369 y Fq(and)43 b(the)h Fp(graphics)g
+Fq(pac)m(k)-5 b(age.)83 b Fp(PSfrag)45 b Fq(curren)m(tly)e(requires)f
+(the)227 1482 y(1995/12/01)47 b(v)m(ersion)41 b(or)h(later)g(of)g
+(these)g(pac)m(k)-5 b(ages,)47 b(but)41 b(it)h(is)f(alw)m(a)m(ys)h(b)s
+(est)f(to)i(ha)m(v)m(e)g(the)f(most)227 1595 y(recen)m(t)32
+b(release.)136 1783 y Fm(\017)46 b Fq(If)34 b(y)m(ou)h(wish)d(to)j(use)
+f(the)h Fp(semina)m(r)g Fq(pac)m(k)-5 b(age)37 b(with)c
+Fp(PSfrag)p Fq(,)i(y)m(ou)f(should)e(mak)m(e)k(sure)d(y)m(ou)i(ha)m(v)m
+(e)g(the)227 1896 y(1997/10/13)g(v)m(ersion)30 b(or)g(later)h(\(see)g
+(section)g(8.3\).)136 2083 y Fm(\017)46 b Fq(A)40 b(compatible)e(D)m
+(VI-to-P)m(ostScript)k(driv)m(er)c(\(see)i(b)s(elo)m(w\).)67
+b Fp(dvips)39 b Fq(is)g(the)g(primary)f(c)m(hoice)i(of)f(the)227
+2196 y Fp(PSfrag)31 b Fq(dev)m(elop)s(ers,)f(and)g(is)g(certainly)f
+(the)i(most)f(widely-used.)0 2434 y(The)39 b(latest)h(v)m(ersions)f(of)
+g(L)943 2417 y Fn(A)982 2434 y Fq(T)1033 2453 y(E)1084
+2434 y(X)14 b(2)1211 2448 y Fl(")1258 2434 y Fq(,)41
+b(the)f Fp(graphics)g Fq(pac)m(k)-5 b(age,)44 b Fp(PSfrag)p
+Fq(,)d(and)e Fp(dvips)g Fq(can)g(all)g(b)s(e)g(found)f(on)0
+2547 y(CT)-8 b(AN,)28 b(the)f(Comprehensiv)m(e)f(T)1146
+2566 y(E)1196 2547 y(X)i(Arc)m(hiv)m(e)f(Net)m(w)m(ork.)41
+b(The)27 b(CT)-8 b(AN)28 b(cites,)g(and)f(their)f(mirrors,)h(include:)
+978 2778 y(Name)491 b(IP)30 b(address)301 b(Lo)s(cation)p
+928 2815 1906 4 v 978 2894 a Fk(ftp.dante.de)144 b Fq(129.206.100.192)
+106 b(German)m(y)978 3007 y Fk(ftp.tex.ac.uk)96 b Fq(128.232.1.87)241
+b(England)978 3120 y Fk(ftp.cdrom.com)96 b Fq(165.113.58.253)151
+b(USA)0 3409 y Fj(2.1)112 b(Cho)s(osing)38 b(a)g(P)m(ostScript)d(driv)m
+(er)0 3630 y Fp(PSfrag)h Fq(relies)e(on)h(some)g(sensitiv)m(e)g(P)m
+(ostScript)f(tric)m(ks)h(to)h(accomplish)e(its)g(goals.)56
+b(Due)35 b(to)h(limited)d(time)0 3743 y(and)40 b(resources,)j(the)e
+(authors)f(could)f(not)i(con\014rm)e(that)i Fp(PSfrag)g
+Fq(w)m(orks)g(prop)s(erly)d(on)i(ev)m(ery)h(a)m(v)-5
+b(ailable)0 3856 y(P)m(ostScript)37 b(driv)m(er.)61 b(W)-8
+b(e)39 b(ha)m(v)m(e)g(attempted)g(to)f(insure)e(that)i(it)f(will)e
+Fi(eventual)5 b(ly)46 b Fq(w)m(ork)38 b(on)f(ev)m(ery)i(driv)m(er)0
+3969 y(that)31 b(is)e(fully)f(comaptible)i(with)f(the)i
+Fp(graphics)f Fq(pac)m(k)-5 b(age)33 b(\()p Fi(i.e.)p
+Fq(,)d(one)h(for)f(whic)m(h)f(a)i Fk(.def)e Fq(\014le)g(is)h(pro)m
+(vided.\))0 4131 y(The)g(driv)m(ers)f(whic)m(h)g(ha)m(v)m(e)j(b)s(een)d
+(con\014rmed)h(to)h(w)m(ork)f(with)f Fp(PSfrag)i Fq(are:)768
+4361 y(Driv)m(er)777 b(T)-8 b(ested)31 b(b)m(y)168 b(Compatibilit)m(y)p
+718 4398 2326 4 v 768 4477 a(Thomas)30 b(Rokic)m(ki's)g
+Fp(dvips)99 b Fq(the)30 b(authors)100 b(fully)28 b(compatible)768
+4590 y(Y&Y's)i Fp(D)m(VIPSONE)288 b Fq(the)30 b(authors)100
+b(fully)28 b(compatible)0 4820 y(Please)37 b(help)f(us)g(add)h(en)m
+(tries)f(to)i(this)e(list!)59 b(If)44 b Fp(PSfrag)38
+b Fq(w)m(orks)f(with)f(y)m(our)g(driv)m(er,)i(please)f(let)g(us)f(kno)m
+(w,)0 4933 y(so)e(w)m(e)h(can)f(add)f(it)h(to)h(the)f(list.)50
+b(If)34 b(p)s(ossible,)e(test)j(y)m(our)f Fp(PSfrag)h
+Fq(output)f(on)g(b)s(oth)f(Lev)m(el)h(1)h(and)e(Lev)m(el)h(2)0
+5046 y(prin)m(ters,)c(so)h(w)m(e)g(can)g(mak)m(e)g(a)h(distinction)c
+(here)j(if)e(necessary)-8 b(.If)39 b Fp(PSfrag)31 b Fq(do)s(es)g
+Fi(not)40 b Fq(w)m(ork,)31 b(please)f(submit)0 5159 y(a)g(bug)f(rep)s
+(ort;)h(consult)f(section)h(9)g(for)g(con)m(tact)i(information.)39
+b(unfortunately)-8 b(,)29 b(w)m(e)h(cannot)g(promise)f(a)h(\014x)0
+5272 y(for)g(ev)m(ery)m(one,)i(but)e(w)m(e)h(w)m(ould)e(lik)m(e)h(to)h
+(insure)d(that)j(the)g(most)g(p)s(opular)d(driv)m(ers)h(remain)g
+(compatible.)1858 6065 y(2)p eop
+%%Page: 3 3
+3 2 bop 0 91 a Ft(3)135 b(Installing)48 b Fo(PSfrag)0
+341 y Fq(Installing)28 b(the)j(v)-5 b(arious)29 b Fp(PSfrag)i
+Fq(\014les)e(is)h(quite)g(simple:)111 566 y(1.)46 b(Run)30
+b(L)450 549 y Fn(A)489 566 y Fq(T)540 586 y(E)590 566
+y(X)g(on)h Fk(psfrag.ins)c Fq(to)k(extract)h Fk(psfrag.sty)c
+Fq(and)h Fk(psfrag.pro)p Fq(.)111 750 y(2.)46 b(Install)19
+b Fk(psfrag.sty)f Fq(in)h(a)i(standard)f(lo)s(cation)g(for)g(L)2017
+734 y Fn(A)2056 750 y Fq(T)2107 770 y(E)2158 750 y(X)14
+b(2)2285 764 y Fl(")2352 750 y Fq(macros.)38 b(F)-8 b(or)21
+b Fp(kpathsea)p Fq(-based)g(systems)227 863 y(lik)m(e)30
+b Fp(teT)514 883 y(E)557 863 y(X)p Fq(,)g(this)f(path)h(is)g
+(determined)f(b)m(y)h(the)h Fk(TEXINPUTS)c Fq(v)-5 b(ariable.)111
+1047 y(3.)46 b(Install)32 b Fk(psfrag.pro)e Fq(wherev)m(er)j(y)m(our)g
+(P)m(ostScript)g(driv)m(er)f(lo)s(oks)h(for)g(header)g(\014les.)48
+b(F)-8 b(or)33 b Fp(kpathsea)p Fq(-)227 1160 y(based)f(systems)h(lik)m
+(e)e Fp(teT)1110 1181 y(E)1153 1160 y(X)p Fq(,)i(this)e(is)g
+(determined)g(b)m(y)h(the)h Fk(DVIPSHEADERS)c Fq(v)-5
+b(araible.)45 b(F)-8 b(or)33 b Fp(dvips)f Fq(in)227 1273
+y(particular,)40 b(the)g(most)g(logical)f(c)m(hoice)h(w)m(ould)e(b)s(e)
+h(the)g(same)h(directory)f(in)f(whic)m(h)g Fk(tex.pro)f
+Fq(and)227 1386 y Fk(special.pro)28 b Fq(are)i(lo)s(cated.)111
+1570 y(4.)46 b(If)36 b(y)m(ou)h(ha)m(v)m(e)g(an)g(older)e(v)m(ersion)h
+(of)44 b Fp(PSfrag)p Fq(,)37 b(y)m(ou)g(ma)m(y)g(delete)f(the)h(follo)m
+(wing)e(\014les,)i(if)e(they)i(exist:)227 1683 y Fk(ps2frag.ps)p
+Fq(,)26 b Fk(ps2frag)g Fq(or)i Fk(ps2psfrag)e Fq(\(the)j(pro)s(cessing)
+e(scripts\),)g(and)h Fk(epsf.sty)e Fq(\(the)i(one)h(pro-)227
+1796 y(vided)h(b)m(y)j Fp(PSfrag)p Fq(,)f Fi(not)41 b
+Fq(the)32 b Fp(dvips)f Fq(v)m(ersion!\).)44 b(System)32
+b(managers)g(ma)m(y)g(wish)e(to)i(replace)g Fk(ps2frag)227
+1909 y Fq(with)d(a)i(script)e(whic)m(h)g(noti\014es)h(users)g(of)g(the)
+h(upgrade.)0 2240 y Ft(4)135 b(Usage)0 2490 y Fq(Here)31
+b(is)e(a)i(quic)m(k)f(summary)f(of)i(the)f(usage)h(of)38
+b Fp(PSfrag)q Fq(:)136 2715 y Fm(\017)46 b Fq(Use)38
+b(the)f Fk(\\includegraphics)c Fq(command)k(de\014ned)f(b)m(y)i(the)f
+Fp(graphics)h Fq(and)e Fp(graphicx)i Fq(pac)m(k)-5 b(ages)39
+b(to)227 2828 y(add)33 b(EPS)g(\014gures)h(to)g(y)m(our)g(new)f(do)s
+(cumen)m(ts.)51 b(If)33 b(y)m(ou)i(m)m(ust)e(use)h(the)g
+Fk(\\epsfbox)d Fq(command)j(from)227 2941 y Fk(epsf.sty)e
+Fq(for)i(old)g(do)s(cumen)m(ts,)h(then)f Fk(epsf.sty)e
+Fq(m)m(ust)j(b)s(e)e(loaded)h Fi(b)-5 b(efor)g(e)42 b
+Fk(psfrag.sty)p Fq(.)50 b(Other)227 3054 y(pac)m(k)-5
+b(ages)29 b(based)e(on)h Fk(graphics.sty)p Fq(,)d(suc)m(h)i(as)g
+Fp(graphicx)h Fq(or)f Fp(eps\014g)p Fq(,)i(do)e(not)g(su\013er)g(this)f
+(restriction.)136 3238 y Fm(\017)46 b Fq(Load)31 b Fk(psfrag.sty)c
+Fq(with)i(a)i Fk(\\usepackage)d Fq(command.)136 3422
+y Fm(\017)46 b Fq(Mak)m(e)36 b(sure)d(that)h(y)m(our)g(EPS)f(\014gures)
+g(con)m(tain)h(a)g(simple)d(\\tag")36 b(w)m(ord)e(in)e(eac)m(h)j(p)s
+(osition)d(that)i(y)m(ou)227 3535 y(w)m(ould)42 b(lik)m(e)h(a)g(L)797
+3519 y Fn(A)836 3535 y Fq(T)887 3555 y(E)937 3535 y(X)h(replacemen)m
+(ts.)79 b(Use)44 b(a)f Fi(single)50 b Fq(w)m(ord,)c(comp)s(osed)d(of)g
+(unaccen)m(ted)h(letters)227 3648 y(and)35 b(n)m(um)m(b)s(ers.)55
+b(Some)35 b(e\013ort)i(has)e(b)s(een)g(made)g(to)i(allo)m(w)e(for)g
+(more)h(arbitrary)e(tag)i(text,)j(but)34 b(the)227 3761
+y(mec)m(hanism)c(is)f(not)i(infallible;)26 b(see)31 b(section)g(8.1.)
+136 3945 y Fm(\017)46 b Fq(F)-8 b(or)40 b(eac)m(h)g(tag)g(w)m(ord)f(in)
+e(y)m(our)i(EPS)f(\014le,)j(add)d(a)i(command)e(to)i(y)m(our)f(y)m(our)
+g(L)3005 3929 y Fn(A)3044 3945 y Fq(T)3095 3965 y(E)3145
+3945 y(X)g(do)s(cumen)m(t)g(to)227 4058 y(sp)s(ecify)29
+b(ho)m(w)i(this)e(tag)j(is)d(to)i(replaced,)f(as)h(follo)m(ws:)427
+4242 y Fk(\\psfrag{)p Fi(tag)8 b Fk(}[)p Fm(h)p Fi(p)-5
+b(osn)7 b Fm(i)p Fk(][)p Fm(h)p Fi(psp)-5 b(osn)7 b Fm(i)s
+Fk(][)p Fm(h)p Fi(sc)-5 b(ale)7 b Fm(i)p Fk(][)p Fm(h)p
+Fi(r)-5 b(ot)9 b Fm(i)r Fk(]{)p Fi(L)2483 4226 y Fh(A)2522
+4242 y Fi(T)2572 4262 y(E)2620 4242 y(X)32 b(text)9 b
+Fk(})227 4427 y Fq(The)27 b(tag)i(will)c(b)s(e)i(replaced)g(b)m(y)h
+(the)g(L)1513 4410 y Fn(A)1552 4427 y Fq(T)1603 4446
+y(E)1653 4427 y(X)g(text.)41 b(Example:)d(in)27 b(a)h(dra)m(wing)e
+(program)i(lik)m(e)f Fp(x\014g)p Fq(,)h(y)m(ou)227 4540
+y(place)j(the)f(text)427 4724 y Fk(xy)227 4908 y Fq(at)h(a)g
+(particular)e(p)s(oin)m(t.)40 b(T)-8 b(o)30 b(replace)h(this)e(with)g
+Fl(x)20 b Fq(+)g Fl(y)s Fq(,)31 b(one)f(p)s(ossible)e(macro)j(w)m(ould)
+e(b)s(e)427 5092 y Fk(\\psfrag{xy}{$x+y$})0 5318 y Fq(All)20
+b Fk(\\psfrag)f Fq(calls)h(that)h(precede)g(the)g Fk(\\includegraphics)
+c Fq(\(or)k(equiv)-5 b(alen)m(t\))21 b(in)e(the)j(same)f(or)g
+(surrounding)0 5431 y(en)m(vironmen)m(ts)30 b(will)e(b)s(e)i(utilized)e
+(for)j(a)g(giv)m(en)f(P)m(ostScript)g(\014le.)41 b(So,)30
+b(y)m(ou)h(can)g(de\014ne)f(global)g Fk(\\psfrag)p Fq(s)e(as)0
+5544 y(w)m(ell)h(as)i(those)g(that)g(are)g(lo)s(cal)e(to)i(a)g
+(\014gure.)0 5703 y(An)m(y)f(text)h(that)f(is)f(not)h(men)m(tioned)f
+(in)g(a)h Fk(\\psfrag)e Fq(command)i(will)d(not)j(b)s(e)f(replaced;)h
+(hence,)g(P)m(ostScript)0 5816 y(and)g(L)201 5799 y Fn(A)240
+5816 y Fq(T)291 5835 y(E)341 5816 y(X)h(text)g(can)g(b)s(e)e(freely)h
+(mixed.)1858 6065 y(3)p eop
+%%Page: 4 4
+4 3 bop 0 91 a Fq(When)38 b(viewing)e(the)i(output)g(with)e(a)j(D)m(VI)
+g(preview)m(er)e(suc)m(h)g(as)i Fp(dviwin)e Fq(or)h Fp(xdvi)p
+Fq(,)h(a)g(v)m(ertical)f(list)e(of)i(the)0 204 y(replacemen)m(ts)g
+(will)c(b)s(e)j(placed)g(on)g(the)h(left)f(side)g(of)g(eac)m(h)i
+(\014gure.)61 b(This)36 b(list)g(allo)m(ws)g(y)m(ou)i(to)g(c)m(hec)m(k)
+h(the)0 317 y(t)m(yp)s(esetting)34 b(of)f(y)m(our)h(replacemen)m(ts;)h
+(it)e(disapp)s(ears)e(in)h(the)i(\014nal)e(P)m(ostScript)g(v)m(ersion.)
+50 b(Unfortunately)-8 b(,)0 430 y(D)m(VI)35 b(driv)m(ers)d(are)i
+(incapable)f(of)h Fi(placing)42 b Fq(the)34 b Fp(PSfrag)h
+Fq(replacemen)m(ts)f(on)f(top)h(of)g(the)g(\014gure,)g(so)g(for)g(that)
+0 543 y(y)m(ou)d(will)c(need)k(to)g(prin)m(t)e(it)h(out)g(or)h(use)f(a)
+g(P)m(ostScript)g(preview)m(er)g(lik)m(e)g(GhostView.)0
+706 y(This)23 b(v)m(ersion)g(of)32 b Fp(PSfrag)25 b Fi(should)35
+b Fq(run)23 b(prop)s(erly)f(in)h(the)i(compatibilit)m(y)d(mo)s(de)i(of)
+g(L)2852 689 y Fn(A)2891 706 y Fq(T)2942 725 y(E)2993
+706 y(X2.09.)40 b(Let)25 b(us)f(kno)m(w)0 819 y(if)29
+b(y)m(ou)i(\014nd)e(otherwise)h(\(see)h(section)g(9\).)0
+1155 y Ft(5)135 b(Commands)45 b(and)g(En)l(vironmen)l(ts)p
+-227 1417 2477 4 v -229 1517 4 100 v -177 1487 a Fg(\\psfrag{)p
+Ff(tag)7 b Fg(}[)p Fe(h)p Ff(p)l(osn)f Fe(i)m Fg(][)p
+Fe(h)p Ff(psp)l(osn)g Fe(i)q Fg(][)p Fe(h)p Ff(sc)l(ale)g
+Fe(i)q Fg(][)p Fe(h)p Ff(r)l(ot)i Fe(i)o Fg(]{)p Ff(r)l(eplac)l(ement)g
+Fg(})p 2248 1517 V -229 1617 V -177 1587 a(\\psfrag*{)p
+Ff(tag)f Fg(}[)p Fe(h)p Ff(p)l(osn)f Fe(i)m Fg(][)p Fe(h)p
+Ff(psp)l(osn)g Fe(i)p Fg(][)p Fe(h)p Ff(sc)l(ale)g Fe(i)q
+Fg(][)p Fe(h)p Ff(r)l(ot)i Fe(i)p Fg(]{)p Ff(r)l(eplac)l(ement)g
+Fg(})p 2248 1617 V -227 1620 2477 4 v 0 1774 a Fq(The)34
+b Fk(\\psfrag)e Fq(macro)j(de\014nes)f(a)g(L)1242 1757
+y Fn(A)1281 1774 y Fq(T)1332 1793 y(E)1383 1774 y(X-t)m(yp)s(eset)h
+Fk({)p Fi(r)-5 b(eplac)g(ement)9 b Fk(})36 b Fq(to)f(b)s(e)e(placed)h
+(at)h(the)g(same)f(p)s(osition)0 1886 y(as)g(a)g(P)m(ostScript)f
+Fk({)p Fi(tag)8 b Fk(})p Fq(.)51 b(The)33 b(command)g(should)f(b)s(e)h
+(placed)g(b)s(efore)h(the)f(call)g(to)i Fk(\\includegraphics)p
+Fq(,)0 1999 y(or)30 b(equiv)-5 b(alen)m(t.)41 b(It)30
+b(matc)m(hes)i Fi(al)5 b(l)40 b Fq(o)s(ccurrences)30
+b(of)h Fk({)p Fi(tag)8 b Fk(})30 b Fq(in)f(the)i(\014gure.)0
+2162 y(A)21 b Fk(\\psfrag)f Fq(command)h(will)d(remain)j(in)f(e\013ect)
+i(un)m(til)e(its)h(surrounding)d(en)m(vironmen)m(t)j(is)f(exited.)38
+b(Therefore,)0 2275 y(y)m(ou)32 b(can)h(de\014ne)e(global)g
+Fk(\\psfrag)p Fq(s)f(whic)m(h)h(will)e(apply)i(to)i(ev)m(ery)g
+(\014gure,)f(or)g(de\014ne)f Fk(\\psfrag)p Fq(s)f(inside)g(a)i(a)0
+2388 y Fk(figure)d Fq(en)m(vironmen)m(t)h(\(for)g(example\))h(whic)m(h)
+e(apply)g(to)i(a)g(single)e(EPS)g(\014le.)0 2551 y(The)g(optional)g(p)s
+(ositioning)e(argumen)m(ts)k Fk([)p Fm(h)p Fi(p)-5 b(osn)7
+b Fm(i)r Fk(])29 b Fq(and)g Fk([)p Fm(h)p Fi(psp)-5 b(osn)7
+b Fm(i)s Fk(])29 b Fq(sp)s(ecify)g(ho)m(w)h(the)g(b)s(ounding)d(b)s(o)m
+(x)i(of)0 2664 y(the)d(L)176 2647 y Fn(A)215 2664 y Fq(T)266
+2683 y(E)317 2664 y(X)g(text)h(and)e(the)i(b)s(ounding)c(b)s(o)m(x)j
+(of)g(the)g(P)m(ostScript)g(text)h(line)d(up,)j(resp)s(ectiv)m(ely)-8
+b(.)39 b(Some)26 b(dra)m(wing)0 2776 y(pac)m(k)-5 b(ages)32
+b(w)m(ould)d(refer)h(to)i(these)e(as)h(\\con)m(trol)g(p)s(oin)m(ts")f
+(or)g(\\alignmen)m(t)h(p)s(oin)m(ts.")45 3039 y Fk([)p
+Fm(h)p Fi(p)-5 b(osn)7 b Fm(i)r Fk(])34 b Fq(the)h(L)614
+3022 y Fn(A)653 3039 y Fq(T)704 3058 y(E)754 3039 y(X)g(text)g
+(reference)g(p)s(oin)m(t.)52 b(The)33 b(syn)m(tax)i(of)g(this)e
+(argumen)m(t)i(is)e(iden)m(tical)g(to)i(that)g(of)227
+3152 y(the)i Fk(\\makebox)d Fq(command.)58 b(Up)36 b(to)g(t)m(w)m(o)i
+(letters)e(ma)m(y)h(b)s(e)f(c)m(hosen,)i(one)f(from)f(the)g(list)f
+Fm(f)p Fk(t)p Fq(,)p Fk(b)p Fq(,)p Fk(B)p Fq(,)p Fk(c)p
+Fm(g)p Fq(,)227 3265 y(\(top,)42 b(b)s(ottom,)f(baseline,)f(cen)m
+(ter\))g(and)e(another)g(from)h Fm(f)p Fk(l)p Fq(,)p
+Fk(r)p Fq(,)p Fk(c)p Fm(g)g Fq(\(left,)i(righ)m(t,)f(cen)m(ter\).)67
+b(If)38 b(either)227 3378 y(letter)g(is)f(omitted,)j(then)d
+Fk(c)g Fq(\(cen)m(ter\))j(is)d(assumed.)62 b(T)-8 b(ogether,)40
+b(these)f(sp)s(ecify)d(one)i(of)g(12)g(anc)m(hor)227
+3490 y(p)s(oin)m(ts.)52 b(If)34 b(the)h(argumen)m(t)f(is)g(omitted)g
+(altogether,)j(then)d Fk([Bl])p Fq(,)h(or)f(left)h(baseline)e(p)s
+(ositioning,)g(is)227 3603 y(assumed|but)c(note)i(that)g(supplying)c
+Fk([])j Fq(sp)s(eci\014es)f(cen)m(tered)i(p)s(ositioning.)227
+3754 y(When)g(running)d(in)i(L)963 3737 y Fn(A)1002 3754
+y Fq(T)1053 3773 y(E)1103 3754 y(X)h(2.09)i(compatibilit)m(y)c(mo)s
+(de,)i(the)g(default)f(alignmen)m(t)g(is)g Fk([bl])p
+Fq(,)g(in)g(order)227 3867 y(to)h(supp)s(ort)e(legacy)i(do)s(cumen)m
+(ts.)41 b(Usually)28 b(this)i(should)e(not)j(mak)m(e)g(a)g
+(signi\014can)m(t)e(di\013erence.)45 4054 y Fk([)p Fm(h)p
+Fi(psp)-5 b(osn)7 b Fm(i)s Fk(])33 b Fq(the)g(P)m(ostScript)g(text)h
+(reference)g(p)s(oin)m(t.)48 b(The)33 b(p)s(ossible)e(argumen)m(ts)i
+(are)h(iden)m(tical)e(to)i(that)227 4167 y(of)d Fk([)p
+Fm(h)p Fi(p)-5 b(osn)7 b Fm(i)r Fk(])p Fq(,)30 b(as)h(is)e(the)i
+(default)e(v)-5 b(alue,)30 b Fk([Bl])g Fq(\()p Fk([bl])f
+Fq(in)g(L)2269 4150 y Fn(A)2308 4167 y Fq(T)2359 4187
+y(E)2409 4167 y(X)i(2.09)h(compatibilit)m(y)c(mo)s(de.\))0
+4429 y(The)i(L)211 4413 y Fn(A)250 4429 y Fq(T)301 4449
+y(E)351 4429 y(X)h(replacemen)m(t)g(ma)m(y)f(b)s(e)g(optionally)f
+(scaled)h(and)g(rotated)h(ab)s(out)f(its)g(reference)h(p)s(oin)m(t:)45
+4667 y Fk([)p Fm(h)p Fi(sc)-5 b(ale)7 b Fm(i)r Fk(])36
+b Fq(Scaling)g(factor)i(\(default)e(1\).)62 b(It's)37
+b(b)s(est)f(if)g(y)m(ou)h(use)g(fon)m(t)h(size)e(c)m(hanges)i(in)e(the)
+h(L)3356 4650 y Fn(A)3395 4667 y Fq(T)3446 4686 y(E)3496
+4667 y(X)h(text)227 4780 y(rather)31 b(than)f(scale,)h(but)e(y)m(ou)i
+(can)g(use)f(the)g(scale)h(to)g(t)m(w)m(eak)h(its)e(size.)40
+b(Default)31 b(is)e Fk([1])p Fq(.)45 4967 y Fk([)p Fm(h)p
+Fi(r)-5 b(otn)7 b Fm(i)r Fk(])23 b Fq(Extra)g(rotation)g(of)g(the)g
+(text)h(around)e(its)g(reference)i(p)s(oin)m(t,)f(in)f(degrees.)39
+b(The)22 b(nominal)f(rotation)227 5080 y(of)36 b(the)h(L)523
+5064 y Fn(A)562 5080 y Fq(T)613 5100 y(E)663 5080 y(X)f(text)h(matc)m
+(hes)g(that)g(of)f(the)g(P)m(ostScript)f(text)i(it)f(replaces.)57
+b(The)35 b(total)i(rotation)g(is)227 5193 y(this)30 b(nominal)e(v)-5
+b(alue)30 b(plus)e Fk([)p Fm(h)p Fi(r)-5 b(otn)7 b Fm(i)r
+Fk(])p Fq(.)41 b(The)29 b(default)h(is)f Fk([0])p Fq(.)0
+5431 y(Figure)k(1)h(illustrates)e(v)-5 b(arious)32 b(com)m(binations)h
+(of)h(the)g(argumen)m(ts.)50 b(If)34 b(y)m(ou're)g(viewing)e(this)g
+(with)h(a)h(D)m(VI)0 5544 y(preview)m(er)26 b(suc)m(h)g(as)h
+Fp(xdvi)p Fq(,)f(the)h Fp(PSfrag)g Fq(replacemen)m(ts)g(should)e(b)s(e)
+g(lined)g(up)g(to)i(the)g(left)f(of)h(the)f(\014gure;)i(and,)0
+5657 y(if)h(y)m(our)h(preview)m(er)f(can)i(displa)m(y)d(EPS)h(\014les,)
+h(a)g(large,)h(rotated)g Fk(gA)p Fq(.)e(If)h(y)m(ou)h(ha)m(v)m(e)g
+(prin)m(ted)d(this)h(out,)i(or)f(are)0 5769 y(viewing)23
+b(it)h(with)f(a)i(P)m(ostScript)f(view)m(er)h(lik)m(e)f(GhostView,)h
+(then)g(the)g(replacemen)m(ts)f(should)f(sup)s(erimp)s(osed)1858
+6065 y(4)p eop
+%%Page: 5 5
+5 4 bop 680 2155 a
+ currentpoint currentpoint translate 0.98076 0.98076 scale neg exch
+neg exch translate
+ 680 2155 a 1359 2155 a
+ gsave currentpoint currentpoint translate 30 neg rotate neg exch neg
+exch translate
+ 1359 2155 a
+1359 2155 a
+ /PSfrag where{pop(gA)[[0(br)1 0][1(b )2 0][2(bl)1 0][3(Bl)1 0][4(B )1
+0][5(Br)1 0][6( r)1 0][7( )0.75 45][8( l)1.5 30][9(tl)1 0][10(Bl)1
+0][11(l)1 0][12(t)1 -90][13(t )1 0][14(tr)1 180]]1 1 -1/Begin PSfrag}{userdict
+/PSfrag{pop}put}ifelse
+ 1359 2155 a @beginspecial 0 @llx 0 @lly 245
+@urx 163 @ury 2450 @rwi @setspecial
+%%BeginDocument: testfig.eps
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 245 163
+(Courier) findfont 216 scalefont setfont
+-13 41 moveto (gA) show
+showpage
+%%EOF
+
+%%EndDocument
+ @endspecial 1359 2155 a
+ /End PSfrag
+ 1359 2155 a 1359 364 a
+ /Hide PSfrag
+ 1359
+364 a 549 427 a Fq(PSfrag)30 b(replacemen)m(ts)p 549
+458 811 4 v 1359 461 a
+ /Unhide PSfrag
+ 1359 461 a 1359 574 a
+ {
+ 1359 574
+a 978 566 a Fk([br][br])1359 574 y
+ } 0/Place PSfrag
+ 1359 574 a 1359 679
+a
+ {
+ 1359 679 a -477 w Fk([Br][b][2])1359 679 y
+ } 1/Place PSfrag
+ 1359 679
+a 1359 765 a
+ {
+ 1359 765 a 1025 792 a Fk([r][bl])1359 765
+y
+ } 2/Place PSfrag
+ 1359 765 a 1359 842 a
+ {
+ 1359 842 a 978 905 a Fk([tr][Bl])1359
+842 y
+ } 3/Place PSfrag
+ 1359 842 a 1216 1026 a
+ {
+ 1216 1026 a 1073 1018 a
+Fk([b][B])1216 1026 y
+ } 4/Place PSfrag
+ 1216 1026 a 1192 1131 a
+ {
+ 1192 1131
+a -167 w Fk([B][Br])1192 1131 y
+ } 5/Place PSfrag
+ 1192 1131 a 1240 1216
+a
+ {
+ 1240 1216 a 1121 1244 a Fk([][r])1240 1216 y
+ } 6/Place PSfrag
+ 1240 1216
+a 1001 1294 a
+ {
+ 1001 1294 a 643 1357 a Fk([t][][0.75][45])1001
+1294 y
+ } 7/Place PSfrag
+ 1001 1294 a 596 1477 a
+ {
+ 596 1477 a -8 x Fk([bl][l][1.5][30])596
+1477 y
+ } 8/Place PSfrag
+ 596 1477 a 978 1582 a
+ {
+ 978 1582 a Fk([Bl][tl])978
+1582 y
+ } 9/Place PSfrag
+ 978 1582 a 824 1703 a
+ {
+ 824 1703 a 975 1680 a Fq(\(baseline\))824
+1703 y
+ } 10/Place PSfrag
+ 824 1703 a 725 1816 a
+ {
+ 725 1816 a 877 1793 a Fq(\(cen)m(ter)i
+(line\))725 1816 y
+ } 11/Place PSfrag
+ 725 1816 a 725 1929 a
+ {
+ 725 1929 a 877
+1906 a Fq(\(cen)m(ter)g(line\))725 1929 y
+ } 12/Place PSfrag
+ 725 1929 a
+1073 2007 a
+ {
+ 1073 2007 a 27 x Fk([l][t])1073 2007 y
+ } 13/Place PSfrag
+ 1073
+2007 a 596 2084 a
+ {
+ 596 2084 a 63 x Fk([tl][tr][1][180])596
+2084 y
+ } 14/Place PSfrag
+ 596 2084 a 3401 2155 a
+ currentpoint grestore moveto
+ 3401 2155 a 680 2155 a
+ currentpoint currentpoint translate 1 0.98076 div 1 0.98076 div scale
+neg exch neg exch translate
+
+680 2155 a 473 2450 a Fq(Figure)e(1:)41 b(An)30 b(illustration)d(of)k
+(v)-5 b(arious)29 b(options)h(for)g(the)g Fk(\\psfrag)f
+Fq(command.)0 2728 y(on)24 b(a)h(graphical)e(represen)m(tation)h(of)h
+(the)f(b)s(ounding)d(b)s(o)m(x,)26 b(cen)m(ter)f(lines,)f(and)g
+(baseline)f(of)h(the)h(tag)g Fk(gA)p Fq(.)f(\(This)0
+2841 y(graphical)29 b(b)s(o)m(x)h(is)g(pro)m(vided)f(only)g(in)g(debug)
+h(mo)s(de.\))0 3004 y(If)21 b(a)g(replacemen)m(t)h(for)f
+Fk({)p Fi(tag)8 b Fk(})21 b Fq(already)g(exists,)i(the)e(unstarred)f
+(command)h Fk(\\psfrag)e Fq(will)g(replace)i(it)g(without)0
+3117 y(w)m(arning.)39 b(The)26 b(starred)h(v)m(ersion)g
+Fk(\\psfrag*)p Fq(,)f(ho)m(w)m(ev)m(er,)j(will)c Fi(add)38
+b Fq(the)27 b(new)g(replacemen)m(t)g(to)h(a)g(list.)38
+b(Using)0 3229 y(the)22 b(starred)g(command,)h(a)g(single)d(piece)i(of)
+g(P)m(ostScript)g(text)h(could)e(trigger)g(sev)m(eral)i(replacemen)m
+(ts.)38 b(I)22 b(can't)0 3342 y(think)35 b(of)i(a)g(reason)g(wh)m(y)f
+(most)h(users)f(w)m(ould)f(use)i(the)f(starred)h(v)m(ersion,)h(but)e
+(it)g(w)m(as)h(used)f(in)f(Figure)h(1)0 3455 y(ab)s(o)m(v)m(e.)p
+-227 3645 1348 4 v -229 3745 4 100 v -177 3715 a Fg(\\begin{psfrags})21
+b(\\end{psfrags})p 1119 3745 V -227 3748 1348 4 v 0 3911
+a Fq(The)29 b Fk(psfrags)e Fq(en)m(vironmen)m(t)i(ma)m(y)h(b)s(e)f
+(used,)g(if)g(necessary)-8 b(,)30 b(to)g(delimit)d(the)j(scop)s(e)g(of)
+f(the)h Fk(\\psfrag)d Fq(calls.)0 4024 y(As)g(w)m(e)h(said)e(b)s
+(efore,)h Fk(\\psfrag)e Fq(commands)i(retain)g(their)f(e\013ect)j(un)m
+(til)c(the)i(most)h(immediate)e(surrounding)0 4137 y(en)m(vironmen)m(t)
+g(is)f(exited.)39 b Fi(A)n(ny)34 b Fq(en)m(vironmen)m(t)26
+b(will)e(do:)38 b Fk(center)p Fq(,)26 b Fk(figure)p Fq(,)f
+Fi(etc.)p Fq(.)39 b(Therefore,)28 b(it)d(ma)m(y)i(nev)m(er)0
+4250 y(b)s(e)d(necessary)i(to)g(use)e(this)g(en)m(vironmen)m(t,)i(and)f
+(the)g(en)m(vironmen)m(t)g(has)f(no)h(other)h(e\013ect)g(on)f(the)g(do)
+s(cumen)m(t.)0 4543 y Fj(5.1)112 b(Em)m(b)s(edding)39
+b Fd(PSfrag)g Fj(op)s(erations)e(in)m(to)g(EPS)f(\014les)p
+-227 4793 2046 4 v -229 4893 4 100 v -177 4863 a Fg(\\tex[)p
+Fe(h)p Ff(p)l(osn)6 b Fe(i)o Fg(][)p Fe(h)p Ff(psp)l(osn)g
+Fe(i)p Fg(][)p Fe(h)p Ff(sc)l(ale)g Fe(i)q Fg(][)p Fe(h)p
+Ff(r)l(ot)i Fe(i)p Fg(]{)p Ff(L)1366 4846 y Fc(A)1404
+4863 y Ff(T)1449 4881 y(E)1494 4863 y(X)29 b(text)8 b
+Fg(})p 1817 4893 V -229 4993 V -177 4963 a(\\psfragscanon)77
+b(\\psfragscanoff)p 1817 4993 V -227 4996 2046 4 v 0
+5150 a Fp(PSfrag)35 b Fq(3.0)g(supp)s(orts)c(the)k(em)m(b)s(edded)d
+Fk(\\tex)h Fq(commands)g(found)g(in)f(previous)h(release)h(of)41
+b Fp(PSfrag)p Fq(.)51 b(Used)0 5263 y(prop)s(erly)-8
+b(,)26 b(this)f(is)h(a)h(p)s(o)m(w)m(erful)e(to)s(ol,)j(but)d(it)h(has)
+h(b)s(een)f(deprecated)h(somewhat)g(b)s(ecause)f(of)h(its)f(reliance)g
+(on)0 5375 y(a)k(pre-pro)s(cessing)d(step.)41 b(Unlik)m(e)28
+b(previous)f(v)m(ersions)i(of)36 b Fp(PSfrag)p Fq(,)29
+b(supp)s(ort)f(for)h(the)g Fk(\\tex)f Fq(command)h(m)m(ust)0
+5488 y(b)s(e)h Fi(explicitly)j(r)-5 b(e)g(queste)g(d)p
+Fq(,)32 b(as)f(describ)s(ed)d(b)s(elo)m(w.)0 5651 y(As)39
+b(y)m(ou)h(can)f(see,)j(the)d(syn)m(tax)h(of)f(the)g
+Fk(\\tex)f Fq(command)h(is)f(v)m(ery)i(similar)c(to)k(the)f
+Fk(\\psfrag)f Fq(command.)0 5764 y(Ho)m(w)m(ev)m(er,)25
+b(instead)20 b(of)h(adding)e(the)i Fk(\\tex)e Fq(command)i(to)g(y)m
+(our)g(L)2156 5747 y Fn(A)2195 5764 y Fq(T)2246 5784
+y(E)2296 5764 y(X)g(\014le,)h(the)f Fk(\\tex)e Fq(command)i(is)f
+Fi(emb)-5 b(e)g(dde)g(d)1858 6065 y Fq(5)p eop
+%%Page: 6 6
+6 5 bop 0 91 a Fi(in)33 b(the)g(EPS)e(\014le)i(itself)p
+Fq(.)41 b(In)30 b(other)g(w)m(ords,)g(the)h(command)f(b)s(ecomes)h(its)
+e(o)m(wn)i(replacemen)m(t)g(tag.)0 254 y(F)-8 b(or)31
+b(example,)f(y)m(ou)h(migh)m(t)f(place)h(the)f(text)227
+491 y Fk(\\tex[bl][bl]{$\\alpha$})0 729 y Fq(at)e(a)h(particular)d(p)s
+(oin)m(t)g(in)h(y)m(our)g(P)m(ostScript)h(\014le)e(to)j(ha)m(v)m(e)g(L)
+2066 712 y Fn(A)2105 729 y Fq(T)2156 749 y(E)2206 729
+y(X)f(replace)f(it)h(with)e Fl(\013)p Fq(.)40 b(Man)m(y)30
+b Fp(PSfrag)e Fq(users)0 842 y(\014nd)h(this)g(feature)i(useful)e(for)h
+(the)g(axis)g(lab)s(els,)f(titles,)h(and)g(legends)f(of)i(MA)-8
+b(TLAB)31 b(graphs.)0 1005 y(The)d(adv)-5 b(an)m(tage)31
+b(to)f(this)e(approac)m(h)h(is)f(that)i(c)m(hanges)g(can)f(b)s(e)f
+(made)h(to)h(the)f(EPS)f(\014le)g(without)g(ha)m(ving)h(to)0
+1117 y(mo)s(dify)g(an)m(y)j Fk(\\psfrag)d Fq(commands)i(in)f(the)h(L)
+1583 1101 y Fn(A)1622 1117 y Fq(T)1673 1137 y(E)1723
+1117 y(X)h(\014le.)42 b(\(It)32 b(is)e(still)f(necessary)i(to)h
+Fi(r)-5 b(e-c)g(ompile)40 b Fq(the)31 b(L)3552 1101 y
+Fn(A)3591 1117 y Fq(T)3642 1137 y(E)3692 1117 y(X)0 1230
+y(\014le)e(in)h(suc)m(h)g(cases,)h(ho)m(w)m(ev)m(er.\))0
+1393 y(There)f(are)h(cautions)f(and)g(disadv)-5 b(an)m(tages)30
+b(to)h(this)f(approac)m(h,)h(including:)136 1631 y Fm(\017)46
+b Fq(Changing)39 b(the)i(lab)s(els)d(created)k(b)m(y)e
+Fk(\\tex)f Fq(commands)h(requires)f(editing)g(the)i(\014gure;)k(if)39
+b(y)m(ou)i(use)227 1743 y Fk(\\psfrag)31 b Fq(instead,)h(y)m(ou)g(need)
+g(only)g(to)h(edit)e(the)i(do)s(cumen)m(t,)g(whic)m(h)e(migh)m(t)h(b)s
+(e)f(less)h(cum)m(b)s(ersome.)227 1856 y(\(Y)-8 b(ou)31
+b(m)m(ust)g(run)e(L)866 1840 y Fn(A)905 1856 y Fq(T)956
+1876 y(E)1006 1856 y(X)h(again)h(in)e(b)s(oth)h(cases.\))136
+2044 y Fm(\017)46 b Fq(Because)28 b Fk(\\tex)d Fq(commands)h(are)h
+(long)f(strings,)g(they)h(can)g(extend)f(past)h(the)f(other)h(graphics)
+f(in)f(y)m(our)227 2157 y(EPS)30 b(\014le.)42 b(As)31
+b(a)h(result,)e(they)h(can)g(mo)s(dify)f(the)h(EPS)f(b)s(ounding)e(b)s
+(o)m(x)j(in)f(an)h(undesired)d(w)m(a)m(y)-8 b(.)44 b(This)227
+2270 y(problem)27 b(can)i(b)s(e)e(mitigated)h(b)m(y)h(reducing)e(the)h
+(fon)m(t)h(size)f(of)h(the)f Fk(\\tex)f Fq(string,)h(since)g(this)f(do)
+s(es)h(not)227 2383 y(a\013ect)k(the)f(size)f(of)h(its)e
+Fp(PSfrag)i Fq(replacemen)m(t.)136 2570 y Fm(\017)46
+b Fq(The)30 b Fk(\\tex)f Fq(command)h(is)g(not)h(supp)s(orted)d(in)h
+(compressed)h(P)m(ostScript)g(\014les.)136 2758 y Fm(\017)46
+b Fq(The)40 b(T)475 2778 y(E)525 2758 y(X)h(engine)f(m)m(ust)h(scan)g
+(the)g(P)m(ostScript)f(\014le)g(for)g(these)h(strings,)i(whic)m(h)c
+(can)i(add)f(to)h(the)227 2871 y(pro)s(cessing)29 b(time)g(of)h(y)m
+(our)g(do)s(cumen)m(t.)41 b(\(T)-8 b(o)30 b(b)s(e)f(honest,)i(w)m(e)f
+(ha)m(v)m(e)h(y)m(et)g(to)g(encoun)m(ter)f(a)g(case)h(where)227
+2984 y(this)f(is)f(a)i(signi\014can)m(t)e(concern.\))136
+3171 y Fm(\017)46 b Fi(Imp)-5 b(ortant!)100 b Fq(Whenev)m(er)47
+b(a)f(\014le)e(is)h(scanned)g(b)m(y)i Fp(PSfrag)p Fq(,)i(it)c
+(generates)i(a)f(\014le)e(with)h(the)h(name)227 3284
+y Fk(\\jobname.pfg)p Fq(,)20 b(where)g Fk(\\jobname)e
+Fq(is)i(the)h(base)f(name)h(of)g(the)g(master)f(L)2710
+3268 y Fn(A)2749 3284 y Fq(T)2800 3304 y(E)2851 3284
+y(X)h(\014le.)36 b(It)21 b(will)d(o)m(v)m(erwrite,)227
+3397 y(without)30 b(w)m(arning,)f(an)m(y)i(\014le)e(with)g(that)i
+(name.)0 3635 y(This)f(feature)j(is)f(no)g(longer)g(enabled)f
+(automatically)-8 b(,)33 b(except)g(in)e(L)2361 3618
+y Fn(A)2400 3635 y Fq(T)2451 3654 y(E)2502 3635 y(X)h(2.09)i
+(compatibilit)m(y)c(mo)s(de.)46 b(So,)0 3748 y(for)30
+b(L)163 3731 y Fn(A)202 3748 y Fq(T)253 3767 y(E)303
+3748 y(X)14 b(2)430 3762 y Fl(")508 3748 y Fq(do)s(cumen)m(ts,)30
+b(y)m(ou)h(m)m(ust)f(activ)-5 b(ate)32 b(it)e(in)f(one)h(of)h(t)m(w)m
+(o)h(w)m(a)m(ys:)136 3985 y Fm(\017)46 b Fq(T)-8 b(o)46
+b(turn)e(on)g(scanning)g(for)h(a)g(single)f(\014gure,)k(precede)d(the)g
+Fk(\\epsfbox)e Fq(or)i Fk(\\includegraphics)227 4098
+y Fq(command)29 b(with)f(a)h(call)g(to)g(the)g(command)g
+Fk(\\psfragscanon)p Fq(.)37 b(Scanning)27 b(will)g(b)s(e)h(turned)g
+(o\013)i(again)227 4211 y(when)i(the)h(surrounding)d(en)m(vironmen)m(t)
+j(is)f(exited;)i(or,)g(y)m(ou)f(can)h(turn)e(it)g(o\013)h(explicit)m(y)
+f(with)g(a)h(call)227 4324 y(to)e Fk(\\psfragscanoff)p
+Fq(.)136 4511 y Fm(\017)46 b Fq(T)-8 b(o)31 b(turn)f(on)h(scanning)e
+(for)i(the)g(en)m(tire)f(do)s(cumen)m(t,)h(pass)g(the)g(option)f
+Fk(scanall)e Fq(to)k Fk(psfrag.sty)c Fq(in)227 4624 y(the)j
+Fk(\\usepackage)c Fq(command.)0 4862 y(The)35 b Fk(\\tex)g
+Fq(scanner)h(will)d(con)m(tin)m(ue)j(to)h(b)s(e)f(supp)s(orted)e(in)g
+(this)h(form.)57 b(So,)38 b(if)d(y)m(ou)h(do)g(\014nd)e(applications)0
+4975 y(where)c(y)m(ou)h(prefer)e(the)i Fk(\\tex)e Fq(command,)h(do)h
+(not)f(hesitate)h(to)g(use)f(it!)0 5311 y Ft(6)135 b(P)l(ac)l(k)-7
+b(age)46 b(Options)0 5564 y Fq(There)38 b(are)h(only)e(four)h(pac)m(k)
+-5 b(age)41 b(options)d(for)g Fp(PSfrag)p Fq(.)64 b(An)m(y)39
+b(other)g(options)e(that)j(are)e(not)h(handled)e(b)m(y)0
+5677 y Fp(PSfrag)31 b Fq(will)d(b)s(e)i(forw)m(arded)f(to)i
+Fk(graphics.sty)p Fq(.)1858 6065 y(6)p eop
+%%Page: 7 7
+7 6 bop 0 91 a Fk(209mode)44 b Fq(\(L)439 75 y Fn(A)478
+91 y Fq(T)529 111 y(E)579 91 y(X)14 b(2)706 105 y Fl(")780
+91 y Fq(nativ)m(e)28 b(mo)s(de)e(only\))h(forces)g Fp(PSfrag)h
+Fq(to)g(op)s(erate)g(exactly)g(as)f(if)f(L)3013 75 y
+Fn(A)3052 91 y Fq(T)3103 111 y(E)3154 91 y(X)h(2.09)h(compat-)227
+204 y(ibilit)m(y)i(mo)s(de)i(w)m(as)g(enabled.)46 b(As)32
+b(a)h(result,)f Fk(bl)g Fq(alignmen)m(t)f(is)h(the)g(default,)g(and)g
+Fk(\\tex)f Fq(scanning)h(is)227 317 y(enabled)d(for)g(all)f(EPS)h
+(\014les.)39 b(This)28 b(option)h(is)f(useful)g(if)g(y)m(ou)i(are)g
+(trying)e(to)j(con)m(v)m(ert)g(old)d(L)3361 300 y Fn(A)3400
+317 y Fq(T)3451 337 y(E)3501 317 y(X)i(2.09)227 430 y(do)s(cumen)m(ts)g
+(to)h(L)817 413 y Fn(A)856 430 y Fq(T)907 450 y(E)958
+430 y(X)14 b(2)1085 444 y Fl(")1132 430 y Fq(.)227 580
+y(The)25 b(L)433 564 y Fn(A)472 580 y Fq(T)523 600 y(E)574
+580 y(X2.09)i(v)m(ersion)e(of)32 b Fp(PSfrag)26 b Fq(generated)h(an)e
+(auxiliary)e(\014le)i(for)g(eac)m(h)i(EPS)d(\014gure)h(con)m(taining)
+227 693 y(imp)s(ortan)m(t)30 b(replacemen)m(t)h(information.)39
+b(These)30 b(\014les)f(are)i(no)f(longer)g(used)g(and)f(can)i(b)s(e)f
+(deleted.)0 881 y Fk(2emode)44 b Fq(\(L)391 864 y Fn(A)430
+881 y Fq(T)481 900 y(E)531 881 y(X)33 b(2.09)h(compatibilit)m(y)c(mo)s
+(de)i(only\))g(forces)h Fp(PSfrag)g Fq(to)g(remain)e(in)g(L)2965
+864 y Fn(A)3004 881 y Fq(T)3055 900 y(E)3105 881 y(X)14
+b(2)3232 895 y Fl(")3311 881 y Fq(mo)s(de,)33 b(ev)m(en)227
+994 y(in)f(the)h(presence)g(of)g(a)g(L)1070 977 y Fn(A)1109
+994 y Fq(T)1160 1013 y(E)1211 994 y(X)g(2.09)h(do)s(cumen)m(t;)h(this)c
+(is)h(the)i(direct)e(opp)s(osite)g(of)h Fk(209mode)p
+Fq(.)47 b(When)227 1107 y(enabled,)30 b(the)g(default)g(alignmen)m(t)g
+(is)f Fk(Bl)p Fq(,)h(and)g Fk(\\tex)f Fq(scanning)g(is)h(turned)f
+(o\013)i(b)m(y)f(default.)0 1294 y Fk(scanall)44 b Fq(turns)26
+b(on)h Fk(\\tex)f Fq(scanning)h(b)m(y)g(default.)39 b(Use)28
+b(this)e(option)h(if)g(most)g(y)m(our)h(\014gures)e(use)i(em)m(b)s
+(edded)227 1407 y Fk(\\tex)h Fq(commands.)0 1595 y Fk(debug)44
+b Fq(turns)i(on)h(some)h(of)f(the)h(debugging)e(features)h(of)h
+(PSfrag.)90 b(It)48 b(inserts)e(extra)i(co)s(de)f(in)m(to)g(the)227
+1708 y(P)m(ostScript)38 b(\014le)f(that)i(dra)m(w)f(the)g(b)s(ounding)e
+(b)s(o)m(xes)i(of)h(eac)m(h)g(piece)f(of)g(text)i(that)e(is)g
+(replaced.)63 b(It)227 1820 y(is)30 b(probably)e(not)j(useful)d(to)k
+(an)m(y)m(one)f(but)f(the)g(dev)m(elop)s(ers)g(of)38
+b Fp(PSfrag)p Fq(.)0 2157 y Ft(7)135 b(An)44 b(Example)0
+2409 y Fq(In)30 b(the)g(follo)m(wing)f(example,)i(w)m(e)g(demonstrate)g
+(ho)m(w)f(to)h(use)g Fp(PSfrag)g Fq(with)e(the)i(MA)-8
+b(TLAB)31 b(pac)m(k)-5 b(age.)43 b(The)0 2522 y(follo)m(wing)33
+b(MA)-8 b(TLAB)36 b(commands)e(generate)i(a)g(plot)e(of)h(b)s(oth)f(a)h
+(sine)e(w)m(a)m(v)m(e)k(and)d(a)h(cosine)g(w)m(a)m(v)m(e,)j(places)0
+2635 y(b)s(oth)g(simple)e(tags)k(and)e Fk(\\tex)f Fq(replacemen)m(ts)i
+(in)m(to)g(the)g(\014gure,)h(and)e(sa)m(v)m(es)i(the)f(result)e(as)i
+(an)g(EPS)e(\014le)0 2748 y Fk(example.eps)p Fq(.)174
+2997 y Fg(t)44 b(=)f(0:.1:10;)174 3096 y(plot\(t,sin\(t\),t,c)o(os)o
+(\(t\))o(\);)174 3196 y(axis\('square'\);)38 b(grid;)174
+3296 y(title\('\\tex[B][B])o({P)o(lot)f(of)43 b($\\sin\(t\)$)c(and)k
+($\\cos\(t\)$}'\);)174 3395 y(xlabel\('\\tex[t][t)o(]{)o($t$)o(}')o
+(\);)174 3495 y(ylabel\('\\tex[B][B)o(]{)o($\\s)o(in)o(\(t\))o($,)37
+b($\\cos\(t\)$}'\);)174 3595 y(text\(t\(30\),sin\(t\()o(30)o(\)\),)o
+('p)o(1'\))o(;)174 3694 y(text\(t\(60\),sin\(t\()o(60)o(\)\),)o('p)o
+(2'\))o(;)174 3794 y(text\(t\(90\),sin\(t\()o(90)o(\)\),)o('p)o(2'\))o
+(;)174 3894 y(tt=text\(t\(50\),cos)o(\(t)o(\(50)o(\)\))o(,'p)o(3')o
+(\);)174 3993 y(set\(tt,'Horizonta)o(lA)o(lig)o(nm)o(ent)o(',)o('ce)o
+(nt)o(er)o(',')o(Ve)o(rti)o(ca)o(lA)o(lig)o(nm)o(ent)o(',)o(...)349
+4093 y('bottom','Rotat)o(ion)o(',)o(ata)o(n2)o(\(-s)o(in)o(\(t)o(\(50)o
+(\)\))o(*10)o(,2)o(\)*)o(180)o(/p)o(i\);)174 4192 y(print)42
+b(-deps)f(example)0 4454 y Fq(\(In)46 b(MA)-8 b(TLAB,)48
+b(the)f('text')i(command)d(defaults)g(to)h(a)h(left-cen)m(ter)f
+(alignmen)m(t,)k(corresp)s(onding)45 b(to)i(a)0 4567
+y Fk([)p Fm(h)p Fi(psp)-5 b(osn)7 b Fm(i)s Fk(])30 b
+Fq(argumen)m(t)g(of)h Fk([l])p Fq(.\))0 4730 y(The)g(co)s(de)h(b)s(elo)
+m(w)e(includes)f Fk(example.eps)g Fq(in)m(to)i(the)h(curren)m(t)f(do)s
+(cumen)m(t,)h(resizing)e(it)h(to)h(a)g(width)e(of)h(3.5)0
+4843 y(inc)m(hes.)38 b(Sev)m(eral)25 b Fk(\\psfrag)d
+Fq(commands)i(are)h(used)f(to)h(replace)f(the)h(tags)h
+Fk(p1)p Fq(,)f Fk(p2)p Fq(,)g(and)f Fk(p3)g Fq(in)f(the)i(\014gure,)g
+(and)0 4956 y(the)g(command)f Fk(\\psfragscanon)d Fq(command)j(is)f
+(used)h(to)h(notify)g Fp(PSfrag)g Fq(that)g(it)f(m)m(ust)g(scan)h
+Fk(example.eps)0 5069 y Fq(for)30 b(the)h Fk(\\tex)e
+Fq(tags.)174 5318 y Fg(\\begin{figure}[tb)o(h])349 5417
+y(\\unitlength=1in)349 5517 y(\\begin{center})523 5616
+y(\\psfragscanon)523 5716 y(\\psfrag{p1}[l]{\\)o(beg)o(in)o({pi)o(ct)o
+(ur)o(e}\()o(0,)o(0\))697 5816 y(\\put\(0.15,)40 b(0.2\){\\makebox\(0,)
+o(0\))o([l])o({$)o(\\s)o(in\()o(t\))o($}})1858 6065 y
+Fq(7)p eop
+%%Page: 8 8
+8 7 bop 697 91 a Fg(\\put\(0.1,0.2\){\\ve)o(cto)o(r\()o(-1)o(,-2)o(\){)
+o(0.1)o(}})697 191 y(\\end{picture}})523 291 y(\\psfrag*{p1}[][l)o(]{$)
+o(\\a)o(st$)o(})523 390 y(\\psfrag{p2}[][l])o({$\\)o(as)o(t$})523
+490 y(\\psfrag{p3}{$\\co)o(s\(t)o(\)$)o(})523 589 y(\\includegraphics)o
+([wi)o(dt)o(h=3)o(.5)o(in)o(]{e)o(xa)o(mpl)o(e.)o(ep)o(s})392
+689 y(\\end{center})392 789 y(\\caption{A)40 b(\\textsf{psfrag})d
+(example.})174 888 y(\\end{figure})0 1137 y Fq(Note)32
+b(the)e(use)g(of)h(a)g Fk(picture)d Fq(en)m(vironmen)m(t)i(within)e
+(the)i(replacemen)m(t)h(for)f Fk(p1)p Fq(.)830 3364 y
+ /PSfrag where{pop(p1)[[0(Bl)1 0][1(l)1 0]](p2)[[2(l)1 0]](p3)[[3(Bl)1
+0]](\\tex[t][t]{$t$})[[4(t)1 0]](\\tex[B][B]{$\\sin\(t\)$, $\\cos\(t\)$})[[5(B)1
+0]](\\tex[B][B]{Plot of $\\sin\(t\)$ and $\\cos\(t\)$})[[6(B)1 0]]6
+0 -1/Begin PSfrag}{userdict /PSfrag{pop}put}ifelse
+
+830 3364 a @beginspecial 97 @llx 197 @lly 502 @urx 604
+@ury 2520 @rwi @setspecial
+%%BeginDocument: example.eps
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: MATLAB, The Mathworks, Inc.
+%%Title: example.eps
+%%CreationDate: 11/05/96 21:16:44
+%%DocumentNeededFonts: Helvetica
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%Pages: 1
+%%BoundingBox: 97 197 502 604
+%%EndComments
+
+%%BeginProlog
+
+% MathWorks dictionary
+/MathWorks 150 dict begin
+
+% definition operators
+/bdef {bind def} bind def
+/ldef {load def} bind def
+/xdef {exch def} bdef
+/xstore {exch store} bdef
+
+% operator abbreviations
+/c /clip ldef
+/cc /concat ldef
+/cp /closepath ldef
+/gr /grestore ldef
+/gs /gsave ldef
+/mt /moveto ldef
+/np /newpath ldef
+/cm /currentmatrix ldef
+/sm /setmatrix ldef
+/rc {rectclip} bdef
+/rf {rectfill} bdef
+/rm /rmoveto ldef
+/rl /rlineto ldef
+/s /show ldef
+/sc {setcmykcolor} bdef
+/sr /setrgbcolor ldef
+/w /setlinewidth ldef
+/j /setlinejoin ldef
+/cap /setlinecap ldef
+
+% page state control
+/pgsv () def
+/bpage {/pgsv save def} bdef
+/epage {pgsv restore} bdef
+/bplot /gsave ldef
+/eplot {stroke grestore} bdef
+
+% orientation switch
+/portraitMode 0 def
+/landscapeMode 1 def
+
+% coordinate system mappings
+/dpi2point 0 def
+
+% font control
+/FontSize 0 def
+/FMS {
+ /FontSize xstore %save size off stack
+ findfont
+ [FontSize 0 0 FontSize neg 0 0]
+ makefont
+ setfont
+ }bdef
+
+/reencode {
+exch dup where
+{pop load} {pop StandardEncoding} ifelse
+exch
+dup 3 1 roll
+findfont dup length dict begin
+ { 1 index /FID ne {def}{pop pop} ifelse } forall
+ /Encoding exch def
+ currentdict
+end
+definefont pop
+} bdef
+
+/isroman {
+findfont /CharStrings get
+/Agrave known
+} bdef
+
+/FMSR {
+3 1 roll 1 index
+dup isroman
+{reencode} {pop pop} ifelse
+exch FMS
+} bdef
+
+/csm {
+ 1 dpi2point div -1 dpi2point div scale
+ neg translate
+ landscapeMode eq {90 rotate} if
+ } bdef
+
+% line types: solid, dotted, dashed, dotdash
+/SO { [] 0 setdash } bdef
+/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+/DA { [6 dpi2point mul] 0 setdash } bdef
+/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+
+% macros for lines and objects
+/L {
+ lineto
+ stroke
+ } bdef
+/MP {
+ 3 1 roll moveto
+ 1 sub {rlineto} repeat
+ } bdef
+/AP {
+ {rlineto} repeat
+ } bdef
+/PP {
+ closepath fill
+ } bdef
+/DP {
+ closepath stroke
+ } bdef
+/MR {
+ 4 -2 roll moveto
+ dup 0 exch rlineto
+ exch 0 rlineto
+ neg 0 exch rlineto
+ closepath
+ } bdef
+/FR {
+ MR stroke
+ } bdef
+/PR {
+ MR fill
+ } bdef
+/L1i {
+ { currentfile picstr readhexstring pop } image
+ } bdef
+
+/tMatrix matrix def
+/MakeOval {
+ newpath
+ tMatrix currentmatrix pop
+ translate scale
+ 0 0 1 0 360 arc
+ tMatrix setmatrix
+ } bdef
+/FO {
+ MakeOval
+ stroke
+ } bdef
+/PO {
+ MakeOval
+ fill
+ } bdef
+
+/PD {
+ 2 copy moveto lineto stroke
+ } bdef
+
+
+currentdict end def
+%%EndProlog
+
+%%BeginSetup
+MathWorks begin
+
+0 cap
+
+end
+%%EndSetup
+
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 97 197 502 604
+MathWorks begin
+bpage
+%%EndPageSetup
+
+%%BeginObject: graph1 1
+bplot
+
+/dpi2point 12 def
+portraitMode 0216 7344 csm
+
+ 956 91 4862 4883 MR c np
+76 dict begin %Colortable dictionary
+/c0 { 0 0 0 sr} bdef
+/c1 { 1 1 1 sr} bdef
+/c2 { 1 0 0 sr} bdef
+/c3 { 0 1 0 sr} bdef
+/c4 { 0 0 1 sr} bdef
+/c5 { 1 1 0 sr} bdef
+/c6 { 1 0 1 sr} bdef
+/c7 { 0 1 1 sr} bdef
+%%IncludeResource: font Helvetica
+/Helvetica /ISOLatin1Encoding 144 FMSR
+
+1 j
+c1
+ 0 0 6912 5185 PR
+6 w
+DO
+4 w
+c0
+1463 4613 mt 1463 388 L
+1463 388 mt 1463 388 L
+2308 4613 mt 2308 388 L
+2308 388 mt 2308 388 L
+3153 4613 mt 3153 388 L
+3153 388 mt 3153 388 L
+3999 4613 mt 3999 388 L
+3999 388 mt 3999 388 L
+4844 4613 mt 4844 388 L
+4844 388 mt 4844 388 L
+5689 4613 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+5689 4613 mt 5689 4613 L
+1463 4191 mt 5689 4191 L
+5689 4191 mt 5689 4191 L
+1463 3768 mt 5689 3768 L
+5689 3768 mt 5689 3768 L
+1463 3346 mt 5689 3346 L
+5689 3346 mt 5689 3346 L
+1463 2923 mt 5689 2923 L
+5689 2923 mt 5689 2923 L
+1463 2501 mt 5689 2501 L
+5689 2501 mt 5689 2501 L
+1463 2078 mt 5689 2078 L
+5689 2078 mt 5689 2078 L
+1463 1655 mt 5689 1655 L
+5689 1655 mt 5689 1655 L
+1463 1233 mt 5689 1233 L
+5689 1233 mt 5689 1233 L
+1463 811 mt 5689 811 L
+5689 811 mt 5689 811 L
+1463 388 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+SO
+6 w
+1463 4613 mt 5689 4613 L
+1463 388 mt 5689 388 L
+5689 4613 mt 5689 388 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 4613 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 1463 4571 L
+1463 388 mt 1463 430 L
+1423 4782 mt
+(0) s
+2308 4613 mt 2308 4571 L
+2308 388 mt 2308 430 L
+2268 4782 mt
+(2) s
+3153 4613 mt 3153 4571 L
+3153 388 mt 3153 430 L
+3113 4782 mt
+(4) s
+3999 4613 mt 3999 4571 L
+3999 388 mt 3999 430 L
+3959 4782 mt
+(6) s
+4844 4613 mt 4844 4571 L
+4844 388 mt 4844 430 L
+4804 4782 mt
+(8) s
+5689 4613 mt 5689 4571 L
+5689 388 mt 5689 430 L
+5609 4782 mt
+(10) s
+1463 4613 mt 1505 4613 L
+5689 4613 mt 5647 4613 L
+1264 4666 mt
+(-1) s
+1463 4191 mt 1505 4191 L
+5689 4191 mt 5647 4191 L
+1144 4244 mt
+(-0.8) s
+1463 3768 mt 1505 3768 L
+5689 3768 mt 5647 3768 L
+1144 3821 mt
+(-0.6) s
+1463 3346 mt 1505 3346 L
+5689 3346 mt 5647 3346 L
+1144 3399 mt
+(-0.4) s
+1463 2923 mt 1505 2923 L
+5689 2923 mt 5647 2923 L
+1144 2976 mt
+(-0.2) s
+1463 2501 mt 1505 2501 L
+5689 2501 mt 5647 2501 L
+1348 2554 mt
+(0) s
+1463 2078 mt 1505 2078 L
+5689 2078 mt 5647 2078 L
+1228 2131 mt
+(0.2) s
+1463 1655 mt 1505 1655 L
+5689 1655 mt 5647 1655 L
+1228 1708 mt
+(0.4) s
+1463 1233 mt 1505 1233 L
+5689 1233 mt 5647 1233 L
+1228 1286 mt
+(0.6) s
+1463 811 mt 1505 811 L
+5689 811 mt 5647 811 L
+1228 864 mt
+(0.8) s
+1463 388 mt 1505 388 L
+5689 388 mt 5647 388 L
+1348 441 mt
+(1) s
+1463 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 388 L
+1463 388 mt 1463 388 L
+5689 388 mt 5689 388 L
+gs 1463 388 4227 4226 MR c np
+42 183 43 192 42 200 42 206 42 210 43 211 42 210 42 208
+42 204 43 196 42 188 42 177 42 165 43 151 42 135 42 119
+42 100 43 82 42 61 42 42 42 20 43 -1 42 -22 42 -43
+42 -63 43 -83 42 -102 42 -120 43 -137 42 -152 42 -166 42 -178
+43 -188 42 -197 42 -204 42 -208 43 -211 42 -211 42 -209 42 -206
+43 -199 42 -192 42 -182 42 -170 43 -157 42 -142 42 -126 42 -108
+43 -89 42 -70 42 -50 43 -29 42 -8 42 13 42 34 43 55
+42 75 42 94 42 113 43 130 42 146 42 160 42 173 43 185
+42 193 42 202 42 206 43 210 42 211 42 211 42 207 43 202
+42 195 42 186 42 176 43 162 42 149 42 132 43 116 42 97
+42 79 42 58 43 37 42 17 42 -4 42 -26 43 -46 42 -67
+42 -86 42 -105 43 -123 42 -139 42 -155 42 -168 43 -180 42 -190
+42 -198 42 -205 43 -209 1505 2290 100 MP stroke
+42 -211 1463 2501 2 MP stroke
+42 -106 43 -87 42 -67 42 -48 42 -26 43 -5 42 15 42 37
+42 57 43 78 42 96 42 115 42 132 43 148 42 162 42 175
+42 185 43 195 42 202 42 207 42 210 43 211 42 211 42 206
+42 202 43 194 42 185 42 174 43 161 42 146 42 131 42 113
+43 95 42 76 42 56 42 35 43 14 42 -7 42 -28 42 -49
+43 -69 42 -89 42 -107 42 -125 43 -141 42 -157 42 -169 42 -182
+43 -191 42 -199 42 -205 43 -210 42 -211 42 -210 42 -209 43 -204
+42 -197 42 -189 42 -179 43 -166 42 -153 42 -137 42 -121 43 -103
+42 -84 42 -64 42 -44 43 -22 42 -2 42 19 42 40 43 61
+42 81 42 99 42 118 43 135 42 150 42 164 43 177 42 187
+42 197 42 203 43 207 42 211 42 211 42 210 43 206 42 200
+42 193 42 183 43 172 42 158 42 144 42 128 43 110 42 92
+42 73 42 52 43 31 1505 399 100 MP stroke
+42 11 1463 388 2 MP stroke
+
+gr
+3194 4942 mt
+(\\tex[t][t]{$t$}) s
+1090 3419 mt -90 rotate
+(\\tex[B][B]{$\\sin\(t\)$, $\\cos\(t\)$}) s
+90 rotate
+2314 273 mt
+(\\tex[B][B]{Plot of $\\sin\(t\)$ and $\\cos\(t\)$}) s
+2689 2048 mt
+(p1) s
+3956 3343 mt
+(p2) s
+5224 1495 mt
+(p2) s
+3486 2178 mt -78 rotate
+(p3) s
+78 rotate
+
+end
+
+eplot
+%%EndObject graph 1
+
+epage
+end
+
+showpage
+
+%%Trailer
+%%EOF
+
+%%EndDocument
+ @endspecial 830 3364 a
+ /End PSfrag
+ 830 3364 a 830 2476 a
+ /Hide PSfrag
+ 830 2476
+a 20 2539 a Fq(PSfrag)g(replacemen)m(ts)p 20 2570 811
+4 v 830 2573 a
+ /Unhide PSfrag
+ 830 2573 a 830 2686 a
+ {
+ 830 2686 a 920 2589
+a Fq(sin)o(\()p Fl(t)p Fq(\))849 2649 y Fb(\001)830 2686
+y(\001)-42 b(\013)830 2686 y
+ } 0/Place PSfrag
+ 830 2686 a 807 2778 a
+ {
+ 807
+2778 a 784 2799 a Fm(\003)807 2778 y
+ } 1/Place PSfrag
+ 807 2778 a 807 2891
+a
+ {
+ 807 2891 a 784 2912 a Fm(\003)807 2891 y
+ } 2/Place PSfrag
+ 807 2891 a
+605 3002 a
+ {
+ 605 3002 a Fq(cos)q(\()p Fl(t)p Fq(\))605
+3002 y
+ } 3/Place PSfrag
+ 605 3002 a 814 3082 a
+ {
+ 814 3082 a 798 3138 a Fl(t)814
+3082 y
+ } 4/Place PSfrag
+ 814 3082 a 582 3228 a
+ {
+ 582 3228 a -248 w Fq(sin)o(\()p
+Fl(t)p Fq(\),)31 b(cos)q(\()p Fl(t)p Fq(\))582 3228 y
+ } 5/Place PSfrag
+
+582 3228 a 356 3341 a
+ {
+ 356 3341 a -475 w Fq(Plot)f(of)h(sin)n(\()p
+Fl(t)p Fq(\))g(and)f(cos)q(\()p Fl(t)p Fq(\))356 3341
+y
+ } 6/Place PSfrag
+ 356 3341 a 1313 3659 a Fq(Figure)f(2:)41 b(A)31 b Fp(PSfrag)g
+Fq(example.)0 3866 y(The)f(result)f(of)i(these)g(t)m(w)m(o)g(steps)g
+(is)e(sho)m(wn)h(in)f(Figure)h(2.)0 4154 y Fj(7.1)112
+b(Figure)37 b(scaling)g(and)h(resizing)0 4372 y Fq(There)33
+b(are)h(t)m(w)m(o)g(w)m(a)m(ys)h(to)f(resize)f(EPS)g(\014gures)f(with)g
+(the)i Fp(graphics)f Fq(pac)m(k)-5 b(age,)37 b(and)c(eac)m(h)h(has)f
+(as)h(di\013eren)m(t)0 4485 y(e\013ect)i(on)f Fp(PSfrag)h
+Fq(replacemen)m(ts.)55 b(If)34 b(y)m(ou)i(are)f(used)f(to)i(using)f
+Fk(epsf.sty)p Fq(,)f(y)m(ou)h(will)d(b)s(e)j(accustomed)h(to)0
+4598 y(only)29 b(one)i(suc)m(h)f(b)s(eha)m(vior.)0 4757
+y(If)25 b(y)m(ou)g(use)g(the)g Fk(\\scalebox)e Fq(or)i
+Fk(\\resizebox)d Fq(macros)k(of)32 b Fk(graphics.sty)p
+Fq(,)24 b(then)g(the)i Fp(PSfrag)g Fq(replacmen)m(ts)0
+4870 y Fi(wil)5 b(l)50 b Fq(scale)41 b(with)d(the)j(\014gure.)70
+b(This)38 b(e\013ect)k(is)d(illustrated)f(in)h(3)i(b)s(elo)m(w.)69
+b(Figure)40 b(3)h(uses)f(the)g(follo)m(wing)0 4983 y(command)30
+b(to)h(scale)g(the)f(\014gure)g(to)h(3.5)h(inc)m(hes)e(in)f(width:)0
+5219 y Fg(\\resizebox{3.5in)o(}{!)o(}{)o(\\i)o(ncl)o(ud)o(egr)o(ap)o
+(hic)o(s{)o(ex)o(amp)o(le)o(.ep)o(s})o(})0 5467 y Fq(This)f(is)h(in)g
+(direct)g(con)m(trast)i(to)g(Figure)e(2,)i(whic)m(h)d(uses)i(the)g
+Fk(width=)e Fq(k)m(eyw)m(ord)i(from)g(the)g Fk(graphicx.sty)p
+Fq(,)0 5580 y(as)h(follo)m(ws:)0 5816 y Fg(\\includegraphics)o([wi)o
+(dt)o(h=)o(3.5)o(in)o(]{\\)o(in)o(clu)o(de)o(gr)o(aph)o(ic)o(s{e)o(xa)o
+(mp)o(le.)o(ep)o(s}})1858 6065 y Fq(8)p eop
+%%Page: 9 9
+9 8 bop 830 2110 a
+ currentpoint currentpoint translate 0.62222 0.62222 scale neg exch
+neg exch translate
+ 830 2110 a 830 2110 a
+ /PSfrag where{pop(p1)[[0(Bl)1 0][1(l)1 0]](p2)[[2(l)1 0]](p3)[[3(Bl)1
+0]](\\tex[t][t]{$t$})[[4(t)1 0]](\\tex[B][B]{$\\sin\(t\)$, $\\cos\(t\)$})[[5(B)1
+0]](\\tex[B][B]{Plot of $\\sin\(t\)$ and $\\cos\(t\)$})[[6(B)1 0]]6
+0 -1/Begin PSfrag}{userdict /PSfrag{pop}put}ifelse
+ 830 2110 a @beginspecial
+97 @llx 197 @lly 502 @urx 604 @ury 4050 @rwi @setspecial
+%%BeginDocument: example.eps
+%!PS-Adobe-2.0 EPSF-1.2
+%%Creator: MATLAB, The Mathworks, Inc.
+%%Title: example.eps
+%%CreationDate: 11/05/96 21:16:44
+%%DocumentNeededFonts: Helvetica
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%%Pages: 1
+%%BoundingBox: 97 197 502 604
+%%EndComments
+
+%%BeginProlog
+
+% MathWorks dictionary
+/MathWorks 150 dict begin
+
+% definition operators
+/bdef {bind def} bind def
+/ldef {load def} bind def
+/xdef {exch def} bdef
+/xstore {exch store} bdef
+
+% operator abbreviations
+/c /clip ldef
+/cc /concat ldef
+/cp /closepath ldef
+/gr /grestore ldef
+/gs /gsave ldef
+/mt /moveto ldef
+/np /newpath ldef
+/cm /currentmatrix ldef
+/sm /setmatrix ldef
+/rc {rectclip} bdef
+/rf {rectfill} bdef
+/rm /rmoveto ldef
+/rl /rlineto ldef
+/s /show ldef
+/sc {setcmykcolor} bdef
+/sr /setrgbcolor ldef
+/w /setlinewidth ldef
+/j /setlinejoin ldef
+/cap /setlinecap ldef
+
+% page state control
+/pgsv () def
+/bpage {/pgsv save def} bdef
+/epage {pgsv restore} bdef
+/bplot /gsave ldef
+/eplot {stroke grestore} bdef
+
+% orientation switch
+/portraitMode 0 def
+/landscapeMode 1 def
+
+% coordinate system mappings
+/dpi2point 0 def
+
+% font control
+/FontSize 0 def
+/FMS {
+ /FontSize xstore %save size off stack
+ findfont
+ [FontSize 0 0 FontSize neg 0 0]
+ makefont
+ setfont
+ }bdef
+
+/reencode {
+exch dup where
+{pop load} {pop StandardEncoding} ifelse
+exch
+dup 3 1 roll
+findfont dup length dict begin
+ { 1 index /FID ne {def}{pop pop} ifelse } forall
+ /Encoding exch def
+ currentdict
+end
+definefont pop
+} bdef
+
+/isroman {
+findfont /CharStrings get
+/Agrave known
+} bdef
+
+/FMSR {
+3 1 roll 1 index
+dup isroman
+{reencode} {pop pop} ifelse
+exch FMS
+} bdef
+
+/csm {
+ 1 dpi2point div -1 dpi2point div scale
+ neg translate
+ landscapeMode eq {90 rotate} if
+ } bdef
+
+% line types: solid, dotted, dashed, dotdash
+/SO { [] 0 setdash } bdef
+/DO { [.5 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+/DA { [6 dpi2point mul] 0 setdash } bdef
+/DD { [.5 dpi2point mul 4 dpi2point mul 6 dpi2point mul 4 dpi2point mul] 0 setdash } bdef
+
+% macros for lines and objects
+/L {
+ lineto
+ stroke
+ } bdef
+/MP {
+ 3 1 roll moveto
+ 1 sub {rlineto} repeat
+ } bdef
+/AP {
+ {rlineto} repeat
+ } bdef
+/PP {
+ closepath fill
+ } bdef
+/DP {
+ closepath stroke
+ } bdef
+/MR {
+ 4 -2 roll moveto
+ dup 0 exch rlineto
+ exch 0 rlineto
+ neg 0 exch rlineto
+ closepath
+ } bdef
+/FR {
+ MR stroke
+ } bdef
+/PR {
+ MR fill
+ } bdef
+/L1i {
+ { currentfile picstr readhexstring pop } image
+ } bdef
+
+/tMatrix matrix def
+/MakeOval {
+ newpath
+ tMatrix currentmatrix pop
+ translate scale
+ 0 0 1 0 360 arc
+ tMatrix setmatrix
+ } bdef
+/FO {
+ MakeOval
+ stroke
+ } bdef
+/PO {
+ MakeOval
+ fill
+ } bdef
+
+/PD {
+ 2 copy moveto lineto stroke
+ } bdef
+
+
+currentdict end def
+%%EndProlog
+
+%%BeginSetup
+MathWorks begin
+
+0 cap
+
+end
+%%EndSetup
+
+%%Page: 1 1
+%%BeginPageSetup
+%%PageBoundingBox: 97 197 502 604
+MathWorks begin
+bpage
+%%EndPageSetup
+
+%%BeginObject: graph1 1
+bplot
+
+/dpi2point 12 def
+portraitMode 0216 7344 csm
+
+ 956 91 4862 4883 MR c np
+76 dict begin %Colortable dictionary
+/c0 { 0 0 0 sr} bdef
+/c1 { 1 1 1 sr} bdef
+/c2 { 1 0 0 sr} bdef
+/c3 { 0 1 0 sr} bdef
+/c4 { 0 0 1 sr} bdef
+/c5 { 1 1 0 sr} bdef
+/c6 { 1 0 1 sr} bdef
+/c7 { 0 1 1 sr} bdef
+%%IncludeResource: font Helvetica
+/Helvetica /ISOLatin1Encoding 144 FMSR
+
+1 j
+c1
+ 0 0 6912 5185 PR
+6 w
+DO
+4 w
+c0
+1463 4613 mt 1463 388 L
+1463 388 mt 1463 388 L
+2308 4613 mt 2308 388 L
+2308 388 mt 2308 388 L
+3153 4613 mt 3153 388 L
+3153 388 mt 3153 388 L
+3999 4613 mt 3999 388 L
+3999 388 mt 3999 388 L
+4844 4613 mt 4844 388 L
+4844 388 mt 4844 388 L
+5689 4613 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+5689 4613 mt 5689 4613 L
+1463 4191 mt 5689 4191 L
+5689 4191 mt 5689 4191 L
+1463 3768 mt 5689 3768 L
+5689 3768 mt 5689 3768 L
+1463 3346 mt 5689 3346 L
+5689 3346 mt 5689 3346 L
+1463 2923 mt 5689 2923 L
+5689 2923 mt 5689 2923 L
+1463 2501 mt 5689 2501 L
+5689 2501 mt 5689 2501 L
+1463 2078 mt 5689 2078 L
+5689 2078 mt 5689 2078 L
+1463 1655 mt 5689 1655 L
+5689 1655 mt 5689 1655 L
+1463 1233 mt 5689 1233 L
+5689 1233 mt 5689 1233 L
+1463 811 mt 5689 811 L
+5689 811 mt 5689 811 L
+1463 388 mt 5689 388 L
+5689 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+1463 4613 mt 1463 388 L
+1463 388 mt 5689 388 L
+SO
+6 w
+1463 4613 mt 5689 4613 L
+1463 388 mt 5689 388 L
+5689 4613 mt 5689 388 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 4613 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+1463 4613 mt 1463 4613 L
+1463 4613 mt 1463 4571 L
+1463 388 mt 1463 430 L
+1423 4782 mt
+(0) s
+2308 4613 mt 2308 4571 L
+2308 388 mt 2308 430 L
+2268 4782 mt
+(2) s
+3153 4613 mt 3153 4571 L
+3153 388 mt 3153 430 L
+3113 4782 mt
+(4) s
+3999 4613 mt 3999 4571 L
+3999 388 mt 3999 430 L
+3959 4782 mt
+(6) s
+4844 4613 mt 4844 4571 L
+4844 388 mt 4844 430 L
+4804 4782 mt
+(8) s
+5689 4613 mt 5689 4571 L
+5689 388 mt 5689 430 L
+5609 4782 mt
+(10) s
+1463 4613 mt 1505 4613 L
+5689 4613 mt 5647 4613 L
+1264 4666 mt
+(-1) s
+1463 4191 mt 1505 4191 L
+5689 4191 mt 5647 4191 L
+1144 4244 mt
+(-0.8) s
+1463 3768 mt 1505 3768 L
+5689 3768 mt 5647 3768 L
+1144 3821 mt
+(-0.6) s
+1463 3346 mt 1505 3346 L
+5689 3346 mt 5647 3346 L
+1144 3399 mt
+(-0.4) s
+1463 2923 mt 1505 2923 L
+5689 2923 mt 5647 2923 L
+1144 2976 mt
+(-0.2) s
+1463 2501 mt 1505 2501 L
+5689 2501 mt 5647 2501 L
+1348 2554 mt
+(0) s
+1463 2078 mt 1505 2078 L
+5689 2078 mt 5647 2078 L
+1228 2131 mt
+(0.2) s
+1463 1655 mt 1505 1655 L
+5689 1655 mt 5647 1655 L
+1228 1708 mt
+(0.4) s
+1463 1233 mt 1505 1233 L
+5689 1233 mt 5647 1233 L
+1228 1286 mt
+(0.6) s
+1463 811 mt 1505 811 L
+5689 811 mt 5647 811 L
+1228 864 mt
+(0.8) s
+1463 388 mt 1505 388 L
+5689 388 mt 5647 388 L
+1348 441 mt
+(1) s
+1463 388 mt 5689 388 L
+1463 4613 mt 5689 4613 L
+1463 4613 mt 1463 388 L
+5689 4613 mt 5689 388 L
+1463 388 mt 1463 388 L
+5689 388 mt 5689 388 L
+gs 1463 388 4227 4226 MR c np
+42 183 43 192 42 200 42 206 42 210 43 211 42 210 42 208
+42 204 43 196 42 188 42 177 42 165 43 151 42 135 42 119
+42 100 43 82 42 61 42 42 42 20 43 -1 42 -22 42 -43
+42 -63 43 -83 42 -102 42 -120 43 -137 42 -152 42 -166 42 -178
+43 -188 42 -197 42 -204 42 -208 43 -211 42 -211 42 -209 42 -206
+43 -199 42 -192 42 -182 42 -170 43 -157 42 -142 42 -126 42 -108
+43 -89 42 -70 42 -50 43 -29 42 -8 42 13 42 34 43 55
+42 75 42 94 42 113 43 130 42 146 42 160 42 173 43 185
+42 193 42 202 42 206 43 210 42 211 42 211 42 207 43 202
+42 195 42 186 42 176 43 162 42 149 42 132 43 116 42 97
+42 79 42 58 43 37 42 17 42 -4 42 -26 43 -46 42 -67
+42 -86 42 -105 43 -123 42 -139 42 -155 42 -168 43 -180 42 -190
+42 -198 42 -205 43 -209 1505 2290 100 MP stroke
+42 -211 1463 2501 2 MP stroke
+42 -106 43 -87 42 -67 42 -48 42 -26 43 -5 42 15 42 37
+42 57 43 78 42 96 42 115 42 132 43 148 42 162 42 175
+42 185 43 195 42 202 42 207 42 210 43 211 42 211 42 206
+42 202 43 194 42 185 42 174 43 161 42 146 42 131 42 113
+43 95 42 76 42 56 42 35 43 14 42 -7 42 -28 42 -49
+43 -69 42 -89 42 -107 42 -125 43 -141 42 -157 42 -169 42 -182
+43 -191 42 -199 42 -205 43 -210 42 -211 42 -210 42 -209 43 -204
+42 -197 42 -189 42 -179 43 -166 42 -153 42 -137 42 -121 43 -103
+42 -84 42 -64 42 -44 43 -22 42 -2 42 19 42 40 43 61
+42 81 42 99 42 118 43 135 42 150 42 164 43 177 42 187
+42 197 42 203 43 207 42 211 42 211 42 210 43 206 42 200
+42 193 42 183 43 172 42 158 42 144 42 128 43 110 42 92
+42 73 42 52 43 31 1505 399 100 MP stroke
+42 11 1463 388 2 MP stroke
+
+gr
+3194 4942 mt
+(\\tex[t][t]{$t$}) s
+1090 3419 mt -90 rotate
+(\\tex[B][B]{$\\sin\(t\)$, $\\cos\(t\)$}) s
+90 rotate
+2314 273 mt
+(\\tex[B][B]{Plot of $\\sin\(t\)$ and $\\cos\(t\)$}) s
+2689 2048 mt
+(p1) s
+3956 3343 mt
+(p2) s
+5224 1495 mt
+(p2) s
+3486 2178 mt -78 rotate
+(p3) s
+78 rotate
+
+end
+
+eplot
+%%EndObject graph 1
+
+epage
+end
+
+showpage
+
+%%Trailer
+%%EOF
+
+%%EndDocument
+ @endspecial 830 2110 a
+ /End PSfrag
+ 830 2110 a 830 1223 a
+ /Hide PSfrag
+ 830 1223
+a 20 1286 a Fq(PSfrag)30 b(replacemen)m(ts)p 20 1317
+811 4 v 830 1320 a
+ /Unhide PSfrag
+ 830 1320 a 830 1433 a
+ {
+ 830 1433 a 920
+1336 a Fq(sin)o(\()p Fl(t)p Fq(\))849 1396 y Fb(\001)830
+1433 y(\001)-42 b(\013)830 1433 y
+ } 0/Place PSfrag
+ 830 1433 a 807 1525
+a
+ {
+ 807 1525 a 784 1546 a Fm(\003)807 1525 y
+ } 1/Place PSfrag
+ 807 1525 a
+807 1638 a
+ {
+ 807 1638 a 784 1659 a Fm(\003)807 1638 y
+ } 2/Place PSfrag
+ 807
+1638 a 605 1749 a
+ {
+ 605 1749 a Fq(cos)q(\()p Fl(t)p Fq(\))605
+1749 y
+ } 3/Place PSfrag
+ 605 1749 a 814 1829 a
+ {
+ 814 1829 a 798 1885 a Fl(t)814
+1829 y
+ } 4/Place PSfrag
+ 814 1829 a 582 1975 a
+ {
+ 582 1975 a -248 w Fq(sin)o(\()p
+Fl(t)p Fq(\),)31 b(cos)q(\()p Fl(t)p Fq(\))582 1975 y
+ } 5/Place PSfrag
+
+582 1975 a 356 2088 a
+ {
+ 356 2088 a -475 w Fq(Plot)f(of)h(sin)n(\()p
+Fl(t)p Fq(\))g(and)f(cos)q(\()p Fl(t)p Fq(\))356 2088
+y
+ } 6/Place PSfrag
+ 356 2088 a 830 2110 a
+ currentpoint currentpoint translate 1 0.62222 div 1 0.62222 div scale
+neg exch neg exch translate
+ 830 2110 a 198 2406 a Fq(Figure)g(3:)41
+b(The)30 b(same)h Fp(PSfrag)g Fq(example)f(as)h(Figure)f(2,)h(using)e
+Fk(\\resizebox)e Fq(to)k(set)g(the)g(width.)0 2665 y(Figure)50
+b(2)g(also)g(re\015ects)h(the)f(b)s(eha)m(vior)f(that)i(y)m(ou)f(w)m
+(ould)f(see)h(when)f(using)g(the)h Fk(epsf.sty)e Fq(macros)0
+2778 y Fk(\\epfxsize)p Fq(,)40 b Fk(\\epsfysize)p Fq(,)g
+Fi(etc)p Fq(.)70 b(In)40 b(these)h(cases,)i(the)e Fp(PSfrag)g
+Fq(text)g(do)s(es)f(not)g(scale)h(with)e(it.)69 b(to)41
+b(re-)0 2891 y(size)30 b(the)h(\014gure.)0 3045 y(As)d(y)m(ou)g(can)g
+(see,)h(the)g(text)f(in)f(the)h(second)g(\014gure)f(is)g(decidedly)f
+(smaller)h(than)g(the)h(\014rst.)40 b(This)26 b(is)h(b)s(ecause)0
+3158 y Fk(\\resizebox)19 b Fq(uses)j(P)m(ostScript)g(tric)m(ks)g(to)h
+(scale)f Fi(al)5 b(l)32 b Fq(of)23 b(the)f(con)m(ten)m(ts)i(of)e(its)g
+(argumen)m(t.)38 b(Since)21 b(the)i Fk(\\psfrag)0 3271
+y Fq(commands)41 b(are)h(not)f(actually)g(t)m(yp)s(eset)h(un)m(til)e
+Fi(within)49 b Fq(the)42 b Fk(\\includegraphics)37 b
+Fq(command,)44 b(they)d(are)0 3384 y(resized)30 b(as)g(w)m(ell.)0
+3539 y(The)20 b Fk(graphicx.sty)e Fq(k)m(ey-v)-5 b(alue)21
+b(pairs)f Fk(width=)p Fq(,)h Fk(height=)p Fq(,)g(and)g
+Fk(scale=)e Fq(scale)i(the)g(\014gure)g(without)e(scaling)0
+3652 y(the)36 b(replacemen)m(t)g(text,)j(as)d(long)f(as)h(they)g(are)h
+(supplied)32 b Fi(b)-5 b(efor)g(e)44 b Fq(an)35 b Fk(angle=)f
+Fq(rotation)j(k)m(ey)-8 b(.)58 b(Of)35 b(course,)0 3765
+y(the)26 b Fk(\\resizebox)d Fq(and)i Fk(\\scalebox)f
+Fq(macros)i(are)g(still)e(a)m(v)-5 b(ailable)26 b(in)e
+Fk(graphicx.sty)p Fq(,)g(so)i(y)m(ou)g(can)g(mix)f(and)0
+3878 y(matc)m(h)31 b(b)s(oth)f(b)s(eha)m(viors)f(as)i(y)m(ou)g(see)g
+(\014t.)40 b(See)31 b(the)f Fp(graphics)h Fq(do)s(cumen)m(tation)f(for)
+g(more)h(details.)0 4032 y(If)h(y)m(ou)h(are)f(still)f(unsure)f(ab)s
+(out)i(these)h(distinctions,)e(then)h(try)g(b)s(oth)g(metho)s(ds)f(for)
+i(scaling)e(y)m(our)h(\014gures)0 4145 y(un)m(til)d(y)m(ou)h(\014nd)f
+(a)i(con)m(v)m(en)m(tion)g(that)g(w)m(orks)g(b)s(est)f(for)g(y)m(ou.)0
+4470 y Ft(8)135 b(Common)45 b(mistak)l(es,)i(kno)l(wn)e(problems,)h
+(and)e(bugs)0 4714 y Fp(PSfrag)31 b Fq(is)f(bug-free.)0
+4869 y(W)-8 b(ell,)29 b(of)g(course)f(w)m(e're)i(kidding.)37
+b Fp(PSfrag)30 b Fq(uses)e(some)h(tric)m(ky)f(P)m(ostScript)h(hac)m(ks)
+g(to)g(ac)m(hiev)m(e)h(its)e(goals.)41 b(So)0 4982 y(it)33
+b(really)g(w)m(ould)f(not)i(surprise)e(us)h(if)g(y)m(ou)h(\014nd)e
+(bugs,)i(If)f(y)m(ou)h(\014nd)f(an)m(y)h(problems,)f(please)g
+(con\014rm)g(they)0 5095 y(are)e(not)f(men)m(tioned)g(b)s(elo)m(w;)g
+(and,)g(if)f(not,)i(rep)s(ort)f(them)g(to)i(te)f Fp(PSfrag)g
+Fq(mailing)d(list)h(\(see)i(b)s(elo)m(w\).)0 5377 y Fj(8.1)112
+b(Using)39 b Fd(PSfrag)g Fj(tags)f(prop)s(erly)0 5590
+y Fq(One)31 b(of)h(the)f(more)h(frequen)m(t)g(problems)d(that)k(p)s
+(eople)d(encoun)m(ter)i(with)e Fp(PSfrag)j Fq(is)d(that)i(it)f
+(replaces)h Fi(some)0 5703 y Fq(of)h(their)f(tags)h(prop)s(erly)-8
+b(,)32 b(but)g(not)h(all)f(of)h(them.)48 b(Whenev)m(er)33
+b(p)s(ossible,)e(y)m(ou)i(should)e(design)h(y)m(our)g(\014gures)0
+5816 y Fi(with)h Fa(PSfrag)g Fi(in)f(mind)p Fq(,)f(b)m(y)g(follo)m
+(wing)e(this)g(rule:)1858 6065 y(9)p eop
+%%Page: 10 10
+10 9 bop 227 91 a Fq(When)35 b(adding)f(a)h(piece)g(of)h(text)g(\(a)f
+Fi(tag)8 b Fq(\))36 b(in)e(a)i(\014gure)e(for)h Fp(PSfrag)h
+Fq(to)g(replace,)g(use)f(a)g Fi(single)227 204 y(wor)-5
+b(d)p Fq(,)33 b(con)m(taining)d(only)f(unaccen)m(ted)i(letters)g(and)f
+(n)m(um)m(b)s(ers.)0 442 y(This)f(is)h(the)h(w)m(a)m(y)h(that)g
+Fp(PSfrag)g Fq(is)e(in)m(tended)f(to)j(b)s(e)f(used;)f(doing)g(so)i
+(will)c(almost)j(guaran)m(tee)h(that)g Fp(PSfrag)0 555
+y Fq(w)m(orks)41 b(as)g(adv)m(ertised.)73 b(Of)41 b(course,)j(one)d
+(cannot)h(alw)m(a)m(ys)g(follo)m(w)e(this)g(rule;)45
+b(and)c(a)g(small)f(handful)e(of)0 667 y(dra)m(wing)d(pac)m(k)-5
+b(ages)37 b(consisten)m(tly)e(cause)i(problems.)55 b(In)m(v)-5
+b(ariably)d(,)36 b(these)g(problems)e(can)i(b)s(e)f(resolv)m(ed)h(b)m
+(y)0 780 y(understanding)28 b(ho)m(w)j Fp(PSfrag)h Fq(lo)s(oks)d(for)h
+(these)h(tags.)0 943 y(P)m(ostScript)20 b(has)g(\014v)m(e)g(commands)g
+(to)h(displa)m(y)e(text|)p Fk(show)p Fq(,)j Fk(ashow)p
+Fq(,)f Fk(kshow)p Fq(,)g Fk(widthshow)p Fq(,)f(and)g
+Fk(awidthshow)p Fq(|)0 1056 y(although,)34 b(in)e(man)m(y)h(cases,)i
+(an)e(EPS)g(\014le)f(will)f(de\014ne)h(abbreviations)g(of)i(these)f
+(commands.)49 b Fp(PSfrag)34 b Fq(ac-)0 1169 y(tually)j
+Fi(inter)-5 b(c)g(epts)46 b Fq(these)39 b(commands)e(and)g(c)m(hec)m
+(ks)j(them)e(for)f(the)h(tags)h(to)g(replace.)63 b(When)38
+b(the)g(string)0 1282 y(matc)m(hes)32 b(a)f(kno)m(wn)f(tag,)i
+Fp(PSfrag)f Fq(\014gures)f(out)g(where)g(the)h(tag)h
+Fi(would)41 b Fq(ha)m(v)m(e)32 b(b)s(een)d(displa)m(y)m(ed,)h(and)g
+(inserts)0 1395 y(its)g(replacemen)m(t)h(there.)41 b(When)30
+b(it)g(do)s(esn't,)g Fp(PSfrag)h Fq(lets)f(the)h Fk(*show)e
+Fq(command)h(pro)s(ceed)g(normally)-8 b(.)0 1557 y(The)30
+b(strings)g(that)i(these)f Fk(*show)f Fq(displa)m(y)f(are)i(delimited)e
+(with)g(paren)m(theses,)j(m)m(uc)m(h)f(lik)m(e)f(the)i
+Fk(C)e Fq(language)0 1670 y(uses)g(double)f(quotes.)41
+b(F)-8 b(or)31 b(example:)227 1908 y Fk(\(This)47 b(is)g(a)g(test.\))f
+(show)393 b Fq(displa)m(ys)362 b Fk(This)47 b(is)g(a)g(test.)0
+2145 y Fq(Unmatc)m(hed)34 b(paren)m(theses)f(and)g(certain)g(other)h
+(sp)s(ecial)e(c)m(haracters)j(m)m(ust)e(b)s(e)g(preceded)g(b)m(y)g(a)h
+(bac)m(kslash)0 2258 y(in)29 b(a)i(P)m(ostScript)f(string.)39
+b(F)-8 b(or)32 b(example:)227 2496 y Fk(\(x)47 b(=)h(\\\(0,1]\))e(show)
+393 b Fq(displa)m(ys)361 b Fk(x)48 b(=)f(\(0,1])0 2733
+y Fq(With)30 b(this)f(in)g(mind,)g(here)h(is)f(the)i(rule)e(ab)s(out)h
+Fp(PSfrag)h Fq(tags:)227 2971 y(The)i(tag)h(supplied)c(to)k(the)g
+Fk(\\psfrag)d Fq(command)i(m)m(ust)g(b)s(e)g(t)m(yp)s(ed)f
+Fi(exactly)k(as)g(it)f(app)-5 b(e)g(ars)38 b(in)227 3083
+y(the)33 b(EPS)f(\014le's)h Fk(*show)e Fi(c)-5 b(ommand)p
+Fq(,)33 b(without)c(the)i(surrounding)c(paren)m(theses.)0
+3321 y(In)i(other)h(w)m(ords,)f Fp(PSfrag)i Fq(will)c(w)m(ork)j(only)e
+(if)h(the)h(string)e(in)h(the)h Fk(\\psfrag)d Fq(command)j(exactly)g
+(duplicates)0 3434 y(what)45 b(is)e(found)g(in)h(the)h(EPS)e(\014le.)83
+b(If)44 b(y)m(our)h(strings)e(ha)m(v)m(e)j(bac)m(kslashes)f(added)e(to)
+j(them,)i(as)d(in)e(the)0 3547 y Fk(x)k(=)h(\\\(0,1])35
+b Fq(example,)k(then)d(y)m(ou)i(will)c(ha)m(v)m(e)k(to)g(add)e(that)i
+(bac)m(kslash)f(to)g(the)h Fk(\\psfrag)d Fq(command)h(as)0
+3660 y(w)m(ell.)65 b(And)38 b Fp(PSfrag)h Fq(can)g(only)f(replace)h
+Fi(entir)-5 b(e)46 b Fq(strings,)40 b(not)f(just)f(parts)g(of)h(one.)66
+b(So)39 b(if)f(y)m(our)h(EPS)e(\014le)0 3773 y(con)m(tains)227
+4010 y Fk(\(I)47 b(want)g(to)g(replace)f(the)h(XXX)g(here\))f(show)0
+4247 y Fq(then)30 b(the)h Fk(\\psfrag)d Fq(command)i(will)e(fail)h(if)g
+(y)m(ou)i(supply)d(just)i(the)g Fk(XXX)p Fq(.)0 4410
+y(Y)-8 b(ou)31 b(can)f(use)g(a)g(simple)e(text)j(editor)f(to)g(c)m(hec)
+m(k)i(things,)d(if)g(y)m(ou)h(lik)m(e;)g(EPS)f(\014les)g(are)i
+(\(almost)f(alw)m(a)m(ys\))h(just)0 4523 y(simple)d(ASCI)s(I)h
+(\014les.)0 4686 y(Unfortunately)-8 b(,)30 b(some)h(dra)m(wing)e(pac)m
+(k)-5 b(ages)31 b(displa)m(y)e(text)i(b)m(y)f(sending)e(eac)m(h)k(c)m
+(haracter)f Fi(individual)5 b(ly)39 b Fq(to)31 b(a)0
+4799 y Fk(show)k Fq(command.)57 b(In)36 b(other)g(w)m(ords,)h(if)e(y)m
+(ou)i(use)e(the)i(dra)m(wing)e(to)s(ol)h(to)g(put)g(the)g(string)f
+(\\test")j(in)d(y)m(our)0 4912 y(\014gure,)30 b(it)g(will)e(do)i
+(something)g(lik)m(e)f(this:)227 5149 y Fk(\(t\))47 b(show)g(\(e\))g
+(show)f(\(s\))h(show)g(\(t\))g(show)0 5386 y Fq(If)32
+b(this)f(is)h(true)g(in)f(y)m(our)i(case,)h(w)m(e)f(ap)s(ologize;)h(it)
+e(mak)m(es)i(using)e Fp(PSfrag)h Fq(m)m(uc)m(h)g(more)f(incon)m(v)m
+(enien)m(t|y)m(ou)0 5499 y(will)c(b)s(e)h(limited)g(to)i(single-c)m
+(haracter)g(tags.)41 b(Suc)m(h)30 b(to)s(ols)g(also)h(prev)m(en)m(t)g
+(the)f(use)g(of)h(the)f Fk(\\tex)g Fq(command.)1835 6065
+y(10)p eop
+%%Page: 11 11
+11 10 bop 0 91 a Fj(8.2)112 b(Problems)36 b(using)h(some)h
+Fd(x\014g)g Fj(\014gures)0 305 y Fp(PSfrag)27 b Fq(do)s(es)f(not)h(w)m
+(ork)f(with)f Fp(x\014g)j Fq(\014gures)d(that)i(use)f(\\pattern)h
+(\014lls.")38 b(When)26 b(pain)m(ting/\014lling)d(a)j(p)s(olygon,)0
+418 y Fp(x\014g)40 b Fq(pro)m(vides)e(a)h(n)m(um)m(b)s(er)e(of)i(c)m
+(hoices:)58 b(simple)37 b(colors)h(or)h(grey)g(lev)m(els,)i(or)d(a)h(n)
+m(um)m(b)s(er)f(of)h(patterns)f(lik)m(e)0 531 y(cross-hatc)m(hes,)d(c)m
+(hec)m(k)m(ers,)h Fi(etc.)c Fq(Unfortunately)-8 b(,)33
+b(using)e(a)j(pattern)e(\014ll)f(in)h(a)h(\014gure)f(pro)s(cessed)g(b)m
+(y)i Fp(PSfrag)0 644 y Fq(results)29 b(in)g(P)m(ostScript)h(\014les)f
+(that)i(will)d(not)j(prin)m(t.)0 798 y(F)-8 b(ortunately)g(,)32
+b(there)e(are)h(w)m(ork)-5 b(arounds:)111 1008 y(1.)46
+b(Av)m(oid)34 b(pattern)f(\014lls)f(in)g(y)m(our)h Fp(x\014g)i
+Fq(\014gures;)g(use)e(simple)e(colors)j(\(or)g(greys\))g(instead.)49
+b(Consult)32 b(the)227 1121 y Fp(x\014g)g Fq(do)s(cumen)m(tation)e(for)
+g(details.)111 1301 y(2.)46 b(Op)s(en)25 b(the)h(o\013ending)f
+Fk(.eps)g Fq(\014le)g(\(generated)i(b)m(y)g Fp(\014g2dev)h
+Fq(or)e Fp(x\014g)q Fq('s)g(\\exp)s(ort")h(command\))f(with)f(y)m(our)
+227 1414 y(fa)m(v)m(orite)40 b(text)f(editor.)63 b(Lo)s(ok)38
+b(for)g(the)h(de\014nition)c Fk(PATfill)i Fq(command;)42
+b(inside)35 b(this)i(subroutine,)227 1527 y(replace)31
+b Fk(show)e Fq(with)g Fk(oldshow)f Fq(\(there)j(is)f(only)f(one)i(o)s
+(ccurrence\).)0 1736 y(F)-8 b(or)45 b(those)f(P)m(ostScript)f(hac)m(k)m
+(ers)i(out)f(there:)68 b(b)s(oth)43 b Fp(PSfrag)h Fq(and)f
+Fp(x\014g)i Fq(rede\014ne)e(the)h(P)m(ostScript)g Fk(show)0
+1849 y Fq(command.)39 b Fk(oldshow)23 b Fq(is)g(where)i
+Fp(x\014g)h Fq(stores)f(the)h(\\old")e(v)m(ersion)h(of)g(the)g
+(command.)39 b(If)24 b(y)m(ou)h(can)g(determine)0 1962
+y(wh)m(y)h(this)g(\014x)g(w)m(orks,)h(and)f(con)m(vince)h(the)g
+Fp(x\014g)h Fq(main)m(tainers)d(to)i(mak)m(e)h(the)f(c)m(hange;)i(or,)e
+(if)f(y)m(ou)h(can)g(suggest)0 2075 y(a)k(\014x)f(for)g
+Fp(PSfrag)p Fq(,)g(please)g(do.)0 2357 y Fj(8.3)112 b(Problems)36
+b(using)h(old)g(v)m(ersions)g(of)h(the)f Fd(semina)m(r)i
+Fj(pac)m(k)-6 b(age)0 2570 y Fq(The)30 b(p)s(opular)e
+Fp(semina)m(r)k Fq(pac)m(k)-5 b(age)32 b(w)m(as,)f(for)g(a)m(while,)e
+(incompatbile)g(with)g(PSfrag)h(3.0.)41 b(This)29 b(is)h(due)f(to)i
+(the)0 2683 y(fact)39 b(that)g(PSfrag)f(relies)f(on)h(certain)h
+(features)f(of)h(the)f(L)2033 2666 y Fn(A)2072 2683 y
+Fq(T)2123 2703 y(E)2174 2683 y(X)14 b(2)2301 2697 y Fl(")2386
+2683 y Fq(output)38 b(routine,)h(while)e Fp(semina)m(r)j
+Fq(still)0 2796 y(uses)30 b(one)h(largely)e(b)s(orro)m(w)m(ed)h(from)g
+(L)1291 2779 y Fn(A)1330 2796 y Fq(T)1381 2816 y(E)1431
+2796 y(X)h(2.09.)0 2951 y(The)24 b(b)s(est)g(solution)f(for)h(this)f
+(problem)g(is)g(to)i(mak)m(e)h(sure)e(that)g(y)m(ou)h(ha)m(v)m(e)h(the)
+e(latest)h(v)m(ersion)f(of)h(the)f Fp(semina)m(r)0 3064
+y Fq(pac)m(k)-5 b(age,)31 b(whic)m(h)26 b(can)i(b)s(e)g(retriev)m(ed)f
+(from)h(an)m(y)g(CT)-8 b(AN)28 b(site,)g(lik)m(ely)f(from)g(the)h(same)
+g(place)g(y)m(ou)g(found)f Fp(PS-)0 3177 y(frag)p Fq(.)41
+b(A)31 b(w)m(eb)f(page)i(for)e Fp(semina)m(r)i Fq(can)f(b)s(e)f(found)f
+(at)i Fk(http://www.tug.org/applic)o(atio)o(ns/S)o(emi)o(nar/)o
+Fq(.)0 3290 y(The)f(1997/10/13)35 b(v)m(ersion)30 b(seems)g(to)h(ha)m
+(v)m(e)h(corrected)f(the)g(problem.)0 3444 y(If)36 b(for)g(some)h
+(reason)f(y)m(ou)h(are)g(forced)f(to)h(use)f(an)g(older)g(v)m(ersion,)h
+(there)g(is)e(a)i(temp)s(orary)-8 b(,)38 b Fp(dvips)p
+Fq(-sp)s(eci\014c)0 3557 y(\014x:)i(add)30 b(the)h(command)f
+Fk(\\special{header=psfrag.)o(pro})24 b Fq(just)30 b(b)s(efore)g
+Fk(\\begin{document})c Fq(in)j(y)m(our)0 3670 y(L)24
+3653 y Fn(A)63 3670 y Fq(T)114 3690 y(E)164 3670 y(X)i(\014le.)0
+3995 y Ft(9)135 b(The)44 b Fo(PSfrag)i Ft(mailing)g(list)0
+4240 y Fq(There)31 b(is)g(a)h(Ma)5 b(joro)s(domo)33 b(mailing)c(list)i
+(for)g(purp)s(oses)f(of)39 b Fp(PSfrag)33 b Fq(main)m(tenance.)45
+b(It)32 b Fi(is)i(not)41 b Fq(in)m(tended)31 b(to)0 4353
+y(replace)i(this)f(man)m(ual)g(or)g(a)i(small)d(amoun)m(t)i(of)g
+(educated)h(guessw)m(ork.)48 b(But,)34 b(it)e Fi(is)40
+b Fq(the)33 b(p)s(erfect)g(place)g(for)0 4465 y(bug)25
+b(rep)s(orts,)h(dev)m(elopmen)m(t)g(ideas,)h(and)e(so)h(forth.)38
+b(An)m(y)m(one)27 b(who)e(wishes)f(to)j(assist)e(in)f
+Fp(PSfrag)q Fq('s)i(ev)m(olution)0 4578 y(ma)m(y)31 b(subscrib)s(e;)d
+(to)j(do)f(so,)h(just)f(send)g(mail)f(to)227 4788 y Fk
+(majordomo@rascals.stanfor)o(d.ed)o(u)0 4998 y Fq(with)g(the)i(line)d
+Fk(subscribe)46 b(psfrag)28 b Fq(in)h(the)i Fi(b)-5 b(o)g(dy)40
+b Fq(of)30 b(the)h(text.)0 5153 y(Bug)g(supp)s(orts,)d(ideas,)i
+Fi(etc.)41 b Fq(should)28 b(go)j(to)227 5362 y Fk
+(psfrag@rascals.stanford.e)o(du)p Fq(.)0 5572 y(If)41
+b(y)m(ou)h(ha)m(v)m(e)h(found)e(a)h(bug)f(to)i(rep)s(ort,)h(please)d
+(pro)m(vide)g(us)g(with)g(the)h(necessary)g(\014les)f(\(a)h(L)3369
+5556 y Fn(A)3408 5572 y Fq(T)3459 5592 y(E)3509 5572
+y(X)g(\014le,)0 5685 y(the)g(EPS)e(\014gures,)k Fi(etc.)p
+Fq(\))e(so)g(w)m(e)g(can)f(test)i(it)e(out)h(ourselv)m(es!)73
+b(T)-8 b(ry)42 b(to)g(pro)m(vide)e(us)h(with)g(the)g(shortest)0
+5798 y(self-con)m(tained)30 b(example)g(that)h(demonstrates)g(y)m(our)f
+(bug.)41 b(If)29 b(this)h(is)f(not)i(p)s(ossible,)d(drop)h(us)h(a)h
+(line)d(\014rst.)1835 6065 y(11)p eop
+%%Trailer
+end
+userdict /end-hook known{end-hook}if
+%%EOF
diff --git a/support/easylatex/psfrag/pfgguide.tex b/support/easylatex/psfrag/pfgguide.tex
new file mode 100644
index 0000000000..7e7d68c6a1
--- /dev/null
+++ b/support/easylatex/psfrag/pfgguide.tex
@@ -0,0 +1,695 @@
+%% pfgguide.dtx Copyright (c) 1995 Michael C. Grant and Craig Barratt
+%% All rights are reserved.
+%%
+%% This system 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. Don't come complaining to us if you
+%% modify this file and it doesn't work! If this file is
+%% modified by anyone but the authors, those changes and
+%% their authors must be explicitly stated HERE.
+%%
+\documentclass[11pt]{ltxguide}
+\usepackage{shortvrb,psfrag,graphicx}
+
+% I prefer more to a page.
+\marginparsep 0pt \oddsidemargin 0pt \evensidemargin 0pt
+\textwidth \paperwidth \advance \textwidth by-2in
+\topmargin 0pt \headheight 0pt \headsep 0pt
+\textheight \paperheight \advance \textheight by-2in
+
+\let\pkg\textsf
+\let\fname\texttt
+\let\pscom\texttt
+\newcommand{\pfg}{\pkg{PSfrag}}
+\newcommand{\ie}{\emph{i.e.\@}}
+\newcommand{\eg}{\emph{e.g.\@}}
+\newcommand{\etc}{\emph{etc.\@}}
+\newcommand{\netaddress}[1]{\texttt{#1}}
+\MakeShortVerb{\|}
+\def\cs#1{%
+ {\ttfamily\expandafter\string\csname #1\endcsname}}
+\providecommand\marg[1]{%
+ {\ttfamily\char`\{}{\em#1\/}{\ttfamily\char`\}}}
+\providecommand\oarg[1]{%
+ {\ttfamily[}{\em #1\/}{\ttfamily]}}
+\providecommand\parg[1]{%
+ {\ttfamily(}{\em #1\/}{\ttfamily)}}
+
+\title{The \pfg\ system, version 3}
+\author{Michael C. Grant and David Carlisle\\
+ \netaddress{psfrag@rascals.stanford.edu}}
+\date{11 April 1998}
+
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+\section{What is \pfg?}
+
+Many drawing and graphing packages produce output in the Encapsulated
+PostScript (EPS) format, but few can easily produce the equations and other
+scientific text of which \TeX\ is so capable. On the other hand, many
+\LaTeX\-based drawing packages are not as expressive or easy-to-use as these
+stand-alone tools.
+
+\pfg\ provides the best of both worlds by allowing the user to precisely
+overlay Encapsulated PostScript (EPS) files with arbitrary \LaTeX\
+constructions. In order to accomplish this, the user places a simple text
+``tag'' in the graphics file, as a ``position marker'' of sorts. Then, using
+simple \LaTeX\ commands, the user instructs \pfg\ to remove that tag from the
+figure, and replace it with a properly sized, aligned, and rotated \LaTeX\
+equation. \pfg\ also allows the user to place \LaTeX\ constructs directly into
+the EPS file itself.
+
+Dr.\ Craig Barratt wrote the original version of \pfg\ as a graduate student at
+Stanford University. The interface has changed very little since then, but the
+internals have been completely re-written. The current version of PSfrag is
+maintained by Michael Grant and David Carlisle. Many thanks go to the members
+of the \pfg\ mailing list, and to everyone who has submitted a bug report or
+suggestion.
+
+\section{\pfg\ necessities}
+
+In order to use \pfg, you will need the following tools:
+\begin{itemize}
+\item A recent version of \LaTeXe\ and the \pkg{graphics} package.
+ \pfg\ currently requires the 1995/12/01 version or later of these
+ packages, but it is always best to have the most recent release.
+\item If you wish to use the \pkg{seminar} package with \pfg, you
+ should make sure you have the 1997/10/13 version or later (see
+ section \ref{sec:sem-bug}).
+\item A compatible DVI-to-PostScript driver (see below). \pkg{dvips} is
+ the primary choice of the \pfg\ developers, and is certainly the
+ most widely-used.
+\end{itemize}
+
+The latest versions of \LaTeXe, the \pkg{graphics} package, \pfg,
+and \pkg{dvips} can all be found on CTAN, the
+Comprehensive \TeX\ Archive Network. The CTAN cites, and their mirrors,
+include:
+\begin{center}
+ \begin{tabular}{lll}
+ Name & IP address & Location \\ \hline
+ |ftp.dante.de| & 129.206.100.192 & Germany \\
+ |ftp.tex.ac.uk| & 128.232.1.87 & England \\
+ |ftp.cdrom.com| & 165.113.58.253 & USA \\
+ \end{tabular}
+\end{center}
+
+\subsection{Choosing a PostScript driver}
+\label{sec:compat}
+
+\pfg\ relies on some sensitive PostScript tricks to accomplish its goals. Due
+to limited time and resources, the authors could not confirm that \pfg\ works
+properly on every available PostScript driver. We have attempted to insure that
+it will \emph{eventually} work on every driver that is fully comaptible with
+the \pkg{graphics} package (\ie, one for which a \fname{.def} file is
+provided.)
+
+The drivers which have been confirmed to work with \pfg\ are:
+\begin{center}
+\begin{tabular}{lll}
+Driver & Tested by & Compatibility \\ \hline
+Thomas Rokicki's \pkg{dvips} & the authors &
+fully compatible \\
+Y\&Y's \pkg{DVIPSONE} & the authors &
+fully compatible
+\end{tabular}
+\end{center}
+Please help us add entries to this list! If \pfg\ works with your driver,
+please let us know, so we can add it to the list. If possible, test your \pfg\
+output on both Level 1 and Level 2 printers, so we can make a distinction here
+if necessary.If \pfg\ does \emph{not} work, please submit a bug report; consult
+section \ref{sec:mail} for contact information. unfortunately, we cannot
+promise a fix for everyone, but we would like to insure that the most popular
+drivers remain compatible.
+
+\section{Installing \pfg}
+
+Installing the various \pfg\ files is quite simple:
+\begin{enumerate}
+\item Run \LaTeX\ on \fname{psfrag.ins} to extract
+ \fname{psfrag.sty} and \fname{psfrag.pro}.
+\item Install \fname{psfrag.sty} in a standard location for
+ \LaTeXe\ macros. For \pkg{kpathsea}-based systems like
+ \pkg{te\TeX}, this path is determined by the
+ \texttt{TEXINPUTS} variable.
+\item Install \fname{psfrag.pro} wherever your PostScript driver
+ looks for header files. For \pkg{kpathsea}-based systems
+ like \pkg{te\TeX}, this is determined by the \texttt{DVIPSHEADERS}
+ varaible. For \pkg{dvips} in particular, the most logical choice would
+ be the same directory in which \fname{tex.pro} and
+ \fname{special.pro} are located.
+\item If you have an older version of \pfg, you may delete the
+ following files, if they exist: \fname{ps2frag.ps}, \fname{ps2frag}
+ or \fname{ps2psfrag} (the processing scripts),
+ and \fname{epsf.sty} (the one provided by \pfg,
+ \emph{not} the \pkg{dvips} version!). System managers may wish to
+ replace \fname{ps2frag} with a script which notifies users of the
+ upgrade.
+\end{enumerate}
+
+\section{Usage}
+Here is a quick summary of the usage of \pfg:
+\begin{itemize}
+
+\item Use the \cs{includegraphics} command defined by the \pkg{graphics}
+ and \pkg{graphicx} packages to add EPS figures to your new documents.
+ If you must use the \cs{epsfbox} command from \fname{epsf.sty} for
+ old documents, then \fname{epsf.sty} must be loaded \emph{before}
+ \fname{psfrag.sty}. Other packages based on \fname{graphics.sty},
+ such as \pkg{graphicx} or \pkg{epsfig}, do not suffer this restriction.
+
+\item Load \fname{psfrag.sty} with a \cs{usepackage} command.
+
+\item Make sure that your EPS figures contain a simple ``tag'' word in
+ each position that you would like a \LaTeX\ replacements. Use
+ a \emph{single} word, composed of unaccented letters and numbers.
+ Some effort has been made to allow for more arbitrary tag text,
+ but the mechanism is not infallible; see section \ref{sec:tags}.
+
+\item For each tag word in your EPS file, add a command to your
+ your \LaTeX\ document to specify how this tag is to replaced,
+ as follows:
+\begin{quote}
+ \cs{psfrag}\marg{tag}\oarg{posn}\oarg{psposn}%
+ \oarg{scale}\oarg{rot}\marg{\LaTeX\ text}
+\end{quote}
+ The tag will be replaced by the \LaTeX\ text.
+ Example: in a drawing program like \pkg{xfig}, you place the text
+ \begin{quote}
+ |xy|
+ \end{quote}
+ at a particular point. To replace this with $x+y$, one possible
+ macro would be
+ \begin{quote}
+ \cs{psfrag{xy}{$x+y$}}
+ \end{quote}
+\end{itemize}
+
+All \cs{psfrag} calls that precede the \cs{includegraphics} (or
+equivalent) in the same or surrounding environments will be utilized
+for a given PostScript file. So, you can define global \cs{psfrag}s as
+well as those that are local to a figure.
+
+Any text that is not mentioned in a \cs{psfrag} command
+will not be replaced; hence, PostScript and \LaTeX\
+text can be freely mixed.
+
+When viewing the output with a DVI previewer such as \pkg{dviwin} or
+\pkg{xdvi}, a vertical list of the replacements will be placed on the
+left side of each figure. This list allows you to check the
+typesetting of your replacements; it disappears in the final
+PostScript version. Unfortunately, DVI drivers are incapable of
+\emph{placing} the \pfg\ replacements on top of the figure, so
+for that you will need to print it out or use a PostScript
+previewer like GhostView.
+
+This version of \pfg\ \emph{should} run properly in the compatibility
+mode of \LaTeX2.09. Let us know if you find otherwise (see section
+\ref{sec:mail}).
+
+\section{Commands and Environments}\label{sec:pos}
+
+\begin{decl}
+\cs{psfrag}\marg{tag}\oarg{posn}\oarg{psposn}%
+ \oarg{scale}\oarg{rot}\marg{replacement}\\
+\cs{psfrag*}\marg{tag}\oarg{posn}\oarg{psposn}%
+ \oarg{scale}\oarg{rot}\marg{replacement}
+\end{decl}
+
+The \cs{psfrag} macro defines a \LaTeX-typeset \marg{replacement} to be placed
+at the same position as a PostScript \marg{tag}. The command should be placed
+before the call to \cs{includegraphics}, or equivalent. It matches \emph{all}
+occurrences of \marg{tag} in the figure.
+
+A \cs{psfrag} command will remain in effect until its surrounding environment
+is exited. Therefore, you can define global \cs{psfrag}s which will apply to
+every figure, or define \cs{psfrag}s inside a a |figure| environment (for
+example) which apply to a single EPS file.
+
+The optional positioning arguments \oarg{posn} and \oarg{psposn} specify how
+the bounding box of the \LaTeX\ text and the bounding box of the PostScript
+text line up, respectively. Some drawing packages would refer to these as
+``control points'' or ``alignment points.''
+
+\begin{description}
+\item{\oarg{posn}}
+the \LaTeX\ text reference point. The syntax of this argument is identical to
+that of the \cs{makebox} command. Up to two letters may be chosen, one from the
+list \{|t|,|b|,|B|,|c|\}, (top, bottom, baseline, center) and another from
+\{|l|,|r|,|c|\} (left, right, center). If either letter is omitted, then |c|
+(center) is assumed. Together, these specify one of 12 anchor points. If the
+argument is omitted altogether, then |[Bl]|, or left baseline positioning, is
+assumed---but note that supplying |[]| specifies centered positioning.
+
+When running in \LaTeX\ 2.09 compatibility mode, the default alignment
+is |[bl]|, in order to support legacy documents. Usually this should
+not make a significant difference.
+\item{\oarg{psposn}}
+the PostScript text reference point. The possible arguments are
+identical to that of \oarg{posn}, as is the default value, |[Bl]|
+(|[bl]| in \LaTeX\ 2.09 compatibility mode.)
+\end{description}
+
+The \LaTeX\ replacement may be optionally scaled and rotated about
+its reference point:
+\begin{description}
+\item{\oarg{scale}} Scaling factor (default 1). It's best if you
+ use font size changes in the \LaTeX\ text rather than scale, but
+ you can use the scale to tweak its size. Default is |[1]|.
+\item{\oarg{rotn}} Extra rotation of the text around its reference
+ point, in degrees. The nominal rotation of the \LaTeX\ text matches
+ that of the PostScript text it replaces. The total rotation is this
+ nominal value plus \oarg{rotn}. The default is |[0]|.
+\end{description}
+
+\begin{figure}[tbh]
+\psfragdebugon
+\begin{center}
+ \psfrag{gA}[br][br]{|[br][br]|}
+ \psfrag*{gA}[Br][b ][2]{|[Br][b][2]|}
+ \psfrag*{gA}[ r][bl]{|[r][bl]|}
+ \psfrag*{gA}[tr][Bl]{|[tr][Bl]|}
+ \psfrag*{gA}[b ][B ]{|[b][B]|}
+ \psfrag*{gA}[B ][Br]{|[B][Br]|}
+ \psfrag*{gA}[ ][ r]{|[][r]|}
+ \psfrag*{gA}[t ][ ][0.75][45]{|[t][][0.75][45]|}
+ \psfrag*{gA}[bl][ l][1.5][30]{|[bl][l][1.5][30]|}
+ \psfrag*{gA}[Bl][tl]{|[Bl][tl]|}
+ \psfrag*{gA}[bl][Bl]{~~~~~(baseline)}
+ \psfrag*{gA}[bl][l]{~~~~~(center line)}
+ \psfrag*{gA}[bl][t][1][-90]{~~~~~(center line)}
+ \psfrag*{gA}[ l][t ]{|[l][t]|}
+ \psfrag*{gA}[tl][tr][1][180]{|[tl][tr][1][180]|}
+ \resizebox{4in}{!}{\includegraphics[angle=30]{testfig.eps}}
+\end{center}
+\caption{An illustration of various options for the \cs{psfrag} command.}
+\label{fig:argexam}
+\end{figure}
+Figure~\ref{fig:argexam} illustrates various combinations of the arguments. If
+you're viewing this with a DVI previewer such as \pkg{xdvi}, the \pfg\
+replacements should be lined up to the left of the figure; and, if your
+previewer can display EPS files, a large, rotated |gA|. If you have printed
+this out, or are viewing it with a PostScript viewer like GhostView, then the
+replacements should superimposed on a graphical representation of the bounding
+box, center lines, and baseline of the tag |gA|. (This graphical box is
+provided only in debug mode.)
+
+If a replacement for \marg{tag} already exists, the unstarred
+command \cs{psfrag} will replace it without warning. The starred
+version \cs{psfrag*}, however, will \emph{add} the new replacement
+to a list. Using the starred command, a single piece of PostScript
+text could trigger several replacements. I can't think of a reason
+why most users would use the starred version, but it was used in
+Figure~\ref{fig:argexam} above.
+
+\begin{decl}
+\cs{begin}|{psfrags}|
+\cs{end}|{psfrags}|
+\end{decl}
+
+The |psfrags| environment may be used, if necessary, to delimit the
+scope of the \cs{psfrag} calls. As we said before, \cs{psfrag}
+commands retain their effect until the most immediate surrounding
+environment is exited. \emph{Any} environment will do: |center|,
+|figure|, \etc. Therefore, it may never be necessary to use this
+environment, and the environment has no other effect on the document.
+
+\subsection{Embedding \pfg\ operations into EPS files}
+\label{sec:texcomm}
+
+\begin{decl}
+\cs{tex}\oarg{posn}\oarg{psposn}\oarg{scale}%
+ \oarg{rot}\marg{\LaTeX\ text}\\
+\cs{psfragscanon}~~~\cs{psfragscanoff}
+\end{decl}
+
+\pfg\ 3.0 supports the embedded \cs{tex} commands found in previous release of
+\pfg. Used properly, this is a powerful tool, but it has been deprecated
+somewhat because of its reliance on a pre-processing step. Unlike previous
+versions of \pfg, support for the \cs{tex} command must be \emph{explicitly
+requested}, as described below.
+
+As you can see, the syntax of the \cs{tex} command is very similar to the
+\cs{psfrag} command. However, instead of adding the \cs{tex} command to your
+\LaTeX\ file, the \cs{tex} command is \emph{embedded in the EPS file itself}.
+In other words, the command becomes its own replacement tag.
+
+For example, you might place the text
+\begin{quote}
+ |\tex[bl][bl]{$\alpha$}|
+\end{quote}
+at a particular point in your PostScript file to have \LaTeX\ replace it
+with $\alpha$. Many \pfg\ users find this feature useful for the axis
+labels, titles, and legends of MATLAB graphs.
+
+The advantage to this approach is that changes can be made to the
+EPS file without having to modify any \cs{psfrag} commands in the
+\LaTeX\ file. (It is still necessary to \emph{re-compile} the
+\LaTeX\ file in such cases, however.)
+
+There are cautions and disadvantages to this approach, including:
+\begin{itemize}
+\item Changing the labels created by \cs{tex} commands requires editing
+ the figure; if you use \cs{psfrag} instead, you need only to edit the
+ document, which might be less cumbersome. (You must
+ run \LaTeX\ again in both cases.)
+\item Because \cs{tex} commands are long strings, they can extend
+ past the other graphics in your EPS file. As a result, they can modify
+ the EPS bounding box in an undesired way. This problem can be mitigated by
+ reducing the font size of the \cs{tex} string, since this does not affect
+ the size of its \pfg\ replacement.
+\item The \cs{tex} command is not supported in compressed PostScript files.
+\item The \TeX\ engine must scan the PostScript file for these strings,
+ which can add to the processing time of your document. (To be honest,
+ we have yet to encounter a case where this is a significant concern.)
+\item \emph{Important!} Whenever a file is scanned by \pfg,
+ it generates a file with the name \cs{jobname}\fname{.pfg}, where \cs{jobname}
+ is the base name of the master \LaTeX\ file. It will overwrite, without
+ warning, any file with that name.
+\end{itemize}
+
+This feature is no longer enabled automatically, except in \LaTeX\ 2.09
+compatibility mode. So, for \LaTeXe\ documents, you must activate it in one of
+two ways:
+\begin{itemize}
+\item To turn on scanning for a single figure, precede the \cs{epsfbox}
+ or \cs{includegraphics} command with a call to the command \cs{psfragscanon}.
+ Scanning will be turned off again when the surrounding environment is
+ exited; or, you can turn it off explicity with a call to \cs{psfragscanoff}.
+\item To turn on scanning for the entire document, pass the option
+ |scanall| to \fname{psfrag.sty} in the \cs{usepackage} command.
+\end{itemize}
+The \cs{tex} scanner will continue to be supported in this form. So, if you do
+find applications where you prefer the \cs{tex} command, do not hesitate to use
+it!
+
+\section{Package Options}
+
+There are only four package options for \pfg. Any other options
+that are not handled by \pfg\ will be forwarded to
+\fname{graphics.sty}.
+\begin{description}
+\item[|209mode|] (\LaTeXe\ native mode only) forces \pfg\
+to operate exactly as if \LaTeX\ 2.09 compatibility mode was
+enabled. As a result, |bl| alignment is the default, and
+\cs{tex} scanning is enabled for all EPS files. This option is
+useful if you are trying to convert old \LaTeX\ 2.09 documents
+to \LaTeXe.
+
+The \LaTeX 2.09 version of \pfg\ generated an auxiliary
+file for each EPS figure containing important replacement information.
+These files are no longer used and can be deleted.
+
+\item[|2emode|] (\LaTeX\ 2.09 compatibility mode only)
+forces \pfg\ to remain in \LaTeXe\ mode, even in the presence of a
+\LaTeX\ 2.09 document; this is the direct opposite of |209mode|. When
+enabled, the default alignment is |Bl|, and \cs{tex} scanning is turned
+off by default.
+
+\item[|scanall|] turns on \cs{tex} scanning by default. Use this
+option if most your figures use embedded \cs{tex} commands.
+
+\item[|debug|] turns on some of the debugging features of PSfrag. It
+inserts extra code into the PostScript file that draw the bounding boxes
+of each piece of text that is replaced. It is probably not useful to anyone
+but the developers of \pfg.
+\end{description}
+
+\section{An Example}\label{sec:example}
+
+In the following example, we demonstrate how to use \pfg\ with
+the MATLAB package. The following MATLAB commands generate a
+plot of both a sine wave and a cosine wave, places both simple
+tags and \cs{tex} replacements into the figure, and saves the
+result as an EPS file \fname{example.eps}.
+\begin{verbatim}
+ t = 0:.1:10;
+ plot(t,sin(t),t,cos(t));
+ axis('square'); grid;
+ title('\tex[B][B]{Plot of $\sin(t)$ and $\cos(t)$}');
+ xlabel('\tex[t][t]{$t$}');
+ ylabel('\tex[B][B]{$\sin(t)$, $\cos(t)$}');
+ text(t(30),sin(t(30)),'p1');
+ text(t(60),sin(t(60)),'p2');
+ text(t(90),sin(t(90)),'p2');
+ tt=text(t(50),cos(t(50)),'p3');
+ set(tt,'HorizontalAlignment','center','VerticalAlignment',...
+ 'bottom','Rotation',atan2(-sin(t(50))*10,2)*180/pi);
+ print -deps example
+\end{verbatim}
+(In MATLAB, the 'text' command defaults to a left-center alignment,
+corresponding to a \oarg{psposn} argument of |[l]|.)
+
+The code below includes \fname{example.eps} into the current document,
+resizing it to a width of 3.5 inches. Several \cs{psfrag}
+commands are used to replace the tags |p1|, |p2|, and |p3| in
+the figure, and the command \cs{psfragscanon} command is used to
+notify \pfg\ that it must scan \fname{example.eps} for the
+\cs{tex} tags.
+\begin{verbatim}
+ \begin{figure}[tbh]
+ \unitlength=1in
+ \begin{center}
+ \psfragscanon
+ \psfrag{p1}[l]{\begin{picture}(0,0)
+ \put(0.15, 0.2){\makebox(0,0)[l]{$\sin(t)$}}
+ \put(0.1,0.2){\vector(-1,-2){0.1}}
+ \end{picture}}
+ \psfrag*{p1}[][l]{$\ast$}
+ \psfrag{p2}[][l]{$\ast$}
+ \psfrag{p3}{$\cos(t)$}
+ \includegraphics[width=3.5in]{example.eps}
+ \end{center}
+ \caption{A \textsf{psfrag} example.}
+ \end{figure}
+\end{verbatim}
+Note the use of a |picture| environment within the replacement
+for |p1|.
+
+\begin{figure}[tbh]
+ \unitlength=1in
+ \begin{center}
+ \psfragscanon
+ \psfrag{p1}[l]{\begin{picture}(0,0)
+ \put(0.15, 0.2){\makebox(0,0)[l]{$\sin(t)$}}
+ \put(0.1,0.2){\vector(-1,-2){0.1}}
+ \end{picture}}
+ \psfrag*{p1}[][l]{$\ast$}
+ \psfrag{p2}[][l]{$\ast$}
+ \psfrag{p3}{$\cos(t)$}
+ \includegraphics[width=3.5in]{example.eps}
+ \end{center}
+ \caption{A \pfg\ example.}
+ \label{fig:example1}
+\end{figure}
+The result of these two steps is shown in Figure~\ref{fig:example1}.
+
+\subsection{Figure scaling and resizing}
+\label{sec:scaling}
+
+There are two ways to resize EPS figures with the \pkg{graphics}
+package, and each has as different effect on \pfg\ replacements. If you
+are used to using \fname{epsf.sty}, you will be accustomed to only one
+such behavior.
+
+If you use the \cs{scalebox} or \cs{resizebox} macros of \fname{graphics.sty},
+then the \pfg\ replacments \emph{will} scale with the figure. This
+effect is illustrated in \ref{fig:example2} below.
+\begin{figure}[tbh]\unitlength=1in
+ \begin{center}
+ \psfragscanon
+ \psfrag{p1}[l]{\begin{picture}(0,0)
+ \put(0.15, 0.2){\makebox(0,0)[l]{$\sin(t)$}}
+ \put(0.1,0.2){\vector(-1,-2){0.1}}
+ \end{picture}}
+ \psfrag*{p1}[][l]{$\ast$}
+ \psfrag{p2}[][l]{$\ast$}
+ \psfrag{p3}{$\cos(t)$}
+ \resizebox{3.5in}{!}{\includegraphics{example.eps}}
+ \end{center}
+ \caption{The same \pfg\ example as Figure~\ref{fig:example1}, using
+ \cs{resizebox} to set the width.}
+ \label{fig:example2}
+\end{figure}
+Figure~\ref{fig:example2} uses the following command to scale the figure
+to 3.5 inches in width:
+\begin{verbatim}
+\resizebox{3.5in}{!}{\includegraphics{example.eps}}
+\end{verbatim} This
+is in direct contrast to Figure~\ref{fig:example1}, which uses the
+|width=| keyword from the \fname{graphicx.sty}, as follows:
+\begin{verbatim}
+\includegraphics[width=3.5in]{\includegraphics{example.eps}}
+\end{verbatim}
+Figure~\ref{fig:example1} also reflects the behavior that
+you would see when using the \fname{epsf.sty} macros \cs{epfxsize},
+\cs{epsfysize}, \emph{etc}. In these cases, the \pfg\ text does not
+scale with it. to resize the figure.
+
+As you can see, the text in the second figure is decidedly smaller
+than the first. This is because \cs{resizebox} uses PostScript tricks to
+scale \emph{all} of the contents of its argument. Since the \cs{psfrag}
+commands are not actually typeset until \emph{within} the
+\cs{includegraphics} command, they are resized as well.
+
+The \fname{graphicx.sty} key-value pairs |width=|, |height=|,
+and |scale=| scale the figure without scaling the replacement
+text, as long as they are supplied \emph{before} an |angle=|
+rotation key. Of course, the \cs{resizebox} and \cs{scalebox}
+macros are still available in \fname{graphicx.sty}, so you can
+mix and match both behaviors as you see fit. See the \pkg{graphics}
+documentation for more details.
+
+If you are still unsure about these distinctions, then try both
+methods for scaling your figures until you find a convention that
+works best for you.
+
+\section{Common mistakes, known problems, and bugs}
+
+\pfg\ is bug-free.
+
+Well, of course we're kidding. \pfg\ uses some tricky PostScript hacks to
+achieve its goals. So it really would not surprise us if you find bugs, If you
+find any problems, please confirm they are not mentioned below; and, if not,
+report them to te \pfg\ mailing list (see below).
+
+\subsection{Using \pfg\ tags properly}
+\label{sec:tags}
+
+One of the more frequent problems that people encounter with \pfg\ is that it
+replaces \emph{some} of their tags properly, but not all of them. Whenever
+possible, you should design your figures \emph{with \pfg\ in mind}, by
+following this rule:
+\begin{quote}
+ When adding a piece of text (a \emph{tag}) in a figure for \pfg\ to
+ replace, use a \emph{single word}, containing only unaccented letters
+ and numbers.
+\end{quote}
+This is the way that \pfg\ is intended to be used; doing so will almost
+guarantee that \pfg\ works as advertised. Of course, one cannot always follow
+this rule; and a small handful of drawing packages consistently cause problems.
+Invariably, these problems can be resolved by understanding how \pfg\ looks for
+these tags.
+
+PostScript has five commands to display text---|show|, |ashow|, |kshow|,
+|widthshow|, and |awidthshow|---although, in many cases, an EPS file will
+define abbreviations of these commands. \pfg\ actually \emph{intercepts} these
+commands and checks them for the tags to replace. When the string matches a
+known tag, \pfg\ figures out where the tag \emph{would} have been displayed,
+and inserts its replacement there. When it doesn't, \pfg\ lets the |*show|
+command proceed normally.
+
+The strings that these |*show| display are delimited with parentheses, much
+like the \fname{C} language uses double quotes. For example:
+\begin{quote}
+ |(This is a test.) show| ~~~~~~~~~~~~displays~~~~~~~~~~~~|This is a test.|
+\end{quote}
+Unmatched parentheses and
+certain other special characters must be preceded by a backslash in a
+PostScript string. For example:
+\begin{quote}
+ |(x = \(0,1]) show| ~~~~~~~~~~~~displays~~~~~~~~~~~~|x = (0,1]|
+\end{quote}
+
+With this in mind, here is the rule about \pfg\ tags:
+\begin{quote}
+ The tag supplied to the \cs{psfrag} command must be typed \emph{exactly
+ as it appears in the EPS file's |*show| command}, without the surrounding
+ parentheses.
+\end{quote}
+In other words, \pfg\ will work only if the string in the \cs{psfrag} command
+exactly duplicates what is found in the EPS file. If your strings have
+backslashes added to them, as in the |x = \(0,1]| example, then you will have
+to add that backslash to the \cs{psfrag} command as well. And \pfg\ can only
+replace \emph{entire} strings, not just parts of one. So if your EPS file
+contains
+\begin{quote}
+ |(I want to replace the XXX here) show|
+\end{quote}
+then the \cs{psfrag} command will fail if you supply just the |XXX|.
+
+You can use a simple text editor to check things, if you like; EPS files are
+(almost always) just simple ASCII files.
+
+Unfortunately, some drawing packages display text by sending each character
+\emph{individually} to a |show| command. In other words, if you use the
+drawing tool to put the string ``test'' in your figure, it will do something like this:
+\begin{quote}
+ |(t) show (e) show (s) show (t) show |
+\end{quote}
+If this is true in your case, we apologize; it makes using \pfg\ much more
+inconvenient---you will be limited to single-character tags. Such tools
+also prevent the use of the \cs{tex} command.
+
+\subsection{Problems using some \pkg{xfig} figures}
+
+\pfg\ does not work with \pkg{xfig} figures that use ``pattern fills.'' When
+painting/filling a polygon, \pkg{xfig} provides a number of choices: simple
+colors or grey levels, or a number of patterns like cross-hatches, checkers,
+\etc\ Unfortunately, using a pattern fill in a figure processed by \pfg\ results
+in PostScript files that will not print.
+
+Fortunately, there are workarounds:
+\begin{enumerate}
+ \item Avoid pattern fills in your \pkg{xfig} figures; use simple
+ colors (or greys) instead. Consult the \pkg{xfig} documentation
+ for details.
+ \item Open the offending \fname{.eps} file (generated by \pkg{fig2dev}
+ or \pkg{xfig}'s ``export'' command) with your favorite text editor.
+ Look for the definition \pscom{PATfill} command; inside this
+ subroutine, replace \pscom{show} with \pscom{oldshow} (there is only
+ one occurrence).
+\end{enumerate}
+For those PostScript hackers out there: both \pfg\ and \pkg{xfig} redefine the
+PostScript \pscom{show} command. \pscom{oldshow} is where \pkg{xfig} stores the
+``old'' version of the command. If you can determine why this fix works, and
+convince the \pkg{xfig} maintainers to make the change; or, if you can suggest
+a fix for \pfg, please do.
+
+\subsection{Problems using old versions of the \pkg{seminar} package}
+\label{sec:sem-bug}
+
+The popular \pkg{seminar} package was, for awhile, incompatbile with PSfrag
+3.0. This is due to the fact that PSfrag relies on certain features of the
+\LaTeXe\ output routine, while \pkg{seminar} still uses one largely borrowed
+from \LaTeX\ 2.09.
+
+The best solution for this problem is to make sure that you have the latest
+version of the \pkg{seminar} package, which can be retrieved from any CTAN
+site, likely from the same place you found \pfg. A web page for \pkg{seminar}
+can be found at \fname{http://www.tug.org/applications/Seminar/}. The
+1997/10/13 version seems to have corrected the problem.
+
+If for some reason you are forced to use an older version, there is a
+temporary, \pkg{dvips}-specific fix: add the command
+|\special{header=psfrag.pro}| just before |\begin{document}| in your \LaTeX\
+file.
+
+\section{The \pfg\ mailing list}
+\label{sec:mail}
+
+There is a Majorodomo mailing list for purposes of \pfg\ maintenance.
+It \emph{is not} intended to replace this manual or a small amount of
+educated guesswork. But, it \emph{is} the perfect place for bug reports,
+development ideas, and so forth. Anyone who wishes to assist in
+\pfg's evolution may subscribe; to do so, just send mail to
+\begin{quote}
+ \netaddress{majordomo@rascals.stanford.edu}
+\end{quote}
+with the line |subscribe psfrag| in the \emph{body} of the text.
+
+Bug supports, ideas, \emph{etc.} should go to
+\begin{quote}
+ \netaddress{psfrag@rascals.stanford.edu}.
+\end{quote}
+If you have found a bug to report, please provide us with the
+necessary files (a \LaTeX\ file, the EPS figures, \etc) so we can
+test it out ourselves! Try to provide us with the shortest
+self-contained example that demonstrates your bug. If this is not
+possible, drop us a line first.
+
+\end{document}
diff --git a/support/easylatex/psfrag/psfrag.dtx b/support/easylatex/psfrag/psfrag.dtx
new file mode 100644
index 0000000000..e2baef58f9
--- /dev/null
+++ b/support/easylatex/psfrag/psfrag.dtx
@@ -0,0 +1,1102 @@
+%
+% \iffalse
+% psfrag.dtx Copyright (C) 1996 Craig Barratt, Michael C. Grant,
+% and David Carlisle.
+% All rights are reserved.
+%
+% This system 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. Don't come complaining to us if you
+% modify this file and it doesn't work! If this file is
+% modified by anyone but the authors, those changes and
+% their authors must be explicitly stated HERE.
+%
+%<package>\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+%<package>\ProvidesPackage{psfrag}[1998/04/11 v3.04 PSfrag (MCG)]
+% \fi
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{graphicx,psfrag}
+\begin{document}
+ \DocInput{psfrag.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{psfrag.sty}
+% \RecordChanges
+%
+% \let\pkg\textsf
+% \let\fname\texttt
+% \let\pscom\texttt
+% \newcommand{\pfg}{\textsf{PSfrag}}
+% \newcommand{\bsl}{\protect\bslash}
+% \newcommand{\ie}{\emph{i.e.}}
+% \newcommand{\eg}{\emph{e.g.}}
+% \newcommand{\etc}{\emph{etc.}}
+% \newcommand{\netaddress}[1]{\texttt{#1}}
+% \marginparsep 0pt
+%
+% \title{\fname{psfrag.sty} and \fname{psfrag.pro}%^^A
+% \thanks{This file has version number \fileversion,
+% last revised \filedate.}}
+%
+% \author{Michael Grant, David Carlisle, and Craig Barratt \\
+% \netaddress{psfrag@rascals.stanford.edu}}
+% \date{\filedate}
+% \maketitle
+% \PrintChanges
+%
+% \changes{3.04}{1998/04/11}{Made some (theoretically) back-compatible
+% changes to \fname{psfrag.pro} which should make it more friendly
+% to EPS and page-manipulation packages like \pkg{psnup}. Fixed
+% orientation problem for DVIPSone. Added support for EPS files
+% as \pfg\ replacements.}
+% \changes{3.03}{1997/01/21}{Fixed some typographical errors that
+% broke the \pscom{awidthshow} command. Improved the scanner to
+% handle multi-line \cs{tex} commands. Fixed a bug in the
+% \pscom{replace} command which would break some legal EPS files.}
+% \changes{3.02}{1996/12/06}{Continued to improve the transformation
+% code to make it more robust to rotations and odd scaling.
+% Improved the range of strings accepted as PSfrag tags.}
+% \changes{3.01}{1996/11/26}{Expanded the PSfrag dictionary
+% for Level 1 printers. Fixed bugs that produce incorrect output
+% for rotated figures. Output should now print properly when
+% combined with page-manipulation programs like \pkg{psnup}.}
+% \changes{3.0}{1996/10/31}{Major rewrite. Elimination of the
+% preprocessing step, deprecation of the \pscom{tex} command. I've
+% wiped most of the source-level change entries as a result.}
+% \changes{2.0}{1995/04/04}{Bug fixes}
+% \changes{2.0}{1995/03/14}{Bug fixes. Better support for \LaTeX\ 2.09
+% \pfg\ files, including both naming schemes. Improved
+% documentation and separated it from this file.}
+% \changes{1.99}{1995/02/14}{Taken over from Craig, completely
+% overhauled for \LaTeXe. Completely changed the placement code;
+% baseline alignment added. Integrated \pscom{psfrag} commands into
+% the PostScript file. \textsf{graphics} package used for
+% portability across multiple DVI-to-PostScript packages.
+% Improved ps2frag.ps file provides improved (correct) support
+% for ashow, widthshow, awidthshow, and kshow.}
+% \changes{1.1}{1992/10/20}{Released version 1.1, adding support for
+% ashow, widthshow, awidthshow, and kshow.}
+% \changes{1.0}{1992/06/01}{Released version 1.0.}
+%
+% \section{\fname{psfrag.sty}}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Intialization}
+%
+% \begin{macrocode}
+\newif\ifpfg@compat
+\newif\ifpfg@prepass
+\newif\ifpfg@debug \pfg@debugfalse
+\if@compatibility
+ \pfg@compattrue\pfg@prepasstrue
+\else
+ \pfg@compatfalse\pfg@prepassfalse
+\fi
+\def\psfragscanon{\pfg@prepasstrue}
+\def\psfragscanoff{\pfg@prepassfalse}
+\def\psfragdebugon{\pfg@debugtrue}
+\def\psfragdebugoff{\pfg@debugfalse}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareOption{scanall}{\pfg@prepasstrue}
+\DeclareOption{2emode}{\pfg@compatfalse\pfg@prepassfalse}
+\DeclareOption{209mode}{\pfg@compattrue\pfg@prepasstrue}
+\DeclareOption{debugshow}{\pfg@debugtrue
+ \PassOptionsToPackage\CurrentOption{graphics}}
+\DeclareOption*{\PassOptionsToPackage\CurrentOption{graphics}}
+\ProcessOptions
+% \end{macrocode}
+%
+% \fname{psfrag.sty} requires the \pkg{graphics} package and the
+% support file \fname{psfrag.pro}. (\fname{epsf.sty} can still be
+% used,but \pkg{graphics} package is still used for internal
+% purposes.) To load \fname{psfrag.pro} in a portable way, we provide
+% and use the \cs{Gin@PS@file@header} command, which the
+% \pkg{graphics} will eventually provide for us.
+% \changes{3.01}{1996/11/25}{Added the \cs{AtBeginDocument} command
+% to save some important global transformation information.}
+% \changes{3.02}{1996/12/03}{Deleted this \cs{AtBeginDocument} info;
+% see \cs{pfg@orient}.}
+% \begin{macrocode}
+\RequirePackage{graphics}
+\providecommand\Gin@PS@file@header[1]{\AtBeginDvi{\special{header=#1}}}
+\Gin@PS@file@header{psfrag.pro}
+% \end{macrocode}
+%
+% \begin{macro}{\pfg@orient}
+% In order to properly handle all cases of rotation, scaling,
+% \etc\ that \pfg\ may encounter, it is necessary that we know a bit
+% about the transformations that the DVI to PS driver uses itself.
+% Specifically, we need to know what transformations, if any, the
+% DVI to PS driver appends to PostScript's \pscom{defaultmatrix}
+% before it starts to typeset text. At the moment, all of the drivers
+% which work with \pfg\ reverse the orientation of the $y$ axis;
+% new drivers may not. But until we can find a portable way to make
+% this determination in PostScript itself, we have to supply that
+% information here.
+% \changes{3.02}{1996/12/03}{Created. Added \pkg{dvips} and
+% \pkg{textures} as ``$y$-reversers.''}
+% \changes{3.04}{1998/04/11}{\pkg{dvipsone} now uses the same
+% orientation as \pkg{dvips}, so we added a line for it here.}
+% \begin{macrocode}
+\def\pfg@orient{1}
+\def\@tempa{dvipsone.def}\ifx\Gin@driver\@tempa\def\pfg@orient{-1}\fi%
+\def\@tempa{dvips.def}\ifx\Gin@driver\@tempa\def\pfg@orient{-1}\fi%
+\def\@tempa{textures.def}\ifx\Gin@driver\@tempa\def\pfg@orient{-1}\fi%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Interface to the \pkg{graphics}
+% and \pkg{epsf} packages}
+%
+% \begin{macro}{\pfg@epsfbox}
+% The original definition of \cs{epsfbox} from \pkg{epsf.sty} or \pkg{graphics}.
+% \begin{macro}{\pfg@Ginclude@eps}
+% The original definition of \cs{Ginclude@eps} from \pkg{graphics},
+% the key routine inside the \cs{includegraphics} routine for EPS files.
+%
+% Below we redefine these two commands to add \pfg\ functionality.
+% \begin{macrocode}
+\let\pfg@epsfbox\epsfbox
+\let\pfg@Ginclude@eps\Ginclude@eps
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\pfg@pcount}
+% Counts how many fragments are active in the current figure.
+% \begin{macro}{\pfg@scount}
+% Counts how many replacements strings are active in the current
+% figure.
+%
+% Since it is possible for a single string to accept multiple
+% replacements, \cs{pfg@scount} $\le$ \cs{pfg@pcount}.
+% \begin{macrocode}
+\newcount\pfg@pcount \pfg@pcount=\z@
+\newcount\pfg@scount \pfg@scount=\z@
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{\epsfbox}
+% Here we intercept calls to \cs{epsfbox} and wrap them with the
+% \pfg\ processing. The first thing we do is revert \cs{epsfbox}
+% and \cs{Ginclude@eps} back to their original definitions, to
+% prevent recursion---which could occur if some of the replacements
+% are themselves EPS files.
+% \changes{3.04}{1998/04/11}
+% {Improved the recursion protection by reverting
+% \cs{epsfbox} and \cs{Ginclude@eps} back to their original
+% definitions within the block. Deleted \cs{ifpfg@epsf}, which
+% is no longer needed in this new system.}
+% \begin{macrocode}
+\def\epsfbox#1{%
+ \begingroup
+ \let\Ginclude@eps\pfg@Ginclude@eps
+ \let\epsfbox\pfg@epsfbox
+ \ifpfg@prepass\pfg@scan{#1}\fi
+ \ifnum\pfg@scount>\z@\pfg@hidestart\fi
+ \pfg@epsfbox{#1}%
+ \ifnum\pfg@scount>\z@\pfg@hideend\fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Ginclude@eps}
+% We need to override this function from the \pkg{graphics}
+% package in a similar fashion to \cs{epsfbox}. As we did for
+% \cs{epsfbox}, we revert \cs{epsfbox} and \cs{Ginclude@eps}
+% back to their original definitions in order to prevent recursion.
+% \changes{3.01}{1996/11/26}
+% {Added the \cs{pfg@hideinit} functionality.}
+% \changes{3.02}{1996/12/01}
+% {Removed \cs{pfg@hideinit}.}
+% \changes{3.04}{1998/04/11}
+% {Improved the recursion protection by reverting
+% \cs{epsfbox} and \cs{Ginclude@eps} back to their original
+% definitions within the block.}
+% \begin{macrocode}
+\def\Ginclude@eps#1{%
+ \begingroup
+ \let\Ginclude@eps\pfg@Ginclude@eps
+ \let\epsfbox\pfg@epsfbox
+ \ifpfg@prepass\pfg@scan{#1}\fi
+ \ifnum\pfg@scount>\z@\pfg@hidestart\fi
+ \pfg@Ginclude@eps{#1}%
+ \ifnum\pfg@scount>\z@\pfg@hideend\fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{psfrags}
+% Defines a dummy environment to delimit the scope of \pfg\
+% replacements.
+% \begin{macrocode}
+\newenvironment{psfrags}{\ignorespaces}{\global\@ignoretrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psfragspecial}
+% This macro is no longer supported.
+% \begin{macrocode}
+\ifpfg@compat
+\def\psfragspecial#1#2#3#4#5#6{%
+ \PackageError{PSfrag}%
+ {\string\psfragspecial no longer implemented.}{}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\psfrag}
+% \marg{tag}\oarg{posn}\oarg{psposn}\oarg{scl}\oarg{rot}\\
+% The main macro \cs{psfrag} must be defined specially in order
+% to handle its odd combination of optional and required arguments.
+% In addition, catcode tricks (thanks to David Carlisle and others)
+% allow special characters to be used inside the tag text. It also
+% replaces spaces with their octal equivalents to prevent drivers
+% like \pkg{dvips} from breaking one in the middle.
+% \changes{3.01}{1996/11/26}{Now changes every space in the tag
+% text by its octal code. Some DVI to PS drivers were breaking the
+% strings onto multiple lines; this should prevent that from happening.}
+% \changes{3.01}{1996/11/26}{Removed octal code in favour of convert
+% routine in the prologue}
+% \changes{3.03}{1997/1/6}{Added another ``special'' character.}
+% \begin{macrocode}
+\newif\ifpfg@star
+\def\psfrag{\@ifstar{\pfg@startrue\@psfraga}{\pfg@starfalse\@psfraga}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@psfraga{\begingroup
+ \@makeother\"\@makeother\*\@makeother\!\@makeother\~%
+ \@makeother\:\@makeother\\\@makeother\%\@makeother\#%
+ \@makeother\ \@psfragb}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifpfg@compat
+\def\@psfragb#1{\xdef\@gtempa{#1}\endgroup
+ \@ifnextchar[{\@psfragc{\@gtempa}}%
+ {\@psfrag{\@gtempa}[bl][bl][1][0]}}
+\def\@psfragc#1[#2]{\@ifnextchar [{\@psfragd{#1}[#2]}%
+ {\@psfrag{#1}[#2][bl][1][0]}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+\def\@psfragb#1{\xdef\@gtempa{#1}\endgroup
+ \@ifnextchar [{\@psfragc{\@gtempa}}%
+ {\@psfrag{\@gtempa}[Bl][Bl][1][0]}}
+\def\@psfragc#1[#2]{\@ifnextchar [{\@psfragd{#1}[#2]}%
+ {\@psfrag{#1}[#2][Bl][1][0]}}
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@psfragd#1[#2][#3]{\@ifnextchar [{\@psfrage{#1}[#2][#3]}%
+ {\@psfrag{#1}[#2][#3][1][0]}}
+\def\@psfrage#1[#2][#3][#4]{\@ifnextchar [{\@psfrag{#1}[#2][#3][#4]}%
+ {\@psfrag{#1}[#2][#3][#4][0]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@psfrag}\marg{tag}\\
+% Now that we have all of the arguments, we need to check to check to
+% see if the string has been used yet; if not, increment the string
+% count and create a place for the new string. Then pass the string
+% number on down the line to \cs{@@psfrag}.
+% \begin{macrocode}
+\def\pfg@newstring#1.#2{%
+ \@nameedef{pfg@using@#2}{#1}%
+ \pfg@starfalse\advance\pfg@scount\@ne}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@psfrag#1{%
+ \@ifundefined{pfg@using@#1}%
+ {\expandafter\pfg@newstring\the\pfg@scount.{#1}}%
+ {}%
+ \edef\@tempa{\@nameuse{pfg@using@#1}}%
+ \expandafter\@@psfrag\@tempa.{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@psfrag}\marg{tag-key}.\marg{tag}\\
+% \cs{@@psfrag} passes along the current \emph{replacement} number to
+% to \cs{@@@psfrag}, which is doing all of the dirty work.
+% \begin{macrocode}
+\def\@@psfrag{\expandafter\@@@psfrag\the\pfg@pcount.}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@@psfrag}
+% \marg{repl-key}.\marg{tag-key}.\marg{tag}\oarg{posn}%
+% \oarg{psposn}\oarg{scl}\oarg{rot}\oarg{repl}
+% \begin{macro}{\pfg@align}\marg{tag-key}.
+% \begin{macro}{\pfg@place}\marg{repl-key}.\\
+% \cs{@@@psfrag}, armed with numeric keys for the tag string and the
+% replacement, creates a \cs{pfg@place} procedure call for this
+% fragment and appends the control point, scale, and rotation
+% information to the proper tag's list, found in
+% \cs{pfg@align\emph{<tag-key>}.}
+% \changes{3.01}{1996/11/26}{Added some extra spaces in
+% \cs{pfg@align@} to encourage more benevlolent line-breaking
+% by DVI to PS drivers.}
+% \begin{macrocode}
+\def\@nameedef#1#2{\expandafter\edef\csname #1\endcsname{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@@@psfrag#1.#2.#3[#4][#5][#6][#7]#8{%
+ \advance\pfg@pcount\@ne
+ \ifpfg@star\else\@nameedef{pfg@align@#2}{(#3)[}\fi
+ \@nameedef{pfg@align@#2}{\@nameuse{pfg@align@#2}[#1(#5)#6 #7]}%
+ \@namedef{pfg@place@#1}{\pfg@@place{#1}{#4}{#8}}\ignorespaces}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\pfg@align#1.{\@nameuse{pfg@align@#1}}
+\def\pfg@place#1.{\@nameuse{pfg@place@#1}}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+%
+% \subsection{Fragment processing}
+%
+% \begin{macro}{\pfg@hidestart}
+% This procedure provides PostScript with a list of the strings that
+% \pfg\ would like to replace, and the control points, scales, and
+% rotations of each one. The PostScript code in \fname{psfrag.pro}
+% will use this information to construct transformation matrices for
+% each replacement to move them into proper position.
+% \changes{3.01}{1996/11/26}{Moved the \pkg{xdvi} stub to
+% \cs{pfg@hideinit}}.
+% \changes{3.02}{1996/12/01}{Moved it back.}
+% \begin{macrocode}
+\def\pfg@hidestart{%
+ \def\pfg@{}\count@=\z@\loop\ifnum\count@<\pfg@scount
+ \toks@=\expandafter{\expandafter\pfg@align\the\count@.}%
+ \edef\pfg@{\pfg@\the\toks@]}%
+ \advance\count@ by\@ne\repeat
+ \Gin@PS@raw{/PSfrag where{pop\pfg@\the\pfg@scount\space
+ \ifpfg@debug1\else0\fi\space\pfg@orient/Begin
+ PSfrag}{userdict /PSfrag{pop}put}ifelse}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfg@hideend}
+% Now that the EPS file has been loaded, and (therefore) all of the
+% replacement positions have been determined, move each replacement
+% to its proper position by calling the \cs{pfg@place} procedure for
+% each one. Except for the calls to \cs{Gin@PS@raw}, it looks like
+% we're building a vertical list of the replacements: that's the idea,
+% because we want it to look decent when viewed by a DVI viewer.
+% \begin{macrocode}
+\def\pfg@hideend{%
+ \Gin@PS@raw{/End PSfrag}%
+ \vbox to\z@{\vss
+ \Gin@PS@raw{/Hide PSfrag}%
+ \hbox to\z@{\hss \raisebox{\depth}{%
+ \underline{PSfrag replacements}}}%
+ \Gin@PS@raw{/Unhide PSfrag}%
+ \count@=\z@\loop\ifnum\count@<\pfg@pcount
+ \expandafter\pfg@place\the\count@.%
+ \advance\count@ by\@ne\repeat}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfg@@place}
+% \marg{repl-key}\marg{posn}\marg{replacement}\\
+% The following macro does the dirty work. Its job is to insert the
+% appropriate code so that the \TeX\ replacement is transformed to
+% its requested location; and, if desired, repeated for as many times
+% as the PostScript tag text appeared in the figure.
+%
+% It performs this magic by first surrounding the \TeX-produced code
+% in curly braces, so we can defer its execution while we figure out
+% where to place it. Then, we call the \pscom{Place} routine in
+% \fname{psfrag.pro}, which takes \marg{repl-key}
+% and provides the proper coordinate transformations.
+%
+% We're allowed to reassign these dimension registers because we are
+% always inside a group when we use them. This technique is taken from
+% \fname{graphics.sty}...
+% \begin{macrocode}
+\let\pfg@dp\leftmargini\let\pfg@wd\leftmarginii
+\let\pfg@dx\leftmarginiii\let\pfg@dy\leftmarginiv
+% \end{macrocode}
+% We need to stuff the curly braces into macros.
+% \begin{macrocode}
+\edef\pfg@bchar{ \string{ }
+\edef\pfg@echar{ \string} }
+\def\pfg@@place#1#2#3{\begingroup
+% \end{macrocode}
+% Typeset the replacement into a box and determine its dimensions.
+% \begin{macrocode}
+ \sbox\z@{#3}%
+ \dimen@=\ht\z@ \advance\dimen@ by\dp\z@%
+% \end{macrocode}
+% Determine the desired alignment of the \TeX\ box, and the glue
+% that will be needed in order to achieve this alignment.
+% \begin{macrocode}
+ \pfg@wd=0.5\wd\z@\pfg@dp=0.5\dimen@
+ \pfg@dx=\pfg@wd\pfg@dy=\pfg@dp
+ \@tfor\@tempa:=#2\do{%
+ \if l\@tempa \pfg@dx=\z@ \pfg@wd=\wd\z@ \else
+ \if r\@tempa \pfg@dx=\wd\z@ \pfg@wd=\z@ \else
+ \if b\@tempa \pfg@dy=\z@ \pfg@dp=\z@ \else
+ \if t\@tempa \pfg@dy=\dimen@\pfg@dp=\dimen@\else
+ \if B\@tempa \pfg@dy=\dp\z@ \pfg@dp=\dp\z@ \fi\fi\fi\fi\fi}%
+% \end{macrocode}
+% Create a zero-area box with the desired \pfg\ replacement
+% text typeset inside of it (and aligned with the glue). This
+% is actually the box that will be moved, rotated, and/or scaled.
+% \begin{macrocode}
+ \setbox\z@\hbox to\z@{\hskip-\pfg@dx\box\z@\hss}%
+ \setbox\z@\vbox to\z@{\vss\box\z@\vskip-\pfg@dy}%
+% \end{macrocode}
+% Typeset the box. The inner, zero-size box is the one we place
+% with the PostScript code, and the outer, full-height, right-\
+% justified box is the one that we use to stack up the preview
+% list.
+% \begin{macrocode}
+ \vbox to\dimen@{\vss\hbox to\z@{\hss
+ \Gin@PS@raw{\pfg@bchar}\box\z@
+ \Gin@PS@raw{\pfg@echar#1/Place PSfrag}%
+ \hskip\pfg@wd}\vskip\pfg@dp}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+%<*filepro>
+% \end{macrocode}
+%
+% \section{The PostScript library, \fname{psfrag.pro}}
+% This code must perform two functions: 1) determine and save the
+% alignment point, rotation, and scaling for each piece of PostScript
+% text that is going to serve as a \pfg\ tag; and 2) use that
+% information to properly transform the coordinate system for each
+% \TeX\ replacement.
+%
+% The only two symbols that we define globally are \pscom{PSfragLib},
+% the library of support routines, \pscom{PSfragDict}, the dictionary
+% containing the ``magic'' \pscom{show} commands,
+% and \pscom{PSfrag}, the gateway from
+% the global namespace to \pscom{PSfragLib}. This technique minimizes
+% the possibility that our procedure names will conflict with those
+% defined by the PostScript driver or the figure itself.
+% \changes{3.02}{1996/12/03}{Added code to insure that \pscom{PSfragLib}
+% and \pscom{PSfrag} are stored in \pscom{userdict}. Some cruel DVI to
+% PostScript drivers try and force these into their own dictionary. Also
+% moved \pscom{PSfragDict} out of \pscom{PSfragLib}.}
+% \begin{macrocode}
+userdict begin
+/PSfragLib 90 dict def
+/PSfragDict 6 dict def
+/PSfrag { PSfragLib begin load exec end } bind def
+end
+% \end{macrocode}
+%
+% \begin{macro}{PSfragLib}
+% \pscom{PSfragLib} is the dictionary with the meaty stuff. We're also
+% defining some useful abbreviations. Of note is the \pscom{OE} command
+% (``outside exec''), which executes some code after removing
+% \pscom{PSfragLib} from the stack (to insure that there are no
+% collisions with \pscom{PSfragLib}'s internal names.
+% \changes{3.01}{1996/11/26}{Fixed \pscom{islev2}.}
+% \changes{3.02}{1996/12/03}{Added \pscom{readonly} to \pscom{BD} to
+% help insure that this dictionary isn't being trampled on.}
+% \changes{3.02}{1996/12/03}{Added some abbreviations.}
+% \changes{3.04}{1998/04/11}{Added the default definition of \pscom{S} to
+% avert potential problems if it is defined elsewhere. Thanks again to
+% J. Scott Berg for this fix.}
+% \begin{macrocode}
+PSfragLib begin
+/RO /readonly load def
+/CP /currentpoint load def
+/CM /currentmatrix load def
+/B { bind RO def } bind def
+/X { exch def } B
+/MD { { X } forall } B
+/OE { end exec PSfragLib begin } B
+/S false def
+/tstr 8 string def
+/islev2 { languagelevel } stopped { false } { 2 ge } ifelse def
+% \end{macrocode}
+% Allocate some space for matrices that we will use frequently.
+% \pscom{sM} is the matrix we encounter at the time this library
+% is defined; this should theoretically be \pscom{initmatrix}, unless
+% we are in an EPS/psnup situation.
+% \pscom{srcFM} contains a matrix which describes the difference
+% between PostScript's \pscom{defaultmatrix} and the transformation
+% defined by the DVI-to-PS driver's ``default matrix.'' This information
+% is crucial to the proper placing of the \pfg\ replacements.
+% \changes{3.02}{1996/12/01}{Changed the names to be a tiny bit
+% more descriptive, and added a couple.}
+% \changes{3.02}{1996/12/03}{Added the \pscom{readonly} commands.}
+% \changes{3.04}{1998/04/11}{Added \pscom{sM}, which stores the
+% \pscom{currentmatrix} found at the time \pscom{PSfragLib} is defined.
+% See the \pscom{replace} command for its use. Thanks to J. Scott Berg.}
+% \begin{macrocode}
+[ /sM /tM /srcM /dstM /dM /idM /srcFM /dstFM ] { matrix def } forall
+sM currentmatrix RO pop
+dM defaultmatrix RO idM invertmatrix RO pop
+srcFM identmatrix pop
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{Hide}
+% \begin{macro}{Unhide}
+% Surrounding a (fairly) arbitrary piece of PostScript code with calls
+% to \pscom{Hide} and \pscom{Unhide} should render it invisible.
+% \pfg\ uses these calls to hide unused replacements. Note that we are
+% assuming that the DVI-to-PS driver isn't relying on any of the
+% information that will be wiped out by the \pscom{grestore}, except
+% for the \pscom{currentpoint}.
+% \begin{macrocode}
+/Hide { gsave { CP } stopped not newpath clip { moveto } if } B
+/Unhide { { CP } stopped not grestore { moveto } if } B
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{setrepl}
+% \begin{macro}{getrepl}
+% These macros are defined differently for Level 1 and Level 2
+% PostScript. \pscom{setrepl} accepts an array of N elements,
+% followed by the length N, and store them in a global variable (or
+% the equivalent) for later use. \pscom{getrepl} restores that exact
+% information to the stack. This is used to store the replacement
+% information in a persistent fashion.
+% \begin{macrocode}
+/setrepl islev2 {{ /glob currentglobal def true setglobal array astore
+ globaldict exch /PSfrags exch put glob setglobal }}
+ {{ array astore /PSfrags X }} ifelse B
+/getrepl islev2 {{ globaldict /PSfrags get aload length }}
+ {{ PSfrags aload length }} ifelse B
+% \end{macrocode}
+% \end{macro}\end{macro}
+%
+% \begin{macro}{convert}
+% This routine takes a string and replaces every character whose
+% ASCII code is less than 32 with a space. This makes the replacement
+% dictionary robust to multiple-line tags, etc.
+% \begin{macrocode}
+/convert {
+ /src X src length string
+ /c 0 def src length {
+ dup c src c get dup 32 lt { pop 32 } if put /c c 1 add def
+ } repeat
+} B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{Begin}
+% \pfg\ calls this routine once per figure, once it has placed
+% on the stack all of each tag's alignment, rotation, and scaling
+% information. This information is collected into a dictionary:
+% each tag has an entry which is an array of [ repl-key, (psposn),
+% scl, rot ] quads. Then it saves the current transformation
+% information in a form ready for \pscom{/replace} to use.
+% \changes{3.02}{1996/12/03}{\pscom{PSfragDict} now goes at the
+% \emph{bottom} of the read-write portion of the dictionary stack,
+% to insure that it does not conflict with dictionary manipulation
+% by the EPS file or the DVI to PS driver.}
+% \changes{3.02}{1996/12/03}{Changes to account for transformation
+% rearrangement; see \pscom{/replace}.}
+% \begin{macrocode}
+/Begin {
+ /saver save def
+ srcFM exch 3 exch put
+ 0 ne /debugMode X 0 setrepl
+ dup /S exch dict def { S 3 1 roll exch convert exch put } repeat
+ srcM CM dup invertmatrix pop
+ mark { currentdict { end } stopped { pop exit } if } loop
+ PSfragDict counttomark { begin } repeat pop
+} B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{End}
+% End converts the alignment information that has been collected
+% into a dictionary: each repl-key that was encountered in
+% \pscom{Begin} has an entry which is an array of
+% transformation matrices.
+% \changes{3.02}{1996/12/03}{Changes to the dictionary placement
+% as discussed in \pscom{/Begin}.}
+% \begin{macrocode}
+/End {
+ mark { currentdict end dup PSfragDict eq { pop exit } if } loop
+ counttomark { begin } repeat pop
+ getrepl saver restore
+ 7 idiv dup /S exch dict def {
+ 6 array astore /mtrx X tstr cvs /K X
+ S K [ S K known { S K get aload pop } if mtrx ] put
+ } repeat
+} B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{Place}
+% This macro is called once for each \pfg\ replacement. It checks to
+% see if the replacement's tag was actually encountered in the PS
+% figure; if not, it surrounds the code in a ``clip all'' context and
+% executes it. This makes it invisible, as requested, but still allows
+% it to run so that any side effects that the code may have will take
+% place.
+%
+% If the replacement's tag \emph{was} encountered, however, it
+% retrieves the transformation matrix that was calculated for it; it
+% prepends this calculation to the current (\TeX) transformation matrix
+% (some tricky math to wade through there!), and then draws the
+% replacement.
+%
+% If there are multiple copies of the replacement to be laid down,
+% this will do it, surrounding all but the last replacement in a
+% \pscom{save}-\pscom{restore} pair. This \pscom{save}-\pscom{restore}
+% pair may slow things down, but theoretically it is necessary,
+% because the procedure might modify other variables in the PostScript
+% namespace. We need to be sure that those modifications do not
+% ``accumulate''.
+%
+% For multiple replacements to work, the code that \pfg\ surrounds with
+% curly braces must leave the stack the same way it found it. So far,
+% we have confirmed this fact for \pkg{dvips} and \pkg{DVIPSONE}.
+% \changes{3.02}{1996/12/03}{Changes to account for transformation
+% rearrangement; see \pscom{/replace}.}
+% \begin{macrocode}
+/Place {
+ tstr cvs /K X
+ S K known {
+ bind /proc X tM CM pop
+ CP /cY X /cX X
+ 0 0 transform idtransform neg /aY X neg /aX X
+ S K get dup length /maxiter X
+ /iter 1 def {
+ iter maxiter ne { /saver save def } if
+ tM setmatrix aX aY translate
+ [ exch aload pop idtransform ] concat
+ cX neg cY neg translate cX cY moveto
+ /proc load OE
+ iter maxiter ne { saver restore /iter iter 1 add def } if
+ } forall
+ /noXY { CP /cY X /cX X } stopped def
+ tM setmatrix noXY { newpath } { cX cY moveto } ifelse
+ } {
+ Hide OE Unhide
+ } ifelse
+} B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{normalize}
+% This function accepts three numbers, $x$, $y$, and $s$, and returns
+% $sx/\sqrt{x^2+y^2}$ and $sy/\sqrt{x^2+y^2}$.
+% \begin{macrocode}
+/normalize {
+ 2 index dup mul 2 index dup mul add sqrt div
+ dup 4 -1 roll exch mul 3 1 roll mul
+} B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{replace}
+% This routine is called for every string in the string list. It
+% must determine the translation, scaling, and rotation necessary to
+% move a piece of \TeX code to the proper orientation. It stores in
+% \pscom{replArray}, for each alignment/scale/rotation combination, a
+% transformation matrix that achieves this.
+% \begin{macrocode}
+/replace {
+ aload pop MD
+% \end{macrocode}
+% Trace out the text and determine its bounding box. We need to
+% temporarily revert to an identity transformation matrix, so that
+% we can be sure to get the tightest bounding box possible. If the
+% text is rotated, the bounding box that PostScript produces with the
+% \pscom{pathbbox} command is not optimal.
+%
+% We also need to save the position of the point following the text
+% placement, and move to that position when we've finished, to fool
+% the PS interpreter into thinking we actually drew that text.
+% \changes{3.01}{1996/11/22}{Modified this transformation to put the
+% beginning of the text at the origin, and forced its width to be
+% $\sim5$ in. Some figures were using coordinate systems that were
+% so ``large'' that they would break PostScript with
+% ``limitcheck'' errors here.}
+% \changes{3.01}{1996/12/03}{The added transformation is no longer
+% ``slipped under'' the CTM, but now it is more properly appended.
+% this should allow the replacements to move properly if the entire
+% figure is rotated or transformed. This required changes throughout
+% the code, but primarily here.}
+% \changes{3.03}{1997/01/06}{Added a \pscom{gsave}/\pscom{grestore}
+% pair around the bounding-box calculations. I thought I was being
+% clever by avoiding it; but it wasn't infallible, so I was wrong.}
+% \changes{3.04}{1998/04/11}{Changed \pscom{initmatrix} to \pscom{sM}
+% \pscom{setmatrix}, to be more EPS-friendly. Thanks to J. Scott Berg.}
+% \begin{macrocode}
+ CP /bY X /lX X gsave sM setmatrix
+ str stringwidth abs exch abs add dup 0 eq
+ { pop } { 360 exch div dup scale } ifelse
+ lX neg bY neg translate newpath lX bY moveto
+ str { /ch X ( ) dup 0 ch put false charpath ch Kproc } forall
+ flattenpath pathbbox [ /uY /uX /lY /lX ] MD
+ CP grestore moveto
+% \end{macrocode}
+% If the FontMatrix shows that the font is draw in the opposite X or
+% opposite Y direction, then the X or Y coordinates of the bounding
+% box, respectively, need to be swapped. This actually occurs quite
+% often. Here we also determine the center of the box.
+% \begin{macrocode}
+ currentfont /FontMatrix get dstFM copy dup
+ 0 get 0 lt { uX lX /uX X /lX X } if
+ 3 get 0 lt { uY lY /uY X /lY X } if
+ /cX uX lX add 0.5 mul def
+ /cY uY lY add 0.5 mul def
+% \end{macrocode}
+% If debug mode has been enabled, we draw the bounding box, the
+% baseline, and the center lines of the text.
+% \begin{macrocode}
+ debugMode { gsave 0 setgray 1 setlinewidth
+ lX lY moveto lX uY lineto uX uY lineto uX lY lineto closepath
+ lX bY moveto uX bY lineto lX cY moveto uX cY lineto
+ cX lY moveto cX uY lineto stroke
+ grestore } if
+% \end{macrocode}
+% Add each replacement's alignment to \pscom{replArray}.
+% \changes{3.02}{1996/12/01}{Now saves the current CTM here.}
+% \begin{macrocode}
+ dstFM dup invertmatrix dstM CM srcM
+ 2 { dstM concatmatrix } repeat pop
+ getrepl /temp X
+ S str convert get {
+% \end{macrocode}
+% Retrieve the replacement information
+% \begin{macrocode}
+ aload pop [ /rot /scl /loc /K ] MD
+% \end{macrocode}
+% Determine the PostScript alignment point.
+% \begin{macrocode}
+ /aX cX def /aY cY def
+ loc {
+ dup 66 eq { /aY bY def } { % B
+ dup 98 eq { /aY lY def } { % b
+ dup 108 eq { /aX lX def } { % l
+ dup 114 eq { /aX uX def } { % r
+ dup 116 eq { /aY uY def } % t
+ if } ifelse } ifelse } ifelse } ifelse pop
+ } forall
+% \end{macrocode}
+% Store the replacement key, and the transformation information, in
+% \pscom{replArray}. These transformations are appended to the CTM
+% encountered when \pscom{Place} is run. Indeed, this and
+% \pscom{Place} are the two most difficult pieces of code to
+% understand.
+% \changes{3.03}{1996/12/03}{The added transformation is no longer
+% ``slipped under'' the CTM, but now it is more properly appended.
+% this should allow the replacements to move properly if the entire
+% figure is rotated or transformed. This required changes throughout
+% the code, but primarily here.}
+% \begin{macrocode}
+ K srcFM rot tM rotate dstM
+ 2 { tM concatmatrix } repeat aload pop pop pop
+ 2 { scl normalize 4 2 roll } repeat
+ aX aY transform
+ /temp temp 7 add def
+ } forall
+ temp setrepl
+} B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{rs}
+% \begin{macro}{rks}
+% \begin{macro}{ras}
+% \begin{macro}{rws}
+% \begin{macro}{raws}
+% These macros intercept calls to their PostScript
+% counterparts and execute \pscom{replace} in their stead if the
+% argument string matches one in the replacement list.
+% \changes{3.03}{1996/12/17}{Corrected typo for \pscom{raws}.}
+% \begin{macrocode}
+/Rif {
+ S 3 index convert known { pop replace } { exch pop OE } ifelse
+} B
+/XA { bind [ /Kproc /str } B /XC { ] 2 array astore def } B
+/xs { pop } XA XC
+/xks { /kern load OE } XA /kern XC
+/xas { pop ax ay rmoveto } XA /ay /ax XC
+/xws { c eq { cx cy rmoveto } if } XA /c /cy /cx XC
+/xaws { ax ay rmoveto c eq { cx cy rmoveto } if }
+ XA /ay /ax /c /cy /cx XC
+/raws { xaws { awidthshow } Rif } B
+/rws { xws { widthshow } Rif } B
+/rks { xks { kshow } Rif } B
+/ras { xas { ashow } Rif } B
+/rs { xs { show } Rif } B
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
+%
+% \begin{macro}{restore}
+% In Level 1 PostScript, this is necessary because global variables
+% do not exist (and we need one!). Every call to \pscom{restore}
+% wipes out any variables that were modified since the previous call
+% to \pscom{save}. Unfortunately, this is not guaranteed to work,
+% although it does work for \pkg{dvips}.
+%
+% For Level 2, we can use global variables so this is not necessary.
+% We make this distinction \emph{at print time}, so a file that does
+% not seem to work on a Level 1 printer for which it was originally
+% intended should still work on a Level 2 printer without
+% modification.
+% \changes{3.04}{1998/04/11}{Added a fix recommended by J. Scott Berg.}
+% \begin{macrocode}
+/rrs { getrepl dup 2 add -1 roll //restore exec setrepl } B
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{Dict}
+% This dictionary is added to the stack just before the figure, so
+% that its definitions of the \pscom{show} operators can substitute
+% for the originals.
+% \changes{3.02}{1996/12/03}{Made \pscom{Dict} read-only to help
+% track down problems.}
+% \changes{3.03}{1996/12/17}{Corrected typo in \pscom{awidthshow}.}
+% \begin{macrocode}
+PSfragDict begin
+islev2 not { /restore { /rrs PSfrag } B } if
+/show { /rs PSfrag } B
+/kshow { /rks PSfrag } B
+/ashow { /ras PSfrag } B
+/widthshow { /rws PSfrag } B
+/awidthshow { /raws PSfrag } B
+end PSfragDict RO pop
+end
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</filepro>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \section{The scanner}
+% This code implements the \TeX-based scanner that performs the work
+% that the \pfg\ Perl script used to perform. This is
+% very similar to the code used
+% to scan for bounding boxes in \fname{graphics.sty}.
+%
+% We need to read the string with two sets of catcodes: as `verbatim
+% text' for using in the first argument of |\psfrag|, and as normal
+% \TeX\ commands for using in the replacemnt text argument.
+% The only way to do this sensibly in standard \TeX\ is to write
+% the string to a file and then read it back. So while reading the
+% EPS file, the character |\| will be `active'.
+% Then the argument can be duplicated
+% before writing this temp file, once with |\| expanding to |\\| (two
+% catcode 12 tokens) and once to |\| (one catcode 12 token). When this
+% is read back, these tokens will be re-catcoded by the |psfrag|
+% command.
+% \begin{macrocode}
+\newwrite\pfg@temp
+% \end{macrocode}
+%
+% \begin{macro}{\pfg@scan}
+% The main command. |#1| is the name of the file. It might be better
+% to use the bounding box (`|.bb|') file name so
+% that compressed files could work by you copying any lines with
+% |(\\tex|\ldots strings in them to the |bb| file before compressing.
+% However, if you are
+% doing that, you may as well just move the |\psfrag| commands to the
+% main \TeX\ file. So currently compression is not supported by this
+% system.
+% \begin{macrocode}
+\def\pfg@scan#1{\begingroup
+% \end{macrocode}
+% First the standard making `safe' of illegal characters.
+% \begin{macrocode}
+ \@tempcnta\z@
+ \loop
+ \ifnum\@tempcnta<\@xxxii
+ \catcode\@tempcnta12 \advance\@tempcnta\@ne
+ \repeat
+% \end{macrocode}
+%
+% Now normalise some catcodes we need. Most things are treated verbatim,
+% but |{}| have their normal catcodes so |\read| will read multi-line
+% |\\tex| expresions; and, as discussed above, |\| is made active.
+% The end of a line is treated as space. Originally this meant that
+% multi-line |\tex| commands did not work, but with v3.02, the PS side
+% of things normalises white space to `space', as well so everyone is in
+% agreement.
+% \begin{macrocode}
+ \let\do\@makeother\dospecials\catcode`\ 10 %
+ \catcode`\{=1\catcode`\}=2\catcode127=12 %
+ \catcode`\\=\active\catcode\endlinechar5 %
+% \end{macrocode}
+%
+% Open the scratch file. Don't complain if it already exists as that
+% is probably just a previous graphic, or a previous run.
+% \fname{pfgguide.tex} warns that any existing file of this name will
+% be zapped, so: you've been warned.
+% \begin{macrocode}
+ \immediate\openout\pfg@temp=\jobname.pfg %
+% \end{macrocode}
+%
+% If the graphic file is not there, complain, else start reading it
+% line by line. Look at each line with |\pfg@find|. Unlike the looking
+% for |%%BoundingBox| where you can stop once you've found it, here
+% you need to go to the end of the file looking for all the occurrences
+% of |\tex| so if you give it megabytes of data, this may take a while.
+% \begin{macrocode}
+ \immediate\openin\@inputcheck=#1 %
+ \ifeof\@inputcheck
+ \PackageWarning{psfrag}{Could not scan #1...}\endgroup
+ \else
+ \message{<psfrag:#1>}%
+ \@tempswatrue
+ \loop
+ \ifeof\@inputcheck
+ \@tempswafalse
+ \else
+ \read\@inputcheck to\@tempa
+ \expandafter\pfg@find\@tempa{\@nil}%
+ \fi
+ \if@tempswa
+ \repeat
+ \closein\@inputcheck
+ \fi
+ \immediate\closeout\pfg@temp
+ \endgroup
+ \@input{\jobname.pfg}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfg@find}
+% \changes{3.03}{1997/01/07}
+% {Find strings even if nested inside brace groups}
+% This command first looks for an explicit brace group |{ }|.
+% (one definitely exists as |{\@nil}| is added at the end as
+% a `marker').
+% \begin{macrocode}
+\long\def\pfg@find#1#{\pfg@finda{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% To enable an `active' copy or |\| to be accessed easily, use a special
+% lowercase table while defining these macros.
+% \begin{macrocode}
+\begingroup
+ \lccode`\~=`\\
+ \lowercase{\endgroup
+% \end{macrocode}
+%
+% \begin{macro}{\pfg@finda}
+% If the group found contained the |\@nil| marker stop, else
+% start looking for |(\\tex| in the tokens before the group.
+% \begin{macrocode}
+\long\def\pfg@finda#1#2{%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@nnil
+ \else
+ \pfg@findb#1(~~tex(~~tex%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pfg@findb}
+% Having found a brace group, look for the string |\\tex| in the
+% preceding tokens. If there is such, discard any tokens before that
+% then take all tokens after |\\tex| (up to the brace already found)
+% to be the optional arguments. In that case write out a suitable
+% call to |\psfrag|, and then continue after the brace group.
+% Otherwise if no |\\tex| is found, Add the contents of the brace group
+% (without the braces) back in front of the list before restarting the
+% search. In that way any strings inside brace groups will be found.
+%
+% As |{}| have their normal catcodes, multiline |\tex| commands work
+% as long as any line breaks occur inside the main |{ }| argument, not
+% between the optional arguments (normally there is no space at all
+% there, so no possibility of a break). This is because \TeX\ will
+% read more than a line if necessary to ensure that braces balance.
+%
+% The arguments are delimited by |(\\tex| sequences:\\
+% |#1| Is always discarded; the tokens before any |(\\tex| string.\\
+% |#2| contains any optional arguments (complete with |[]| brackets).\\
+% |#3| Will be the `dummy tokens' placed at the end, unless
+% no |(\\tex| is in the string, in which case |#3| will be empty.
+% This argument is |\fi| delimited which allows for tail recursion
+% in a slightly sneaky way.
+% \begin{macrocode}
+\long\def\pfg@findb#1(~~tex#2(~~tex#3\fi{%
+ \fi
+ \ifx\box#3\box
+ \else
+% \end{macrocode}
+% Since |\| is the PS escape character in strings, as well as the \TeX\
+% escape character, the following looks a bit weird, but it's probably
+% right. A |\| will appear in the PS string as |\\|, so\ldots
+%
+% First set |\| to be |\string| (recall |\| is active, and can be written
+% as |~| due to the |\lowercase| above).
+% This means that
+% |\\foo| expands to |\foo| (one catcode 12 |\| coming from |\string\|
+% and then a catcode 11 |foo|). This expansion is frozen by an |\edef|
+% for use in the second argument. Then redefine |\| to be |\relax|
+% so it is a non-expandable active token, which writes as itself.
+%
+% Now write a call to |\psfrag| to the temp file.
+% The `user' string |\foo| which was the literal PS |\\foo| thus ends
+% up as:\\
+% |\psfrag{|\ldots |\\foo| \ldots |}{| \ldots |\foo| |}%|
+%
+% When this file is read back |\psfrag| will read the first argument
+% verbatim, and the second argument with normal catcodes so finally
+% |\foo| gets to be a single token instead of 4, and is executed
+% as part of the replacement text.
+%
+% Finally reset |\@tempa| (which contatined the contents of the brace group
+% to empty, as we've done with that.
+% \begin{macrocode}
+ {\let~\string
+ \edef\@tempb{\@tempa}%
+ \let~\relax
+ \immediate\write\pfg@temp{%
+ \string\psfrag\space
+ {\string\\tex#2{\@tempa}}#2\@percentchar
+ ^^J\@spaces\@spaces{\@tempb}\@percentchar}}%
+ \let\@tempa\@empty
+ \fi
+% \end{macrocode}
+%
+% Now start looking for the next brace group to test. First tip
+% the contents of |\@tempa| in front of the tokens not yet seen, so that
+% the contents of a brace group will be searched if they were not
+% used as the argument to |\tex|.
+% \begin{macrocode}
+ \expandafter\pfg@find\@tempa}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% Finally close the call to |\lowercase|.
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
diff --git a/support/easylatex/psfrag/psfrag.ins b/support/easylatex/psfrag/psfrag.ins
new file mode 100644
index 0000000000..9c22e7cf66
--- /dev/null
+++ b/support/easylatex/psfrag/psfrag.ins
@@ -0,0 +1,25 @@
+%%
+%% This file is part of the standard PSfrag bundle. It extracts the
+%% files from psfrag.dtx to be installed in the TeX hierarchy.
+%%
+%% This file may not be changed unless it is distributed under a
+%% different name, accompanied by a copy of the original file.
+%% The author of the changes and their scope should be clearly
+%% documented, so that questions can be distributed to the proper author.
+%%
+\def\batchfile{psfrag.ins}
+\input docstrip
+\preamble
+
+Copyright (c) 1996 Craig Barratt, Michael C. Grant, and David Carlisle.
+All rights reserved.
+
+This file is part of the PSfrag package.
+
+\endpreamble
+\generateFile{psfrag.sty}{f}{\from{psfrag.dtx}{package}}
+\def\npostamble{}\usepostamble\npostamble
+\generateFile{psfrag.pro}{f}{\from{psfrag.dtx}{filepro}}
+
+
+
diff --git a/support/easylatex/psfrag/testfig.eps b/support/easylatex/psfrag/testfig.eps
new file mode 100644
index 0000000000..437bb54899
--- /dev/null
+++ b/support/easylatex/psfrag/testfig.eps
@@ -0,0 +1,6 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 245 163
+(Courier) findfont 216 scalefont setfont
+-13 41 moveto (gA) show
+showpage
+%%EOF
diff --git a/support/easylatex/quickInstall.pl b/support/easylatex/quickInstall.pl
new file mode 100644
index 0000000000..2e64df83d9
--- /dev/null
+++ b/support/easylatex/quickInstall.pl
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+
+$HOME = $ENV{HOME};
+$fail = system("mv -i easylatex $HOME/.easylatex");
+if ($fail) {die "Aborting; reason: couldn't do 'mv easylatex $HOME/.easylatex'; maybe easylatex is already installed?";}
+
+# I'll assume most distos have psfrag and leave this out for now...
+
+# should put in a test here to make sure psfrag, amsmath, etc are installed
+
+#$fail = system('cd psfrag; latex psfrag.ins');
+#if ($fail) {die "Couldn't install psfrag; graph functionality not installed. The rest of EasyLatex is installed.";}
+
+
+# print <<"EOF";
+
+
+
+
+# ----------------------------
+
+# Most of EasyLatex is now installed.
+
+# If you are going to let EasyLatex generate PostScript files for you,
+# then you are almost done. To tell EasyLatex to generate a PostScript file,
+# use the "-ps" flag like this:
+
+# easylatex.pl -ps demo.txt
+
+# However, if you'll want to manually recompile .tex files with graphs in them,
+# you'll need to install "psfrag" yourself. Psfrag is a separate program
+# which is bundled with this one. It is in the subdirectory "psfrag".
+
+
+
+# EOF
+
+
diff --git a/support/easylatex/testFiles/alignAndLinefeed.tex.correct b/support/easylatex/testFiles/alignAndLinefeed.tex.correct
new file mode 100644
index 0000000000..08a3e2f583
--- /dev/null
+++ b/support/easylatex/testFiles/alignAndLinefeed.tex.correct
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\begin{align}
+1 + 1 &= 2
+\\1 &= 2 - 1
+\\0 &= 2 - 1 - 1
+\\0 &= 2 - 2
+\end{align}
+
+\end{document}
diff --git a/support/easylatex/testFiles/alignAndLinefeed.txt b/support/easylatex/testFiles/alignAndLinefeed.txt
new file mode 100644
index 0000000000..0edb4682f6
--- /dev/null
+++ b/support/easylatex/testFiles/alignAndLinefeed.txt
@@ -0,0 +1,6 @@
+\begin{align}
+1 + 1 = 2
+1 = 2 - 1
+0 = 2 - 1 - 1
+0 = 2 - 2
+\end{align}
diff --git a/support/easylatex/testFiles/alreadyHasHeaderAndFooter.tex.correct b/support/easylatex/testFiles/alreadyHasHeaderAndFooter.tex.correct
new file mode 100644
index 0000000000..c4ca8745db
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyHasHeaderAndFooter.tex.correct
@@ -0,0 +1,18 @@
+\documentclass{article}
+\title{CS202 Homework 1}
+\author{Bayle Shanks}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+\oddsidemargin=.25in \textwidth=6in
+
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+\begin{document}
+I'm a Latex document.
+
+\end{document}
+
+
+
+
diff --git a/support/easylatex/testFiles/alreadyHasHeaderAndFooter.txt b/support/easylatex/testFiles/alreadyHasHeaderAndFooter.txt
new file mode 100644
index 0000000000..93f09b0412
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyHasHeaderAndFooter.txt
@@ -0,0 +1,16 @@
+\documentclass{article}
+\title{CS202 Homework 1}
+\author{Bayle Shanks}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+\oddsidemargin=.25in \textwidth=6in
+
+\begin{document}
+I'm a Latex document.
+
+\end{document}
+
+
+
+
diff --git a/support/easylatex/testFiles/alreadyInMathMode_align.tex.correct b/support/easylatex/testFiles/alreadyInMathMode_align.tex.correct
new file mode 100644
index 0000000000..1a3d6cf922
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyInMathMode_align.tex.correct
@@ -0,0 +1,19 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\begin{align}
+(A - \lambda I), \textrm{where I = }
+\\ \left[ \begin{array}{lll}
+ 1 & 0 & 0
+\\ 0 & 1 & 0
+\\ 0 & 0 & 1
+\end{array} \right]
+\end{align}
+
+\end{document}
diff --git a/support/easylatex/testFiles/alreadyInMathMode_align.txt b/support/easylatex/testFiles/alreadyInMathMode_align.txt
new file mode 100644
index 0000000000..6ad6ddac60
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyInMathMode_align.txt
@@ -0,0 +1,4 @@
+\begin{align}
+(A - \lambda I), \textrm{where I = }
+\\ [[1 0 0 ; 0 1 0 ; 0 0 1]]
+\end{align}
diff --git a/support/easylatex/testFiles/alreadyInMathMode_dollar.tex.correct b/support/easylatex/testFiles/alreadyInMathMode_dollar.tex.correct
new file mode 100644
index 0000000000..1a2762c62d
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyInMathMode_dollar.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+$\frac{3}{4}$
+
+\end{document}
diff --git a/support/easylatex/testFiles/alreadyInMathMode_dollar.txt b/support/easylatex/testFiles/alreadyInMathMode_dollar.txt
new file mode 100644
index 0000000000..7a3b3b4966
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyInMathMode_dollar.txt
@@ -0,0 +1 @@
+$\frac{3}{4}$
diff --git a/support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.tex.correct b/support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.tex.correct
new file mode 100644
index 0000000000..a2bc955870
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.tex.correct
@@ -0,0 +1,15 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\begin{eqnarray*}
+Ax &=& b
+\\x &=& A^{-1} b
+\end{eqnarray*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.txt b/support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.txt
new file mode 100644
index 0000000000..9cd6318b47
--- /dev/null
+++ b/support/easylatex/testFiles/alreadyInMathMode_eqnarrayStar.txt
@@ -0,0 +1,4 @@
+\begin{eqnarray*}
+Ax &=& b
+\\x &=& A^{-1} b
+\end{eqnarray*}
diff --git a/support/easylatex/testFiles/autoAlignEquations.tex.correct b/support/easylatex/testFiles/autoAlignEquations.tex.correct
new file mode 100644
index 0000000000..86cfd8a17a
--- /dev/null
+++ b/support/easylatex/testFiles/autoAlignEquations.tex.correct
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\begin{align*}
+1 + 1 &= 2
+\\1 &= 2 - 1
+\\0 &= 2 - 1 - 1
+\\0 &= 2 - 2
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/autoAlignEquations.txt b/support/easylatex/testFiles/autoAlignEquations.txt
new file mode 100644
index 0000000000..aa1a0127af
--- /dev/null
+++ b/support/easylatex/testFiles/autoAlignEquations.txt
@@ -0,0 +1,6 @@
+\begin{align*}
+1 + 1 = 2
+\\1 = 2 - 1
+\\0 = 2 - 1 - 1
+\\0 = 2 - 2
+\end{align*}
diff --git a/support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.tex.correct b/support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.tex.correct
new file mode 100644
index 0000000000..436f7c8020
--- /dev/null
+++ b/support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.tex.correct
@@ -0,0 +1,19 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+
+\begin{align*}
+1 + 1 &= 2
+\\1 &= 2 - 1
+\\0 &= 2 - 1 - 1
+\\0 &= 2 - 2
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.txt b/support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.txt
new file mode 100644
index 0000000000..384e423070
--- /dev/null
+++ b/support/easylatex/testFiles/autoAlignEquationsOutsideMathMode.txt
@@ -0,0 +1,4 @@
+1 + 1 = 2
+1 = 2 - 1
+0 = 2 - 1 - 1
+0 = 2 - 2 \ No newline at end of file
diff --git a/support/easylatex/testFiles/autoItemize.tex.correct b/support/easylatex/testFiles/autoItemize.tex.correct
new file mode 100644
index 0000000000..9a8e2bd81f
--- /dev/null
+++ b/support/easylatex/testFiles/autoItemize.tex.correct
@@ -0,0 +1,41 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+hi
+
+\begin{itemize}
+\item hello
+\item there
+\end{itemize}
+
+
+\begin{itemize}
+\item[(1)] one
+\item[(2)] two
+\item[(3)] three
+\end{itemize}
+
+
+\begin{itemize}
+\item[1)] one
+\item[2)] two
+\end{itemize}
+
+\begin{itemize}
+\item[John)] is a boy
+\item[Amy)] is a girl
+\end{itemize}
+
+
+\begin{itemize}
+\item[1.1)] decimal
+\item[1.2)] test
+\end{itemize}
+
+\end{document}
diff --git a/support/easylatex/testFiles/autoItemize.txt b/support/easylatex/testFiles/autoItemize.txt
new file mode 100644
index 0000000000..6d53bf5687
--- /dev/null
+++ b/support/easylatex/testFiles/autoItemize.txt
@@ -0,0 +1,20 @@
+hi
+
+* hello
+* there
+
+
+(1) one
+(2) two
+(3) three
+
+
+1) one
+2) two
+
+John) is a boy
+Amy) is a girl
+
+
+1.1) decimal
+1.2) test
diff --git a/support/easylatex/testFiles/autoLinefeedInMathMode.tex.correct b/support/easylatex/testFiles/autoLinefeedInMathMode.tex.correct
new file mode 100644
index 0000000000..a1e48f6dfb
--- /dev/null
+++ b/support/easylatex/testFiles/autoLinefeedInMathMode.tex.correct
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\begin{align*}
+a
+\\b
+\\c
+\\d
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/autoLinefeedInMathMode.txt b/support/easylatex/testFiles/autoLinefeedInMathMode.txt
new file mode 100644
index 0000000000..c8d4894ed6
--- /dev/null
+++ b/support/easylatex/testFiles/autoLinefeedInMathMode.txt
@@ -0,0 +1,6 @@
+\begin{align*}
+a
+b
+c
+d
+\end{align*}
diff --git a/support/easylatex/testFiles/autoLinefeedInMathMode.txt.correct b/support/easylatex/testFiles/autoLinefeedInMathMode.txt.correct
new file mode 100644
index 0000000000..d55a7d6b82
--- /dev/null
+++ b/support/easylatex/testFiles/autoLinefeedInMathMode.txt.correct
@@ -0,0 +1,15 @@
+\documentclass{article}
+\usepackage{amsmath}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+
+\begin{document}
+
+\begin{align*}
+1 + 1 &=& 2
+\\1 &=& 2 - 1
+\\0 &=& 2 - 1 - 1
+\\0 &=& 2 - 2
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.tex.correct b/support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.tex.correct
new file mode 100644
index 0000000000..18438c7368
--- /dev/null
+++ b/support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\{1,2,3$\}^4$
+
+\end{document}
diff --git a/support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.txt b/support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.txt
new file mode 100644
index 0000000000..6529f51c8e
--- /dev/null
+++ b/support/easylatex/testFiles/autoMathOnSuperShouldIncludeEscapingBackslash.txt
@@ -0,0 +1 @@
+\{1,2,3\}^4
diff --git a/support/easylatex/testFiles/automathFracSqrt.tex.correct b/support/easylatex/testFiles/automathFracSqrt.tex.correct
new file mode 100644
index 0000000000..8b3aca8b84
--- /dev/null
+++ b/support/easylatex/testFiles/automathFracSqrt.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+ $\sqrt{2}$ + $\frac{1}{(x+5)}$
+
+\end{document}
diff --git a/support/easylatex/testFiles/automathFracSqrt.txt b/support/easylatex/testFiles/automathFracSqrt.txt
new file mode 100644
index 0000000000..47871d82b1
--- /dev/null
+++ b/support/easylatex/testFiles/automathFracSqrt.txt
@@ -0,0 +1 @@
+ \sqrt{2} + \frac{1}{(x+5)}
diff --git a/support/easylatex/testFiles/bareParensShouldntBeItemized.tex.correct b/support/easylatex/testFiles/bareParensShouldntBeItemized.tex.correct
new file mode 100644
index 0000000000..780b8b5a3b
--- /dev/null
+++ b/support/easylatex/testFiles/bareParensShouldntBeItemized.tex.correct
@@ -0,0 +1,22 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+(picture; same images taken to their nearest neighbor)
+
+Overall,
+
+
+\ \ \ \ \ error rate $=$ 6\%\ (on \textbf{test} set)
+\\
+
+
+(compare to the baseline error rate for random guessing: 90\%)
+(6\%\ error rate happens to be pretty competitive for this task)
+
+\end{document}
diff --git a/support/easylatex/testFiles/bareParensShouldntBeItemized.txt b/support/easylatex/testFiles/bareParensShouldntBeItemized.txt
new file mode 100644
index 0000000000..00466442a7
--- /dev/null
+++ b/support/easylatex/testFiles/bareParensShouldntBeItemized.txt
@@ -0,0 +1,11 @@
+(picture; same images taken to their nearest neighbor)
+
+Overall,
+
+
+\ \ \ \ \ error rate $=$ 6%\ (on \textbf{test} set)
+\\
+
+
+(compare to the baseline error rate for random guessing: 90%)
+(6%\ error rate happens to be pretty competitive for this task)
diff --git a/support/easylatex/testFiles/binarySymbol.tex.correct b/support/easylatex/testFiles/binarySymbol.tex.correct
new file mode 100644
index 0000000000..b988dcc658
--- /dev/null
+++ b/support/easylatex/testFiles/binarySymbol.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+$a \to b$, $x \mapsto y$
+
+\end{document}
diff --git a/support/easylatex/testFiles/binarySymbol.txt b/support/easylatex/testFiles/binarySymbol.txt
new file mode 100644
index 0000000000..a25ede23f2
--- /dev/null
+++ b/support/easylatex/testFiles/binarySymbol.txt
@@ -0,0 +1 @@
+a \to b, x \mapsto y
diff --git a/support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.tex.correct b/support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.tex.correct
new file mode 100644
index 0000000000..43e4513160
--- /dev/null
+++ b/support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.tex.correct
@@ -0,0 +1,15 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+$x \mapsto y_1\ldots y_n
+\\ \\ y_1\ldots y_n \mapsto x$
+
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.txt b/support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.txt
new file mode 100644
index 0000000000..81519e3aa7
--- /dev/null
+++ b/support/easylatex/testFiles/captureWordsOppositeToStoredExpressionAutoMath.txt
@@ -0,0 +1,6 @@
+x \mapsto y_1...y_n
+
+
+y_1...y_n \mapsto x
+
+
diff --git a/support/easylatex/testFiles/columnVector.tex.correct b/support/easylatex/testFiles/columnVector.tex.correct
new file mode 100644
index 0000000000..455c1334d5
--- /dev/null
+++ b/support/easylatex/testFiles/columnVector.tex.correct
@@ -0,0 +1,20 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+\begin{align*}
+\left[ \begin{array}{l}
+ 0
+\\ 1
+\\ 0
+\end{array} \right]
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/columnVector.txt b/support/easylatex/testFiles/columnVector.txt
new file mode 100644
index 0000000000..8e09110cba
--- /dev/null
+++ b/support/easylatex/testFiles/columnVector.txt
@@ -0,0 +1 @@
+[[0 1 0 ]]'
diff --git a/support/easylatex/testFiles/demo.tex.correct b/support/easylatex/testFiles/demo.tex.correct
new file mode 100644
index 0000000000..5a96f99ba6
--- /dev/null
+++ b/support/easylatex/testFiles/demo.tex.correct
@@ -0,0 +1,55 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+The identity matrix is the matrix for which $a_{ij} = 1$ when $i = j$, and 0 everywhere else. For example, in three dimensions, \begin{align*}I =
+ \left[ \begin{array}{lll}
+ 1 & 0 & 0
+\\ 0 & 1 & 0
+\\ 0 & 0 & 1
+\end{array} \right]
+\end{align*}
+.
+
+Here is a column vector:
+\begin{align*}
+\left[ \begin{array}{l}
+ 0
+\\ 1
+\\ 0
+\end{array} \right]
+\end{align*}
+.
+
+$x \mapsto y
+\\ \frac{1}{3}$
+
+
+% note: you can still use normal LaTeX in an easylatex file! for example:
+\begin{eqnarray*}
+a + b &=& c
+\\ a &=& c - b
+\\ \begin{array}{ll}
+\\1 & 2
+\\ 3 & 4
+\\\end{array}
+\end{eqnarray*}
+
+Here are some equations which easylatex will automatically align:
+
+\begin{align*}
+1 + 1 &= 2
+\\1 &= 2 - 1
+\\0 &= 2 - 2
+\end{align*}
+For easylatex to deal with a series of naked equations, like in the last three lines, there must be either an empty line, or the end of the file, both before and after the equations. So, the following lines WON'T be automatically aligned:
+$1 + 1 = 2
+1 = 2 - 1
+0 = 2 - 2$
+
+\end{document}
diff --git a/support/easylatex/testFiles/demo.txt b/support/easylatex/testFiles/demo.txt
new file mode 100644
index 0000000000..32ef744288
--- /dev/null
+++ b/support/easylatex/testFiles/demo.txt
@@ -0,0 +1,29 @@
+The identity matrix is the matrix for which a_ij = 1 when i = j, and 0 everywhere else. For example, in three dimensions, I = [[1 0 0 ; 0 1 0 ; 0 0 1]].
+
+Here is a column vector: [[0 1 0]]'.
+
+x \mapsto y
+
+1/3
+
+
+%% note: you can still use normal LaTeX in an easylatex file! for example:
+\begin{eqnarray*}
+a + b &=& c
+\\ a &=& c - b
+\\ \begin{array}{ll}
+1 & 2
+\\ 3 & 4
+\end{array}
+\end{eqnarray*}
+
+Here are some equations which easylatex will automatically align:
+
+1 + 1 = 2
+1 = 2 - 1
+0 = 2 - 2
+
+For easylatex to deal with a series of naked equations, like in the last three lines, there must be either an empty line, or the end of the file, both before and after the equations. So, the following lines WON'T be automatically aligned:
+1 + 1 = 2
+1 = 2 - 1
+0 = 2 - 2 \ No newline at end of file
diff --git a/support/easylatex/testFiles/dontSweepApartDollarSigns.tex.correct b/support/easylatex/testFiles/dontSweepApartDollarSigns.tex.correct
new file mode 100644
index 0000000000..6ce54e36f7
--- /dev/null
+++ b/support/easylatex/testFiles/dontSweepApartDollarSigns.tex.correct
@@ -0,0 +1,18 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+\begin{align*}x \mapsto y_1\ldots y_n
+\\ \\ \\ \frac{1}{3}
+\\ \\ \\ 1 + 1 &= 2
+\\1 &\leq 3 - 1
+\\&\leq 5
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/dontSweepApartDollarSigns.txt b/support/easylatex/testFiles/dontSweepApartDollarSigns.txt
new file mode 100644
index 0000000000..f512032521
--- /dev/null
+++ b/support/easylatex/testFiles/dontSweepApartDollarSigns.txt
@@ -0,0 +1,12 @@
+
+x \mapsto y_1...y_n
+
+
+
+1/3
+
+
+
+1 + 1 = 2
+1 \leq 3 - 1
+\leq 5
diff --git a/support/easylatex/testFiles/dotsToLdots.tex.correct b/support/easylatex/testFiles/dotsToLdots.tex.correct
new file mode 100644
index 0000000000..adfc81492c
--- /dev/null
+++ b/support/easylatex/testFiles/dotsToLdots.tex.correct
@@ -0,0 +1,18 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+Dots to ldots changes $\ldots$ to ldots
+
+
+$1 + 2$ + $\ldots$ + 10
+
+$v_1 v_2\ldots v_n$
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/dotsToLdots.txt b/support/easylatex/testFiles/dotsToLdots.txt
new file mode 100644
index 0000000000..0981dca526
--- /dev/null
+++ b/support/easylatex/testFiles/dotsToLdots.txt
@@ -0,0 +1,7 @@
+Dots to ldots changes ... to ldots
+
+
+1 + 2 + ... + 10
+
+v_1 v_2...v_n
+
diff --git a/support/easylatex/testFiles/easySections.tex.correct b/support/easylatex/testFiles/easySections.tex.correct
new file mode 100644
index 0000000000..b0f47a95e2
--- /dev/null
+++ b/support/easylatex/testFiles/easySections.tex.correct
@@ -0,0 +1,34 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\section*{ main section 1 }
+hello
+
+\begin{align*}
+3 + 2 = 5
+\end{align*}
+\subsection*{ subsection 1 }
+hi
+
+\begin{align*}
+2 + 9 = 7
+\end{align*}
+\subsubsection*{ subsubsection 1 }
+bye
+
+\begin{align*}
+1 + 3 = 44
+\end{align*}
+\subsection*{ subsection 2 }
+number 2 is my name
+
+\section*{ mainSec 2 }
+goodbye: $22 + 4 = 9$
+
+\end{document}
diff --git a/support/easylatex/testFiles/easySections.txt b/support/easylatex/testFiles/easySections.txt
new file mode 100644
index 0000000000..79d99d4041
--- /dev/null
+++ b/support/easylatex/testFiles/easySections.txt
@@ -0,0 +1,20 @@
+== main section 1 ==
+hello
+
+3 + 2 = 5
+
+=== subsection 1 ===
+hi
+
+2 + 9 = 7
+
+==== subsubsection 1 ====
+bye
+
+1 + 3 = 44
+
+=== subsection 2 ===
+number 2 is my name
+
+== mainSec 2 ==
+goodbye: 22 + 4 = 9
diff --git a/support/easylatex/testFiles/escapedMatrix.tex.correct b/support/easylatex/testFiles/escapedMatrix.tex.correct
new file mode 100644
index 0000000000..ef02471ebb
--- /dev/null
+++ b/support/easylatex/testFiles/escapedMatrix.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+[1 0 0 ; 0 1 0 ; 0 0 1]
+
+\end{document}
diff --git a/support/easylatex/testFiles/escapedMatrix.txt b/support/easylatex/testFiles/escapedMatrix.txt
new file mode 100644
index 0000000000..02e97ea870
--- /dev/null
+++ b/support/easylatex/testFiles/escapedMatrix.txt
@@ -0,0 +1 @@
+[1 0 0 ; 0 1 0 ; 0 0 1]
diff --git a/support/easylatex/testFiles/graphInteractions.tex.correct b/support/easylatex/testFiles/graphInteractions.tex.correct
new file mode 100644
index 0000000000..0872cc0ce6
--- /dev/null
+++ b/support/easylatex/testFiles/graphInteractions.tex.correct
@@ -0,0 +1,18 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\input{easyLatexGraph.tex}
+\includegraphics{easyLatexGraph.eps}
+
+\begin{align*}
+% note: the fields inside [] are comma-deliminted, so if there are commas inside a label= math expression, easylatex will break up the math expression at the comma; in this case you must put in the dollar signs manually
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/graphInteractions.txt b/support/easylatex/testFiles/graphInteractions.txt
new file mode 100644
index 0000000000..c0ad949144
--- /dev/null
+++ b/support/easylatex/testFiles/graphInteractions.txt
@@ -0,0 +1,12 @@
+\begin{graph}
+ rankdir=LR
+ node [shape=plaintext]
+ v_1
+ v_1 -> v_2 [label=\sqrt{2}+\frac{1}{(x+5)}, color=forestgreen]
+ v_2 -> v_3 [label=$S \subseteq \{1,2,3\}^4$]
+ v_3 -> v_1 [label=(f \circ g)^{-1}]
+\end{graph}
+
+%% note: the fields inside [] are comma-deliminted, so if there are commas inside a label= math expression, easylatex will break up the math expression at the comma; in this case you must put in the dollar signs manually
+
+
diff --git a/support/easylatex/testFiles/graphInteractions2.tex.correct b/support/easylatex/testFiles/graphInteractions2.tex.correct
new file mode 100644
index 0000000000..d664d4ea2c
--- /dev/null
+++ b/support/easylatex/testFiles/graphInteractions2.tex.correct
@@ -0,0 +1,21 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\input{easyLatexGraph.tex}
+\includegraphics{easyLatexGraph.eps}
+
+
+
+
+\input{easyLatexGraph.tex}
+\includegraphics{easyLatexGraph.eps}
+
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/graphInteractions2.txt b/support/easylatex/testFiles/graphInteractions2.txt
new file mode 100644
index 0000000000..e13731a362
--- /dev/null
+++ b/support/easylatex/testFiles/graphInteractions2.txt
@@ -0,0 +1,22 @@
+\begin{graph}
+ rankdir=LR
+ node [shape=plaintext]
+ [[1 0 0 ; 0 1 0 ; 0 0 1]]
+ [[1 0 0 ; 0 1 0 ; 0 0 1]] -> v_2 [label= [1 0 ; 0 1] , color=forestgreen]
+ v_2 -> v_3 [label=$S \subseteq \{1,2,3\}^4$(2)]
+ v_3 -> [[1 0 0 ; 0 1 0 ; 0 0 1]] [label=$(f \circ g)^{-1}$(2)]
+\end{graph}
+
+
+
+
+\begin{graph}
+ rankdir=LR
+ node [shape=plaintext]
+ $ [[1 0 0 ; 0 1 0 ; 0 0 1]] $(5)
+ $ [[1 0 0 ; 0 1 0 ; 0 0 1]] $(5) -> v_2 [label=$ [[1 0 ; 0 1]] $(6), color=forestgreen]
+ $v_2$(1) -> v_3 [label=$S \subseteq \{1,2,3\}^4$(2)]
+ $v_3$(1) -> $ [[1 0 0 ; 0 1 0 ; 0 0 1]] $(5) [label=$(f \circ g)^{-1}$(2)]
+\end{graph}
+
+
diff --git a/support/easylatex/testFiles/graphViz.tex.correct b/support/easylatex/testFiles/graphViz.tex.correct
new file mode 100644
index 0000000000..b303d47007
--- /dev/null
+++ b/support/easylatex/testFiles/graphViz.tex.correct
@@ -0,0 +1,15 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\input{easyLatexGraph.tex}
+\includegraphics{easyLatexGraph.eps}
+
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/graphViz.txt b/support/easylatex/testFiles/graphViz.txt
new file mode 100644
index 0000000000..d2f240a43d
--- /dev/null
+++ b/support/easylatex/testFiles/graphViz.txt
@@ -0,0 +1,11 @@
+\begin{graph}
+ rankdir=LR
+ node [shape=plaintext]
+ $v_1$(2)
+ $v_1$ -> $v_2$ [label=$\sqrt{2}+\frac{1}{x+5}$(5)]
+ $v_2$ -> $v_3$ [label=$S \subseteq \{1,2,3\}^4$(4)]
+ $v_3$ -> $v_1$ [label=$(f \circ g)^{-1}$(7)]
+ A -> B [dir=none]
+\end{graph}
+
+
diff --git a/support/easylatex/testFiles/identityMatrix.tex.correct b/support/easylatex/testFiles/identityMatrix.tex.correct
new file mode 100644
index 0000000000..b2351591f5
--- /dev/null
+++ b/support/easylatex/testFiles/identityMatrix.tex.correct
@@ -0,0 +1,20 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+\begin{align*}
+\left[ \begin{array}{lll}
+ 1 & 0 & 0
+\\ 0 & 1 & 0
+\\ 0 & 0 & 1
+\end{array} \right]
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/identityMatrix.txt b/support/easylatex/testFiles/identityMatrix.txt
new file mode 100644
index 0000000000..edeae5d6c8
--- /dev/null
+++ b/support/easylatex/testFiles/identityMatrix.txt
@@ -0,0 +1 @@
+[[1 0 0 ; 0 1 0 ; 0 0 1]]
diff --git a/support/easylatex/testFiles/identityMatrix4D.tex.correct b/support/easylatex/testFiles/identityMatrix4D.tex.correct
new file mode 100644
index 0000000000..906a8ac6df
--- /dev/null
+++ b/support/easylatex/testFiles/identityMatrix4D.tex.correct
@@ -0,0 +1,21 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+\begin{align*}
+\left[ \begin{array}{llll}
+ 1 & 0 & 0 & 0
+\\ 0 & 1 & 0 & 0
+\\ 0 & 0 & 1 & 0
+\\ 0 & 0 & 0 & 1
+\end{array} \right]
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/identityMatrix4D.txt b/support/easylatex/testFiles/identityMatrix4D.txt
new file mode 100644
index 0000000000..5d94dde3df
--- /dev/null
+++ b/support/easylatex/testFiles/identityMatrix4D.txt
@@ -0,0 +1 @@
+[[1 0 0 0 ; 0 1 0 0 ; 0 0 1 0 ; 0 0 0 1]]
diff --git a/support/easylatex/testFiles/inequalityAfterFirstEqn.tex.correct b/support/easylatex/testFiles/inequalityAfterFirstEqn.tex.correct
new file mode 100644
index 0000000000..a57c285474
--- /dev/null
+++ b/support/easylatex/testFiles/inequalityAfterFirstEqn.tex.correct
@@ -0,0 +1,24 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+
+\begin{align*}
+&C(v_1) + C(v_2) + C(v_5) + C(v_6)
+\\&\geq C(v_1) + C(v_2) + C(v_5) + C(v_6) - 2*c(v_1, v_2)
+\\&= C(v_1,v_2) + C(v_5) + C(v_6)
+\\&\geq C(v_1,v_2) + C(v_5) + C(v_6) - 2*c(v_1 v_2, v_6)
+\\&= C(v_1,v_2, v_6) + C(v_5)
+\\&\geq C(v_1,v_2, v_3) + C(v_5)
+\\&\geq C(v_1,v_2, v_3) + C(v_5) - 2*c(v_1 v_2 v_3, v_5)
+\\&= C(v_1,v_2, v_3, v_5)
+\\&\geq C(v_1,v_2, v_3, v_4)
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/inequalityAfterFirstEqn.txt b/support/easylatex/testFiles/inequalityAfterFirstEqn.txt
new file mode 100644
index 0000000000..f5fbdacf61
--- /dev/null
+++ b/support/easylatex/testFiles/inequalityAfterFirstEqn.txt
@@ -0,0 +1,12 @@
+
+
+C(v_1) + C(v_2) + C(v_5) + C(v_6)
+\geq C(v_1) + C(v_2) + C(v_5) + C(v_6) - 2*c(v_1, v_2)
+= C(v_1,v_2) + C(v_5) + C(v_6)
+\geq C(v_1,v_2) + C(v_5) + C(v_6) - 2*c(v_1 v_2, v_6)
+= C(v_1,v_2, v_6) + C(v_5)
+\geq C(v_1,v_2, v_3) + C(v_5)
+\geq C(v_1,v_2, v_3) + C(v_5) - 2*c(v_1 v_2 v_3, v_5)
+= C(v_1,v_2, v_3, v_5)
+\geq C(v_1,v_2, v_3, v_4)
+
diff --git a/support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.tex.correct b/support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.tex.correct
new file mode 100644
index 0000000000..a402546e0d
--- /dev/null
+++ b/support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.tex.correct
@@ -0,0 +1,24 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+
+\begin{align*}
+&C(v_1) + C(v_2) + C(v_5) + C(v_6)
+\\&\geq C(v_1) + C(v_2) + C(v_5) + C(v_6) - 2*c(v_1, v_2)
+\\&= C(v_1,v_2) + C(v_5) + C(v_6)
+\\&\geq C(v_1,v_2) + C(v_5) + C(v_6) - 2*c(v_1 v_2, v_6)
+\\&= C(v_1,v_2, v_6) + C(v_5)
+\\&\geq C(v_1,v_2, v_3) + C(v_5) & \textrm{ if $v_6$ is connected to $v_1$ or $v_2$}
+\\&\geq C(v_1,v_2, v_3) + C(v_5) - 2*c(v_1 v_2 v_3, v_5)
+\\&= C(v_1,v_2, v_3, v_5)
+\\&\geq C(v_1,v_2, v_3, v_4) & \textrm{ if $v_5$ is connected to $v_1$ or $v_2$ or $v_3$}
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.txt b/support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.txt
new file mode 100644
index 0000000000..d01b78ce16
--- /dev/null
+++ b/support/easylatex/testFiles/inequalityAfterFirstEqnWithTextrm.txt
@@ -0,0 +1,12 @@
+
+
+C(v_1) + C(v_2) + C(v_5) + C(v_6)
+\geq C(v_1) + C(v_2) + C(v_5) + C(v_6) - 2*c(v_1, v_2)
+= C(v_1,v_2) + C(v_5) + C(v_6)
+\geq C(v_1,v_2) + C(v_5) + C(v_6) - 2*c(v_1 v_2, v_6)
+= C(v_1,v_2, v_6) + C(v_5)
+\geq C(v_1,v_2, v_3) + C(v_5) \textrm{if $v_6$ is connected to $v_1$ or $v_2$}
+\geq C(v_1,v_2, v_3) + C(v_5) - 2*c(v_1 v_2 v_3, v_5)
+= C(v_1,v_2, v_3, v_5)
+\geq C(v_1,v_2, v_3, v_4) \textrm{if $v_5$ is connected to $v_1$ or $v_2$ or $v_3$}
+
diff --git a/support/easylatex/testFiles/multipleEqnsToAlign.tex.correct b/support/easylatex/testFiles/multipleEqnsToAlign.tex.correct
new file mode 100644
index 0000000000..501011e96e
--- /dev/null
+++ b/support/easylatex/testFiles/multipleEqnsToAlign.tex.correct
@@ -0,0 +1,28 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+
+\begin{align*}
+X_{IN} &= & \textrm{ (sum of all edges with X on one end and a node inside the circle on the other end)}
+\\X_{OUT} &= & \textrm{ (sum of all edges with X on one end and a node outside the circle on the other end)}
+\end{align*}
+
+
+
+
+\begin{align*}
+&C(v_4,v_5,v_9)
+\\&= C(v_1,v_2,v_3,v_6,v_7,v_8)
+\\&= C(v_1,v_2,v_3) + C(v_6,v_7,v_8) - 2*c(v_1 v_2 v_3, v_6 v_7 v_8)
+\\&\leq C(v_1,v_2,v_3) + C(v_6,v_7,v_8)
+\\&\leq C(v_1,v_2,v_6) + C(v_6,v_7,v_8)
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/multipleEqnsToAlign.txt b/support/easylatex/testFiles/multipleEqnsToAlign.txt
new file mode 100644
index 0000000000..43df352c4f
--- /dev/null
+++ b/support/easylatex/testFiles/multipleEqnsToAlign.txt
@@ -0,0 +1,12 @@
+X_IN = \textrm{(sum of all edges with X on one end and a node inside the circle on the other end)}
+X_OUT = \textrm{(sum of all edges with X on one end and a node outside the circle on the other end)}
+
+
+
+
+
+C(v_4,v_5,v_9)
+= C(v_1,v_2,v_3,v_6,v_7,v_8)
+= C(v_1,v_2,v_3) + C(v_6,v_7,v_8) - 2*c(v_1 v_2 v_3, v_6 v_7 v_8)
+\leq C(v_1,v_2,v_3) + C(v_6,v_7,v_8)
+\leq C(v_1,v_2,v_6) + C(v_6,v_7,v_8)
diff --git a/support/easylatex/testFiles/nakedEqnsInequalities.tex.correct b/support/easylatex/testFiles/nakedEqnsInequalities.tex.correct
new file mode 100644
index 0000000000..f0fb99f91d
--- /dev/null
+++ b/support/easylatex/testFiles/nakedEqnsInequalities.tex.correct
@@ -0,0 +1,47 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+
+\begin{align*}
+a &\leq b
+\\b &\leq c
+\\a &\geq d
+\\a &= e
+\end{align*}
+
+
+\begin{align*}
+b &= c
+\\b &= d
+\end{align*}
+
+
+\begin{align*}
+a = a
+\end{align*}
+
+
+\begin{align*}
+&&c(v_a v_b \ldots v_c, v_x v_y \ldots v_z) + c(v_d v_e \ldots v_f, v_x v_y \ldots v_z) &= c(v_a v_b \ldots v_c v_d v_e \ldots v_f, v_x v_y \ldots v_z)
+\\ \textrm{if $m \geq n$, } && c(v_1 v_2 \ldots v_{n-1} v_n) &\geq c(v_1 v_2 \ldots v_{n-1} v_m)
+\\&& c(v_a v_b \ldots v_c, v_x v_y \ldots v_z) + c(v_d v_e \ldots v_f, v_q v_r \ldots v_s) &\geq c(v_a v_b \ldots v_c, v_x v_y \ldots v_z)
+\end{align*}
+
+
+
+\begin{align*}
+&&a + b &= c
+\\ \textrm{if $m \geq n$, } && d &\geq e
+\\&& f &\geq g
+\end{align*}
+
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/nakedEqnsInequalities.txt b/support/easylatex/testFiles/nakedEqnsInequalities.txt
new file mode 100644
index 0000000000..83bbc073a2
--- /dev/null
+++ b/support/easylatex/testFiles/nakedEqnsInequalities.txt
@@ -0,0 +1,31 @@
+
+
+a \leq b
+b \leq c
+a \geq d
+a = e
+
+
+
+b = c
+b = d
+
+
+
+a = a
+
+
+
+c(v_a v_b \ldots v_c, v_x v_y \ldots v_z) + c(v_d v_e \ldots v_f, v_x v_y \ldots v_z) = c(v_a v_b \ldots v_c v_d v_e \ldots v_f, v_x v_y \ldots v_z)
+\textrm{if $m \geq n$, } c(v_1 v_2 \ldots v_{n-1} v_n) \geq c(v_1 v_2 \ldots v_{n-1} v_m)
+c(v_a v_b \ldots v_c, v_x v_y \ldots v_z) + c(v_d v_e \ldots v_f, v_q v_r \ldots v_s) \geq c(v_a v_b \ldots v_c, v_x v_y \ldots v_z)
+
+
+
+
+a + b = c
+\textrm{if $m \geq n$, } d \geq e
+f \geq g
+
+
+
diff --git a/support/easylatex/testFiles/nakedEqnsMultipleLines.tex.correct b/support/easylatex/testFiles/nakedEqnsMultipleLines.tex.correct
new file mode 100644
index 0000000000..336723c405
--- /dev/null
+++ b/support/easylatex/testFiles/nakedEqnsMultipleLines.tex.correct
@@ -0,0 +1,18 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+Test of finding multiple line naked eqn
+
+\begin{align*}
+B_{old} &= B + X_{IN} - X_{OUT}
+\\B_{new} &= B - X_{IN} + X_{OUT}
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/nakedEqnsMultipleLines.txt b/support/easylatex/testFiles/nakedEqnsMultipleLines.txt
new file mode 100644
index 0000000000..8e3db3ec93
--- /dev/null
+++ b/support/easylatex/testFiles/nakedEqnsMultipleLines.txt
@@ -0,0 +1,6 @@
+Test of finding multiple line naked eqn
+
+B_old = B + X_IN - X_OUT
+B_new = B - X_IN + X_OUT
+
+
diff --git a/support/easylatex/testFiles/notAMatrix.tex.correct b/support/easylatex/testFiles/notAMatrix.tex.correct
new file mode 100644
index 0000000000..fba322d181
--- /dev/null
+++ b/support/easylatex/testFiles/notAMatrix.tex.correct
@@ -0,0 +1,14 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\allowdisplaybreaks[1]
+
+Hello
+
+\end{document}
diff --git a/support/easylatex/testFiles/notAMatrix.txt b/support/easylatex/testFiles/notAMatrix.txt
new file mode 100644
index 0000000000..2025ab04be
--- /dev/null
+++ b/support/easylatex/testFiles/notAMatrix.txt
@@ -0,0 +1,3 @@
+\allowdisplaybreaks[1]
+
+Hello
diff --git a/support/easylatex/testFiles/scriptedMatrix.tex.correct b/support/easylatex/testFiles/scriptedMatrix.tex.correct
new file mode 100644
index 0000000000..0114278bac
--- /dev/null
+++ b/support/easylatex/testFiles/scriptedMatrix.tex.correct
@@ -0,0 +1,20 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+\begin{align*}
+\left[ \begin{array}{lll}
+ a_{1,1} & a_{1,2} & a_{1,3}
+\\ a_{2,1} & a_{2,2} & a_{2,3}
+\\ a_{3,1} & a_{3,2} & a_{3,3}
+\end{array} \right]
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/scriptedMatrix.txt b/support/easylatex/testFiles/scriptedMatrix.txt
new file mode 100644
index 0000000000..156c7e1f53
--- /dev/null
+++ b/support/easylatex/testFiles/scriptedMatrix.txt
@@ -0,0 +1 @@
+[[[3,3,"a_{$i,$j}"]]]
diff --git a/support/easylatex/testFiles/scriptedMatrixAckermann.tex.correct b/support/easylatex/testFiles/scriptedMatrixAckermann.tex.correct
new file mode 100644
index 0000000000..2a40fd2682
--- /dev/null
+++ b/support/easylatex/testFiles/scriptedMatrixAckermann.tex.correct
@@ -0,0 +1,23 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+
+\begin{align*}
+\left[ \begin{array}{lll}
+ 3 & 4 & 5
+\\ 5 & 7 & 9
+\\ 13 & 29 & 61
+\end{array} \right]
+\end{align*}
+
+
+
+Function "Ack" (Ackermann's function) copied from Doug Bagley.
+
+\end{document}
diff --git a/support/easylatex/testFiles/scriptedMatrixAckermann.txt b/support/easylatex/testFiles/scriptedMatrixAckermann.txt
new file mode 100644
index 0000000000..fe05f0860a
--- /dev/null
+++ b/support/easylatex/testFiles/scriptedMatrixAckermann.txt
@@ -0,0 +1,13 @@
+[[[3,3,
+sub Ack {
+ my($M, $N) = @_;
+ return( $N + 1 ) if ($M == 0);
+ return( Ack($M - 1, 1) ) if ($N == 0);
+ Ack($M - 1, Ack($M, $N - 1));
+}
+
+return Ack($i,$j);
+]]]
+
+
+Function "Ack" (Ackermann's function) copied from Doug Bagley.
diff --git a/support/easylatex/testFiles/seminarDocClass.tex.correct b/support/easylatex/testFiles/seminarDocClass.tex.correct
new file mode 100644
index 0000000000..1875634694
--- /dev/null
+++ b/support/easylatex/testFiles/seminarDocClass.tex.correct
@@ -0,0 +1,16 @@
+\documentclass{seminar}
+
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+\usepackage{slidesec} % pkg required by EasyLatex
+\begin{document}
+
+
+\begin{slide*}
+I'm a slide
+\end{slide*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/seminarDocClass.txt b/support/easylatex/testFiles/seminarDocClass.txt
new file mode 100644
index 0000000000..57bb5badb6
--- /dev/null
+++ b/support/easylatex/testFiles/seminarDocClass.txt
@@ -0,0 +1,5 @@
+\documentclass{seminar}
+
+\begin{slide*}
+I'm a slide
+\end{slide*} \ No newline at end of file
diff --git a/support/easylatex/testFiles/seminarSlideDivider.tex.correct b/support/easylatex/testFiles/seminarSlideDivider.tex.correct
new file mode 100644
index 0000000000..45c00bde50
--- /dev/null
+++ b/support/easylatex/testFiles/seminarSlideDivider.tex.correct
@@ -0,0 +1,21 @@
+\documentclass{seminar}
+
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+\usepackage{slidesec} % pkg required by EasyLatex
+\begin{document}
+\begin{slide}
+
+
+I'm slide 1
+
+\end{slide}
+\begin{slide}
+
+I'm slide 2
+
+\end{slide}
+\end{document}
diff --git a/support/easylatex/testFiles/seminarSlideDivider.txt b/support/easylatex/testFiles/seminarSlideDivider.txt
new file mode 100644
index 0000000000..a3afd77e53
--- /dev/null
+++ b/support/easylatex/testFiles/seminarSlideDivider.txt
@@ -0,0 +1,7 @@
+\documentclass{seminar}
+
+I'm slide 1
+
+----
+
+I'm slide 2
diff --git a/support/easylatex/testFiles/simpleFraction.tex.correct b/support/easylatex/testFiles/simpleFraction.tex.correct
new file mode 100644
index 0000000000..2fff150811
--- /dev/null
+++ b/support/easylatex/testFiles/simpleFraction.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+$\frac{3.6}{2^2}$
+
+\end{document}
diff --git a/support/easylatex/testFiles/simpleFraction.txt b/support/easylatex/testFiles/simpleFraction.txt
new file mode 100644
index 0000000000..fdaee2e602
--- /dev/null
+++ b/support/easylatex/testFiles/simpleFraction.txt
@@ -0,0 +1 @@
+3.6/2^2
diff --git a/support/easylatex/testFiles/simpleSymbol.tex.correct b/support/easylatex/testFiles/simpleSymbol.tex.correct
new file mode 100644
index 0000000000..f5ee46d8a3
--- /dev/null
+++ b/support/easylatex/testFiles/simpleSymbol.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+$alpha \to beta$, $xx \mapsto yy$
+
+\end{document}
diff --git a/support/easylatex/testFiles/simpleSymbol.txt b/support/easylatex/testFiles/simpleSymbol.txt
new file mode 100644
index 0000000000..4e8f6647e0
--- /dev/null
+++ b/support/easylatex/testFiles/simpleSymbol.txt
@@ -0,0 +1 @@
+alpha \to beta, xx \mapsto yy
diff --git a/support/easylatex/testFiles/singleLineNakedEqn.tex.correct b/support/easylatex/testFiles/singleLineNakedEqn.tex.correct
new file mode 100644
index 0000000000..cfc1a996b2
--- /dev/null
+++ b/support/easylatex/testFiles/singleLineNakedEqn.tex.correct
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+Test of finding single line naked eqn
+
+\begin{align*}
+B_{new} = B - X_{IN} + X_{OUT}
+\end{align*}
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/singleLineNakedEqn.txt b/support/easylatex/testFiles/singleLineNakedEqn.txt
new file mode 100644
index 0000000000..8e43767cf2
--- /dev/null
+++ b/support/easylatex/testFiles/singleLineNakedEqn.txt
@@ -0,0 +1,5 @@
+Test of finding single line naked eqn
+
+B_new = B - X_IN + X_OUT
+
+
diff --git a/support/easylatex/testFiles/singleLineNakedEqnNot.tex.correct b/support/easylatex/testFiles/singleLineNakedEqnNot.tex.correct
new file mode 100644
index 0000000000..121622f308
--- /dev/null
+++ b/support/easylatex/testFiles/singleLineNakedEqnNot.tex.correct
@@ -0,0 +1,16 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+Test of finding single line naked eqn which has an escaped = sign (i.e. should NOT be found)
+
+$B_{new}$ = $B - X_{IN}$ + $X_{OUT}$
+
+
+
+\end{document}
diff --git a/support/easylatex/testFiles/singleLineNakedEqnNot.txt b/support/easylatex/testFiles/singleLineNakedEqnNot.txt
new file mode 100644
index 0000000000..f2ced8ebe6
--- /dev/null
+++ b/support/easylatex/testFiles/singleLineNakedEqnNot.txt
@@ -0,0 +1,5 @@
+Test of finding single line naked eqn which has an escaped \= sign (i.e. should NOT be found)
+
+B_new \= B - X_IN + X_OUT
+
+
diff --git a/support/easylatex/testFiles/superSubscripts.tex.correct b/support/easylatex/testFiles/superSubscripts.tex.correct
new file mode 100644
index 0000000000..29250fecf1
--- /dev/null
+++ b/support/easylatex/testFiles/superSubscripts.tex.correct
@@ -0,0 +1,14 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+Let's say that $a_2 = 2$, and $a_4$ = $2^2$, and $a_{1024}$ = $2^{10}$.
+
+Furthermore, let's try to say that $a^x$ or $a^{x + b}$ or $a_x$ .
+
+\end{document}
diff --git a/support/easylatex/testFiles/superSubscripts.txt b/support/easylatex/testFiles/superSubscripts.txt
new file mode 100644
index 0000000000..dcbf1a2d40
--- /dev/null
+++ b/support/easylatex/testFiles/superSubscripts.txt
@@ -0,0 +1,3 @@
+Let's say that a_2 = 2, and a_4 = 2^2, and a_{1024} = 2^{10}.
+
+Furthermore, let's try to say that a^x or a^{x + b} or a_x .
diff --git a/support/easylatex/testFiles/superSubscripts2.tex.correct b/support/easylatex/testFiles/superSubscripts2.tex.correct
new file mode 100644
index 0000000000..13bde3947a
--- /dev/null
+++ b/support/easylatex/testFiles/superSubscripts2.tex.correct
@@ -0,0 +1,16 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+Let's say that $a_2 = 2$, and $a_4$ = $2^2$, and $a_{1024}$ = $2^{10}$.
+
+Furthermore, let's try to say that $a^x$ or $a^{x + b}$ or $a_x$ .
+
+And, $i_{amatest}$ .
+
+\end{document}
diff --git a/support/easylatex/testFiles/superSubscripts2.txt b/support/easylatex/testFiles/superSubscripts2.txt
new file mode 100644
index 0000000000..288113afdf
--- /dev/null
+++ b/support/easylatex/testFiles/superSubscripts2.txt
@@ -0,0 +1,5 @@
+Let's say that a_2 = 2, and a_4 = 2^2, and a_1024 = 2^10.
+
+Furthermore, let's try to say that a^x or a^{x + b} or a_x .
+
+And, i_amatest . \ No newline at end of file
diff --git a/support/easylatex/testFiles/superSymbolInteraction.tex.correct b/support/easylatex/testFiles/superSymbolInteraction.tex.correct
new file mode 100644
index 0000000000..423a09eede
--- /dev/null
+++ b/support/easylatex/testFiles/superSymbolInteraction.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+($f \circ g)^{-1}$
+
+\end{document}
diff --git a/support/easylatex/testFiles/superSymbolInteraction.txt b/support/easylatex/testFiles/superSymbolInteraction.txt
new file mode 100644
index 0000000000..38684f89f3
--- /dev/null
+++ b/support/easylatex/testFiles/superSymbolInteraction.txt
@@ -0,0 +1 @@
+(f \circ g)^{-1}
diff --git a/support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.tex.correct b/support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.tex.correct
new file mode 100644
index 0000000000..de1c9971f3
--- /dev/null
+++ b/support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.tex.correct
@@ -0,0 +1,17 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+\begin{align*}x \mapsto y
+\\ \\ \\ \frac{1}{3}
+\\ \\ \\ 1 + 1 &= 2
+\\1 &\leq 3 - 1
+\\&\leq 5
+\end{align*}
+
+\end{document}
diff --git a/support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.txt b/support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.txt
new file mode 100644
index 0000000000..a39ec3d135
--- /dev/null
+++ b/support/easylatex/testFiles/sweepingTogetherEqnsShouldntBreakAlign.txt
@@ -0,0 +1,11 @@
+x \mapsto y
+
+
+
+1/3
+
+
+
+1 + 1 = 2
+1 \leq 3 - 1
+\leq 5
diff --git a/support/easylatex/testFiles/transpose.tex.correct b/support/easylatex/testFiles/transpose.tex.correct
new file mode 100644
index 0000000000..a1b59bc38f
--- /dev/null
+++ b/support/easylatex/testFiles/transpose.tex.correct
@@ -0,0 +1,28 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+The transpose of
+\begin{align*}
+\left[ \begin{array}{lll}
+ 0 & 1 & 0
+\\ 0 & 1 & 0
+\\ 0 & 1 & 0
+\end{array} \right]
+\end{align*}
+ is
+\begin{align*}
+\left[ \begin{array}{lll}
+ 0 & 0 & 0
+\\ 1 & 1 & 1
+\\ 0 & 0 & 0
+\end{array} \right]
+\end{align*}
+.
+
+\end{document}
diff --git a/support/easylatex/testFiles/transpose.txt b/support/easylatex/testFiles/transpose.txt
new file mode 100644
index 0000000000..a996877c79
--- /dev/null
+++ b/support/easylatex/testFiles/transpose.txt
@@ -0,0 +1 @@
+The transpose of [[ 0 1 0 ; 0 1 0 ; 0 1 0 ]] is [[ 0 1 0 ; 0 1 0; 0 1 0 ]]'.
diff --git a/support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.tex.correct b/support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.tex.correct
new file mode 100644
index 0000000000..3caf8898ee
--- /dev/null
+++ b/support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.tex.correct
@@ -0,0 +1,12 @@
+\documentclass{article}
+\usepackage{amsmath} % pkg required by EasyLatex
+\usepackage{amsfonts} % pkg required by EasyLatex
+\usepackage{amssymb} % pkg required by EasyLatex
+\usepackage{psfrag} % pkg required by EasyLatex
+\usepackage[dvips]{graphicx} % pkg required by EasyLatex
+
+\begin{document}
+
+ $v_1$ -> $v_2$ [label=$\sqrt{2}$+1/(x+5)(5)]
+
+\end{document}
diff --git a/support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.txt b/support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.txt
new file mode 100644
index 0000000000..d72975af76
--- /dev/null
+++ b/support/easylatex/testFiles/unEscapeEqualsAndSquareBrackets.txt
@@ -0,0 +1 @@
+ v_1 -> v_2 [label\=\sqrt{2}+1/(x+5)(5)]
diff --git a/support/easylatex/unitTestDiffs.pl b/support/easylatex/unitTestDiffs.pl
new file mode 100755
index 0000000000..ddf6d4abcf
--- /dev/null
+++ b/support/easylatex/unitTestDiffs.pl
@@ -0,0 +1,62 @@
+#!/usr/bin/perl
+
+
+
+$TESTFILES_DIRNAME = 'testFiles';
+
+
+#echo \*\*\* You should see nothing below except for lines starting with \*\*\*:
+
+
+opendir(TESTFILESDIR, "$TESTFILES_DIRNAME") || die "can't opendir $TESTFILES_DIRNAME. Aborting.";
+
+@tests = readdir(TESTFILESDIR);
+closedir(TESTFILESDIR);
+
+%tests = {};
+foreach $test (@tests) {
+ if ($test =~ /.*\.txt$/) {
+ $test =~ s/\.txt$//;
+ $test =~ s/.*\///;
+ #print "$test\n";
+ $tests{$test} = 1;
+ }
+}
+
+
+foreach $test (keys %tests) {
+ #if (string($test))
+ #{print "$test\n";}
+
+ print "Comparing $test...";
+ #print "Comparing the results of ./easylatex testFiles/$test.txt to testFiles/$test.tex.correct\n";
+ unlink "$test.tex";
+ #print STDERR "perl easylatex.pl -e testFiles/$test.txt";
+ system("perl easylatex.pl -e testFiles/$test.txt\n");
+
+ #print STDERR "results: $test.tex vs. testFiles/$test.tex.correct\n";
+ open(RESULTFILE, "$test.tex");
+ undef $/;
+ $result = <RESULTFILE>;
+ close RESULTFILE;
+
+ $result =~ s/easyLatexGraph\d+/easyLatexGraph/g;
+
+ open(GOALFILE, "testFiles/$test.tex.correct");
+ $goal = <GOALFILE>;
+ close GOALFILE;
+
+ #print $result;
+
+ if ($result ne $goal) {
+ print "DIFFERENCES!...";
+ }
+
+ print "done\n";
+
+}
+
+
+
+
+
diff --git a/support/easylatex/unitTestDiffs.sh b/support/easylatex/unitTestDiffs.sh
new file mode 100644
index 0000000000..4575dc287f
--- /dev/null
+++ b/support/easylatex/unitTestDiffs.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+
+
+echo \*\*\* You should see nothing below except for lines starting with \*\*\*:
+
+for f in testFiles/*.txt
+do
+ f=`perl -e '$_ = $ARGV[0]; s/\.txt//; s/.*\///; print;' $f`
+ if [ -e testFiles/$f.tex ]; then
+ rm testFiles/$f.tex;
+ fi
+ ./easylatex.pl -e testFiles/$f.txt
+
+ echo \*\*\* diff $f.tex testFiles/$f.tex.correct:
+ perl -pi -e 's/easyLatexGraph\d+/easyLatexGraph/g;' $f.tex
+ diff $f.tex testFiles/$f.tex.correct
+ #rm $f.tex
+done
+ \ No newline at end of file
diff --git a/support/easylatex/wikiLatexToEasyLatex.pl b/support/easylatex/wikiLatexToEasyLatex.pl
new file mode 100755
index 0000000000..c60ca60565
--- /dev/null
+++ b/support/easylatex/wikiLatexToEasyLatex.pl
@@ -0,0 +1,41 @@
+#!/usr/bin/perl -pi
+
+s/(?<!\\)&/\\&/g;
+s/\$\$/\$/g;
+s/(?<!\\)%/\\%/g;
+s/(?<!\\)#/\\#/g;
+
+# those ops were idempotent
+
+s/'''(.*)'''/\\textbf{$1}/g;
+s/''(.*)''/\\emph{$1}/g;
+
+
+# add these to easylatex:
+
+s/^:(.*)/\n\\ \\ \\ \\ \\ $1\n\\\\\n/gm;
+s/<pre>/\\begin{verbatim}/g;
+s/<\/pre>/\\end{verbatim}/g;
+s/-->/\\to/g;
+#s/http:\/\/([\w\/\.]+)~([\w\/\.]*)/http:\/\/$1\\~{}$2/g;
+s/~/\\~{}/g;
+s/\\%(\s)/\\%\\ $1/sg;
+
+# change graph size in \{seminar} class! 3,3?
+s/\\begin{graph}/\\begin{graph}\nsize="3,3"/g;
+
+
+# alert! bug in easylatex ?!?: an escaped equals sign didn't take:
+
+#\ \ \ \ \ error rate \= 6\% (on \textbf{test} set)
+#
+# had to be manually changed to
+#
+#\ \ \ \ \ error rate $=$ 6\% (on \textbf{test} set)
+
+# note: must escape [s as \[s! must escape unwanted =s!
+
+
+
+
+
diff --git a/support/easylatex/wikiLatexToEasyLatexTables.pl b/support/easylatex/wikiLatexToEasyLatexTables.pl
new file mode 100755
index 0000000000..6ba4359d25
--- /dev/null
+++ b/support/easylatex/wikiLatexToEasyLatexTables.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl -i
+
+undef $/;
+$file = <>;
+
+$tableLineRE = '\|\|([^\|\n]*?)(\|\|[^\|\n]*?)*?\|\|'."\n";
+$file =~ s/($tableLineRE($tableLineRE)+)/processTable($1)/eg;
+#$file =~ s/(.*|\n)*/'I found a table!'/gsm;
+
+print $file;
+
+
+
+sub processTable {
+ my ($table) = @_;
+
+ $table =~ /(.*)/;
+ $tableLine1 = $1;
+
+ $dividerCount = 0;
+ while ($tableLine1 =~ /\|\|/g) {
+ $dividerCount = $dividerCount + 1;}
+ $colCount = $dividerCount - 1;
+
+ $colSpec = '|l'.('|l' x ($colCount - 1)).'|';
+
+ $table =~ s/^\|\|(.*)\|\|$/$1/gm;
+ $table =~ s/\|\|/&/g;
+ $table =~ s/\n/\\\\\n/g;
+
+ $table = "\\begin{tabular}{$colSpec}\n".'\hline'."\n".$table.'\hline'."\n".'\end{tabular}';
+
+ return $table;
+}
+
+#todo: add this to easylatex